diff --git a/README.md b/README.md index 0bc778b47..8e864c398 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

Logo

Create
- Patreon - Supported Versions + Patreon + Supported Versions License Discord Curseforge Downloads

@@ -19,7 +19,7 @@ Check out the wiki and in-game Tool-tips for further info on how to use these fe [](https://www.patreon.com/simibubi "Support Us") - Support for Minecraft 1.12: Not planned -- Support for Minecraft 1.15: Porting work is in Progress! +- Support for Minecraft 1.16: Porting efforts will begin soon. - Support for Fabric: Not planned

Find out more about Create on our Project Page

diff --git a/gradle.properties b/gradle.properties index 648b66d9a..79739da3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ minecraft_version=1.15.2 forge_version=31.2.21 # dependency versions -registrate_version=0.0.3.17 +registrate_version=0.0.4.18 jei_version=6.0.0.2 # curseforge information diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 18b24e191..7e3221ca0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5,26 +5,33 @@ f0d6baaabda94151134f569246d61a6e710c35a9 assets\create\blockstates\acacia_window 79c50afcea3a360783a5b3c73de9823511e9aed9 assets\create\blockstates\adjustable_pulse_repeater.json 1d730df54c9eae94063e37396d224fb3c87517e0 assets\create\blockstates\adjustable_repeater.json 9dd79bf5430f674e7d3e3fc7d59edee3d66e241e assets\create\blockstates\analog_lever.json +aaad1fc11aae17e209b0c3fbc9977c724c50c1ef assets\create\blockstates\andesite_belt_funnel.json 585481e97c5066af63ea12fa5dd658798844d64c assets\create\blockstates\andesite_bricks.json 4e8d61aa2c8490301317ef747f67f0169ebfc2ed assets\create\blockstates\andesite_bricks_slab.json da63a8be3191d6d72afef6c79e3aea3f607631f9 assets\create\blockstates\andesite_bricks_stairs.json a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets\create\blockstates\andesite_bricks_wall.json 9999a75c7766781eadb12510a09264600bc846e4 assets\create\blockstates\andesite_casing.json +7074f8af642b74edc26464bb627d919516c2de0a assets\create\blockstates\andesite_chute_funnel.json 3af4ea3c44b5ebc7e1e3fb73fb8356faf067a613 assets\create\blockstates\andesite_cobblestone.json 97adf53a7cb99d7652fb39adc957e9e34cbaca47 assets\create\blockstates\andesite_cobblestone_slab.json 96b5284693da168ab8e0809d86515b5f1a7e763f assets\create\blockstates\andesite_cobblestone_stairs.json 82bd82270aff7d51e9239680ef4dd7b5c899ceb0 assets\create\blockstates\andesite_cobblestone_wall.json +2be950008c00513dfe39021b65c26eea8554ee20 assets\create\blockstates\andesite_funnel.json 398922758a6219544e5b85c91c9cf8a543b437e5 assets\create\blockstates\andesite_pillar.json +a9f73f228f2cde7f707fab3467e57a9080233433 assets\create\blockstates\andesite_tunnel.json f9fa6aa530eb0891a74eadfbebc663172a57147a assets\create\blockstates\basin.json -96a4fae5883eda130f8ec1a57d34534f6d0793c4 assets\create\blockstates\belt.json +39dc813be2049a42475f93d12f9f2e356139cf1b assets\create\blockstates\belt.json 40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json -4325605fbdea60d5f54286c309c825bebcd74b95 assets\create\blockstates\belt_tunnel.json cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets\create\blockstates\birch_window_pane.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets\create\blockstates\black_seat.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets\create\blockstates\blue_seat.json +fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets\create\blockstates\brass_belt_funnel.json 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets\create\blockstates\brass_block.json b8dd6e505943e06706d0718ece620ab3cf943650 assets\create\blockstates\brass_casing.json +e8583247cc7108c80320b739d7af121a890d79a8 assets\create\blockstates\brass_chute_funnel.json +3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets\create\blockstates\brass_funnel.json +a967a349df6ca76b772abed915545abbca515c90 assets\create\blockstates\brass_tunnel.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets\create\blockstates\brown_seat.json 26f3b6a8f8249e4e622ab200057d75e228762817 assets\create\blockstates\cart_assembler.json 7299cea212d879d6d5611bd139b24768b9af236f assets\create\blockstates\chiseled_dark_scoria.json @@ -33,6 +40,7 @@ e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets\create\blockstates\brown_seat.js 2ca82a3c4bf7ba1a9cf3bb674e786d9b23b020a4 assets\create\blockstates\chiseled_limestone.json cbcdab42d01f8085db9e5f8db884f8adf7f17625 assets\create\blockstates\chiseled_scoria.json 291952556c52fba2af5bbd793c71af81abd27e71 assets\create\blockstates\chiseled_weathered_limestone.json +99def0a786714a337e2b1b17db844e4d1aee6234 assets\create\blockstates\chute.json 4947c261310445fa55b92038326ac82967d192dd assets\create\blockstates\clockwork_bearing.json 1f33834c685e3243882acfe20183fe64dfa872be assets\create\blockstates\clutch.json e5e3757e99c139d67b2a70288466d8a74d818841 assets\create\blockstates\cogwheel.json @@ -59,6 +67,7 @@ f86eea3f7df0988fffbe90e29b74141a7203cd15 assets\create\blockstates\dark_scoria_c f1020a33fcb1a362b6c55b5aa8ce093e47ebde09 assets\create\blockstates\dark_scoria_cobblestone_wall.json 902778a0f16b7ad009ee7b123bb583eaea32467a assets\create\blockstates\dark_scoria_pillar.json ac85f55d82d96fc15750e6b954297cfd1e00d04d assets\create\blockstates\deployer.json +3660f44309279a0347347f23ce7444c6ed98cafd assets\create\blockstates\depot.json c890ec9b3778aebb16c6b2eb2ca79bfbe7bf7435 assets\create\blockstates\diorite_bricks.json 894d5ca00c3765553deaac44b83257983acf502d assets\create\blockstates\diorite_bricks_slab.json e42f2ebe5a2fdaeed62b9bc289252664a1e8705b assets\create\blockstates\diorite_bricks_stairs.json @@ -123,7 +132,6 @@ b2a7c321b1795f20e7433f81a55ce4683de081b8 assets\create\blockstates\fancy_weather e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets\create\blockstates\flywheel.json ac00d40e1ef50a37041c0481afa1a23a14dea78e assets\create\blockstates\framed_glass.json 61df7769fa61f6dd2868a4377e54320fdd473b4e assets\create\blockstates\framed_glass_pane.json -3cc74c51eb8fc2bbe9285ad0ae640ece0a602bae assets\create\blockstates\funnel.json 3cf49f4812732f00f578fa73785e14ffdf340f21 assets\create\blockstates\furnace_engine.json f512b70d7fd0ca10184f21f5bfb71c83ab11f8ef assets\create\blockstates\gabbro.json d2358eb3d9337741f55339f0b94b2e81d73965c8 assets\create\blockstates\gabbro_bricks.json @@ -181,7 +189,7 @@ b7506b862d13b3f915c60d38bb7a20afc935f70a assets\create\blockstates\limestone_pil c793ab3aa6cf09d8d6d4136757629689f0365771 assets\create\blockstates\linked_extractor.json c5422866667331f1d5cf6753c0889747ee02762b assets\create\blockstates\linked_transposer.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets\create\blockstates\magenta_seat.json -e82e69ae4c7a784ef89fc5d954b2b01946746d48 assets\create\blockstates\mechanical_arm.json +3b3250d6e209403a93d025604a8081087965016e assets\create\blockstates\mechanical_arm.json ddcf4bb281e046fbb1026b8f46a2cf12448598df assets\create\blockstates\mechanical_bearing.json 5586beef2d9183dc34d8e8d2723620c0569592ae assets\create\blockstates\mechanical_crafter.json 044db7d50e19008bae8bf3325eac2ed0eb1ea6d2 assets\create\blockstates\mechanical_drill.json @@ -222,6 +230,7 @@ c46f0b62967cf483ec0720a9297c8ccc97f5547d assets\create\blockstates\overgrown_and 2398939c8be07cac0dcb7ea710eb98e74b408e0c assets\create\blockstates\overgrown_limestone.json fbb651b8e4a72bf0a17a6bfdbf4eef680e9d4a5c assets\create\blockstates\overgrown_scoria.json 9c8e210bdb29b2ab1535a25762498d7c03156444 assets\create\blockstates\overgrown_weathered_limestone.json +5ab323fefdbfff04aa5c224bf5f0237f0598b3b2 assets\create\blockstates\packager.json ab93ff18b747607dbc1d8d7311a2737e302b92d1 assets\create\blockstates\paved_andesite.json 89e88a0d2e7df66bac7ab11ac2c7b14812d8675f assets\create\blockstates\paved_andesite_slab.json f43d947077b3f4a11a9729c58709c56f09859da0 assets\create\blockstates\paved_andesite_stairs.json @@ -326,7 +335,6 @@ a8094531617e27a545c4815ab2062bf0ffca3633 assets\create\blockstates\turntable.jso d45450255fd7a64cfd2bd8856fd4cff01a49cc8d assets\create\blockstates\vertical_extractor.json 69dfe8afaa8eb6105dae9f76ab8b7847bf90b8c6 assets\create\blockstates\vertical_framed_glass.json c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets\create\blockstates\vertical_framed_glass_pane.json -3ecf6ddcf6d31a04b98e1d9a46a1db04278041d9 assets\create\blockstates\vertical_funnel.json 0ecc57db2487ed6b370b9cc43d2a873c61d7c37e assets\create\blockstates\vertical_linked_extractor.json 751b99625aca1b4122a0333bfaf93325d37eb003 assets\create\blockstates\vertical_linked_transposer.json 02199afb5b6ebcbc8e11567df05f39eface39e39 assets\create\blockstates\vertical_transposer.json @@ -345,8 +353,17 @@ c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets\create\blockstates\weathered_lim a3a11524cd3515fc01d905767b4b7ea782adaf03 assets\create\blockstates\yellow_seat.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets\create\blockstates\zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets\create\blockstates\zinc_ore.json -237cff4ba13aa7ab9a8c7b98e04d028195b420ab assets\create\lang\en_ud.json -147611124c17a338cf9a0869086391723ff8ab67 assets\create\lang\en_us.json +a3ab099f56df07f3ffcedceb30d1bf31b6bb9f9a assets\create\lang\en_ud.json +34fdfd3138c647dfbfc691c1806dc556e98441dd assets\create\lang\en_us.json +224278e010e3c2bd9c3e3b351d6403af88d14630 assets\create\lang\unfinished\de_de.json +ecbd3680c894786a564aa02748cbb901c3bcfbd6 assets\create\lang\unfinished\fr_fr.json +e11ffd52f43f14e4ba49608a7183b84928b8ea68 assets\create\lang\unfinished\it_it.json +a7302b0c727c53254ffe5f93d7cc139b83268e0e assets\create\lang\unfinished\ja_jp.json +4d82492bbd359d97e51d7e87e0fb9ca653c91d75 assets\create\lang\unfinished\ko_kr.json +107933935edab7e6a90195114dd91a51e645fd9d assets\create\lang\unfinished\nl_nl.json +1529beab7a5971239bcb6b0b8f219da4bd61b60b assets\create\lang\unfinished\pt_br.json +a999e6fd8ff0fb35c725792fa274205fcdbc39f9 assets\create\lang\unfinished\ru_ru.json +2b1a05ce5ec43658e974749a53c2f0d8b103f54b 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 @@ -369,6 +386,10 @@ cda6f9761431c5b8538f746db2dc55e5fb57bf01 assets\create\models\block\adjustable_p ce5e0cd1598cf2228bb77a68c304dd210f3848f8 assets\create\models\block\adjustable_repeater_powered.json c82a31943f5adb4a64c6db4c48c94cbce5d95bc4 assets\create\models\block\adjustable_repeater_powered_powering.json 51cf61f8bc25cf62b0e0c0705c75512809358ff0 assets\create\models\block\adjustable_repeater_powering.json +e4af27010c74bb5b1e79b6fccf1669526e1bb5e3 assets\create\models\block\andesite_belt_funnel_pull_extended.json +502916dc860e5ba971af51c640192b5ac02e574f assets\create\models\block\andesite_belt_funnel_pull_retracted.json +f1ba5c40d5e580d3c46d2eeab37b59263d0b0904 assets\create\models\block\andesite_belt_funnel_push_extended.json +5689f01354dcb8bf1547467c7c5b86468f962bce assets\create\models\block\andesite_belt_funnel_push_retracted.json 4d412de3eb98dfee548a0dcdbae5d0168ac67123 assets\create\models\block\andesite_bricks.json 054ef3fff7f146dbf8adc92dc2b6d169c2bdb7a5 assets\create\models\block\andesite_bricks_slab.json 8784414839f6a5786bf43d6a7dff6c27bdf7fe46 assets\create\models\block\andesite_bricks_slab_top.json @@ -378,6 +399,8 @@ c82a31943f5adb4a64c6db4c48c94cbce5d95bc4 assets\create\models\block\adjustable_r f0a955282f7abd5ce0b412ec7b59024113ca970a assets\create\models\block\andesite_bricks_wall_post.json 0ed2fa65af49b5c92c4e5c688c155e37d3d6b118 assets\create\models\block\andesite_bricks_wall_side.json b9943c5585fc081385ea49a4199efeb6c7c22423 assets\create\models\block\andesite_casing.json +d89f1a04622290303729479ce5e19768f296a297 assets\create\models\block\andesite_chute_funnel_pull.json +911cd82e8716a076a7760534de845f60db3534fb assets\create\models\block\andesite_chute_funnel_push.json 77a045e855eb37d2da7ed8f7d27a85b9546c0ab8 assets\create\models\block\andesite_cobblestone.json 7d816d54c85bc7d0cc8db9c68abcba960daa7b43 assets\create\models\block\andesite_cobblestone_slab.json 5179ecd1f926bf3211a1a3f033dfd1d2368eeb20 assets\create\models\block\andesite_cobblestone_slab_top.json @@ -386,7 +409,15 @@ 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 +9febbf6fb88e726a89573c3788bd8348ba805b6d assets\create\models\block\andesite_funnel.json b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets\create\models\block\andesite_pillar.json +01ad35140f53b2c7d3c36ce148629351ab91412b assets\create\models\block\andesite_tunnel\cross.json +cdfd39b052f0f606abfd34d9330d536d7f0f1281 assets\create\models\block\andesite_tunnel\fullshade.json +4425b48e65cc855cee37abd6c7ec1356c703e87c assets\create\models\block\andesite_tunnel\halfshade.json +1ee32dacef1840d526579ac93560f85869053e6d assets\create\models\block\andesite_tunnel\straight.json +4cf6628da4d000ef84497781853f8df31ac91d93 assets\create\models\block\andesite_tunnel\t_left.json +fc94e50b17588232db29f917e90f9659e36ec967 assets\create\models\block\andesite_tunnel\t_right.json +1405be1d4ca1aeced9a287f0d1fca5ba3cc722d2 assets\create\models\block\andesite_tunnel\window.json e8bfb63e0a4426f9d95cd111640169b218dead1b assets\create\models\block\belt_observer\detect.json a2e63810eceb028484b193ddf4315e1811950dc8 assets\create\models\block\belt_observer\detect_belt.json 034c308d46def892e6638ac0b3374849a6a88a26 assets\create\models\block\belt_observer\detect_belt_powered.json @@ -411,8 +442,29 @@ fa79580db6187c864bc8148a41987ecdd1eb03b7 assets\create\models\block\belt_observe 95d4230eb366f5e7684820c9337e3956ed34042a assets\create\models\block\birch_window_pane_side_alt.json 97d79ab99c0fb278a9b5dc54e1c6563868f87b76 assets\create\models\block\black_seat.json e58b00a7222152d7facbe0e82f00933b974df747 assets\create\models\block\blue_seat.json +7f2ed408fb662a23a75c29398e75bb9deff4c2b5 assets\create\models\block\brass_belt_funnel_pull_extended.json +242c9972e2dc70671ffef4de15a31a74b800fcb4 assets\create\models\block\brass_belt_funnel_pull_powered_extended.json +3f88752bbf2d4d635cfadb9c7217035a74ff78e3 assets\create\models\block\brass_belt_funnel_pull_powered_retracted.json +da2ae304a1b1e02b1ce03cd0205be66d824e16d6 assets\create\models\block\brass_belt_funnel_pull_retracted.json +91ba57aded6f4a99208a8812650f454b1a44fe8b assets\create\models\block\brass_belt_funnel_push_extended.json +ee79efc65b05d953784b00e573d37602629eb9e8 assets\create\models\block\brass_belt_funnel_push_powered_extended.json +1231141717d6609f0e3c282996b1739a2c790e0c assets\create\models\block\brass_belt_funnel_push_powered_retracted.json +253e88f2c11006abdc87156dd409ed3944bb7295 assets\create\models\block\brass_belt_funnel_push_retracted.json 0934933df6bfbb19a1b14cd0e3cab2c18d5a3ebc assets\create\models\block\brass_block.json 166a5c053a81e6aadc24509ed24dc144a7255969 assets\create\models\block\brass_casing.json +8c42d09a18fb17fe846365138d0f0d58c6a3c05e assets\create\models\block\brass_chute_funnel_pull.json +7b3d2865ee7611940af017161aaabc7cb107225d assets\create\models\block\brass_chute_funnel_pull_powered.json +78122dd0f7b65bd071974030682fa484c31d7ba2 assets\create\models\block\brass_chute_funnel_push.json +7edf6b5c95f61071d8a9243a63e786765d6104a3 assets\create\models\block\brass_chute_funnel_push_powered.json +6c617fc504cb2259263d24fc56c4735e455aac6d assets\create\models\block\brass_funnel.json +2f152b82291b7fc994191b1ffb8ec6d65aec748b assets\create\models\block\brass_funnel_powered.json +eed69194b5b53e285d39bf2d794e67300497bf6f assets\create\models\block\brass_tunnel\cross.json +06efb094dd1ca296614d2a15c74d2aca63503b97 assets\create\models\block\brass_tunnel\fullshade.json +da066edd238414610a14fd092f7e06705d36fd9e assets\create\models\block\brass_tunnel\halfshade.json +77fc3e676e25d84d88dc2b452b2263b366a408f6 assets\create\models\block\brass_tunnel\straight.json +11bfe6b44bbf5f5af88295317f20a91dbf6ebfcd assets\create\models\block\brass_tunnel\t_left.json +fb1a38ee7e4a58711f2f2d90edc13c8a5aedd31c assets\create\models\block\brass_tunnel\t_right.json +67d96d75e9c2b3d9e0c781c514efb85486fce0ad assets\create\models\block\brass_tunnel\window.json 4eed0ad902f5e84f2b6c160f3283e8028640e77d assets\create\models\block\brown_seat.json 028a07b49c05fe8a93f1d8c229d81e73d887c2df assets\create\models\block\chiseled_dark_scoria.json b1f9ee4867373dd8f976625bab744a1c72c7fd16 assets\create\models\block\chiseled_dolomite.json @@ -969,21 +1021,24 @@ d283f86cd05ed378efd82ce46cf49bc83783069b assets\create\models\item\andesite_bric 1ceb0e49f2c46f1d5414d5fd6edfc2bdd3afa6f7 assets\create\models\item\andesite_cobblestone_slab.json b0f664dd6de3d0ee9afcb6223fbcd53b97fa0d65 assets\create\models\item\andesite_cobblestone_stairs.json 4856d13a72ec0af9f10226b4a4bf0567eb580b9a assets\create\models\item\andesite_cobblestone_wall.json +0a9f5f6d552813029474dbbfa31e8443ed91adcd assets\create\models\item\andesite_funnel.json 75b8b00c2418b9660d35a7fabd0774925cf1c02f assets\create\models\item\andesite_pillar.json +5889a1d445c576dc23cef8ab42c76f1d6cc4bfd3 assets\create\models\item\andesite_tunnel.json bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets\create\models\item\basin.json 1da382e7e58eaa9788f5b1d92221ccac573e068f assets\create\models\item\belt_connector.json 695a69d5854e2eb134b55d855bd2b7b18808a01d assets\create\models\item\belt_observer.json -5006164d5bdb17cc5ec9759d7cdaf218e2b45f04 assets\create\models\item\belt_tunnel.json 9044243882cfd49a2827e1b910a4c9b0e46daa47 assets\create\models\item\birch_window.json 6ed49f59ea91068ef68720f43e67a9237594bdf0 assets\create\models\item\birch_window_pane.json 22632bd681c8a605f0845f7549770389a741156a assets\create\models\item\black_seat.json 0e1977585128fc0ecef640f72e5fc5e9fb47ef92 assets\create\models\item\blue_seat.json 17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets\create\models\item\brass_block.json f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets\create\models\item\brass_casing.json +ab045c951352806c3f632dda7b71573f93f60ac4 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 14ea6ee4db6e7e76446e331a70b6b6bec31e8eb7 assets\create\models\item\brass_sheet.json +7b231b9401ff151fa6b0e1361b64774b3a2051cf assets\create\models\item\brass_tunnel.json 24df6f8391d8ba09cef46e69d65d32ea770745cd assets\create\models\item\brown_seat.json 3e232a103f7f916fc11edb4d541ca99fe7b44181 assets\create\models\item\cart_assembler.json 99d64b76b3baa84c3bd4b96ccd3376ca12425950 assets\create\models\item\chiseled_dark_scoria.json @@ -992,6 +1047,7 @@ afd697168c9786eb80e54eccdc6a23afa6c7fb0e assets\create\models\item\chiseled_gabb 0cb1692f6cdd007ac690fd1f0222dde3429d136f assets\create\models\item\chiseled_limestone.json a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets\create\models\item\chiseled_scoria.json 70232ce9b88119fb383717e2c1ad113f7aad6a99 assets\create\models\item\chiseled_weathered_limestone.json +fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets\create\models\item\chute.json b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets\create\models\item\clockwork_bearing.json 0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets\create\models\item\clutch.json dcb09deae110077bcddf090996b51cc66e9a7de3 assets\create\models\item\cogwheel.json @@ -1027,6 +1083,7 @@ e67fe11e9036c81f0f54d368b41a971822a84a32 assets\create\models\item\dark_scoria_c f5b2995929ac9dca9857d4618660ffa7778d5618 assets\create\models\item\dark_scoria_pillar.json f06f56ffb1cd7c9a2b81c65f7796726692e5cc59 assets\create\models\item\deforester.json 2104c1276259ab67b94f3d4fe97e14b6bc6941ac assets\create\models\item\deployer.json +84d87f715efab45dc7bcb2e3c0870ed56fa20ee9 assets\create\models\item\depot.json a97ca9b6fc3e10a9c9409b27458a852222045e4e assets\create\models\item\diorite_bricks.json 7a28bb619d37a37ed82509d2ff395d76b4435961 assets\create\models\item\diorite_bricks_slab.json 920804b7380cca2c477d9f901e045597234246d7 assets\create\models\item\diorite_bricks_stairs.json @@ -1095,7 +1152,6 @@ e5e6fb6eb182b85b977e1025a7fe84d46de59320 assets\create\models\item\fluid_pipe.js 8707332c0cb6ee123e7962d08536a60725c64ce8 assets\create\models\item\flywheel.json d62b93d3c274d280f3eec22a28b5175943411d25 assets\create\models\item\framed_glass.json 1041d462c6e856f7f3f2365c299c0599703d1ed7 assets\create\models\item\framed_glass_pane.json -2dc08da54182756cd3520f1420d0506ab50063e1 assets\create\models\item\funnel.json 0bee2855dc9bad52e941153b87e9c35797c246ee assets\create\models\item\furnace_engine.json 090edb6a728fc3803e870d647c7c4e826faadca0 assets\create\models\item\furnace_minecart_contraption.json 2c1608c114ccc285a84e936dc3f1233c535e1a26 assets\create\models\item\gabbro.json @@ -1200,6 +1256,7 @@ e34c7bbdd4fcaa3a73c61584418bb159db49758b assets\create\models\item\overgrown_gra e73e4be7e7eafdf9635a3d72eb7fa05c2bc1e54b assets\create\models\item\overgrown_limestone.json a64a649428a2e130059f3f1f8de81b907621589f assets\create\models\item\overgrown_scoria.json 3354b93677c87bfc82807503c8d658fc6ab114e2 assets\create\models\item\overgrown_weathered_limestone.json +15baa926f7208040c437c920ae0c159a06057073 assets\create\models\item\packager.json 014530344c8b7e53531e3c09095b6ed4839d5ab8 assets\create\models\item\paved_andesite.json bd81aa53b83c2f9683c024989d0305807cf28f5a assets\create\models\item\paved_andesite_slab.json c61f409eb1a24cf76017b677579cb0423a1951c6 assets\create\models\item\paved_andesite_stairs.json @@ -1356,10 +1413,12 @@ e4e3c1bd7ecf501b40cffc26d8ad145ab4e89118 data\create\advancements\deployer.json 62f3610188f7dbd3900ab305edc2d06282705a38 data\create\advancements\goggles.json 7e12b7ccb198ef0db7964b8cbef152d8347e333c data\create\advancements\its_alive.json 3d0fc63191ef507a018ef996ebf9406a523f3976 data\create\advancements\lava_wheel.json +90393cdb6b699c9c0fd4dd9400159c3aa6911a6b data\create\advancements\mechanical_arm.json 786c2058805ceca3cd3970cc6e918560b54747f5 data\create\advancements\mechanical_drill.json 41444ae151ce90d2d68dcda0ed3565f98509c594 data\create\advancements\mechanical_saw.json 9c7f0c2484a84ccf42166704475fafcb1f232ce6 data\create\advancements\millstone.json 704c7fc0ed357b1a116ffdc0b6c64fe64e337a5a data\create\advancements\mixer.json +8085b46ca0dd8c511841cabd88e51bff4baceefd data\create\advancements\musical_arm.json a135eec618e448f440d9f42cc7a3e6c63fc45a71 data\create\advancements\overstressed.json 72025d8bf73ab8096c29f12d0c8d9a346f09cd64 data\create\advancements\polished_rose_quartz.json 1e3cd82e36fd4bcd053d652a0eead4458ed7f315 data\create\advancements\press.json @@ -1758,26 +1817,33 @@ fe37896bb804d2be9b8abf3744c5b9b7bc1c086e data\create\advancements\wand_of_symmet 417da41ebd0520ae22ddc3541eb490daf2af95dd data\create\loot_tables\blocks\adjustable_pulse_repeater.json d0ba402852cea164f6d279a9b37cc38ac3958574 data\create\loot_tables\blocks\adjustable_repeater.json 0d139e302f4a11438b0acd664c0df15b41040f69 data\create\loot_tables\blocks\analog_lever.json +d3202a337c15c8b8ec41fa5879bb94327bb75057 data\create\loot_tables\blocks\andesite_belt_funnel.json 1d04146c468ce4bf898b596c171b3ba3146d7d66 data\create\loot_tables\blocks\andesite_bricks.json b67ea51eaed1e847317829636cbf5967522e73d1 data\create\loot_tables\blocks\andesite_bricks_slab.json 0ba4528089294c5229e1904dc3191f604138cf8e data\create\loot_tables\blocks\andesite_bricks_stairs.json db2d27969cb53d9489e7c7e4bf60864fa89b29f4 data\create\loot_tables\blocks\andesite_bricks_wall.json cb36b039a511aca643fe674a63de8d6ad8478256 data\create\loot_tables\blocks\andesite_casing.json +d3202a337c15c8b8ec41fa5879bb94327bb75057 data\create\loot_tables\blocks\andesite_chute_funnel.json 906155b0d00438e695d34dd14b374d94e691460d data\create\loot_tables\blocks\andesite_cobblestone.json 6d2f1bd619b131803d5bc9e393a2c67e03c39ff6 data\create\loot_tables\blocks\andesite_cobblestone_slab.json 6b5393dab7d443da6d54debccbc8b060c6c9bdc7 data\create\loot_tables\blocks\andesite_cobblestone_stairs.json 36d38c085d8e522fe15f0ef9bc64363e163f3de7 data\create\loot_tables\blocks\andesite_cobblestone_wall.json +d3202a337c15c8b8ec41fa5879bb94327bb75057 data\create\loot_tables\blocks\andesite_funnel.json 6908f62c809ea2105bc92765d84d5655197346ab data\create\loot_tables\blocks\andesite_pillar.json +317aa99086127c649981b7b2fc85e66774a30f58 data\create\loot_tables\blocks\andesite_tunnel.json 14bf1764b9313893b6a6f57094f9506ac9fa71a8 data\create\loot_tables\blocks\basin.json c7f81e30c31837a287d6d6040cdb02c7dec11441 data\create\loot_tables\blocks\belt.json 1104e323abb2a8c25769c47dc5d1154965113cc9 data\create\loot_tables\blocks\belt_observer.json -f2acadb49cac3aa6347cae606536cbbde89f0a5f data\create\loot_tables\blocks\belt_tunnel.json 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data\create\loot_tables\blocks\birch_window.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data\create\loot_tables\blocks\birch_window_pane.json cccc209d172cc7bac76f1b4ac79085ee90742ab2 data\create\loot_tables\blocks\black_seat.json 3834f7ac2bbc42cead02d4973842adb9ad97e6bf data\create\loot_tables\blocks\blue_seat.json +1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data\create\loot_tables\blocks\brass_belt_funnel.json 70d9d4def43d5b31fa7cdc5ca5002c71cf4a90b0 data\create\loot_tables\blocks\brass_block.json 8a14258ad5d79d9e4dc5a318905644b446196420 data\create\loot_tables\blocks\brass_casing.json +1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data\create\loot_tables\blocks\brass_chute_funnel.json +1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data\create\loot_tables\blocks\brass_funnel.json +6c8e784677d1a843b6c707484c79751acdb46ebc data\create\loot_tables\blocks\brass_tunnel.json d415862a0abe20e8c5c2c8125bb672065330a9bc data\create\loot_tables\blocks\brown_seat.json 0be542fef3bc0e1a0d556883568a1400a8b97df1 data\create\loot_tables\blocks\cart_assembler.json ab820bbaaf67c6697dfbab33c05fb73b18c70bfb data\create\loot_tables\blocks\chiseled_dark_scoria.json @@ -1786,6 +1852,7 @@ ab820bbaaf67c6697dfbab33c05fb73b18c70bfb data\create\loot_tables\blocks\chiseled 4b09725707bac4c5813e2bb489ff848d0d964ae9 data\create\loot_tables\blocks\chiseled_limestone.json 43f446abd3c1c184a08645979edf620e59955a30 data\create\loot_tables\blocks\chiseled_scoria.json adde89e46b12de1eee6fd0c5cb98c5f45feefc15 data\create\loot_tables\blocks\chiseled_weathered_limestone.json +07ccc1576a71338cb73c4e06f8c28a2c86843877 data\create\loot_tables\blocks\chute.json 778b53c36d73b6e9c78fd6c091c9c3535c3c18f7 data\create\loot_tables\blocks\clockwork_bearing.json d76113310fc56eca6382d44df174096f2210d416 data\create\loot_tables\blocks\clutch.json 673ba3a5deae9133b917d16c9eb87fe4c2873c8a data\create\loot_tables\blocks\cogwheel.json @@ -1812,6 +1879,7 @@ ef1beeb856cb30d381fd4f1cb4d2bf62fc444e52 data\create\loot_tables\blocks\dark_sco 76457f3ec7c2d3874866ce8eb894f7bd9cfd59ee data\create\loot_tables\blocks\dark_scoria_cobblestone_wall.json be851f6643d151ed464e4164bc2b7ca145e5ff82 data\create\loot_tables\blocks\dark_scoria_pillar.json cf9be747e10a98f3f3aabb95c9753f39d806f73b data\create\loot_tables\blocks\deployer.json +5b46f6003bfe393b43ea0447fffcf7ae3bf969b1 data\create\loot_tables\blocks\depot.json 5c8ca846c3fb348fea628035e1670208e386516b data\create\loot_tables\blocks\diorite_bricks.json 427fea1465652db87a2c192934511b972ecfcedf data\create\loot_tables\blocks\diorite_bricks_slab.json bdaba62199f7a65e1149b742aaaf0c23a1e149b0 data\create\loot_tables\blocks\diorite_bricks_stairs.json @@ -1876,7 +1944,6 @@ c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data\create\loot_tables\blocks\fluid_pi f37526c092c645045c22674dea6c7b1ec503c9c3 data\create\loot_tables\blocks\flywheel.json ce0bb978b11935bc2d1218445f8ab18099af6b8a data\create\loot_tables\blocks\framed_glass.json 89bd90ecd7a1ce1f75bd873989cc58a84c8dcef9 data\create\loot_tables\blocks\framed_glass_pane.json -ed895ef7dcb97ad9b00d80a4fa9c331229dd532e data\create\loot_tables\blocks\funnel.json 4063880eda871fe63a4eb549a19daecabce849e5 data\create\loot_tables\blocks\furnace_engine.json 1070cba1c0f46cf7ebe31089f35333f5eadda6e4 data\create\loot_tables\blocks\gabbro.json 0356e003d8890d31b89d0ad98e32aae892da71f9 data\create\loot_tables\blocks\gabbro_bricks.json @@ -1941,7 +2008,7 @@ dee1e06d953c0ca4e37799aee9073fdd43a3dc76 data\create\loot_tables\blocks\mechanic 95fa2d3e9cf4aacc42617b1f5ddbf25eeb025770 data\create\loot_tables\blocks\mechanical_harvester.json b12efeeef5682966016ce6ea2d171eecd33d9667 data\create\loot_tables\blocks\mechanical_mixer.json 2599be757a55464af338ef0a01e3772690d7eaf8 data\create\loot_tables\blocks\mechanical_piston.json -205f5899101262f31f5c1a88bb7d954918d08d04 data\create\loot_tables\blocks\mechanical_piston_head.json +1087b6c6d88dc7c71ed81e1d3e180fe065e6d098 data\create\loot_tables\blocks\mechanical_piston_head.json d9e217fcc668a04ee495968f8ccf9966271b6cea data\create\loot_tables\blocks\mechanical_plough.json 0e0742d066bda87ba5cc835a4028efb99e70b2f2 data\create\loot_tables\blocks\mechanical_press.json e94a78187bcf7f235244b2c656732ba9a5821dd0 data\create\loot_tables\blocks\mechanical_pump.json @@ -1975,6 +2042,7 @@ bab9f6fb35f2ba4aa45fd726a8e94f90ef155bfb data\create\loot_tables\blocks\overgrow 4b4acf9026d68de21b5804903556a505f913a778 data\create\loot_tables\blocks\overgrown_limestone.json e0fc59a8645dae8f87e62b34c08014077e14de66 data\create\loot_tables\blocks\overgrown_scoria.json 8af10a6b2d07ed1b84ce617502ad68044262e701 data\create\loot_tables\blocks\overgrown_weathered_limestone.json +131cb27de9d0b44d2ec335055558b8039d6d5fb9 data\create\loot_tables\blocks\packager.json fc529ec8d55abf361ba1b8c38875839530b082c6 data\create\loot_tables\blocks\paved_andesite.json 3658337cb8a5a6cdd7dd19dd8ac399b1397350d5 data\create\loot_tables\blocks\paved_andesite_slab.json 4dbc7c7537e680e4e7c8a5ba4e4ed394d788b10d data\create\loot_tables\blocks\paved_andesite_stairs.json @@ -2079,7 +2147,6 @@ b201436ae6d2ad5a7d47dca0ee8c7016b4c28fa5 data\create\loot_tables\blocks\transpos 5a47c1535c866184b4ffca65763f5676f319e0aa data\create\loot_tables\blocks\vertical_extractor.json 028e293b5cd694017962f67dc80dba719f904e28 data\create\loot_tables\blocks\vertical_framed_glass.json d0156602dd5f4a274c293df67e19374820c72890 data\create\loot_tables\blocks\vertical_framed_glass_pane.json -ed895ef7dcb97ad9b00d80a4fa9c331229dd532e data\create\loot_tables\blocks\vertical_funnel.json dac789cf53b00eed34308848b5e267b7ccec090c data\create\loot_tables\blocks\vertical_linked_extractor.json 7af5a13c9e10903b11732fbc01ae3299328216f0 data\create\loot_tables\blocks\vertical_linked_transposer.json b201436ae6d2ad5a7d47dca0ee8c7016b4c28fa5 data\create\loot_tables\blocks\vertical_transposer.json @@ -2474,6 +2541,8 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data\create\recipes\weathered_limestone 6eceb25fabbb6b389ca35de3b829ad061c9c456a data\create\recipes\weathered_limestone_pillar.json 11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data\create\recipes\weathered_limestone_pillar_from_weathered_limestone_stonecutting.json 266f08e604d229a9d2b46f7272c0b06ec270bf3d data\create\recipes\zinc_block.json +403576ae5710d4fe731144fe623b1673093076ea data\create\tags\blocks\brittle.json +081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data\create\tags\items\create_ingots.json d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data\create\tags\items\crushed_ores.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data\forge\tags\blocks\glass\colorless.json 81ced867d24ec814942909965dd4576eff1db685 data\forge\tags\blocks\glass_panes.json @@ -2482,16 +2551,21 @@ d5ea262a0f5fb210612d22521818e26cf08e591a data\forge\tags\blocks\ores\zinc.json ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data\forge\tags\blocks\storage_blocks\brass.json f6c8f34ceb475546dba5cc6ff288863ea795d20b data\forge\tags\blocks\storage_blocks\copper.json 7f71a774800111e50b42de0e6159ed2d2a807d32 data\forge\tags\blocks\storage_blocks\zinc.json +d9ffc62a496946fc4848934e7c0a6e917337f8be data\forge\tags\items\beacon_payment.json +05ca51cdc60a5e109b5a0e3b782de13d34ebcb24 data\forge\tags\items\cobblestone.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data\forge\tags\items\glass\colorless.json 81ced867d24ec814942909965dd4576eff1db685 data\forge\tags\items\glass_panes.json +d9ffc62a496946fc4848934e7c0a6e917337f8be data\forge\tags\items\ingots.json 2dfd21017cb51d4bdc18d977a7d16f103cc3a985 data\forge\tags\items\ingots\brass.json 8e0ca32df10a50544f54fbe3dbfe485971b23315 data\forge\tags\items\ingots\copper.json 2f9ac80569a5cc168061742f9e3c36277d4d056e data\forge\tags\items\ingots\zinc.json +bcf15289cbadd429a48bd9accb4d2d5f75353a61 data\forge\tags\items\nuggets.json cc82188fe8d986f4457301ed4f75ae833d263601 data\forge\tags\items\nuggets\brass.json 7affb30e30a252566a77467994b0c99331f1076c data\forge\tags\items\nuggets\copper.json 0d8cb5092ee6ec01ea09324c80d649ba05549799 data\forge\tags\items\nuggets\zinc.json 4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data\forge\tags\items\ores\copper.json d5ea262a0f5fb210612d22521818e26cf08e591a data\forge\tags\items\ores\zinc.json +5d5ec04a61ff2b1ad19210e2859a9c96cc246ef8 data\forge\tags\items\plates.json 39f0d70ec10597e85df7c4783bbc5e0e4a5ffb80 data\forge\tags\items\plates\brass.json c3dab5fe379bc1b7b10d4a0ba7009eee1b75a27c data\forge\tags\items\plates\copper.json fb9bfb4c84ed9cf2da8c4b2fbc4cd4d9f37d3016 data\forge\tags\items\plates\gold.json diff --git a/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json new file mode 100644 index 000000000..750bc272b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json @@ -0,0 +1,64 @@ +{ + "variants": { + "facing=north,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_retracted" + }, + "facing=south,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_retracted", + "y": 180 + }, + "facing=west,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_retracted", + "y": 270 + }, + "facing=east,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_retracted", + "y": 90 + }, + "facing=north,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_retracted" + }, + "facing=south,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_retracted", + "y": 180 + }, + "facing=west,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_retracted", + "y": 270 + }, + "facing=east,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_retracted", + "y": 90 + }, + "facing=north,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_extended" + }, + "facing=south,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_extended", + "y": 180 + }, + "facing=west,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_extended", + "y": 270 + }, + "facing=east,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_extended", + "y": 90 + }, + "facing=north,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_extended" + }, + "facing=south,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_extended", + "y": 180 + }, + "facing=west,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_extended", + "y": 270 + }, + "facing=east,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/andesite_chute_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_chute_funnel.json new file mode 100644 index 000000000..cea68cada --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_chute_funnel.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,pushing=false": { + "model": "create:block/andesite_chute_funnel_pull" + }, + "facing=south,pushing=false": { + "model": "create:block/andesite_chute_funnel_pull", + "y": 180 + }, + "facing=west,pushing=false": { + "model": "create:block/andesite_chute_funnel_pull", + "y": 270 + }, + "facing=east,pushing=false": { + "model": "create:block/andesite_chute_funnel_pull", + "y": 90 + }, + "facing=north,pushing=true": { + "model": "create:block/andesite_chute_funnel_push" + }, + "facing=south,pushing=true": { + "model": "create:block/andesite_chute_funnel_push", + "y": 180 + }, + "facing=west,pushing=true": { + "model": "create:block/andesite_chute_funnel_push", + "y": 270 + }, + "facing=east,pushing=true": { + "model": "create:block/andesite_chute_funnel_push", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/andesite_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_funnel.json new file mode 100644 index 000000000..29e935e43 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_funnel.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/andesite_funnel", + "x": 180 + }, + "facing=up": { + "model": "create:block/andesite_funnel" + }, + "facing=north": { + "model": "create:block/andesite_funnel", + "x": 90 + }, + "facing=south": { + "model": "create:block/andesite_funnel", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/andesite_funnel", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/andesite_funnel", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/andesite_tunnel.json b/src/generated/resources/assets/create/blockstates/andesite_tunnel.json new file mode 100644 index 000000000..152534c34 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_tunnel.json @@ -0,0 +1,53 @@ +{ + "variants": { + "axis=x,shape=straight": { + "model": "create:block/andesite_tunnel/straight" + }, + "axis=z,shape=straight": { + "model": "create:block/andesite_tunnel/straight", + "y": 90 + }, + "axis=x,shape=window": { + "model": "create:block/andesite_tunnel/window" + }, + "axis=z,shape=window": { + "model": "create:block/andesite_tunnel/window", + "y": 90 + }, + "axis=x,shape=halfshade": { + "model": "create:block/andesite_tunnel/halfshade" + }, + "axis=z,shape=halfshade": { + "model": "create:block/andesite_tunnel/halfshade", + "y": 90 + }, + "axis=x,shape=fullshade": { + "model": "create:block/andesite_tunnel/fullshade" + }, + "axis=z,shape=fullshade": { + "model": "create:block/andesite_tunnel/fullshade", + "y": 90 + }, + "axis=x,shape=t_left": { + "model": "create:block/andesite_tunnel/t_left" + }, + "axis=z,shape=t_left": { + "model": "create:block/andesite_tunnel/t_left", + "y": 90 + }, + "axis=x,shape=t_right": { + "model": "create:block/andesite_tunnel/t_right" + }, + "axis=z,shape=t_right": { + "model": "create:block/andesite_tunnel/t_right", + "y": 90 + }, + "axis=x,shape=cross": { + "model": "create:block/andesite_tunnel/cross" + }, + "axis=z,shape=cross": { + "model": "create:block/andesite_tunnel/cross", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/belt.json b/src/generated/resources/assets/create/blockstates/belt.json index d259d6504..2c9de12cc 100644 --- a/src/generated/resources/assets/create/blockstates/belt.json +++ b/src/generated/resources/assets/create/blockstates/belt.json @@ -125,7 +125,7 @@ "y": 180 }, "casing=true,facing=north,part=start,slope=upward": { - "model": "create:block/belt_casing/diagonal_end" + "model": "create:block/belt_casing/diagonal_start" }, "casing=false,facing=south,part=start,slope=upward": { "model": "create:block/belt/upward_start" @@ -147,7 +147,7 @@ "y": 270 }, "casing=true,facing=east,part=start,slope=upward": { - "model": "create:block/belt_casing/diagonal_end", + "model": "create:block/belt_casing/diagonal_start", "y": 90 }, "casing=false,facing=north,part=middle,slope=upward": { @@ -185,7 +185,7 @@ "y": 180 }, "casing=true,facing=north,part=end,slope=upward": { - "model": "create:block/belt_casing/diagonal_start" + "model": "create:block/belt_casing/diagonal_end" }, "casing=false,facing=south,part=end,slope=upward": { "model": "create:block/belt/upward_end" @@ -207,7 +207,7 @@ "y": 270 }, "casing=true,facing=east,part=end,slope=upward": { - "model": "create:block/belt_casing/diagonal_start", + "model": "create:block/belt_casing/diagonal_end", "y": 90 }, "casing=false,facing=north,part=pulley,slope=upward": { @@ -252,14 +252,14 @@ "model": "create:block/belt/downward_start" }, "casing=true,facing=south,part=start,slope=downward": { - "model": "create:block/belt_casing/diagonal_start" + "model": "create:block/belt_casing/diagonal_end" }, "casing=false,facing=west,part=start,slope=downward": { "model": "create:block/belt/downward_start", "y": 90 }, "casing=true,facing=west,part=start,slope=downward": { - "model": "create:block/belt_casing/diagonal_start", + "model": "create:block/belt_casing/diagonal_end", "y": 90 }, "casing=false,facing=east,part=start,slope=downward": { @@ -312,14 +312,14 @@ "model": "create:block/belt/downward_end" }, "casing=true,facing=south,part=end,slope=downward": { - "model": "create:block/belt_casing/diagonal_end" + "model": "create:block/belt_casing/diagonal_start" }, "casing=false,facing=west,part=end,slope=downward": { "model": "create:block/belt/downward_end", "y": 90 }, "casing=true,facing=west,part=end,slope=downward": { - "model": "create:block/belt_casing/diagonal_end", + "model": "create:block/belt_casing/diagonal_start", "y": 90 }, "casing=false,facing=east,part=end,slope=downward": { @@ -366,17 +366,18 @@ "y": 180 }, "casing=true,facing=north,part=start,slope=vertical": { - "model": "create:block/belt_casing/vertical_start", + "model": "create:block/belt_casing/sideways_end", "x": 90, - "y": 180 + "y": 270 }, "casing=false,facing=south,part=start,slope=vertical": { "model": "create:block/belt/horizontal_start", "x": 90 }, "casing=true,facing=south,part=start,slope=vertical": { - "model": "create:block/belt_casing/vertical_start", - "x": 90 + "model": "create:block/belt_casing/sideways_start", + "x": 90, + "y": 90 }, "casing=false,facing=west,part=start,slope=vertical": { "model": "create:block/belt/horizontal_end", @@ -384,9 +385,9 @@ "y": 90 }, "casing=true,facing=west,part=start,slope=vertical": { - "model": "create:block/belt_casing/vertical_start", + "model": "create:block/belt_casing/sideways_end", "x": 90, - "y": 90 + "y": 180 }, "casing=false,facing=east,part=start,slope=vertical": { "model": "create:block/belt/horizontal_start", @@ -394,9 +395,8 @@ "y": 270 }, "casing=true,facing=east,part=start,slope=vertical": { - "model": "create:block/belt_casing/vertical_start", - "x": 90, - "y": 270 + "model": "create:block/belt_casing/sideways_start", + "x": 90 }, "casing=false,facing=north,part=middle,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -404,17 +404,18 @@ "y": 180 }, "casing=true,facing=north,part=middle,slope=vertical": { - "model": "create:block/belt_casing/vertical_middle", + "model": "create:block/belt_casing/sideways_middle", "x": 90, - "y": 180 + "y": 270 }, "casing=false,facing=south,part=middle,slope=vertical": { "model": "create:block/belt/horizontal_middle", "x": 90 }, "casing=true,facing=south,part=middle,slope=vertical": { - "model": "create:block/belt_casing/vertical_middle", - "x": 90 + "model": "create:block/belt_casing/sideways_middle", + "x": 90, + "y": 90 }, "casing=false,facing=west,part=middle,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -422,9 +423,9 @@ "y": 90 }, "casing=true,facing=west,part=middle,slope=vertical": { - "model": "create:block/belt_casing/vertical_middle", + "model": "create:block/belt_casing/sideways_middle", "x": 90, - "y": 90 + "y": 180 }, "casing=false,facing=east,part=middle,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -432,9 +433,8 @@ "y": 270 }, "casing=true,facing=east,part=middle,slope=vertical": { - "model": "create:block/belt_casing/vertical_middle", - "x": 90, - "y": 270 + "model": "create:block/belt_casing/sideways_middle", + "x": 90 }, "casing=false,facing=north,part=end,slope=vertical": { "model": "create:block/belt/horizontal_start", @@ -442,17 +442,18 @@ "y": 180 }, "casing=true,facing=north,part=end,slope=vertical": { - "model": "create:block/belt_casing/vertical_end", + "model": "create:block/belt_casing/sideways_start", "x": 90, - "y": 180 + "y": 270 }, "casing=false,facing=south,part=end,slope=vertical": { "model": "create:block/belt/horizontal_end", "x": 90 }, "casing=true,facing=south,part=end,slope=vertical": { - "model": "create:block/belt_casing/vertical_end", - "x": 90 + "model": "create:block/belt_casing/sideways_end", + "x": 90, + "y": 90 }, "casing=false,facing=west,part=end,slope=vertical": { "model": "create:block/belt/horizontal_start", @@ -460,9 +461,9 @@ "y": 90 }, "casing=true,facing=west,part=end,slope=vertical": { - "model": "create:block/belt_casing/vertical_end", + "model": "create:block/belt_casing/sideways_start", "x": 90, - "y": 90 + "y": 180 }, "casing=false,facing=east,part=end,slope=vertical": { "model": "create:block/belt/horizontal_end", @@ -470,9 +471,8 @@ "y": 270 }, "casing=true,facing=east,part=end,slope=vertical": { - "model": "create:block/belt_casing/vertical_end", - "x": 90, - "y": 270 + "model": "create:block/belt_casing/sideways_end", + "x": 90 }, "casing=false,facing=north,part=pulley,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -480,17 +480,18 @@ "y": 180 }, "casing=true,facing=north,part=pulley,slope=vertical": { - "model": "create:block/belt_casing/vertical_pulley", + "model": "create:block/belt_casing/sideways_pulley", "x": 90, - "y": 180 + "y": 270 }, "casing=false,facing=south,part=pulley,slope=vertical": { "model": "create:block/belt/horizontal_middle", "x": 90 }, "casing=true,facing=south,part=pulley,slope=vertical": { - "model": "create:block/belt_casing/vertical_pulley", - "x": 90 + "model": "create:block/belt_casing/sideways_pulley", + "x": 90, + "y": 90 }, "casing=false,facing=west,part=pulley,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -498,9 +499,9 @@ "y": 90 }, "casing=true,facing=west,part=pulley,slope=vertical": { - "model": "create:block/belt_casing/vertical_pulley", + "model": "create:block/belt_casing/sideways_pulley", "x": 90, - "y": 90 + "y": 180 }, "casing=false,facing=east,part=pulley,slope=vertical": { "model": "create:block/belt/horizontal_middle", @@ -508,8 +509,143 @@ "y": 270 }, "casing=true,facing=east,part=pulley,slope=vertical": { - "model": "create:block/belt_casing/vertical_pulley", - "x": 90, + "model": "create:block/belt_casing/sideways_pulley", + "x": 90 + }, + "casing=false,facing=north,part=start,slope=sideways": { + "model": "create:block/belt/sideways_end", + "x": 180, + "y": 180 + }, + "casing=true,facing=north,part=start,slope=sideways": { + "model": "create:block/belt_casing/sideways_end", + "x": 180, + "y": 180 + }, + "casing=false,facing=south,part=start,slope=sideways": { + "model": "create:block/belt/sideways_start" + }, + "casing=true,facing=south,part=start,slope=sideways": { + "model": "create:block/belt_casing/sideways_start" + }, + "casing=false,facing=west,part=start,slope=sideways": { + "model": "create:block/belt/sideways_end", + "x": 180, + "y": 90 + }, + "casing=true,facing=west,part=start,slope=sideways": { + "model": "create:block/belt_casing/sideways_end", + "x": 180, + "y": 90 + }, + "casing=false,facing=east,part=start,slope=sideways": { + "model": "create:block/belt/sideways_start", + "y": 270 + }, + "casing=true,facing=east,part=start,slope=sideways": { + "model": "create:block/belt_casing/sideways_start", + "y": 270 + }, + "casing=false,facing=north,part=middle,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "x": 180, + "y": 180 + }, + "casing=true,facing=north,part=middle,slope=sideways": { + "model": "create:block/belt_casing/sideways_middle", + "x": 180, + "y": 180 + }, + "casing=false,facing=south,part=middle,slope=sideways": { + "model": "create:block/belt/sideways_middle" + }, + "casing=true,facing=south,part=middle,slope=sideways": { + "model": "create:block/belt_casing/sideways_middle" + }, + "casing=false,facing=west,part=middle,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "x": 180, + "y": 90 + }, + "casing=true,facing=west,part=middle,slope=sideways": { + "model": "create:block/belt_casing/sideways_middle", + "x": 180, + "y": 90 + }, + "casing=false,facing=east,part=middle,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "y": 270 + }, + "casing=true,facing=east,part=middle,slope=sideways": { + "model": "create:block/belt_casing/sideways_middle", + "y": 270 + }, + "casing=false,facing=north,part=end,slope=sideways": { + "model": "create:block/belt/sideways_start", + "x": 180, + "y": 180 + }, + "casing=true,facing=north,part=end,slope=sideways": { + "model": "create:block/belt_casing/sideways_start", + "x": 180, + "y": 180 + }, + "casing=false,facing=south,part=end,slope=sideways": { + "model": "create:block/belt/sideways_end" + }, + "casing=true,facing=south,part=end,slope=sideways": { + "model": "create:block/belt_casing/sideways_end" + }, + "casing=false,facing=west,part=end,slope=sideways": { + "model": "create:block/belt/sideways_start", + "x": 180, + "y": 90 + }, + "casing=true,facing=west,part=end,slope=sideways": { + "model": "create:block/belt_casing/sideways_start", + "x": 180, + "y": 90 + }, + "casing=false,facing=east,part=end,slope=sideways": { + "model": "create:block/belt/sideways_end", + "y": 270 + }, + "casing=true,facing=east,part=end,slope=sideways": { + "model": "create:block/belt_casing/sideways_end", + "y": 270 + }, + "casing=false,facing=north,part=pulley,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "x": 180, + "y": 180 + }, + "casing=true,facing=north,part=pulley,slope=sideways": { + "model": "create:block/belt_casing/sideways_pulley", + "x": 180, + "y": 180 + }, + "casing=false,facing=south,part=pulley,slope=sideways": { + "model": "create:block/belt/sideways_middle" + }, + "casing=true,facing=south,part=pulley,slope=sideways": { + "model": "create:block/belt_casing/sideways_pulley" + }, + "casing=false,facing=west,part=pulley,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "x": 180, + "y": 90 + }, + "casing=true,facing=west,part=pulley,slope=sideways": { + "model": "create:block/belt_casing/sideways_pulley", + "x": 180, + "y": 90 + }, + "casing=false,facing=east,part=pulley,slope=sideways": { + "model": "create:block/belt/sideways_middle", + "y": 270 + }, + "casing=true,facing=east,part=pulley,slope=sideways": { + "model": "create:block/belt_casing/sideways_pulley", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/belt_tunnel.json b/src/generated/resources/assets/create/blockstates/belt_tunnel.json deleted file mode 100644 index b3f8cbd90..000000000 --- a/src/generated/resources/assets/create/blockstates/belt_tunnel.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "variants": { - "axis=x,shape=straight": { - "model": "create:block/belt_tunnel/straight" - }, - "axis=z,shape=straight": { - "model": "create:block/belt_tunnel/straight", - "y": 90 - }, - "axis=x,shape=window": { - "model": "create:block/belt_tunnel/window" - }, - "axis=z,shape=window": { - "model": "create:block/belt_tunnel/window", - "y": 90 - }, - "axis=x,shape=halfshade": { - "model": "create:block/belt_tunnel/halfshade" - }, - "axis=z,shape=halfshade": { - "model": "create:block/belt_tunnel/halfshade", - "y": 90 - }, - "axis=x,shape=fullshade": { - "model": "create:block/belt_tunnel/fullshade" - }, - "axis=z,shape=fullshade": { - "model": "create:block/belt_tunnel/fullshade", - "y": 90 - }, - "axis=x,shape=t_left": { - "model": "create:block/belt_tunnel/t_left" - }, - "axis=z,shape=t_left": { - "model": "create:block/belt_tunnel/t_left", - "y": 90 - }, - "axis=x,shape=t_right": { - "model": "create:block/belt_tunnel/t_right" - }, - "axis=z,shape=t_right": { - "model": "create:block/belt_tunnel/t_right", - "y": 90 - }, - "axis=x,shape=cross": { - "model": "create:block/belt_tunnel/cross" - }, - "axis=z,shape=cross": { - "model": "create:block/belt_tunnel/cross", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json b/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json new file mode 100644 index 000000000..779a55e87 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=north,powered=false,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_retracted" + }, + "facing=south,powered=false,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_retracted", + "y": 180 + }, + "facing=west,powered=false,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_retracted", + "y": 270 + }, + "facing=east,powered=false,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_retracted", + "y": 90 + }, + "facing=north,powered=true,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_powered_retracted" + }, + "facing=south,powered=true,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "y": 180 + }, + "facing=west,powered=true,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "y": 270 + }, + "facing=east,powered=true,pushing=false,shape=retracted": { + "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "y": 90 + }, + "facing=north,powered=false,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_retracted" + }, + "facing=south,powered=false,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_retracted", + "y": 180 + }, + "facing=west,powered=false,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_retracted", + "y": 270 + }, + "facing=east,powered=false,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_retracted", + "y": 90 + }, + "facing=north,powered=true,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_powered_retracted" + }, + "facing=south,powered=true,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_powered_retracted", + "y": 180 + }, + "facing=west,powered=true,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_powered_retracted", + "y": 270 + }, + "facing=east,powered=true,pushing=true,shape=retracted": { + "model": "create:block/brass_belt_funnel_push_powered_retracted", + "y": 90 + }, + "facing=north,powered=false,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_extended" + }, + "facing=south,powered=false,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_extended", + "y": 180 + }, + "facing=west,powered=false,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_extended", + "y": 270 + }, + "facing=east,powered=false,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_extended", + "y": 90 + }, + "facing=north,powered=true,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_powered_extended" + }, + "facing=south,powered=true,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_powered_extended", + "y": 180 + }, + "facing=west,powered=true,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_powered_extended", + "y": 270 + }, + "facing=east,powered=true,pushing=false,shape=extended": { + "model": "create:block/brass_belt_funnel_pull_powered_extended", + "y": 90 + }, + "facing=north,powered=false,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_extended" + }, + "facing=south,powered=false,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_extended", + "y": 180 + }, + "facing=west,powered=false,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_extended", + "y": 270 + }, + "facing=east,powered=false,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_extended", + "y": 90 + }, + "facing=north,powered=true,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_powered_extended" + }, + "facing=south,powered=true,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_powered_extended", + "y": 180 + }, + "facing=west,powered=true,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_powered_extended", + "y": 270 + }, + "facing=east,powered=true,pushing=true,shape=extended": { + "model": "create:block/brass_belt_funnel_push_powered_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_chute_funnel.json b/src/generated/resources/assets/create/blockstates/brass_chute_funnel.json new file mode 100644 index 000000000..0e5f38388 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_chute_funnel.json @@ -0,0 +1,64 @@ +{ + "variants": { + "facing=north,powered=false,pushing=false": { + "model": "create:block/brass_chute_funnel_pull" + }, + "facing=south,powered=false,pushing=false": { + "model": "create:block/brass_chute_funnel_pull", + "y": 180 + }, + "facing=west,powered=false,pushing=false": { + "model": "create:block/brass_chute_funnel_pull", + "y": 270 + }, + "facing=east,powered=false,pushing=false": { + "model": "create:block/brass_chute_funnel_pull", + "y": 90 + }, + "facing=north,powered=true,pushing=false": { + "model": "create:block/brass_chute_funnel_pull_powered" + }, + "facing=south,powered=true,pushing=false": { + "model": "create:block/brass_chute_funnel_pull_powered", + "y": 180 + }, + "facing=west,powered=true,pushing=false": { + "model": "create:block/brass_chute_funnel_pull_powered", + "y": 270 + }, + "facing=east,powered=true,pushing=false": { + "model": "create:block/brass_chute_funnel_pull_powered", + "y": 90 + }, + "facing=north,powered=false,pushing=true": { + "model": "create:block/brass_chute_funnel_push" + }, + "facing=south,powered=false,pushing=true": { + "model": "create:block/brass_chute_funnel_push", + "y": 180 + }, + "facing=west,powered=false,pushing=true": { + "model": "create:block/brass_chute_funnel_push", + "y": 270 + }, + "facing=east,powered=false,pushing=true": { + "model": "create:block/brass_chute_funnel_push", + "y": 90 + }, + "facing=north,powered=true,pushing=true": { + "model": "create:block/brass_chute_funnel_push_powered" + }, + "facing=south,powered=true,pushing=true": { + "model": "create:block/brass_chute_funnel_push_powered", + "y": 180 + }, + "facing=west,powered=true,pushing=true": { + "model": "create:block/brass_chute_funnel_push_powered", + "y": 270 + }, + "facing=east,powered=true,pushing=true": { + "model": "create:block/brass_chute_funnel_push_powered", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_funnel.json b/src/generated/resources/assets/create/blockstates/brass_funnel.json new file mode 100644 index 000000000..bd9c61333 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_funnel.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,powered=false": { + "model": "create:block/brass_funnel", + "x": 180 + }, + "facing=up,powered=false": { + "model": "create:block/brass_funnel" + }, + "facing=north,powered=false": { + "model": "create:block/brass_funnel", + "x": 90 + }, + "facing=south,powered=false": { + "model": "create:block/brass_funnel", + "x": 90, + "y": 180 + }, + "facing=west,powered=false": { + "model": "create:block/brass_funnel", + "x": 90, + "y": 270 + }, + "facing=east,powered=false": { + "model": "create:block/brass_funnel", + "x": 90, + "y": 90 + }, + "facing=down,powered=true": { + "model": "create:block/brass_funnel_powered", + "x": 180 + }, + "facing=up,powered=true": { + "model": "create:block/brass_funnel_powered" + }, + "facing=north,powered=true": { + "model": "create:block/brass_funnel_powered", + "x": 90 + }, + "facing=south,powered=true": { + "model": "create:block/brass_funnel_powered", + "x": 90, + "y": 180 + }, + "facing=west,powered=true": { + "model": "create:block/brass_funnel_powered", + "x": 90, + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/brass_funnel_powered", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_tunnel.json b/src/generated/resources/assets/create/blockstates/brass_tunnel.json new file mode 100644 index 000000000..05e7de04f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_tunnel.json @@ -0,0 +1,53 @@ +{ + "variants": { + "axis=x,shape=straight": { + "model": "create:block/brass_tunnel/straight" + }, + "axis=z,shape=straight": { + "model": "create:block/brass_tunnel/straight", + "y": 90 + }, + "axis=x,shape=window": { + "model": "create:block/brass_tunnel/window" + }, + "axis=z,shape=window": { + "model": "create:block/brass_tunnel/window", + "y": 90 + }, + "axis=x,shape=halfshade": { + "model": "create:block/brass_tunnel/halfshade" + }, + "axis=z,shape=halfshade": { + "model": "create:block/brass_tunnel/halfshade", + "y": 90 + }, + "axis=x,shape=fullshade": { + "model": "create:block/brass_tunnel/fullshade" + }, + "axis=z,shape=fullshade": { + "model": "create:block/brass_tunnel/fullshade", + "y": 90 + }, + "axis=x,shape=t_left": { + "model": "create:block/brass_tunnel/t_left" + }, + "axis=z,shape=t_left": { + "model": "create:block/brass_tunnel/t_left", + "y": 90 + }, + "axis=x,shape=t_right": { + "model": "create:block/brass_tunnel/t_right" + }, + "axis=z,shape=t_right": { + "model": "create:block/brass_tunnel/t_right", + "y": 90 + }, + "axis=x,shape=cross": { + "model": "create:block/brass_tunnel/cross" + }, + "axis=z,shape=cross": { + "model": "create:block/brass_tunnel/cross", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/chute.json b/src/generated/resources/assets/create/blockstates/chute.json new file mode 100644 index 000000000..b976d52b6 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/chute.json @@ -0,0 +1,58 @@ +{ + "variants": { + "facing=down,shape=start": { + "model": "create:block/chute/block_windowed" + }, + "facing=north,shape=start": { + "model": "create:block/chute/block_diagonal_start", + "y": 180 + }, + "facing=south,shape=start": { + "model": "create:block/chute/block_diagonal_start" + }, + "facing=west,shape=start": { + "model": "create:block/chute/block_diagonal_start", + "y": 90 + }, + "facing=east,shape=start": { + "model": "create:block/chute/block_diagonal_start", + "y": 270 + }, + "facing=down,shape=window_straight": { + "model": "create:block/chute/block_windowed" + }, + "facing=north,shape=window_straight": { + "model": "create:block/chute/block_diagonal_straight", + "y": 180 + }, + "facing=south,shape=window_straight": { + "model": "create:block/chute/block_diagonal_straight" + }, + "facing=west,shape=window_straight": { + "model": "create:block/chute/block_diagonal_straight", + "y": 90 + }, + "facing=east,shape=window_straight": { + "model": "create:block/chute/block_diagonal_straight", + "y": 270 + }, + "facing=down,shape=normal": { + "model": "create:block/chute/block" + }, + "facing=north,shape=normal": { + "model": "create:block/chute/block_diagonal", + "y": 180 + }, + "facing=south,shape=normal": { + "model": "create:block/chute/block_diagonal" + }, + "facing=west,shape=normal": { + "model": "create:block/chute/block_diagonal", + "y": 90 + }, + "facing=east,shape=normal": { + "model": "create:block/chute/block_diagonal", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/depot.json b/src/generated/resources/assets/create/blockstates/depot.json new file mode 100644 index 000000000..f1af801d0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/depot.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/depot/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/funnel.json b/src/generated/resources/assets/create/blockstates/funnel.json deleted file mode 100644 index 303155a12..000000000 --- a/src/generated/resources/assets/create/blockstates/funnel.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "variants": { - "belt=false,facing=north": { - "model": "create:block/funnel/horizontal" - }, - "belt=true,facing=north": { - "model": "create:block/funnel/horizontal_belt" - }, - "belt=false,facing=south": { - "model": "create:block/funnel/horizontal", - "y": 180 - }, - "belt=true,facing=south": { - "model": "create:block/funnel/horizontal_belt", - "y": 180 - }, - "belt=false,facing=west": { - "model": "create:block/funnel/horizontal", - "y": 270 - }, - "belt=true,facing=west": { - "model": "create:block/funnel/horizontal_belt", - "y": 270 - }, - "belt=false,facing=east": { - "model": "create:block/funnel/horizontal", - "y": 90 - }, - "belt=true,facing=east": { - "model": "create:block/funnel/horizontal_belt", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/mechanical_arm.json b/src/generated/resources/assets/create/blockstates/mechanical_arm.json index c4754cb1a..b283c0432 100644 --- a/src/generated/resources/assets/create/blockstates/mechanical_arm.json +++ b/src/generated/resources/assets/create/blockstates/mechanical_arm.json @@ -1,7 +1,11 @@ { "variants": { - "": { + "ceiling=false": { "model": "create:block/mechanical_arm/block" + }, + "ceiling=true": { + "model": "create:block/mechanical_arm/block", + "x": 180 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json new file mode 100644 index 000000000..6236aa5cd --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -0,0 +1,11 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/packager/block", + "y": 90 + }, + "axis=z": { + "model": "create:block/packager/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/vertical_funnel.json b/src/generated/resources/assets/create/blockstates/vertical_funnel.json deleted file mode 100644 index 2b4f2a6f2..000000000 --- a/src/generated/resources/assets/create/blockstates/vertical_funnel.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "variants": { - "facing=north,upward=false": { - "model": "create:block/funnel/vertical", - "x": 90, - "y": 180 - }, - "facing=south,upward=false": { - "model": "create:block/funnel/vertical", - "x": 90 - }, - "facing=west,upward=false": { - "model": "create:block/funnel/vertical", - "x": 90, - "y": 90 - }, - "facing=east,upward=false": { - "model": "create:block/funnel/vertical", - "x": 90, - "y": 270 - }, - "facing=north,upward=true": { - "model": "create:block/funnel/vertical", - "x": 270 - }, - "facing=south,upward=true": { - "model": "create:block/funnel/vertical", - "x": 270, - "y": 180 - }, - "facing=west,upward=true": { - "model": "create:block/funnel/vertical", - "x": 270, - "y": 270 - }, - "facing=east,upward=true": { - "model": "create:block/funnel/vertical", - "x": 270, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index c8ea29be7..c8cd0c956 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -6,26 +6,33 @@ "block.create.adjustable_pulse_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DDs\u05DFn\u0500 \u01DD\u05DFq\u0250\u0287sn\u0638p\u2C6F", "block.create.adjustable_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DD\u05DFq\u0250\u0287sn\u0638p\u2C6F", "block.create.analog_lever": "\u0279\u01DD\u028C\u01DD\uA780 bo\u05DF\u0250u\u2C6F", + "block.create.andesite_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_bricks_slab": "q\u0250\u05DFS s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_bricks_wall": "\u05DF\u05DF\u0250M s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_casing": "bu\u0131s\u0250\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", + "block.create.andesite_chute_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287n\u0265\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_cobblestone": "\u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_cobblestone_slab": "q\u0250\u05DFS \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F", + "block.create.andesite_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.andesite_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DD\u0287\u0131s\u01DDpu\u2C6F", + "block.create.andesite_tunnel": "\u05DF\u01DDuun\u27D8 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.basin": "u\u0131s\u0250\u15FA", "block.create.belt": "\u0287\u05DF\u01DD\u15FA", "block.create.belt_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287\u05DF\u01DD\u15FA", - "block.create.belt_tunnel": "\u05DF\u01DDuun\u27D8 \u0287\u05DF\u01DD\u15FA", "block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA", "block.create.blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA", + "block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA", "block.create.brass_block": "\u029E\u0254o\u05DF\u15FA ss\u0250\u0279\u15FA", "block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA", + "block.create.brass_chute_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287n\u0265\u0186 ss\u0250\u0279\u15FA", + "block.create.brass_funnel": "\u05DF\u01DDuun\u2132 ss\u0250\u0279\u15FA", + "block.create.brass_tunnel": "\u05DF\u01DDuun\u27D8 ss\u0250\u0279\u15FA", "block.create.brown_seat": "\u0287\u0250\u01DDS u\u028Do\u0279\u15FA", "block.create.cart_assembler": "\u0279\u01DD\u05DFq\u026F\u01DDss\u2C6F \u0287\u0279\u0250\u0186", "block.create.chiseled_dark_scoria": "\u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1 p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", @@ -34,6 +41,7 @@ "block.create.chiseled_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", + "block.create.chute": "\u01DD\u0287n\u0265\u0186", "block.create.clockwork_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186", "block.create.clutch": "\u0265\u0254\u0287n\u05DF\u0186", "block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186", @@ -60,6 +68,7 @@ "block.create.dark_scoria_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1", "block.create.dark_scoria_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1", "block.create.deployer": "\u0279\u01DD\u028Eo\u05DFd\u01DD\u15E1", + "block.create.depot": "\u0287od\u01DD\u15E1", "block.create.diorite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0279o\u0131\u15E1", "block.create.diorite_bricks_slab": "q\u0250\u05DFS s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0279o\u0131\u15E1", "block.create.diorite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0279o\u0131\u15E1", @@ -124,7 +133,6 @@ "block.create.flywheel": "\u05DF\u01DD\u01DD\u0265\u028D\u028E\u05DF\u2132", "block.create.framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132", "block.create.framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132", - "block.create.funnel": "\u05DF\u01DDuun\u2132", "block.create.furnace_engine": "\u01DDu\u0131bu\u018E \u01DD\u0254\u0250u\u0279n\u2132", "block.create.gabbro": "o\u0279qq\u0250\u2141", "block.create.gabbro_bricks": "s\u029E\u0254\u0131\u0279\u15FA o\u0279qq\u0250\u2141", @@ -223,6 +231,7 @@ "block.create.overgrown_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 u\u028Do\u0279b\u0279\u01DD\u028CO", "block.create.overgrown_scoria": "\u0250\u0131\u0279o\u0254S u\u028Do\u0279b\u0279\u01DD\u028CO", "block.create.overgrown_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM u\u028Do\u0279b\u0279\u01DD\u028CO", + "block.create.packager": "\u0279\u01DDb\u0250\u029E\u0254\u0250\u0500", "block.create.paved_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500", "block.create.paved_andesite_slab": "q\u0250\u05DFS \u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500", "block.create.paved_andesite_stairs": "s\u0279\u0131\u0250\u0287S \u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500", @@ -327,7 +336,6 @@ "block.create.vertical_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", - "block.create.vertical_funnel": "\u05DF\u01DDuun\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_linked_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E p\u01DD\u029Eu\u0131\uA780 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_linked_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 p\u01DD\u029Eu\u0131\uA780 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 714cc3079..e6cd764ff 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -9,26 +9,33 @@ "block.create.adjustable_pulse_repeater": "Adjustable Pulse Repeater", "block.create.adjustable_repeater": "Adjustable Repeater", "block.create.analog_lever": "Analog Lever", + "block.create.andesite_belt_funnel": "Andesite Belt Funnel", "block.create.andesite_bricks": "Andesite Bricks", "block.create.andesite_bricks_slab": "Andesite Bricks Slab", "block.create.andesite_bricks_stairs": "Andesite Bricks Stairs", "block.create.andesite_bricks_wall": "Andesite Bricks Wall", "block.create.andesite_casing": "Andesite Casing", + "block.create.andesite_chute_funnel": "Andesite Chute Funnel", "block.create.andesite_cobblestone": "Andesite Cobblestone", "block.create.andesite_cobblestone_slab": "Andesite Cobblestone Slab", "block.create.andesite_cobblestone_stairs": "Andesite Cobblestone Stairs", "block.create.andesite_cobblestone_wall": "Andesite Cobblestone Wall", + "block.create.andesite_funnel": "Andesite Funnel", "block.create.andesite_pillar": "Andesite Pillar", + "block.create.andesite_tunnel": "Andesite Tunnel", "block.create.basin": "Basin", "block.create.belt": "Belt", "block.create.belt_observer": "Belt Observer", - "block.create.belt_tunnel": "Belt Tunnel", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", "block.create.black_seat": "Black Seat", "block.create.blue_seat": "Blue Seat", + "block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_block": "Brass Block", "block.create.brass_casing": "Brass Casing", + "block.create.brass_chute_funnel": "Brass Chute Funnel", + "block.create.brass_funnel": "Brass Funnel", + "block.create.brass_tunnel": "Brass Tunnel", "block.create.brown_seat": "Brown Seat", "block.create.cart_assembler": "Cart Assembler", "block.create.chiseled_dark_scoria": "Chiseled Dark Scoria", @@ -37,6 +44,7 @@ "block.create.chiseled_limestone": "Chiseled Limestone", "block.create.chiseled_scoria": "Chiseled Scoria", "block.create.chiseled_weathered_limestone": "Chiseled Weathered Limestone", + "block.create.chute": "Chute", "block.create.clockwork_bearing": "Clockwork Bearing", "block.create.clutch": "Clutch", "block.create.cogwheel": "Cogwheel", @@ -63,6 +71,7 @@ "block.create.dark_scoria_cobblestone_wall": "Dark Scoria Cobblestone Wall", "block.create.dark_scoria_pillar": "Dark Scoria Pillar", "block.create.deployer": "Deployer", + "block.create.depot": "Depot", "block.create.diorite_bricks": "Diorite Bricks", "block.create.diorite_bricks_slab": "Diorite Bricks Slab", "block.create.diorite_bricks_stairs": "Diorite Bricks Stairs", @@ -127,7 +136,6 @@ "block.create.flywheel": "Flywheel", "block.create.framed_glass": "Framed Glass", "block.create.framed_glass_pane": "Framed Glass Pane", - "block.create.funnel": "Funnel", "block.create.furnace_engine": "Furnace Engine", "block.create.gabbro": "Gabbro", "block.create.gabbro_bricks": "Gabbro Bricks", @@ -226,6 +234,7 @@ "block.create.overgrown_limestone": "Overgrown Limestone", "block.create.overgrown_scoria": "Overgrown Scoria", "block.create.overgrown_weathered_limestone": "Overgrown Weathered Limestone", + "block.create.packager": "Packager", "block.create.paved_andesite": "Paved Andesite", "block.create.paved_andesite_slab": "Paved Andesite Slab", "block.create.paved_andesite_stairs": "Paved Andesite Stairs", @@ -330,7 +339,6 @@ "block.create.vertical_extractor": "Vertical Extractor", "block.create.vertical_framed_glass": "Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "Vertical Framed Glass Pane", - "block.create.vertical_funnel": "Vertical Funnel", "block.create.vertical_linked_extractor": "Vertical Linked Extractor", "block.create.vertical_linked_transposer": "Vertical Linked Transposer", "block.create.vertical_transposer": "Vertical Transposer", @@ -465,6 +473,10 @@ "advancement.create.crafter.desc": "Place and power some Mechanical Crafters", "advancement.create.deployer": "Poke, Place, and Attack", "advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do all the work for you.", + "advancement.create.musical_arm": "Play me my Theme Tune!", + "advancement.create.musical_arm.desc": "Watch a Mechanical Arm operate your Jukebox.", "advancement.create.fist_bump": "Pound It, Bro!", "advancement.create.fist_bump.desc": "Make two Deployers fist-bump.", "advancement.create.crushing_wheel": "A Pair of Giants", @@ -539,7 +551,7 @@ "create.generic.unit.minutes": "Minutes", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", - "create.generic.unit.degrees": "\u00B0", + "create.generic.unit.degrees": "°", "create.action.scroll": "Scroll", "create.action.confirm": "Confirm", @@ -825,6 +837,15 @@ "create.mechanical_mixer.min_ingredients": "Min. Ingredients", + "create.gui.config.overlay1": "Hi :)", + "create.gui.config.overlay2": "This is a sample overlay", + "create.gui.config.overlay3": "Click or drag with your mouse", + "create.gui.config.overlay4": "to move this preview", + "create.gui.config.overlay5": "Press ESC to exit this screen", + "create.gui.config.overlay6": "and save the new position", + "create.gui.config.overlay7": "Run /create overlay reset", + "create.gui.config.overlay8": "to reset to the default position", + "create.command.killTPSCommand": "killtps", "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", @@ -1085,7 +1106,7 @@ "block.create.furnace_engine.tooltip.behaviour1": "_Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", "block.create.flywheel.tooltip": "FLYWHEEL", - "block.create.flywheel.tooltip.summary": "A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90\u00B0_ _Angle_ from each other.", + "block.create.flywheel.tooltip.summary": "A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", "block.create.flywheel.tooltip.condition1": "When Attached to Running Engine", "block.create.flywheel.tooltip.behaviour1": "Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json new file mode 100644 index 000000000..9a8c82e36 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 781", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "adjustable_crate", + "block.create.adjustable_pulley": "UNLOCALIZED: Adjustable Pulley", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "Verzögernder Verstärker", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Andesitziegel", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "UNLOCALIZED: Basin", + "block.create.belt": "Mechanischer Riemen", + "block.create.belt_observer": "Fließband-Beobachter", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", + "block.create.clutch": "Kupplung", + "block.create.cogwheel": "Zahnrad", + "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.creative_crate": "Bauplankanonenmacher", + "block.create.creative_motor": "UNLOCALIZED: Creative Motor", + "block.create.crushing_wheel": "Mahlwerkrad", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "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.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.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_pillar": "Dolomitsäule", + "block.create.encased_belt": "Eingeschlossener Riemen", + "block.create.encased_fan": "Eingeschlossener Propeller", + "block.create.encased_shaft": "Eingeschlossene Welle", + "block.create.extractor": "Auswerfer", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "UNLOCALIZED: Flywheel", + "block.create.framed_glass": "UNLOCALIZED: Framed Glass", + "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", + "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", + "block.create.gabbro": "Gabbro", + "block.create.gabbro_bricks": "Gabbroziegel", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe", + "block.create.gabbro_bricks_wall": "Gabbroziegelmauer", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Getriebe", + "block.create.gearshift": "Gangschaltung", + "block.create.granite_bricks": "Granitziegel", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", + "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Großes Zahnrad", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Kalksand", + "block.create.limestone": "Kalkstein", + "block.create.limestone_bricks": "Kalksteinziegel", + "block.create.limestone_bricks_slab": "Kalksteinziegelstufe", + "block.create.limestone_bricks_stairs": "Kalksteinziegeltreppe", + "block.create.limestone_bricks_wall": "Kalksteinziegelmauer", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Kalksteinsäule", + "block.create.linear_chassis": "Schubgerüst", + "block.create.linked_extractor": "Verknüpfter Auswerfer", + "block.create.linked_transposer": "UNLOCALIZED: Linked Transposer", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Mechanisches Lager", + "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", + "block.create.mechanical_drill": "Mechanischer Bohrer", + "block.create.mechanical_harvester": "Mechanische Erntemaschine", + "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", + "block.create.mechanical_piston": "Mechanischer Kolben", + "block.create.mechanical_piston_head": "Mechanisches Kolbenende", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Mechanische Presse", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", + "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "UNLOCALIZED: Natural Scoria", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "UNLOCALIZED: Nozzle", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", + "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Polierter Dolomit", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Polierter Gabbro", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Polierter Kalkstein", + "block.create.polished_limestone_slab": "Polierte Kalksteinstufe", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", + "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Polierter Verwitterter Kalkstein", + "block.create.polished_weathered_limestone_slab": "Polierte Verwitterte Kalksteinstufe", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "UNLOCALIZED: Portable Storage Interface", + "block.create.powered_latch": "UNLOCALIZED: Powered Latch", + "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", + "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", + "block.create.pulse_repeater": "Pulsierender Verstärker", + "block.create.radial_chassis": "Drehgerüst", + "block.create.redstone_contact": "Redstone-Kontakt", + "block.create.redstone_link": "Redstone-Verbindung", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "UNLOCALIZED: Rope", + "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", + "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.schematic_table": "Bauplantisch", + "block.create.schematicannon": "Bauplankanone", + "block.create.scoria": "UNLOCALIZED: Scoria", + "block.create.scoria_bricks": "UNLOCALIZED: Scoria Bricks", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", + "block.create.shaft": "Welle", + "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben", + "block.create.stockpile_switch": "Vorratssensor", + "block.create.stressometer": "UNLOCALIZED: Stressometer", + "block.create.tiled_glass": "Glasfliesen", + "block.create.tiled_glass_pane": "Glasfliesenscheibe", + "block.create.transposer": "UNLOCALIZED: Transposer", + "block.create.turntable": "Drehtisch", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", + "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Wasserrad", + "block.create.weathered_limestone": "Verwitterter Kalkstein", + "block.create.weathered_limestone_bricks": "Verwitterte Kalksteinziegel", + "block.create.weathered_limestone_bricks_slab": "Verwitterte Kalksteinziegelstufe", + "block.create.weathered_limestone_bricks_stairs": "Verwitterte Kalksteinziegeltreppe", + "block.create.weathered_limestone_bricks_wall": "Verwitterte Kalksteinziegelmauer", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", + "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", + "item.create.belt_connector": "Mechanischer Riemen", + "item.create.brass_hand": "UNLOCALIZED: Brass Hand", + "item.create.brass_ingot": "UNLOCALIZED: Brass Ingot", + "item.create.brass_nugget": "UNLOCALIZED: Brass Nugget", + "item.create.brass_sheet": "UNLOCALIZED: Brass Sheet", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", + "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "UNLOCALIZED: Deforester", + "item.create.dough": "Teig", + "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_schematic": "Leerer Bauplan", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Filter", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Blockpistole", + "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", + "item.create.iron_sheet": "Eisenblech", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Propeller", + "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", + "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", + "item.create.rose_quartz": "Rosenquarz", + "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.schematic": "Bauplan", + "item.create.schematic_and_quill": "Bauplan und Feder", + "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Baumdünger", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Symmetriestab", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "UNLOCALIZED: Whisk", + "item.create.wrench": "UNLOCALIZED: Wrench", + "item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", + "item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", + "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", + "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", + "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Mahlen", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.splashing": "Waschen", + "create.recipe.splashing.fan": "Propeller hinter fließendem Wasser", + "create.recipe.smoking_via_fan": "Räuchern", + "create.recipe.smoking_via_fan.fan": "Propeller hinter Feuer", + "create.recipe.blasting_via_fan": "Schmelzen", + "create.recipe.blasting_via_fan.fan": "Propeller hinter Lava", + "create.recipe.pressing": "Mechanische Presse", + "create.recipe.mixing": "UNLOCALIZED: Mixing", + "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.mechanical_sawing": "UNLOCALIZED: mechanical_sawing", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.blockzapper_upgrade": "Blockpistole", + "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", + "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", + "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.processing.chance": "Chance: %1$s%%", + "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", + + "create.generic.range": "Reichweite", + "create.generic.radius": "Radius", + "create.generic.width": "UNLOCALIZED: Width", + "create.generic.height": "UNLOCALIZED: Height", + "create.generic.length": "UNLOCALIZED: Length", + "create.generic.speed": "Geschwindigkeit", + "create.generic.delay": "Verzögerung", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Sekunden", + "create.generic.unit.minutes": "Minuten", + "create.generic.unit.rpm": "UNLOCALIZED: RPM", + "create.generic.unit.stress": "UNLOCALIZED: su", + "create.generic.unit.degrees": "UNLOCALIZED: °", + + "create.action.scroll": "Wechseln", + "create.action.confirm": "Bestätigen", + "create.action.abort": "Abbrechen", + "create.action.saveToFile": "Speichern", + "create.action.discard": "Löschen", + + "create.keyinfo.toolmenu": "Werkzeugmenü", + "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "Wähle eine Option:", + "create.gui.scrollInput.scrollToModify": "Mausrad zum Ändern", + "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", + "create.gui.scrollInput.scrollToSelect": "Mausrad zum Auswählen", + "create.gui.scrollInput.shiftScrollsFaster": "Shift zum schnelleren Auswählen", + "create.gui.toolmenu.focusKey": "Halte [%1$s] zum Fokussieren", + "create.gui.toolmenu.cycle": "[Mausrad] zum Wechseln", + "create.gui.symmetryWand.mirrorType": "Spiegeln", + "create.gui.symmetryWand.orientation": "Orientierung", + + "create.symmetry.mirror.plane": "Einfach Spiegeln", + "create.symmetry.mirror.doublePlane": "Rechteckig", + "create.symmetry.mirror.triplePlane": "Achteckig", + + "create.orientation.orthogonal": "Orthogonal", + "create.orientation.diagonal": "Diagonal", + "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "Entlang Z", + "create.orientation.alongX": "Entlang X", + + "create.gui.blockzapper.title": "Blockpistole", + "create.gui.blockzapper.replaceMode": "Austauschmodus", + "create.gui.blockzapper.searchDiagonal": "Diagonalen folgen", + "create.gui.blockzapper.searchFuzzy": "Materialgrenzen ignorieren", + "create.gui.blockzapper.range": "Reichweite", + "create.gui.blockzapper.needsUpgradedAmplifier": "Benötigt besseren Verstärker", + "create.gui.blockzapper.patternSection": "Muster", + "create.gui.blockzapper.pattern.solid": "Fest", + "create.gui.blockzapper.pattern.checkered": "Schachbrett", + "create.gui.blockzapper.pattern.inversecheckered": "Inverses Schachbrett", + "create.gui.blockzapper.pattern.chance25": "25%-Chance", + "create.gui.blockzapper.pattern.chance50": "50%-Chance", + "create.gui.blockzapper.pattern.chance75": "75%-Chance", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", + "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", + "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", + "create.gui.terrainzapper.placement.inserted": "UNLOCALIZED: Inserted", + "create.gui.terrainzapper.brush": "UNLOCALIZED: Brush", + "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", + "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", + "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", + "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", + "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", + "create.gui.terrainzapper.tool.replace": "UNLOCALIZED: Replace", + "create.gui.terrainzapper.tool.clear": "UNLOCALIZED: Clear", + "create.gui.terrainzapper.tool.overlay": "UNLOCALIZED: Overlay", + "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", + + "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", + + "create.blockzapper.usingBlock": "Auswahl: %1$s", + "create.blockzapper.componentUpgrades": "Bauteil-Upgrades:", + "create.blockzapper.component.body": "Rumpf", + "create.blockzapper.component.amplifier": "Verstärker", + "create.blockzapper.component.accelerator": "Beschleuniger", + "create.blockzapper.component.retriever": "Empfänger", + "create.blockzapper.component.scope": "Fernrohr", + "create.blockzapper.componentTier.none": "Nichts", + "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", + "create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen", + "create.blockzapper.empty": "Keine Blöcke übrig!", + + "create.contraptions.movement_mode": "UNLOCALIZED: Movement Mode", + "create.contraptions.movement_mode.move_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.move_place_returned": "UNLOCALIZED: Place only in Starting Position", + "create.contraptions.movement_mode.move_never_place": "UNLOCALIZED: Place only when Anchor Destroyed", + "create.contraptions.movement_mode.rotate_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.rotate_place_returned": "UNLOCALIZED: Only Place near Initial Angle", + "create.contraptions.movement_mode.rotate_never_place": "UNLOCALIZED: Only Place when Anchor Destroyed", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Filter", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", + "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", + "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", + "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", + "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", + "create.gui.stressometer.capacity": "UNLOCALIZED: Remaining Capacity", + "create.gui.stressometer.overstressed": "UNLOCALIZED: Overstressed", + "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", + "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.adjustable_crate.title": "adjustable_crate", + "create.gui.adjustable_crate.storageSpace": "Lagerraum", + "create.gui.stockpile_switch.title": "Vorratssensor", + "create.gui.stockpile_switch.lowerLimit": "Untergrenze", + "create.gui.stockpile_switch.upperLimit": "Obergrenze", + "create.gui.stockpile_switch.startAt": "Signal bei", + "create.gui.stockpile_switch.startAbove": "Signal über", + "create.gui.stockpile_switch.stopAt": "Signalstopp bei", + "create.gui.stockpile_switch.stopBelow": "Signalstopp über", + "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", + "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", + "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", + "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", + "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", + "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", + "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", + "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", + + "create.schematicAndQuill.dimensions": "Bauplangröße: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Erste Position festgelegt.", + "create.schematicAndQuill.secondPos": "Zweite Position festgelegt.", + "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", + "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", + "create.schematicAndQuill.prompt": "Gib dem Bauplan einen Namen:", + "create.schematicAndQuill.fallbackName": "Mein Bauplan", + "create.schematicAndQuill.saved": "Gespeichert als %1$s", + + "create.schematic.invalid": "[!] Ungültiger Gegenstand - Benutze einen Bauplantisch.", + "create.schematic.position": "Position", + "create.schematic.rotation": "Rotation", + "create.schematic.rotation.none": "Nein", + "create.schematic.rotation.cw90": "90° im Uhrzeigersinn", + "create.schematic.rotation.cw180": "180° im Uhrzeigersinn", + "create.schematic.rotation.cw270": "270° im Uhrzeigersinn", + "create.schematic.mirror": "Spiegeln", + "create.schematic.mirror.none": "Nein", + "create.schematic.mirror.frontBack": "Vor-Zurück", + "create.schematic.mirror.leftRight": "Links-Rechts", + "create.schematic.tool.deploy": "Positionieren", + "create.schematic.tool.move": "XZ Bewegen", + "create.schematic.tool.movey": "Y Bewegen", + "create.schematic.tool.rotate": "Rotieren", + "create.schematic.tool.print": "Drucken", + "create.schematic.tool.flip": "Umdrehen", + "create.schematic.tool.deploy.description.0": "Bewegt die Struktur an einen anderen ort.", + "create.schematic.tool.deploy.description.1": "Mit Rechtsklick auf den Boden platzieren.", + "create.schematic.tool.deploy.description.2": "[Strg] halten, um in einer bestimmten Entfernung zu arbeiten.", + "create.schematic.tool.deploy.description.3": "[Strg]-Mausrad um die Entfernung zu ändern.", + "create.schematic.tool.move.description.0": "Bewegt das Schema horizontal", + "create.schematic.tool.move.description.1": "Zeig auf das Schema und benutze [Strg]-Mausrad.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Bewegt das Schema vertikal", + "create.schematic.tool.movey.description.1": "[Strg]-Mausrad zum hoch- und runterbewegen", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Rotiert das Schema um seine Mitte.", + "create.schematic.tool.rotate.description.1": "[Strg]-Mausrad für eine Drehung um 90°", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Platziert sofort die Struktur in der Welt", + "create.schematic.tool.print.description.1": "[Rechtsklick] zum Bestätigen der Platzierung an der aktuellen Position.", + "create.schematic.tool.print.description.2": "Dieses Werkzeug ist nur für den Kreativ-Modus.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Kehrt das Schema entlang der ausgewählten Oberfläche um.", + "create.schematic.tool.flip.description.1": "Zeige auf das Schema und benutze [Strg]-Mausrad.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Synchronisation...", + "create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.", + "create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:", + + "create.gui.schematicTable.title": "Bauplantisch", + "create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne", + "create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne", + "create.gui.schematicTable.uploading": "Hochladen...", + "create.gui.schematicTable.finished": "Hochgeladen!", + "create.gui.schematicannon.title": "Bauplankanone", + "create.gui.schematicannon.settingsTitle": "Platzier-Optionen", + "create.gui.schematicannon.listPrinter": "Materiallistendruck", + "create.gui.schematicannon.gunpowderLevel": "Schwarzpulver bei %1$s%%", + "create.gui.schematicannon.shotsRemaining": "%1$s Schuss übrig", + "create.gui.schematicannon.shotsRemainingWithBackup": "Mit Reserve: %1$s", + "create.gui.schematicannon.optionEnabled": "Aktiviert", + "create.gui.schematicannon.optionDisabled": "Deaktiviert", + "create.gui.schematicannon.option.dontReplaceSolid": "Feste Blöcke nicht ersetzen", + "create.gui.schematicannon.option.replaceWithSolid": "Feste Blöcke mit festen ersetzen", + "create.gui.schematicannon.option.replaceWithAny": "Feste Blöcke immer ersetzen", + "create.gui.schematicannon.option.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen", + "create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke ignorieren", + "create.gui.schematicannon.option.skipTileEntities": "Tile Entities ignorieren", + "create.gui.schematicannon.option.skipMissing.description": "Wenn die Bauplankanone einen benötigten Block nicht finden kann, wird sie einfach beim nächsten weiter machen.", + "create.gui.schematicannon.option.skipTileEntities.description": "Die Bauplankanone wird versuchen, Blöcke mit extra Daten, beispielsweise Truhen, nicht zu ersetzen.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Die Kanone wird ausschließlich nicht feste Blöcke und Luft in ihrem Arbeitsbereich ersetzen.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Die Kanone wird feste Blöcke nur dann ersetzen, wenn an der Position vorher bereits ein fester Block war.", + "create.gui.schematicannon.option.replaceWithAny.description": "Die Kanone wird feste Blöcke ersetzen, wenn der Bauplan an der Position einen Block enthält.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Die Kanone wird alle Blöcke im Arbeitsbereich entfernen.", + + "create.schematicannon.status.idle": "Aus", + "create.schematicannon.status.ready": "Bereit", + "create.schematicannon.status.running": "An", + "create.schematicannon.status.finished": "Fertig", + "create.schematicannon.status.paused": "Pausiert", + "create.schematicannon.status.stopped": "Gestoppt", + "create.schematicannon.status.noGunpowder": "Schwarzpulver leer", + "create.schematicannon.status.targetNotLoaded": "Kein Block geladen", + "create.schematicannon.status.targetOutsideRange": "Ziel zu weit weg", + "create.schematicannon.status.searching": "Suchen", + "create.schematicannon.status.skipping": "Überspringen", + "create.schematicannon.status.missingBlock": "Fehlender Block:", + "create.schematicannon.status.placing": "Platzieren", + "create.schematicannon.status.clearing": "Blöcke entfernen", + "create.schematicannon.status.schematicInvalid": "Bauplan ungültig", + "create.schematicannon.status.schematicNotPlaced": "Bauplan nicht positioniert", + "create.schematicannon.status.schematicExpired": "Bauplandatei abgelaufen", + + "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", + "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", + "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", + "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", + "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", + "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", + + "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", + "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", + + "create.tooltip.holdKey": "Halte [%1$s]", + "create.tooltip.holdKeyOrKey": "Halte [%1$s] oder [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Strg", + "create.tooltip.speedRequirement": "UNLOCALIZED: Speed Requirement: %1$s", + "create.tooltip.speedRequirement.none": "UNLOCALIZED: None", + "create.tooltip.speedRequirement.medium": "UNLOCALIZED: Moderate", + "create.tooltip.speedRequirement.high": "UNLOCALIZED: Fast", + "create.tooltip.stressImpact": "UNLOCALIZED: Stress Impact: %1$s", + "create.tooltip.stressImpact.low": "UNLOCALIZED: Low", + "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", + "create.tooltip.stressImpact.high": "UNLOCALIZED: High", + "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", + "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", + "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", + "create.tooltip.capacityProvided.high": "UNLOCALIZED: Large", + "create.tooltip.capacityProvided.asGenerator": "UNLOCALIZED: (As Generator)", + "create.tooltip.generationSpeed": "UNLOCALIZED: Generates at %1$s %2$s", + "create.tooltip.analogStrength": "UNLOCALIZED: Analog Strength: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "UNLOCALIZED: Min. Ingredients", + + "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.command.killTPSCommand": "UNLOCALIZED: killtps", + "create.command.killTPSCommand.status.slowed_by.0": "UNLOCALIZED: [Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "UNLOCALIZED: [Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "UNLOCALIZED: [Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "UNLOCALIZED: [Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", + "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "BEISPIELGEGENSTAND (nur ein Marker, um zu zeigen, dass dieser Tooltip existiert)", + "item.create.example_item.tooltip.summary": "Eine Kurzbeschreibung eines Gegenstands. _Unterstriche_ heben einen Begriff hervor.", + "item.create.example_item.tooltip.condition1": "Wenn dies", + "item.create.example_item.tooltip.behaviour1": "dann tut dieser Gegenstand das. (Verhalten wird mit der Shift-Taste angezeigt)", + "item.create.example_item.tooltip.condition2": "Und wenn dies", + "item.create.example_item.tooltip.behaviour2": "kannst du so viele Verhaltensweisen hinzufügen wie du magst", + "item.create.example_item.tooltip.control1": "Wenn Strg gedrückt ist", + "item.create.example_item.tooltip.action1": "wird diese Steuerung gezeigt.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRIESTAB", + "item.create.wand_of_symmetry.tooltip.summary": "Spiegelt deine Blockplatzierung perfekt über die konfigurierten Ebenen.", + "item.create.wand_of_symmetry.tooltip.condition1": "Wenn in der Schnellleiste", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Bleibt aktiv", + "item.create.wand_of_symmetry.tooltip.control1": "R-Klick auf Boden", + "item.create.wand_of_symmetry.tooltip.action1": "_Erstellt_ oder _Bewegt_ den Spiegel", + "item.create.wand_of_symmetry.tooltip.control2": "R-Klick in die Luft", + "item.create.wand_of_symmetry.tooltip.action2": "_Löscht_ den aktiven Spiegel", + "item.create.wand_of_symmetry.tooltip.control3": "R-Klick beim Schleichen", + "item.create.wand_of_symmetry.tooltip.action3": "Öffnet das _Konfigurationsmenü_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKPISTOLE", + "item.create.handheld_blockzapper.tooltip.summary": "Ermöglicht das Platzieren und Austauschen von Blöcken aus großer Entfernung.", + "item.create.handheld_blockzapper.tooltip.control1": "L-Klick auf Block", + "item.create.handheld_blockzapper.tooltip.action1": "Legt die von dem Werkzeug platzierten Blöcke auf den angeschauten Block fest.", + "item.create.handheld_blockzapper.tooltip.control2": "R-Klick auf Block", + "item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.", + "item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen", + "item.create.handheld_blockzapper.tooltip.action3": "Öffnet das _Konfigurationsmenü_", + + "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain_ _features_.", + "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", + "item.create.handheld_worldshaper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_worldshaper.tooltip.control2": "UNLOCALIZED: R-Click at Block", + "item.create.handheld_worldshaper.tooltip.action2": "UNLOCALIZED: Applies the currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration_ _Interface_", + + "item.create.tree_fertilizer.tooltip": "BAUMDÜNGER", + "item.create.tree_fertilizer.tooltip.summary": "Eine Mischung aus Mineralien, die sich für weit verbreitete Baumarten eignet", + "item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet", + "item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen", + + "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", + "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant_ _axe_ able to chop down trees in a split second.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "UNLOCALIZED: FILTER", + "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.", + "item.create.filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.attribute_filter.tooltip": "UNLOCALIZED: ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ item _attributes_ and _categories_.", + "item.create.attribute_filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.attribute_filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.empty_schematic.tooltip": "LEERER BAUPLAN", + "item.create.empty_schematic.tooltip.summary": "Wird für die Herstellung und das Schreiben auf dem _Bauplantisch_ verwendet", + + "item.create.schematic.tooltip": "BAUPLAN", + "item.create.schematic.tooltip.summary": "Beschreibt eine Struktur, die in der Welt platziert werden kann. Positioniere das Hologramm wie gewünscht und verwende eine _Bauplankanone_, um die Struktur zu bauen.", + "item.create.schematic.tooltip.condition1": "Wenn gehalten", + "item.create.schematic.tooltip.behaviour1": "Kann mit den Werkzeugen auf dem Bildschirm positioniert werden", + "item.create.schematic.tooltip.control1": "R-Klick beim Schleichen", + "item.create.schematic.tooltip.action1": "Öffnet ein Menü zur Eingabe exakter _Koordinaten_.", + + "item.create.schematic_and_quill.tooltip": "BAUPLAN UND FEDER", + "item.create.schematic_and_quill.tooltip.summary": "Wird benutzt, um eine existierende Struktur in der Welt als eine .nbt-Datei zu speichern.", + "item.create.schematic_and_quill.tooltip.condition1": "Schritt 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Wähle zwei Eckpunkte mit R-Klick aus", + "item.create.schematic_and_quill.tooltip.condition2": "Schritt 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "Auf den Oberflächen _Strg-Scrollen_ um die Größe zu verändern. Nochmals R-Klick um zu speichern.", + "item.create.schematic_and_quill.tooltip.control1": "R-Klick", + "item.create.schematic_and_quill.tooltip.action1": "Einen Eckpunkt auswählen / Speichern bestätigen", + "item.create.schematic_and_quill.tooltip.control2": "Strg gedrückt halten", + "item.create.schematic_and_quill.tooltip.action2": "Wählt Punkte _mitten_ _in_ _der_ _Luft._ _Scrolle,_ um die Distanz anzupassen.", + "item.create.schematic_and_quill.tooltip.control3": "R-Klick beim Schleichen", + "item.create.schematic_and_quill.tooltip.action3": "_Setzt_ die Auswahl _zurück_ und löscht sie.", + + "block.create.schematicannon.tooltip": "BAUPLANKANONE", + "block.create.schematicannon.tooltip.summary": "Schießt Blöcke, um eine Struktur nach einem positionierten _Bauplan_ zu errichten. Benutzt Gegenstände aus benachbarten Inventaren und _Schießpulver_ als Treibstoff.", + "block.create.schematicannon.tooltip.control1": "Wenn R-Geklickt", + "block.create.schematicannon.tooltip.action1": "Öffnet das _Menü_", + + "block.create.schematic_table.tooltip": "BAUPLANTISCH", + "block.create.schematic_table.tooltip.summary": "Schreibt gespeicherte Baupläne auf einen _Leeren_ _Bauplan_", + "block.create.schematic_table.tooltip.condition1": "Wenn ein Leerer Bauplan bereitgestellt wird", + "block.create.schematic_table.tooltip.behaviour1": "Lädt eine ausgewählte Datei von deinem Bauplan-Ordner hoch", + + "block.create.shaft.tooltip": "WELLE", + "block.create.shaft.tooltip.summary": "_Überträgt_ _Rotation_ entlang ihrer Achse.", + + "block.create.cogwheel.tooltip": "ZAHNRAD", + "block.create.cogwheel.tooltip.summary": "_Überträgt_ _Rotation_ entlang seiner Achse und auf benachbarte _Zahnräder._", + + "block.create.large_cogwheel.tooltip": "GROẞES ZAHNRAD", + "block.create.large_cogwheel.tooltip.summary": "Eine größere Version des _Zahnrads,_ ermöglicht eine _Änderung_ der _Rotationsgeschwindigket_, wenn es mit einem kleinerem Zahnrad verbunden wird.", + + "block.create.encased_shaft.tooltip": "EINGESCHLOSSENE WELLE", + "block.create.encased_shaft.tooltip.summary": "_Überträgt_ _Rotation_ entlang ihrer Achse. Nützlich für die Übertragung von Rotation durch Wände hindurch.", + + "block.create.gearbox.tooltip": "GETRIEBE", + "block.create.gearbox.tooltip.summary": "_Leitet_ _Rotation_ in _vier_ _Richtungen_ weiter. Kehrt geradlinige Verbindungen um.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "GANGSCHALTUNG", + "block.create.gearshift.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.", + "block.create.gearshift.tooltip.condition1": "Wenn aktiv", + "block.create.gearshift.tooltip.behaviour1": "_Kehrt_ die ausgehende Drehrichtung _um._", + + "block.create.clutch.tooltip": "KUPPLUNG", + "block.create.clutch.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.", + "block.create.clutch.tooltip.condition1": "Wenn aktiv", + "block.create.clutch.tooltip.behaviour1": "_Stoppt_ das Weiterleiten von Rotation zur anderen Seite.", + + "block.create.encased_belt.tooltip": "EINGESCHLOSSENER RIEMEN", + "block.create.encased_belt.tooltip.summary": "_Überträgt_ _Rotation_ durch seinen Block und zu einem angeschlossenen _Eingeschlossenen_ _Riemen._", + "block.create.encased_belt.tooltip.condition1": "Wenn an einem anderen Eingeschlossenen Riemen angeschlossen", + "block.create.encased_belt.tooltip.behaviour1": "Wird der angeschlossene Block die exakt gleiche Rotationsgeschwindigkeit und Richtung haben. Angeschlossene Riemen müssen nicht in die gleiche Richtung schauen.", + + "block.create.adjustable_pulley.tooltip": "UNLOCALIZED: ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ through its block and to attached _Encased_ _Belts_. Attached encased belts will _rotate_ _faster_ based on the _analog_ _redstone_ _signal_ this block receives.", + "block.create.adjustable_pulley.tooltip.condition1": "UNLOCALIZED: Redstone Control", + "block.create.adjustable_pulley.tooltip.behaviour1": "UNLOCALIZED: Without a signal, it will _not_ _speed_ _up_ connected belts. With a full strength signal connected belt, speed _doubles_.", + + "item.create.belt_connector.tooltip": "MECHANISCHER RIEMEN", + "item.create.belt_connector.tooltip.summary": "Verbindet zwei _Wellen_ mit einem _Mechanischen_ _Riemen._ Verbundene Wellen haben die exakt gleiche Rotationsgeschwindigkeit und Richtung.", + "item.create.belt_connector.tooltip.control1": "R-Klick auf Welle", + "item.create.belt_connector.tooltip.action1": "Wählt die Welle als Verbindungspunkt für den Riemen aus. Beide ausgewählten Wellen müssen _horizontal,_ _vertikal_ oder _diagonal_ entlang der Richtung des Riemens zeigen.", + "item.create.belt_connector.tooltip.control2": "R-Klick beim Schleichen", + "item.create.belt_connector.tooltip.action2": "_Setzt_ die erste ausgewählte Position des Riemens _zurück._", + + "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", + "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic_ _information_.", + "item.create.goggles.tooltip.condition1": "UNLOCALIZED: When worn", + "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored_ _indicators_ corresponding to the _Speed_ _Level_ of a placed kinetic component as well as _Stress_ _Impact_ and _Capacity_ of individual components.", + "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", + "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + + "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", + "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", + "item.create.wrench.tooltip.control1": "UNLOCALIZED: Right-Click a kinetic block", + "item.create.wrench.tooltip.action1": "UNLOCALIZED: _Rotates_ _components_ toward or away from the face with which you interacted.", + "item.create.wrench.tooltip.control2": "UNLOCALIZED: R-Click while Sneaking", + "item.create.wrench.tooltip.action2": "UNLOCALIZED: _Disassembles_ _Kinetic_ _components_ and places them back in _your_ _inventory_.", + + "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational_ _Force_.", + + "block.create.water_wheel.tooltip": "WASSERRAD", + "block.create.water_wheel.tooltip.summary": "Liefert _Rotationsenergie_ von benachbarten _Wasserströmungen._", + + "block.create.encased_fan.tooltip": "EINGESCHLOSSENER PROPELLER", + "block.create.encased_fan.tooltip.summary": "Wandelt _Rotationsenergie_ in _Luftstöme_ um und wieder zurück. Hat mehrere Verwendungsmöglichkeiten.", + "block.create.encased_fan.tooltip.condition1": "Wenn über Feuer", + "block.create.encased_fan.tooltip.behaviour1": "Liefert _Rotationsenergie_ (muss vertikal ausgerichtet sein)", + "block.create.encased_fan.tooltip.condition2": "Wenn angetrieben", + "block.create.encased_fan.tooltip.behaviour2": "_Bläst_ Dinge auf einer Seite von sich weg, _zieht_ sie auf der anderen zu sich hin. Kraft und Geschwindigkeit sind abhängig von der eingehenden Rotation.", + "block.create.encased_fan.tooltip.condition3": "Wenn Luft durch spezielle Blöcke fließt", + "block.create.encased_fan.tooltip.behaviour3": "Werden Gegenstände vor dem Block verarbeitet: _Wasser_ wäscht, _Feuer_ räuchert, und _Lava_ schmilzt den Gegenstand.", + + "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", + "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased_ _Fan_ to distribute its effect on Entities in _all_ _directions_.", + + "block.create.hand_crank.tooltip": "UNLOCALIZED: HAND CRANK", + "block.create.hand_crank.tooltip.summary": "UNLOCALIZED: A simple _source_ of _Rotational_ _Force_ that requires the interaction of players.", + "block.create.hand_crank.tooltip.condition1": "UNLOCALIZED: When Used", + "block.create.hand_crank.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + + "block.create.cuckoo_clock.tooltip": "UNLOCALIZED: CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "UNLOCALIZED: Fine craftsmanship for _decorating_ a space and _keeping_ _track_ _of_ _time_.", + "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current_ _time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players_ _can_ _sleep_.", + + "block.create.turntable.tooltip": "DREHTISCH", + "block.create.turntable.tooltip.summary": "Wandelt _Rotationsenergie_ in starkes Schwindelgefühl um.", + + "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", + "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "MAHLWERKRAD", + "block.create.crushing_wheel.tooltip.summary": "Riesige, drehbare Räder, die alles _zermalmen_ das zwischen ihnen landet.", + "block.create.crushing_wheel.tooltip.condition1": "Wenn mit einem anderem Mahlwerkrad verbunden", + "block.create.crushing_wheel.tooltip.behaviour1": "Formt einen Schredder, mit dem man verschiedene Sachen verarbeiten kann. Die Zähne der Räder müssen ineinandergreifen und mit der _gleichen_ _Geschwindigkeit_ in _gegengesetzte_ _Richtungen_ drehen.", + + "block.create.mechanical_press.tooltip": "MECHANISCHE PRESSE", + "block.create.mechanical_press.tooltip.summary": "Ein starker Kolben, welcher Gegenstände unter ihm zusammenpresst. Benötigt konstante _Rotationsenergie._", + "block.create.mechanical_press.tooltip.condition1": "Wenn durch Redstone aktiviert", + "block.create.mechanical_press.tooltip.behaviour1": "_Fängt_ _an_, Gegenstände, die darunter liegen, zusammenzudrücken.", + "block.create.mechanical_press.tooltip.condition2": "Wenn über einem Mechanischem Riemen", + "block.create.mechanical_press.tooltip.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "UNLOCALIZED: BASIN", + "block.create.basin.tooltip.summary": "UNLOCALIZED: A handy _item_ _container_ used in processing with the _Mechanical_ _Mixer_ and the _Mechanical_ _Press_. Supports _Redstone_ _Comparators_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "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.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.", + "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", + "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + + "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", + "block.create.mechanical_crafter.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.mechanical_crafter.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _the_ _crafting_ _process_ as soon as _all_ _crafters_ in the grid have been _given_ _an_ _item_.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "UNLOCALIZED: When Wrenched at Front", + "block.create.mechanical_crafter.tooltip.action1": "UNLOCALIZED: _Cycles_ _the_ _direction_ an individual crafter _moves_ _its_ _items_ towards. To form a working grid, _arrange_ _the_ _belts_ _in_ _a_ _flow_ which moves all items towards a final crafter. The final crafter must _point_ _away_ from the grid.", + "block.create.mechanical_crafter.tooltip.control2": "UNLOCALIZED: When Wrenched at back", + "block.create.mechanical_crafter.tooltip.action2": "UNLOCALIZED: _Connects_ the _input_ _inventory_ of adjacent crafters. Use this to _combine_ _slots_ in the crafting grid and _save_ _on_ _input_ _work_.", + + "block.create.furnace_engine.tooltip": "UNLOCALIZED: FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "UNLOCALIZED: A powerful source of _Rotational_ _Power_ that requires a _running_ _furnace_ to work.", + "block.create.furnace_engine.tooltip.condition1": "UNLOCALIZED: When Attached to Lit Furnace", + "block.create.furnace_engine.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + + "block.create.flywheel.tooltip": "UNLOCALIZED: FLYWHEEL", + "block.create.flywheel.tooltip.summary": "UNLOCALIZED: A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", + "block.create.flywheel.tooltip.condition1": "UNLOCALIZED: When Attached to Running Engine", + "block.create.flywheel.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", + + "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", + "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + + "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", + "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", + "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached_ _on_ _top_ of the controller.", + + "block.create.mechanical_piston.tooltip": "MECHANISCHER KOLBEN", + "block.create.mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Kolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.", + "block.create.mechanical_piston.tooltip.condition1": "Wenn angetrieben", + "block.create.mechanical_piston.tooltip.behaviour1": "Fängt an, die angeschlossene Struktur zu bewegen. Geschwindigkeit und Richtung korrelieren mit der eingehenden Rotationsgeschwindigkeit.", + + "block.create.sticky_mechanical_piston.tooltip": "KLEBRIGER MECHANISCHER KOLBEN", + "block.create.sticky_mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Klebrigen_ _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Klolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "Wenn angetrieben", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Fängt an, die angeschlossene Struktur zu bewegen. Geschwindigkeit und Richtung korrelieren mit der eingehenden Rotationsgeschwindigkeit.", + + "block.create.piston_extension_pole.tooltip": "KOLBEN-PLEUELVERÄNGERUNG", + "block.create.piston_extension_pole.tooltip.summary": "Wird benutzt, um die Reichweite von _Mechanischen_ _Kolben_ zu erhöhen.", + "block.create.piston_extension_pole.tooltip.condition1": "Wenn an einem Mechanischen Kolben angebracht", + "block.create.piston_extension_pole.tooltip.behaviour1": "Erhöht die Länge des Kolbens um 1 Block.", + + "block.create.mechanical_bearing.tooltip": "MECHANISCHES LAGER", + "block.create.mechanical_bearing.tooltip.summary": "Wird benutzt, um _größere_ _Strukturen_ zu drehen oder um _Rotationsenergie_ aus Wind zu erzeugen.", + "block.create.mechanical_bearing.tooltip.condition1": "Wenn angetrieben", + "block.create.mechanical_bearing.tooltip.behaviour1": "Fängt an, angeschlossene _Drehgerüste_ und an ihnen angebrachte Blöcke zu drehen.", + "block.create.mechanical_bearing.tooltip.condition2": "Wenn durch Redstone aktiviert", + "block.create.mechanical_bearing.tooltip.behaviour2": "Fängt an, _Rotationsenergie_ durch das Drehen der angebrachten Struktur zu erzeugen. Die Struktur muss _geeignete_ _Segelblöcke_ beinhalten. (Momentan jede Art von Wolle).", + + "block.create.clockwork_bearing.tooltip": "UNLOCALIZED: CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "UNLOCALIZED: An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", + "block.create.clockwork_bearing.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.clockwork_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", + + "block.create.sequenced_gearshift.tooltip": "UNLOCALIZED: SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "UNLOCALIZED: A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", + "block.create.sequenced_gearshift.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _executing_ programmed instructions based on the input speed.", + "block.create.sequenced_gearshift.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.sequenced_gearshift.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface._", + + "block.create.cart_assembler.tooltip": "UNLOCALIZED: CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "UNLOCALIZED: When _placed_ _on_ a _Rail_, adopts functionality and _assembles/disassebles_ _structures_ on passing _carts_.", + "block.create.cart_assembler.tooltip.condition1": "UNLOCALIZED: When placed above Rail", + "block.create.cart_assembler.tooltip.behaviour1": "UNLOCALIZED: _Assembles_ onto passing _carts_ _when_ _powered_, _disassembles_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "UNLOCALIZED: ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "UNLOCALIZED: Moves attached _blocks_ and _structures_ _vertically_. Use _Chassis_ or _Slime_ _Blocks_ to move more than a single block.", + "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + + "block.create.linear_chassis.tooltip": "SCHUBGERÜST", + "block.create.linear_chassis.tooltip.summary": "Eine konfigurierbare Basis für Strukturen, die durch _Mechanische_ _Kolben_ bewegt werden sollen. Diese Blöcke müssen die erste Reihe von Blöcken vor dem Kloben bilden.", + "block.create.linear_chassis.tooltip.condition1": "Wenn durch einen Mechanischen Kolben bewegt", + "block.create.linear_chassis.tooltip.behaviour1": "_Bewegt_ alle _verbundenen_ _Gerüste_ mit der gleichen Orientierung, und angebrachte Blöcke davor. Wenn der Kolben zurückgezogen wird, werden Blöcke nur zurückgezogen, wenn die Fläche des Gerüsts _klebrig_ ist (Siehe [Strg]).", + "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.linear_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", + "block.create.linear_chassis.tooltip.action1": "Lässt die Oberfläche _klebrig_ werden. Wenn der Kolben zurückgezogen wird, _zieht_ das Gerüst alle verbundenen Blöcke _zurück_ in seine Spalte und innerhalb der konfigurierten Reichweite.", + + "block.create.radial_chassis.tooltip": "DREHGERÜST", + "block.create.radial_chassis.tooltip.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.", + "block.create.radial_chassis.tooltip.condition1": "Wenn durch ein Lager gedreht", + "block.create.radial_chassis.tooltip.behaviour1": "_Dreht_ alle an _klebrigen_ Seiten angebrachten Blöcke (Siehe [Strg]) innerhalb der konfigurierten Reichweite um sich. _Überträgt_ die Rotation zu weiter angebrachten Rotationsgerüsten.", + "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.radial_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", + "block.create.radial_chassis.tooltip.action1": "Lässt die geklickte Fläche _klebrig_ werden. Wenn das Gerüst gedreht wird, werden alle verbundenen Blöcke an dieser Seite mit dem Gerüst mitgedreht.", + + "block.create.mechanical_drill.tooltip": "MECHANISCHER BOHRER", + "block.create.mechanical_drill.tooltip.summary": "Ein mechanisches Gerät, welches sich dazu eignet _Blöcke_ _zu_ _brechen._", + "block.create.mechanical_drill.tooltip.condition1": "Wenn angetrieben", + "block.create.mechanical_drill.tooltip.behaviour1": "Funktioniert als _stationärer_ Blockbrecher. _Schadet_ außerdem _Wesen_ in seiner effektiven Reichweite.", + "block.create.mechanical_drill.tooltip.condition2": "Wenn durch einem Mechanischen Kolben bewegt", + "block.create.mechanical_drill.tooltip.behaviour2": "Bricht Blöcke die der Bohrer trifft.", + + "block.create.mechanical_harvester.tooltip": "MECHANISCHE ERNTEMASCHINE", + "block.create.mechanical_harvester.tooltip.summary": "Ein mechanischer Pflanzenschneider für die Automatisierung deiner Ernte.", + "block.create.mechanical_harvester.tooltip.condition1": "Wenn durch einem Mechanischen Kolben bewegt", + "block.create.mechanical_harvester.tooltip.behaviour1": "Werden alle _reifen_ _Pflanzen_ _geerntet_, die die Klinge treffen, und auf ihren anfänglichen Wachstumszustand zurückgesetzt.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "UNLOCALIZED: MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "UNLOCALIZED: Suitable for _cutting_ _trees_ effectively and for _cutting_ _blocks_ into their carpentered counterparts. It is movable using _Mechanical_ _Pistons_ or _Bearings_.", + "block.create.mechanical_saw.tooltip.condition1": "UNLOCALIZED: When facing up", + "block.create.mechanical_saw.tooltip.behaviour1": "UNLOCALIZED: Applies _Sawing_ and _Stonecutting_ _Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", + "block.create.mechanical_saw.tooltip.condition2": "UNLOCALIZED: When facing horizontally", + "block.create.mechanical_saw.tooltip.behaviour2": "UNLOCALIZED: _Breaks_ _logs_ in front of it. If the log supported a tree on its own, the _tree_ _will_ _collapse_ away from the saw.", + "block.create.mechanical_saw.tooltip.condition3": "UNLOCALIZED: While Moving", + "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", + + "block.create.stockpile_switch.tooltip": "VORRATSSENSOR", + "block.create.stockpile_switch.tooltip.summary": "Schaltet ein Redstone-Signal ein oder aus, basierend auf der _Speichermenge_ im verbundenen Behälter.", + "block.create.stockpile_switch.tooltip.condition1": "Wenn unter dem unteren Limit", + "block.create.stockpile_switch.tooltip.behaviour1": "Wird das Redstone-Signal ausgeschaltet.", + "block.create.stockpile_switch.tooltip.condition2": "Wenn über dem oberen Limit", + "block.create.stockpile_switch.tooltip.behaviour2": "Wird das Redstone-Signal eingeschaltet bis das untere Limit wieder erreicht wird.", + "block.create.stockpile_switch.tooltip.control1": "Wenn R-geklickt", + "block.create.stockpile_switch.tooltip.action1": "Wird das _Konfigurationsmenü_ geöffnet", + + "block.create.redstone_link.tooltip": "REDSTONE-VERBINDUNG", + "block.create.redstone_link.tooltip.summary": "Endpunkte für _Drahtlose_ _Redstone-Verbindungen._ Mithilfe von Gegenständen kann die Frequenz eingestellt werden. Signalreichweite ist begrenzt, aber angemessen.", + "block.create.redstone_link.tooltip.condition1": "Wenn aktiv", + "block.create.redstone_link.tooltip.behaviour1": "Liefern eingehende Verbindungen mit derselben _Frequenz_ ein Redstone-Signal.", + "block.create.redstone_link.tooltip.control1": "Wenn mit einem Gegenstand R-geklickt", + "block.create.redstone_link.tooltip.action1": "Setzt die _Frequenz_ auf diesen Gegenstand. Insgesamt können _zwei_ _verschiedene_ _Gegenstände_ benutzt werden, um die Frequenz zu definieren.", + "block.create.redstone_link.tooltip.control2": "Wenn während dem Schleichen R-geklickt", + "block.create.redstone_link.tooltip.action2": "Schaltet zwischen _Empfänger-_ und _Transmittermodus_ um.", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "REDSTONE-KONTAKT", + "block.create.redstone_contact.tooltip.summary": "Ein einfaches Gerät für fortgeschrittene Redstone-Apparate.", + "block.create.redstone_contact.tooltip.condition1": "Wenn gegenüber einem anderen Kontakt", + "block.create.redstone_contact.tooltip.behaviour1": "Liefert ein _Redstone-Signal._", + "block.create.redstone_contact.tooltip.condition2": "Wenn durch einen Mechanischen Kolben bewegt", + "block.create.redstone_contact.tooltip.behaviour2": "Löst im Vorbeifahren stationären Kontakte aus", + + "block.create.adjustable_crate.tooltip": "adjustable_crate", + "block.create.adjustable_crate.tooltip.summary": "Dieser _Speicherbehälter_ erlaubt manuelle Kontrolle über seine Kapazität. Er kann bis zu _16_ _Stacks_ von jeglichem Gegenstand beinhalten.", + "block.create.adjustable_crate.tooltip.control1": "Wenn R-geklickt", + "block.create.adjustable_crate.tooltip.action1": "Öffnet das _Menü_", + + "block.create.creative_crate.tooltip": "BAUPLANKANONENMACHER", + "block.create.creative_crate.tooltip.summary": "Stellt einen unendlichen Vorrat an Blöcken für benachbarte _Bauplaenkanonen_ bereit.", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "AUSWERFER", + "block.create.extractor.tooltip.summary": "_Nimmt_ _Gegenstände_ von einem verbundenen _Behälter_ und wirft diese auf den Boden. Wird keine Gegenstände auswerfen, bis der Platz dafür frei ist. Kann einen Stack von Gegenständen als _Filter_ zugewiesen bekommen.", + "block.create.extractor.tooltip.condition1": "Wenn durch Redstone aktiviert", + "block.create.extractor.tooltip.behaviour1": "_Pausiert_ den Auswerfer", + "block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.", + "block.create.extractor.tooltip.control1": "R-Klick auf Filterplatz", + "block.create.extractor.tooltip.action1": "Weist den momentan _gehaltenen_ _Stack_ als _Filter_ zu. Der Auswerfer zieht nur diesen _Gegenstandstyp_ und die _Anzahl_ des Stacks aus dem Behälter. ", + + "block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER", + "block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.", + "block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.", + + "block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER", + "block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.deployer.tooltip.behaviour1": "UNLOCALIZED: Extends its arm and _activates_ in the block space _2m_ _ahead_ of itself.", + "block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench", + "block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.", + + "block.create.linked_extractor.tooltip": "VERKÜPFTER AUSWERFER", + "block.create.linked_extractor.tooltip.summary": "_Nimmt_ _Gegenstände_ von einem verbundenen _Behälter_ und wirft diese auf den Boden. Wird Gegenstände nicht auswerfen, bis der Platz frei ist. Kann einen Stack von Gegenständen zugewiesen bekommen. Kann aus Distanz mit einer _Redstone-Verbindung_ kontrolliert werden.", + "block.create.linked_extractor.tooltip.condition1": "Wenn die Restone-Verbindung aktiv ist", + "block.create.linked_extractor.tooltip.behaviour1": "Wird der Auswerfer _pausiert._", + "block.create.linked_extractor.tooltip.control1": "R-Klick auf den Filterplatz", + "block.create.linked_extractor.tooltip.action1": "Weist den momentan _gehaltenen_ _Stack_ als _Filter_ zu. Der Auswerfer zieht nur diesen _Gegenstandstyp_ und die _Anzahl_ des Stacks aus dem Behälter.", + "block.create.linked_extractor.tooltip.control2": "R-Klick auf den Frequenzplatz", + "block.create.linked_extractor.tooltip.action2": "Weist den momentan _gehaltenen_ _Gegenstand_ als Teil der gelisteten Frequenz zu. Wann auch immer eine übertragende _Redstone-Verbindung_ derselben Frequenz aktiv ist, pausiert dieser Auswerfer.", + + "block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", + "block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active", + "block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.", + "block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space", + "block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.", + + "block.create.funnel.tooltip": "FLIEẞBANDTRICHTER", + "block.create.funnel.tooltip.summary": "Sammelt eingehende Gegenstände auf einem _Mechanischen_ _Riemen_ und fügt diese in einen verbundenen _Behälter_ ein, wenn möglich. Muss direkt _auf_ dem Riemen sein, mit der Öffnung entgegen der Bewegungsrichtung des Riemens zeigend. Der Behälter muss auf der gleichen Höhe wie der Trichter sein.", + "block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling", + "block.create.funnel.tooltip.behaviour1": "UNLOCALIZED: Funnels can pull items _from_ _belts_ when placed above them, either sideways or at the end. When a side-ways funnel is backed up, items on the _belt_ _will_ _not_ _stall_.", + + "block.create.belt_tunnel.tooltip": "UNLOCALIZED: BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "UNLOCALIZED: An aesthetic option for running your _Mechanical_ _Belts_ through walls. Belts have to be reinforced with _Brass_ _Casing_. Tunnels can _synchronize_ with _their_ _neighbours_, only letting items pass if all tunnels in the group have one waiting. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Front", + "block.create.belt_tunnel.tooltip.action1": "UNLOCALIZED: Toggles _synchronized_ _behaviour_. Synchronized tunnels hold items until their neighbours have an item as well.", + "block.create.belt_tunnel.tooltip.control2": "UNLOCALIZED: R-Click with Wrench on Side", + "block.create.belt_tunnel.tooltip.action2": "UNLOCALIZED: _Adjusts_ _window_ _shutters_ if the tunnel has a window on that face.", + + "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", + "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration.", + "block.create.brass_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", + "block.create.brass_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a brass foundation. Reinforced Belts can support _Belt_ _Tunnels_, _Extractors_, _Funnels_, and _Transposers_ interacting with the belt from the sides and below.", + + "block.create.belt_observer.tooltip": "FLIEẞBAND-BEOBACHTER", + "block.create.belt_observer.tooltip.summary": "Erkennt Gegenstände, die vor ihm auf einem _Mechanischen_ _Riemen_ vorbeilaufen. Funktioniert wunderbar mit einem _Kolben_ über ihm, der gewisse Gegenstände runterschubst. ", + "block.create.belt_observer.tooltip.condition1": "Wenn ein Gegenstand mit dem Filter übereinstimmt", + "block.create.belt_observer.tooltip.behaviour1": "Sendet einen kurzen _Redstone-Puls_ an alle Seiten. Bei einem leeren Filter passiert dies mit allen Gegenständen.", + "block.create.belt_observer.tooltip.condition2": "UNLOCALIZED: Pulse Mode", + "block.create.belt_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _pulse_ when a _matching_ _item_ _passes_ the center of the observed belt segment.", + "block.create.belt_observer.tooltip.condition3": "UNLOCALIZED: Eject Mode", + "block.create.belt_observer.tooltip.behaviour3": "UNLOCALIZED: _Ejects_ _matching_ _items_ off the side. If the target belt or space is _occupied_, the item will be _held_ _in_ _place_.", + "block.create.belt_observer.tooltip.condition4": "UNLOCALIZED: Split Mode", + "block.create.belt_observer.tooltip.behaviour4": "UNLOCALIZED: _Splits_ a _matching_ _item_ _stack_ and _ejects_ _half_ of it off the side.", + + "block.create.pulse_repeater.tooltip": "PULSIERENDER VERSTÄRKER", + "block.create.pulse_repeater.tooltip.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.", + + "block.create.adjustable_repeater.tooltip": "VERZÖGERNDER VERSTÄRKER", + "block.create.adjustable_repeater.tooltip.summary": "Ein fortgeschrittener _Redstone-Verstärker_ mit einer _konfigurierbaren_ _Verzögerung_ von bis zu 30 Minuten.", + + "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.", + + "block.create.analog_lever.tooltip": "UNLOCALIZED: ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "UNLOCALIZED: A lever with more _precise_ _control_ over its emitted _signal_ _strength_.", + + "block.create.powered_toggle_latch.tooltip": "UNLOCALIZED: POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "UNLOCALIZED: A lever that can be toggled by a _Redstone_ _Pulse_.", + + "block.create.powered_latch.tooltip": "UNLOCALIZED: POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "UNLOCALIZED: A lever that can be controlled by _Redstone_ _Signals_. A signal on the _back_ _enables_ it, a signal from the _side_ _will_ _reset_ it.", + + "block.create.speedometer.tooltip": "UNLOCALIZED: SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _rotational_ _speed_ of attached kinetic components. Supports _Redstone_ _Comparators_.", + "block.create.speedometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.speedometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", + + "block.create.stressometer.tooltip": "UNLOCALIZED: STRESSOMETER", + "block.create.stressometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _overall_ _stress_ of the attached kinetic network. Supports _Redstone_ _Comparators_.", + "block.create.stressometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.stressometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of stress. _Over-stressed_ _networks_ will cease to move. Stress can be relieved by adding more _rotational_ _sources_ to the network.", + + "tool.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", + "tool.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", + "tool.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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "UNLOCALIZED: REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "UNLOCALIZED: A Chromatic material forged from _absorbed_ _light_.", + + "item.create.shadow_steel.tooltip": "UNLOCALIZED: SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "UNLOCALIZED: A Chromatic material forged _in_ _the_ _void_.", + + "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.", + + "create.tooltip.wip": "UNLOCALIZED: WIP", + "create.tooltip.workInProgress": "UNLOCALIZED: Work in progress!", + "create.tooltip.randomWipDescription0": "UNLOCALIZED: Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "UNLOCALIZED: A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "UNLOCALIZED: Use at your own risk.", + "create.tooltip.randomWipDescription3": "UNLOCALIZED: This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "UNLOCALIZED: This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "UNLOCALIZED: Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "UNLOCALIZED: By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json new file mode 100644 index 000000000..4f2fc8b3d --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 384", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "Caisse ajustable", + "block.create.adjustable_pulley": "Poulie de tapis roulant analogique", + "block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable", + "block.create.adjustable_repeater": "Répéteur réglable", + "block.create.analog_lever": "Levier analogique", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Briques d'andésite", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "Boîtier en andésite", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "Bassin", + "block.create.belt": "Tapis roulant", + "block.create.belt_observer": "Observateur d'entité", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.brass_block": "UNLOCALIZED: Brass Block", + "block.create.brass_casing": "Boîtier en laiton", + "block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.cart_assembler": "Assembleur de wagon", + "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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "Roulement mécanique horloger", + "block.create.clutch": "Embrayage", + "block.create.cogwheel": "Roue dentée", + "block.create.copper_block": "Bloc de cuivre", + "block.create.copper_casing": "Boîtier en cuivre", + "block.create.copper_ore": "Minerai de cuivre", + "block.create.copper_shingles": "Bardeaux de cuivre", + "block.create.creative_crate": "Créateur de schémacanon", + "block.create.creative_motor": "Moteur", + "block.create.crushing_wheel": "Roue de concassage", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "Horloge à coucou", + "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", + "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", + "block.create.dark_scoria": "Scorie sombre", + "block.create.dark_scoria_bricks": "Briques de scorie sombre", + "block.create.dark_scoria_bricks_slab": "Dalles de briques de scorie sombre", + "block.create.dark_scoria_bricks_stairs": "Escaliers de briques de scorie sombre", + "block.create.dark_scoria_bricks_wall": "Muret de briques de scorie sombre", + "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": "Déployeur", + "block.create.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "Briques de diorite", + "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.dolomite": "Dolomie", + "block.create.dolomite_bricks": "Briques de dolomie", + "block.create.dolomite_bricks_slab": "Dalle de briques de dolomie", + "block.create.dolomite_bricks_stairs": "Escaliers de briques de dolomie", + "block.create.dolomite_bricks_wall": "Muret de briques de dolomie", + "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_pillar": "Pillier de dolomie", + "block.create.encased_belt": "Tapis roulant enfermé", + "block.create.encased_fan": "Ventilateur enfermé", + "block.create.encased_shaft": "Arbre mécanique enfermé", + "block.create.extractor": "Extracteur", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "Volant d'inertie", + "block.create.framed_glass": "Grande fenêtre en verre", + "block.create.framed_glass_pane": "Grande vitre encadrée", + "block.create.furnace_engine": "Moteur de four", + "block.create.gabbro": "Gabbro", + "block.create.gabbro_bricks": "Briques de gabbro", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Escaliers en briques de gabbro", + "block.create.gabbro_bricks_wall": "Muret en briques de gabbro", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Boîte à roue dentée", + "block.create.gearshift": "Décaleur de rotation", + "block.create.granite_bricks": "Briques de granite", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "Manivelle", + "block.create.horizontal_framed_glass": "Fenêtre en verre horizontale", + "block.create.horizontal_framed_glass_pane": "Vitre encadrée horizontale", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Grande roue dentée", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Chaux", + "block.create.limestone": "Calcaire", + "block.create.limestone_bricks": "Briques de calcaire", + "block.create.limestone_bricks_slab": "Dalle de briques de calcaire", + "block.create.limestone_bricks_stairs": "Escaliers de briques de calcaire", + "block.create.limestone_bricks_wall": "Muret de briques de calcaire", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Pillier de calcaire", + "block.create.linear_chassis": "Châssis linéaire", + "block.create.linked_extractor": "Extracteur lié", + "block.create.linked_transposer": "Transposeur lié", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Roulement mécanique", + "block.create.mechanical_crafter": "Établi mécanique", + "block.create.mechanical_drill": "Perceuse mécanique", + "block.create.mechanical_harvester": "Récolteuse mécanique", + "block.create.mechanical_mixer": "Mixeur mécanique", + "block.create.mechanical_piston": "Piston mécanique", + "block.create.mechanical_piston_head": "Tête de piston mécanique", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Presse mécanique", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "Scie mécanique", + "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "Scorie naturelle", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "Buse", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Pôle d'extension de piston", + "block.create.polished_dark_scoria": "Scorie sombre polie", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Dolomie polie", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Gabbro poli", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Calcaire poli", + "block.create.polished_limestone_slab": "Dalle de calcaire polie", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "Scorie polie", + "block.create.polished_scoria_slab": "Dalle de scorie polie", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Calcaire patinées polies", + "block.create.polished_weathered_limestone_slab": "Dalle de calcaire patinées", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "Interface de stockage portable", + "block.create.powered_latch": "Verrou alimenté", + "block.create.powered_toggle_latch": "Verrou alimenté à bascule", + "block.create.pulley_magnet": "Aimant de poulie", + "block.create.pulse_repeater": "Répéteur d'impulsions", + "block.create.radial_chassis": "Châssis radial", + "block.create.redstone_contact": "redstone_contact Redstone", + "block.create.redstone_link": "Liaison Redstone", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "Corde", + "block.create.rope_pulley": "Poulie à corde", + "block.create.rotation_speed_controller": "Contrôleur de vitesse de rotation", + "block.create.schematic_table": "Table à schéma", + "block.create.schematicannon": "Schémacanon", + "block.create.scoria": "Scorie", + "block.create.scoria_bricks": "Briques de scorie", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "Pillier de scorie", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "Décaleur de rotation séquencé", + "block.create.shaft": "Arbre mécanique", + "block.create.speedometer": "Compteur de vitesse", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Piston mécanique collant", + "block.create.stockpile_switch": "Détecteur de stockage", + "block.create.stressometer": "Stressomètre", + "block.create.tiled_glass": "Verre carrelé", + "block.create.tiled_glass_pane": "Vitre carrelé", + "block.create.transposer": "Transposeur", + "block.create.turntable": "Plaque tournante", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "Fenêtre en verre verticale", + "block.create.vertical_framed_glass_pane": "Vitre encadrée verticale", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Roue à eau", + "block.create.weathered_limestone": "Calcaire patinées", + "block.create.weathered_limestone_bricks": "Briques de calcaire patinées", + "block.create.weathered_limestone_bricks_slab": "Dalle de briques de calcaire patinées", + "block.create.weathered_limestone_bricks_stairs": "Escaliers de briques de calcaire patinées", + "block.create.weathered_limestone_bricks_wall": "Muret de briques de calcaire patinées", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Pillier de calcaire patinées", + "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_ore": "Minerai de zinc", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "Alliage d'andésite", + "item.create.attribute_filter": "Filtre d'attribut", + "item.create.belt_connector": "Tapis roulant", + "item.create.brass_hand": "Main", + "item.create.brass_ingot": "Lingot de laiton", + "item.create.brass_nugget": "Pépite de laiton", + "item.create.brass_sheet": "Plaques de laiton", + "item.create.chromatic_compound": "Composé chromatique", + "item.create.copper_ingot": "Lingot de cuivre", + "item.create.copper_nugget": "Pépite de cuivre", + "item.create.copper_sheet": "Plaques de cuivre", + "item.create.crafter_slot_cover": "Couvercle", + "item.create.crushed_brass": "Laiton concassé", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "Déforesteur", + "item.create.dough": "Pâte", + "item.create.electron_tube": "Tube électronique", + "item.create.empty_schematic": "Schéma vide", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Filtre", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "Lunettes d'ingénieur", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Blockzappeur portable", + "item.create.handheld_worldshaper": "Térraformeur portable", + "item.create.integrated_circuit": "Circuit intégré", + "item.create.iron_sheet": "Plaque de Fer", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "Quartz rose poli", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Hélice", + "item.create.red_sand_paper": "Papier de verre rouge", + "item.create.refined_radiance": "Éclat raffiné", + "item.create.rose_quartz": "Quartz rose", + "item.create.sand_paper": "Papier de verre", + "item.create.schematic": "Schéma", + "item.create.schematic_and_quill": "Schéma et plume", + "item.create.shadow_steel": "Acier sombre", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Engrais pour arbre", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Bâton de symétrie", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "Fouet", + "item.create.wrench": "Clé", + "item.create.zinc_ingot": "Barre de zinc", + "item.create.zinc_nugget": "Pépite de zinc", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "death.attack.create.crush": "%1$s nanana a été traitée par une roue de concassage", + "death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud", + "death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave", + "death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique", + "death.attack.create.mechanical_saw": "%1$s a été coupé en deux par une scie mécanique", + "death.attack.create.cuckoo_clock_explosion": "%1$s a été explosé par un coucou trafiquée", + + "create.block.deployer.damage_source_name": "un déployeur voyou", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Ecrasement", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.splashing": "Lavage en vrac", + "create.recipe.splashing.fan": "Ventilateur derrière de l'eau qui coule", + "create.recipe.smoking_via_fan": "Fumer en vrac", + "create.recipe.smoking_via_fan.fan": "Fan behind Fire", + "create.recipe.blasting_via_fan": "Ventilateur derrière du feu", + "create.recipe.blasting_via_fan.fan": "Ventilateur derrière de la lave", + "create.recipe.pressing": "Pressage", + "create.recipe.mixing": "Mixage", + "create.recipe.packing": "Compactage", + "create.recipe.mechanical_sawing": "Sciage", + "create.recipe.mechanical_crafting": "Fabrication mécanique", + "create.recipe.block_cutting": "Coupe de bloc", + "create.recipe.blockzapper_upgrade": "Blockzappeur portable", + "create.recipe.sandpaper_polishing": "Polissage au papier de verre", + "create.recipe.mystery_conversion": "Métamorphose chromatique", + "create.recipe.processing.catalyst": "Catalyseur", + "create.recipe.processing.chance": "%1$s%% de chance", + "create.recipe.processing.chanceToReturn": "%1$s%% de chance de retour", + + "create.generic.range": "Portée", + "create.generic.radius": "Rayon", + "create.generic.width": "Largeur", + "create.generic.height": "Hauteur", + "create.generic.length": "Longueur", + "create.generic.speed": "Vitesse", + "create.generic.delay": "Delai", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Secondes", + "create.generic.unit.minutes": "Minutes", + "create.generic.unit.rpm": "tr/min", + "create.generic.unit.stress": "us", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "Faire défiler", + "create.action.confirm": "Confirmer", + "create.action.abort": "Abandonner", + "create.action.saveToFile": "Sauvegarder", + "create.action.discard": "Annuler", + + "create.keyinfo.toolmenu": "Focus sur le menu de l'outil", + "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "Choisissez une option:", + "create.gui.scrollInput.scrollToModify": "Faites défiler pour modifier", + "create.gui.scrollInput.scrollToAdjustAmount": "Faites défiler pour ajuster le montant", + "create.gui.scrollInput.scrollToSelect": "Faites défiler pour sélectionner", + "create.gui.scrollInput.shiftScrollsFaster": "Maj pour défiler plus rapidement", + "create.gui.toolmenu.focusKey": "Enfoncez [%1$s] pour focus", + "create.gui.toolmenu.cycle": "[SCROLL] pour cycler", + "create.gui.symmetryWand.mirrorType": "Mirroir", + "create.gui.symmetryWand.orientation": "Orientation", + + "create.symmetry.mirror.plane": "Miroir une fois", + "create.symmetry.mirror.doublePlane": "Rectangulaire", + "create.symmetry.mirror.triplePlane": "Octogonal", + + "create.orientation.orthogonal": "Orthogonal", + "create.orientation.diagonal": "Diagonal", + "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "Sur Z", + "create.orientation.alongX": "Sur X", + + "create.gui.blockzapper.title": "Blockzappeur portable", + "create.gui.blockzapper.replaceMode": "Mode de remplacement", + "create.gui.blockzapper.searchDiagonal": "Suivez les diagonales", + "create.gui.blockzapper.searchFuzzy": "Ignorer les bordures de matériau", + "create.gui.blockzapper.range": "Plage de propagation", + "create.gui.blockzapper.needsUpgradedAmplifier": "Nécessite un amplificateur amélioré", + "create.gui.blockzapper.patternSection": "Motif", + "create.gui.blockzapper.pattern.solid": "Solide", + "create.gui.blockzapper.pattern.checkered": "Quamechanical_drillage", + "create.gui.blockzapper.pattern.inversecheckered": "Quamechanical_drillage inversé", + "create.gui.blockzapper.pattern.chance25": "25%", + "create.gui.blockzapper.pattern.chance50": "50%", + "create.gui.blockzapper.pattern.chance75": "75%", + "create.gui.terrainzapper.title": "Térraformeur portable", + "create.gui.terrainzapper.placement": "Placement", + "create.gui.terrainzapper.placement.merged": "Fusionner", + "create.gui.terrainzapper.placement.attached": "Attacher", + "create.gui.terrainzapper.placement.inserted": "Inserer", + "create.gui.terrainzapper.brush": "Pinceau", + "create.gui.terrainzapper.brush.cuboid": "Cuboïde", + "create.gui.terrainzapper.brush.sphere": "Sphère", + "create.gui.terrainzapper.brush.cylinder": "Cylindre", + "create.gui.terrainzapper.tool": "Outil", + "create.gui.terrainzapper.tool.fill": "Remplir", + "create.gui.terrainzapper.tool.place": "Placer", + "create.gui.terrainzapper.tool.replace": "Remplacer", + "create.gui.terrainzapper.tool.clear": "Effacer", + "create.gui.terrainzapper.tool.overlay": "Recouvrir", + "create.gui.terrainzapper.tool.flatten": "Applatir", + + "create.terrainzapper.shiftRightClickToSet": "Maj + clic droit pour sélectionner une forme", + + "create.blockzapper.usingBlock": "Utilisation: %1$s", + "create.blockzapper.componentUpgrades": "Mises à niveau des composants:", + "create.blockzapper.component.body": "Corps", + "create.blockzapper.component.amplifier": "Amplifieur", + "create.blockzapper.component.accelerator": "Accélérateur", + "create.blockzapper.component.retriever": "Récupérateur", + "create.blockzapper.component.scope": "Lunette", + "create.blockzapper.componentTier.none": "Aucun", + "create.blockzapper.componentTier.brass": "Laiton", + "create.blockzapper.componentTier.chromatic": "Chromatique", + "create.blockzapper.leftClickToSet": "Clic gauche sur un bloc pour en définir le matériau", + "create.blockzapper.empty": "Plus de blocs!", + + "create.contraptions.movement_mode": "Mode de mouvement", + "create.contraptions.movement_mode.move_place": "Toujours placer à l'arrêt", + "create.contraptions.movement_mode.move_place_returned": "Placer uniquement en position de départ", + "create.contraptions.movement_mode.move_never_place": "Ne placer que lorsque l'ancre est détruite", + "create.contraptions.movement_mode.rotate_place": "Toujours placer à l'arrêt", + "create.contraptions.movement_mode.rotate_place_returned": "Placer uniquement près de l'angle initial", + "create.contraptions.movement_mode.rotate_never_place": "Ne placer que lorsque l'ancre est détruite", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Filtre", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "Statistiques du générateur:", + "create.gui.goggles.kinetic_stats": "Statistiques cinétiques:", + "create.gui.goggles.at_current_speed": "À la vitesse actuelle", + "create.gui.goggles.base_value": "Valeur de base", + "create.gui.gauge.info_header": "Informations sur la jauge:", + "create.gui.speedometer.title": "Vitesse de rotation", + "create.gui.stressometer.title": "Stress du réseau", + "create.gui.stressometer.capacity": "Capacité restante", + "create.gui.stressometer.overstressed": "Surmenée", + "create.gui.stressometer.no_rotation": "Pas de rotation", + "create.gui.contraptions.not_fast_enough": "Il semblerais que ce.t.te %1$s ne tourne _pas_ à la _vitesse_ _suffisante_.", + "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.adjustable_crate.title": "Caisse réglable", + "create.gui.adjustable_crate.storageSpace": "Espace de stockage", + "create.gui.stockpile_switch.title": "Commutateur de stockage", + "create.gui.stockpile_switch.lowerLimit": "Seuil inférieur", + "create.gui.stockpile_switch.upperLimit": "Seuil supérieur", + "create.gui.stockpile_switch.startAt": "Signal de départ à", + "create.gui.stockpile_switch.startAbove": "Signal de démarrage au-dessus", + "create.gui.stockpile_switch.stopAt": "Signal d'arrêt à", + "create.gui.stockpile_switch.stopBelow": "Signal d'arrêt en-dessous", + "create.gui.sequenced_gearshift.title": "Décaleur de rotation séquencé", + "create.gui.sequenced_gearshift.instruction": "Instructions", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Tourner", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Piston", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance", + "create.gui.sequenced_gearshift.instruction.wait": "Attente", + "create.gui.sequenced_gearshift.instruction.wait.duration": "Durée", + "create.gui.sequenced_gearshift.instruction.end": "Fin", + "create.gui.sequenced_gearshift.speed": "Vitesse, direction", + "create.gui.sequenced_gearshift.speed.forward": "Vitesse d'entrée, normal", + "create.gui.sequenced_gearshift.speed.forward_fast": "Vitesse double, normal", + "create.gui.sequenced_gearshift.speed.back": "Vitesse d'entrée, inversé", + "create.gui.sequenced_gearshift.speed.back_fast": "Vitesse double, inversée", + + "create.schematicAndQuill.dimensions": "Taille du schéma: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Première position définie.", + "create.schematicAndQuill.secondPos": "Seconde position définie.", + "create.schematicAndQuill.noTarget": "Enfoncez [Ctrl] pour sélectionner les blocs d'air.", + "create.schematicAndQuill.abort": "Sélection supprimée.", + "create.schematicAndQuill.prompt": "Entrez un nom pour le schéma:", + "create.schematicAndQuill.fallbackName": "Mon schéma", + "create.schematicAndQuill.saved": "Sauvegardé en tant que %1$s", + + "create.schematic.invalid": "[!] objet invalide - Utilisez plutôt la table à schéma", + "create.schematic.position": "Position", + "create.schematic.rotation": "Rotation", + "create.schematic.rotation.none": "Aucune", + "create.schematic.rotation.cw90": "Sens horaire 90", + "create.schematic.rotation.cw180": "Sens horaire 180", + "create.schematic.rotation.cw270": "Sens horaire 270", + "create.schematic.mirror": "Mirroir", + "create.schematic.mirror.none": "Aucun", + "create.schematic.mirror.frontBack": "Avant-Arrière", + "create.schematic.mirror.leftRight": "Gauche-Droite", + "create.schematic.tool.deploy": "Déployer", + "create.schematic.tool.move": "Déplacer XZ", + "create.schematic.tool.movey": "Déplacer Y", + "create.schematic.tool.rotate": "Tourner", + "create.schematic.tool.print": "Imprimer", + "create.schematic.tool.flip": "Retourner", + "create.schematic.tool.deploy.description.0": "Déplace la structure vers un emplacement.", + "create.schematic.tool.deploy.description.1": "Clic droit sur le sol pour placer.", + "create.schematic.tool.deploy.description.2": "Maintenez [Ctrl] pour sélectionner à une distance fixe.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Défiler pour changer la distance.", + "create.schematic.tool.move.description.0": "Décale le schéma horizontalement.", + "create.schematic.tool.move.description.1": "Pointez sur le schéma et [CTRL]-Défiler pour le pousser.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Décale le schéma verticalement.", + "create.schematic.tool.movey.description.1": "[CTRL]-Défiler pour le déplacer vers le haut / bas.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Fait pivoter le schéma autour de son centre.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Défiler pour faire une rotation de 90 degrés.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Place instantanément la structure dans le monde.", + "create.schematic.tool.print.description.1": "[Clic droit] pour confirmer le placement à l'emplacement actuel.", + "create.schematic.tool.print.description.2": "Cet outil est uniquement pour le mode créatif.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Retourne le schéma le long de la face que vous sélectionnez.", + "create.schematic.tool.flip.description.1": "Pointez sur le schéma et [CTRL]-Défiler pour le retourner.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Synchronisation...", + "create.schematics.uploadTooLarge": "Votre schéma est trop grand.", + "create.schematics.maxAllowedSize": "La taille de fichier schématique maximale autorisée est:", + + "create.gui.schematicTable.title": "Table à schéma", + "create.gui.schematicTable.availableSchematics": "Schémas disponibles", + "create.gui.schematicTable.noSchematics": "Aucun schéma enregistré", + "create.gui.schematicTable.uploading": "Téléchargement...", + "create.gui.schematicTable.finished": "Téléchargement terminé!", + "create.gui.schematicannon.title": "Schémacanon", + "create.gui.schematicannon.settingsTitle": "Options de placement", + "create.gui.schematicannon.listPrinter": "Imprimante de liste de matériaux", + "create.gui.schematicannon.gunpowderLevel": "Poudre à canon à %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Tirs restants: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Avec sauvegarde: %1$s", + "create.gui.schematicannon.optionEnabled": "Actuellement activé", + "create.gui.schematicannon.optionDisabled": "Actuellement désactivé", + "create.gui.schematicannon.option.dontReplaceSolid": "Ne remplacez pas les blocs solides", + "create.gui.schematicannon.option.replaceWithSolid": "Remplacer solide par solide", + "create.gui.schematicannon.option.replaceWithAny": "Remplacer le solide par n'importe quoi", + "create.gui.schematicannon.option.replaceWithEmpty": "Remplacer le solide par rien", + "create.gui.schematicannon.option.skipMissing": "Ignorer les blocs manquants", + "create.gui.schematicannon.option.skipTileEntities": "Protéger les Tile Entities", + "create.gui.schematicannon.option.skipMissing.description": "Si le canon ne peut pas trouver un bloc requis pour le placement, il continuera au prochain emplacement.", + "create.gui.schematicannon.option.skipTileEntities.description": "Le canon évitera de remplacer les blocs de stockage de données tels que les coffres.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Le canon ne remplacera jamais les blocs solides dans sa zone de travail, seulement non solides et air.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Le canon ne remplacera les blocs solides dans sa zone de travail que si le schéma contient un bloc solide à l'emplacement.", + "create.gui.schematicannon.option.replaceWithAny.description": "Le canon remplacera les blocs solides dans sa zone de travail si le schéma contient un bloc à l'emplacement.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Le canon effacera tous les blocs dans sa zone de travail, y compris ceux remplacés par de l'air.", + + "create.schematicannon.status.idle": "Repos", + "create.schematicannon.status.ready": "Prêt", + "create.schematicannon.status.running": "En cours", + "create.schematicannon.status.finished": "Terminé", + "create.schematicannon.status.paused": "Pausé", + "create.schematicannon.status.stopped": "Arrêté", + "create.schematicannon.status.noGunpowder": "Plus de poudre à canon", + "create.schematicannon.status.targetNotLoaded": "Le bloc n'est pas chargé", + "create.schematicannon.status.targetOutsideRange": "Cible trop lointaine", + "create.schematicannon.status.searching": "Recherche", + "create.schematicannon.status.skipping": "Saut", + "create.schematicannon.status.missingBlock": "Blocs manquants:", + "create.schematicannon.status.placing": "Placement", + "create.schematicannon.status.clearing": "Suppression des blocs", + "create.schematicannon.status.schematicInvalid": "Schéma non valide", + "create.schematicannon.status.schematicNotPlaced": "Schéma non déployé", + "create.schematicannon.status.schematicExpired": "Fichier de schéma arrivé à expiration", + + "create.gui.filter.blacklist": "Liste noire", + "create.gui.filter.blacklist.description": "Les articles réussissent s'ils ne correspondent à AUCUN des éléments ci-dessus. Une liste noire vide accepte tout.", + "create.gui.filter.whitelist": "Liste blanche", + "create.gui.filter.whitelist.description": "Les éléments réussissent s'ils correspondent à l'un des éléments ci-dessus. Une liste blanche vide rejette tout.", + "create.gui.filter.respect_data": "Respect des données", + "create.gui.filter.respect_data.description": "Les objets ne correspondent que si leur durabilité, leurs enchantements et autres attributs correspondent également.", + "create.gui.filter.ignore_data": "Ignorer les données", + "create.gui.filter.ignore_data.description": "Les éléments correspondent indépendamment de leurs attributs.", + + "create.item_attributes.placeable": "est placeable", + "create.item_attributes.consumable": "peut être mangé", + "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.enchanted": "est enchanté", + "create.item_attributes.damaged": "est endommagé", + "create.item_attributes.badly_damaged": "est fortement damaged", + "create.item_attributes.not_stackable": "ne peut pas s'empiler", + "create.item_attributes.equipable": "peut être équipé", + "create.item_attributes.furnace_fuel": "est du combustible", + "create.item_attributes.in_tag": "est étiqueté %1$s", + "create.item_attributes.in_item_group": "appartient à %1$s", + "create.item_attributes.added_by": "a été ajouté par %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné", + "create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:", + "create.gui.attribute_filter.whitelist_disjunctive": "Liste blanche (n'importe)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", + "create.gui.attribute_filter.whitelist_conjunctive": "Liste blanche (tout)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "Les objets ne passent que s'ils ont TOUS les attributs sélectionnés.", + "create.gui.attribute_filter.blacklist": "Liste noire", + "create.gui.attribute_filter.blacklist.description": "Les éléments réussissent s'ils n'ont AUCUN des attributs sélectionnés.", + "create.gui.attribute_filter.add_reference_item": "Ajouter un objet de référence", + + "create.tooltip.holdKey": "Enfoncez [%1$s]", + "create.tooltip.holdKeyOrKey": "Enfoncez [%1$s] ou [%2$s]", + "create.tooltip.keyShift": "Maj", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "Vitesse requise: %1$s", + "create.tooltip.speedRequirement.none": "Aucune", + "create.tooltip.speedRequirement.medium": "Modérée", + "create.tooltip.speedRequirement.high": "Rapide", + "create.tooltip.stressImpact": "Impact du stress: %1$s", + "create.tooltip.stressImpact.low": "Faible", + "create.tooltip.stressImpact.medium": "Modéré", + "create.tooltip.stressImpact.high": "Elevé", + "create.tooltip.stressImpact.overstressed": "Surmené", + "create.tooltip.capacityProvided": "Capacité de stress: %1$s", + "create.tooltip.capacityProvided.low": "Petite", + "create.tooltip.capacityProvided.medium": "Moyenne", + "create.tooltip.capacityProvided.high": "Grande", + "create.tooltip.capacityProvided.asGenerator": "(En tant que générateur)", + "create.tooltip.generationSpeed": "Génère à %1$s %2$s", + "create.tooltip.analogStrength": "Force analogique: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "Ingrédients min.", + + "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.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "Tire de schémacanon", + "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", + "create.subtitle.mechanical_press_item_break": "Cliquetis de métal", + "create.subtitle.blockzapper_place": "Blocs se zappant en place", + "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.blockzapper_deny": "Boop de déclin", + "create.subtitle.block_funnel_eat": "Croc d'entonoir", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "OBJET EXEMPLE (juste une indication que cette info-bulle existe)", + "item.create.example_item.tooltip.summary": "Une brève description de l'objet. Les _underscores_ surligne les mots.", + "item.create.example_item.tooltip.condition1": "Quand ceci", + "item.create.example_item.tooltip.behaviour1": "Donc cet objet fait ceci. (les comportements sont affichés avec shift)", + "item.create.example_item.tooltip.condition2": "Et quand cela", + "item.create.example_item.tooltip.behaviour2": "Vous pouvez ajouter autant de comportements que vous le souhaitez", + "item.create.example_item.tooltip.control1": "Lorsque Ctrl enfoncé", + "item.create.example_item.tooltip.action1": "Ces commandes sont affichées.", + + "item.create.wand_of_symmetry.tooltip": "BÂTON DE SYMÉTRIE", + "item.create.wand_of_symmetry.tooltip.summary": "Reflète parfaitement le placement des blocs sur les plans configurés.", + "item.create.wand_of_symmetry.tooltip.condition1": "Lorsque positionné dans la barre active", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Reste actif", + "item.create.wand_of_symmetry.tooltip.control1": "Clic droit au sol", + "item.create.wand_of_symmetry.tooltip.action1": "_Créé_ ou _déplace_ le mirroir", + "item.create.wand_of_symmetry.tooltip.control2": "Clic droit dans les airs", + "item.create.wand_of_symmetry.tooltip.action2": "_Retire_ le mirroir actif", + "item.create.wand_of_symmetry.tooltip.control3": "Clic droit en étant accroupi", + "item.create.wand_of_symmetry.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPEUR", + "item.create.handheld_blockzapper.tooltip.summary": "Nouveau gadget pour placer ou échanger des blocs à distance.", + "item.create.handheld_blockzapper.tooltip.control1": "Clic gauche sur un bloc", + "item.create.handheld_blockzapper.tooltip.action1": "Définit les blocs placés par l'outil sur le bloc ciblé.", + "item.create.handheld_blockzapper.tooltip.control2": "Clic droit sur un bloc", + "item.create.handheld_blockzapper.tooltip.action2": "_Place_ ou _remplace_ le bloc ciblé.", + "item.create.handheld_blockzapper.tooltip.control3": "Clic droit en étant accroupi", + "item.create.handheld_blockzapper.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_.", + + "item.create.handheld_worldshaper.tooltip": "TERRAFORMEUR", + "item.create.handheld_worldshaper.tooltip.summary": "Outil pratique pour créer des _paysage_ et _caractéristiques_ _de_ _terrain_.", + "item.create.handheld_worldshaper.tooltip.control1": "Clic gauche sur un bloc", + "item.create.handheld_worldshaper.tooltip.action1": "Définit les blocs placés par l'outil sur le bloc ciblé.", + "item.create.handheld_worldshaper.tooltip.control2": "Clic droit sur un bloc", + "item.create.handheld_worldshaper.tooltip.action2": "Applique le _pinceau_ et l'_outil_ actuellement sélectionnés à l'emplacement ciblé.", + "item.create.handheld_worldshaper.tooltip.control3": "Clic droit en étant accroupi", + "item.create.handheld_worldshaper.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_", + + "item.create.tree_fertilizer.tooltip": "ENGRAIS POUR ARBRE", + "item.create.tree_fertilizer.tooltip.summary": "Une puissante combinaison de minéraux adaptée pour accélérer la croissance des types d'arbres communs.", + "item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'arbre", + "item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des arbres _indépendamment_ de leurs _conditions_ _d'emplacement_", + + "item.create.deforester.tooltip": "DÉFORESTEUR", + "item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des arbres en une fraction de seconde.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "FILTRE", + "item.create.filter.tooltip.summary": "_Contrôle_ les _sorties_ et _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.", + "item.create.filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre", + "item.create.filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.", + "item.create.filter.tooltip.condition2": "Clic droit", + "item.create.filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.", + + "item.create.attribute_filter.tooltip": "FILTRE D'ATTRIBUTS", + "item.create.attribute_filter.tooltip.summary": "_Contrôle_ les _sorties_ et les _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.", + "item.create.attribute_filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre", + "item.create.attribute_filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "Clic droit", + "item.create.attribute_filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.", + + "item.create.empty_schematic.tooltip": "SCHÉMA VIDE", + "item.create.empty_schematic.tooltip.summary": "Utilisé comme ingrédient de recette et pour écrire à la _table_ _à_ _schéma_.", + + "item.create.schematic.tooltip": "SCHÉMA", + "item.create.schematic.tooltip.summary": "Contient une structure à positionner et à placer dans le monde. Positionnez l'hologramme comme vous le souhaitez et utilisez un _schémacanon_ pour le construire.", + "item.create.schematic.tooltip.condition1": "Lorsque tenu en main", + "item.create.schematic.tooltip.behaviour1": "Peut être positionné à l'aide des outils à l'écran.", + "item.create.schematic.tooltip.control1": "Clic droit en étant accroupi", + "item.create.schematic.tooltip.action1": "Ouvre une _interface_ pour rentrer les _coordonées_ correctes.", + + "item.create.schematic_and_quill.tooltip": "SCHÉMA ET PLUME", + "item.create.schematic_and_quill.tooltip.summary": "Utilisé pour enregistrer une structure de votre monde dans un fichier .nbt.", + "item.create.schematic_and_quill.tooltip.condition1": "Étape 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Sélectionnez deux points d'angle à l'aide du clic droit.", + "item.create.schematic_and_quill.tooltip.condition2": "Étape 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Défilement_ sur les faces pour ajuster la taille. Cliquez à nouveau pour enregistrer.", + "item.create.schematic_and_quill.tooltip.control1": "Clic droit", + "item.create.schematic_and_quill.tooltip.action1": "Sélectionnez un point d'angle / confirmez la sauvegarde.", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl maintenu", + "item.create.schematic_and_quill.tooltip.action2": "Sélectionnez des points _dans_ _les_ _airs_. Faites défiler pour régler la distance.", + "item.create.schematic_and_quill.tooltip.control3": "Clic droit en étant accroupi", + "item.create.schematic_and_quill.tooltip.action3": "_Réinitialise_ et supprime la sélection.", + + "block.create.schematicannon.tooltip": "SCHÉMACANON", + "block.create.schematicannon.tooltip.summary": "Tire des blocs pour recréer un _schéma_ déployé dans le monde. Utilise des objets des inventaires adjacents et de la _poudre_ _à_ _canon_ comme carburant.", + "block.create.schematicannon.tooltip.control1": "Clic droit", + "block.create.schematicannon.tooltip.action1": "Ouvre l'_Interface_", + + "block.create.schematic_table.tooltip": "TABLE À SCHÉMA", + "block.create.schematic_table.tooltip.summary": "Écrit les schémas enregistrés dans un _schéma_ _vide_.", + "block.create.schematic_table.tooltip.condition1": "Lorsque donné un schéma vide", + "block.create.schematic_table.tooltip.behaviour1": "Télécharge un fichier choisi à partir de votre dossier de schémas.", + + "block.create.shaft.tooltip": "ARBRE MÉCANIQUE", + "block.create.shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite.", + + "block.create.cogwheel.tooltip": "ROUE DENTÉE", + "block.create.cogwheel.tooltip.summary": "_Relais_ la _rotation_ en ligne droite, et aux _roues_ _dentées_ adjacentes.", + + "block.create.large_cogwheel.tooltip": "GRANDE ROUE DENTÉE", + "block.create.large_cogwheel.tooltip.summary": "Une version plus grande de la _roue_ _dentée_, permettant des _changements_ dans la _vitesse_ _de_ _rotation_ lorsqu'il est connecté à son homologue plus petit.", + + "block.create.encased_shaft.tooltip": "ARBRE MÉCANIQUE ENBOÎTÉ", + "block.create.encased_shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite. Convient pour propager la rotation à travers les murs.", + + "block.create.gearbox.tooltip": "BOÎTE DE VITESSES", + "block.create.gearbox.tooltip.summary": "_Relais_ la _rotation_ dans _quatre_ _directions_. Inverse les connexions directes.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "DÉCALEUR DE ROTATION", + "block.create.gearshift.tooltip.summary": "Une commande pour basculer le sens de rotation des arbres connectés.", + "block.create.gearshift.tooltip.condition1": "Lorsqu'alimenté", + "block.create.gearshift.tooltip.behaviour1": "_Inverse_ la rotation sortante.", + + "block.create.clutch.tooltip": "EMBRAYAGE", + "block.create.clutch.tooltip.summary": "Une commande pour engager / désengager la rotation des arbres connectés.", + "block.create.clutch.tooltip.condition1": "Lorsqu'alimenté", + "block.create.clutch.tooltip.behaviour1": "_Arrête_ de transmettre la rotation de l'autre côté.", + + "block.create.encased_belt.tooltip": "TAPIS ROULANT ENFERMÉ", + "block.create.encased_belt.tooltip.summary": "_Relais_ la _rotation_ à travers son bloc et aux _tapis_ _roulants_ _enfermés_ attachés.", + "block.create.encased_belt.tooltip.condition1": "Lorsque connecté", + "block.create.encased_belt.tooltip.behaviour1": "Les blocs attachés auront la _même_ _vitesse_ _de_ _rotation_ et direction. Ils n'ont pas besoin de regarder dans la même direction.", + + "block.create.adjustable_pulley.tooltip": "POULIE DE TAPIS ROULANT ANALOGIQUE", + "block.create.adjustable_pulley.tooltip.summary": "_Relais_ la _rotation_ à travers son bloc et aux _tapis_ _roulants_ _enfermés_ attachés. Les _tapis_ _roulants_ _enfermés_ attachés _tourneront_ _plus_ _vite_ en fonction du _signal_ _de_ _redstone_ _analogique_ que ce bloc reçoit.", + "block.create.adjustable_pulley.tooltip.condition1": "Contrôle Redstone", + "block.create.adjustable_pulley.tooltip.behaviour1": "Sans signal, il ne va pas _accélérer_ les tapis roulants connectées. Avec un tapis roulant connectée au signal de pleine puissance, vitesse _doublées_.", + + "item.create.belt_connector.tooltip": "CONNECTEUR DE TAPIS ROULANTS", + "item.create.belt_connector.tooltip.summary": "Connecte deux _arbres_ ou plus à un _tapis_ _roulant_ _mécanique_. Les arbres connectés auront exactement la même vitesse et le même sens de rotation. La ceinture peut agir comme un _convoyeur_ pour _objets_ et _entités_.", + "item.create.belt_connector.tooltip.control1": "Clic droit sur arbre", + "item.create.belt_connector.tooltip.action1": "Sélectionne l'arbre comme une poulie de la courroie. Les deux arbres sélectionnés doivent être _alignés_ soit _verticalement_, _horizontalement_, ou _diagonalement_ en direction de la courroie.", + "item.create.belt_connector.tooltip.control2": "Clic droit en étant accroupi", + "item.create.belt_connector.tooltip.action2": "_Réinitialise_ la première position sélectionnée pour le tapis roulant.", + + "item.create.goggles.tooltip": "LUNETTES", + "item.create.goggles.tooltip.summary": "Une paire de lunettes pour augmenter votre vision avec des _informations_ _kinétiques_ utiles.", + "item.create.goggles.tooltip.condition1": "Lorsque portées", + "item.create.goggles.tooltip.behaviour1": "Affiche des _indicateurs_ _colorés_ correspondants au _niveau_ _de_ _vitesse_ d'un composant cinétique placé ainsi que _l'impact_ du _stress_ et la _capacité_ des composants individuels.", + "item.create.goggles.tooltip.condition2": "Lorsque vision portée sur une jauge", + "item.create.goggles.tooltip.behaviour2": "Affiche des informations détaillées sur la _vitesse_ ou le _stress_ du réseau auquel la jauge est connectée.", + + "item.create.wrench.tooltip": "CLÉ", + "item.create.wrench.tooltip.summary": "Un outil utile pour travailler sur les engins cinétiques. Peut être utilisé pour _tourner_, _démonter_ et _configurer_ les composants.", + "item.create.wrench.tooltip.control1": "Clic droit a kinetic block", + "item.create.wrench.tooltip.action1": "_Tourne_ les _composents_ proche ou loin de la face avec lequel vous avez interagi.", + "item.create.wrench.tooltip.control2": "Clic droit en étant accroupi", + "item.create.wrench.tooltip.action2": "_Démonte_ les _composants_ _cinétiques_ et les replace dans _votre_ _inventaire_.", + + "block.create.creative_motor.tooltip": "MOTEUR CRÉATIF", + "block.create.creative_motor.tooltip.summary": "Une source configurable de _force_ _de_ _rotation_.", + + "block.create.water_wheel.tooltip": "ROUE À EAU", + "block.create.water_wheel.tooltip.summary": "Fournit une _force_ _de_ _rotation_ provenant de _courants_ _d'eau_ adjacents.", + + "block.create.encased_fan.tooltip": "VENTILATEUR ENFERMÉ", + "block.create.encased_fan.tooltip.summary": "Convertit _force_ _de_ _rotation_ en _courants_ _d'air_ et inversement. A une variété d'utilisations.", + "block.create.encased_fan.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.encased_fan.tooltip.behaviour1": "Fournit _force_ _de_ _rotation_ à partir de toute _source_ _de_ _chaleur_ immédiatement en dessous de lui. Le ventilateur doit être tourné vers le bas.", + "block.create.encased_fan.tooltip.condition2": "Lorsque tourné", + "block.create.encased_fan.tooltip.behaviour2": "_Pousse_ ou _tire_ les entités, selon la vitesse de rotation entrante.", + "block.create.encased_fan.tooltip.condition3": "Lorsque souffle à travers des blocs spéciaux", + "block.create.encased_fan.tooltip.behaviour3": "Des particules de _liquides_ et de _feu_ sont émises dans le flux d'air. Cela peut être utilisé pour _traiter_ des _objets_.", + + "block.create.nozzle.tooltip": "BUSE", + "block.create.nozzle.tooltip.summary": "Attachez-le à l'avant d'un _ventilateur_ _enfermé_ pour répartir son effet sur les entités dans _toutes_ les _directions_.", + + "block.create.hand_crank.tooltip": "MANIVELLE", + "block.create.hand_crank.tooltip.summary": "Une simple _source_ de _force_ _de_ _rotation_ qui nécessite l'interaction des joueurs.", + "block.create.hand_crank.tooltip.condition1": "Lorsqu'utilisé", + "block.create.hand_crank.tooltip.behaviour1": "Fournit des _force_ _de_ _rotation_ à un objet attaché. _S'accroupir_ _pour_ _inverser_ la rotation.", + + "block.create.cuckoo_clock.tooltip": "COUCOU", + "block.create.cuckoo_clock.tooltip.summary": "Un bel artisanat pour _décorer_ un espace et _garder_ la _notion_ _du_ _temps_.", + "block.create.cuckoo_clock.tooltip.condition1": "Lorsque tourné", + "block.create.cuckoo_clock.tooltip.behaviour1": "Affiche le _temps_ _présent_ et joue une mélodie deux fois par jour. _S'active_ une fois le _midi_ et une fois au crépuscule, dès que les _joueurs_ _peuvent_ _dormir_.", + + "block.create.turntable.tooltip": "PLAQUE TOURNANTE", + "block.create.turntable.tooltip.summary": "Transforme la _force_ _de_ _rotation_ en une nausée.", + + "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", + "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "ROUE DE CONCASSAGE", + "block.create.crushing_wheel.tooltip.summary": "Grandes roues rotatives qui _cassent_ n'importe quoi.", + "block.create.crushing_wheel.tooltip.condition1": "Lorsque fixé à une autre roue de concassage", + "block.create.crushing_wheel.tooltip.behaviour1": "Forme une machine de concassage pour traiter une variété de choses. Les dents des roues doivent se connecter et se déplacer avec la _même_ _vitesse_ dans des _directions_ _opposées_.", + + "block.create.mechanical_press.tooltip": "PRESSE MÉCANIQUE", + "block.create.mechanical_press.tooltip.summary": "Un piston puissant pour comprimer les objets en dessous. Nécessite une _force_ _de_ _rotation_ constante.", + "block.create.mechanical_press.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.mechanical_press.tooltip.behaviour1": "_Démarre_ pour compresser les éléments déposés en dessous.", + "block.create.mechanical_press.tooltip.condition2": "Lorsqu'au-dessus d'un tapis roulant mécanique", + "block.create.mechanical_press.tooltip.behaviour2": "Compresse _Automatiquement_ les éléments passant sur le tapis roulant.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "BASSIN", + "block.create.basin.tooltip.summary": "Un _objet_ _conteneur_ pratique utilisé dans le traitement avec le _mixeur_ _mécanique_ et la _presse_ _mecanique_. Prend en charge les _comparateur_ _de_ _redstone_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "MIXEUR MÉCANIQUE", + "block.create.mechanical_mixer.tooltip.summary": "Un fouet cinétique pour appliquer toutes les recettes d'artisanat informes aux objets en dessous. Nécessite une _force_ _de_ _rotation_ constant et un _bassin_ placé en dessous (avec un espace entre les deux).", + "block.create.mechanical_mixer.tooltip.condition1": "Lorsqu'au-dessus d'un bassin", + "block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin lorsque tous les ingrédients nécessaires sont présents.", + "block.create.mechanical_mixer.tooltip.condition2": "Lorsqu'utilisé avec une clé", + "block.create.mechanical_mixer.tooltip.behaviour2": "_Configure_ la quantité minimale du _total_ _d'ingredients_ pour les recettes appliquées. Utilisez cette option pour _exclure_ les _recettes_ _indésirables_ avec des ingrédients similaires mais moins.", + + "block.create.mechanical_crafter.tooltip": "ÉTABLI MÉCANIQUE", + "block.create.mechanical_crafter.tooltip.summary": "Un assembleur cinétique pour _automatiser_ n'importe quelle recette _en_ _forme_. Placez-en _plusieurs_ _dans_ _une_ _grille_ correspondant à votre recette, et _arrangez_ _leurs_ _tapis_ _roulant_ pour créer un _flux_ qui sort de la grille sur l'un des établis.", + "block.create.mechanical_crafter.tooltip.condition1": "Lorsque tourné", + "block.create.mechanical_crafter.tooltip.behaviour1": "_Démarre_ _le_ _processus_ _d'artisanat_ dès que _tous_ les _établis_ dans la grille ont _reçu_ _un_ _objet_.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "Lorsqu'utilisation de la clé à l'avant", + "block.create.mechanical_crafter.tooltip.action1": "_Fait_ _défiler_ _la_ _direction_ dans laquelle un établi individuel _déplace_ _ses_ _objets_. Pour former une grille de travail, disposer les _tapis_ _roulants_ _dans_ _un_ _flux_ qui déplace tous les articles vers un établi final. Le dernier artisan doit _pointer_ _autrepart_ de la grille.", + "block.create.mechanical_crafter.tooltip.control2": "Lorsqu'utilisation de la clé à l'arrière", + "block.create.mechanical_crafter.tooltip.action2": "_Connecte_ _l'inventaire_ _d'entrée_ des établis adjacents. Utilisez ceci pour _combiner_ les _emplacements_ dans la grille de fabrication et pour _économiser_ _sur_ _le_ _travail_ _d'entrée_.", + + "block.create.furnace_engine.tooltip": "MOTEUR DE FOUR", + "block.create.furnace_engine.tooltip.summary": "Une source puissante de _puissance_ _de_ _rotation_ qui nécessite un _four_ _allumé_ pour fonctionner.", + "block.create.furnace_engine.tooltip.condition1": "Lorsqu'attaché à un four allumé", + "block.create.furnace_engine.tooltip.behaviour1": "_Commence_ _à_ _alimenter_ un _volant_ _d'inertie_ placé devant (à 1m de distance). Utilisez un haut fourneau pour des vitesses plus élevées.", + + "block.create.flywheel.tooltip": "VOLANT D'INERTIE", + "block.create.flywheel.tooltip.summary": "Une grande roue métallique pour _exploiter_ _et_ _stabiliser_ la force générée par un _moteur_ _attaché_. Les volants d'inertie se connectent aux moteurs s'ils sont séparés _d'un_ _mètre_ et tournés à un _angle_ de _90°_ les uns des autres.", + "block.create.flywheel.tooltip.condition1": "Lorsqu'attaché à un moteur en marche", + "block.create.flywheel.tooltip.behaviour1": "Fournit une _force_ _de_ rotation_ à un engin connecté basé sur la force et la vitesse du générateur.", + + "block.create.portable_storage_interface.tooltip": "INTERFACE DE STOCKAGE PORTABLE", + "block.create.portable_storage_interface.tooltip.summary": "Un point d'échange portable pour _déplacer_ des _objets_ vers et depuis une _structure_ déplacée par un piston, un roulement, un chariot ou une poulie.", + "block.create.portable_storage_interface.tooltip.condition1": "Lorsqu'en mouvement", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interagit avec les _transposeurs_ stationnaires de sorte que les transposeurs faisant _face_ _autrepart_ de l'interface tirent les objets, et les transposeurs ciblant l'interface y _insereront_ les _objets_ de l'inventaire joint. L'engin se bloquera brièvement lorsque les objets seront échangés.", + + "block.create.rotation_speed_controller.tooltip": "CONTRÔLEUR DE VITESSE DE ROTATION", + "block.create.rotation_speed_controller.tooltip.summary": "Un _relai_ _configurable_ capable d'accélérer ou de ralentir le composant cible à la vitesse souhaitée.", + "block.create.rotation_speed_controller.tooltip.condition1": "Lorsqu'attaché à une grande roue dentée", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Relaie la force de rotation entrante vers la roue, essayant de faire _correspondre_ la _vitesse_ à laquelle elle est configurée. La _roue_ _dentée_ doit être _attachée_ _au_ _dessus_ du contrôleur.", + + "block.create.mechanical_piston.tooltip": "PISTON MÉCANIQUE", + "block.create.mechanical_piston.tooltip.summary": "Une version plus avancée du _piston_. Il utilise une _force_ _de_ rotation_ pour déplacer précisément les structures attachées. Les _pôles_ _d'extension_ _de_ _piston_ à l'arrière définissent la _portée_ de cet appareil. Sans extensions, le piston ne bougera pas. Utilisez un _châssis_ ou un _bloc_ _de_ slime_ pour déplacer plus d'une seule ligne de blocs.", + "block.create.mechanical_piston.tooltip.condition1": "Lorsque tourné", + "block.create.mechanical_piston.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.", + + "block.create.sticky_mechanical_piston.tooltip": "PISTON MÉCANIQUE COLLANT", + "block.create.sticky_mechanical_piston.tooltip.summary": "Une version plus avancée du _piston_ _collant_. Il utilise une _force_ _de_ rotation_ pour déplacer précisément les structures attachées. Les _pôles_ _d'extension_ _de_ _piston_ à l'arrière définissent la _portée_ de cet appareil. Sans extensions, le piston ne bougera pas. Utilisez un _châssis_ ou un _bloc_ _de_ slime_ pour déplacer plus d'une seule ligne de blocs.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "Lorsque tourné", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.", + + "block.create.piston_extension_pole.tooltip": "PÔLE DE PISTON", + "block.create.piston_extension_pole.tooltip.summary": "Étend la portée des _pistons_ _mécaniques.", + "block.create.piston_extension_pole.tooltip.condition1": "Lorsqu'attaché à un piston mécanique", + "block.create.piston_extension_pole.tooltip.behaviour1": "Étend la portée du _piston_ d'un bloc", + + "block.create.mechanical_bearing.tooltip": "ROULEMENT MÉCANIQUE", + "block.create.mechanical_bearing.tooltip.summary": "Utilisé pour faire tourner de _plus_ _grande_ _structures_ ou pour exploiter une _force_ _de_ rotation_ contre le vent.", + "block.create.mechanical_bearing.tooltip.condition1": "Lorsque tourné", + "block.create.mechanical_bearing.tooltip.behaviour1": "Démarre les blocs attachés en rotation. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.", + "block.create.mechanical_bearing.tooltip.condition2": "Lorsqu'alimenté par de la redstone", + "block.create.mechanical_bearing.tooltip.behaviour2": "Commence à fournir une _force_ _de_ rotation_ générée à partir de la rotation de la structure attachée. La structure doit inclure des _blocs_ _de_ _voiles_ appropriés (actuellement n'importe quel bloc de laine).", + + "block.create.clockwork_bearing.tooltip": "ROULEMENT MÉCANIQUE HORLOGER", + "block.create.clockwork_bearing.tooltip.summary": "Une version avancée du _roulement_ _mécanique_ pour faire tourner jusqu'à deux _aiguilles_ _d'horloge_ en fonction du _temps_ _en-jeu_ actuel.", + "block.create.clockwork_bearing.tooltip.condition1": "Lorsque tourné", + "block.create.clockwork_bearing.tooltip.behaviour1": "Commence la rotation de la structure attachée vers l'_heure_ _actuelle_. Si une seconde structure est présente, elle servira _d'aiguille_ _des_ _minutes_.", + + "block.create.sequenced_gearshift.tooltip": "DÉCALEUR DE ROTATION SÉQUENCÉ", + "block.create.sequenced_gearshift.tooltip.summary": "Un _composant_ _utilitaire_ _programmable_, qui peut changer son _débit_ _de_ _rotation_ suivant jusqu'à _5_ _instructions_ _consécutives_. Utilisez-le pour alimenter des roulements mécaniques, des pistons ou des poulies avec plus de contrôle sur le timing et la vitesse. Peut devenir moins précis à des vitesses plus élevées.", + "block.create.sequenced_gearshift.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "_Commence_ _à_ _exécuter_ les instructions programmées en fonction de la vitesse d'entrée.", + "block.create.sequenced_gearshift.tooltip.condition2": "Clic droit", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Ouvre _l'interface_ _de_ _configuration_", + + "block.create.cart_assembler.tooltip": "ASSEMBLEUR DE CHARIOT", + "block.create.cart_assembler.tooltip.summary": "Monte une structure connectée sur un _chariot_ _passant_.", + "block.create.cart_assembler.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.cart_assembler.tooltip.behaviour1": "_Démonte_ les structures montées un _chariot_ _passant_ et les remet dans le monde.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "POULIE DE CORDE", + "block.create.rope_pulley.tooltip.summary": "Déplace les _blocs_ et _structures_ attachés _verticalement_. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.", + "block.create.rope_pulley.tooltip.condition1": "Lorsque tourné", + "block.create.rope_pulley.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.", + + "block.create.linear_chassis.tooltip": "CHÂSSIS DE TRADUCTION", + "block.create.linear_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.", + "block.create.linear_chassis.tooltip.condition1": "Lorsque déplacé", + "block.create.linear_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ avec la même orientation, et une colonne de blocs dans sa portée. Les blocs ne seront tirés que si la face du châssis est _collante_ (Voir [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé", + "block.create.linear_chassis.tooltip.behaviour2": "Configurez la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la plage de tous les blocs de châssis connectés.", + "block.create.linear_chassis.tooltip.control1": "Clic droit avec une boule de slime", + "block.create.linear_chassis.tooltip.action1": "Rends la face _collante_. Lorsque déplace, le châssis va _tirer_ les blocs attachés, quelle que soit la direction du mouvement.", + + "block.create.radial_chassis.tooltip": "CHÂSSIS DE ROTATION", + "block.create.radial_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.", + "block.create.radial_chassis.tooltip.condition1": "Lorsque déplacé", + "block.create.radial_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ en colonne, et un cylindre de blocs autour de lui. Les blocs qui l'entourent ne sont déplacés que lorsqu'ils sont à portée et attachés à un côté collant (voir [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé", + "block.create.radial_chassis.tooltip.behaviour2": "Configure la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la portée de tous les blocs de châssis connectés.", + "block.create.radial_chassis.tooltip.control1": "Clic droit avec une boule de slime", + "block.create.radial_chassis.tooltip.action1": "Rend la face _collante_. Lorsque le châssis se déplace, tous les blocs désignés attachés au côté collant sont déplacés avec lui.", + + "block.create.mechanical_drill.tooltip": "PERCEUSE MÉCANIQUE", + "block.create.mechanical_drill.tooltip.summary": "Un dispositif mécanique adapté pour _casser_ les _blocs_. Il est déplaceable avec _pistons_ _mécaniques_ ou _roulements_.", + "block.create.mechanical_drill.tooltip.condition1": "Lorsque tourné", + "block.create.mechanical_drill.tooltip.behaviour1": "Agit comme un casseur de bloc _stationnaire_. Inflige aussi des _dégats_ aux _entités_ se situant dans sa zone effective.", + "block.create.mechanical_drill.tooltip.condition2": "Lorsqu'en mouvement", + "block.create.mechanical_drill.tooltip.behaviour2": "Casse les blocs avec lesquels la perceuse entre en collision.", + + "block.create.mechanical_harvester.tooltip": "RÉCOLTEUSE MÉCANIQUE", + "block.create.mechanical_harvester.tooltip.summary": "Un coupe-plantes mécanique adapté à l'automatisation des cultures à moyenne échelle. Il est déplaceable avec _pistons_ _mécaniques_ ou _roulements_.", + "block.create.mechanical_harvester.tooltip.condition1": "Lorsqu'en mouvement", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Récolte_ toutes les _cultures_ _matures_ que la lame entre en touche et les remet à leur état de croissance initial.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "SCIE MÉCANIQUE", + "block.create.mechanical_saw.tooltip.summary": "Convient pour _couper_ des _arbres_ efficacement et pour _tailler_ des _blocs_ dans leurs homologues menuisés. Il est déplaceable à l'aide de _pistons_ _mécaniques_ ou _roulements_.", + "block.create.mechanical_saw.tooltip.condition1": "Lorsque tourné vers le haut", + "block.create.mechanical_saw.tooltip.behaviour1": "Applique les _recettes_ de _sciage_ et de _taillerie_ aux éléments jetés ou insérés dedans. Lorsque plusieurs sorties sont possibles, il les parcourt à moins qu'un _filtre_ ne soit affecté.", + "block.create.mechanical_saw.tooltip.condition2": "Lorsqu'à l'horizontal", + "block.create.mechanical_saw.tooltip.behaviour2": "_Casse_ les _troncs_ devant elle. Si le tronc a supportait un arbre, _l'arbre_ _tombera_ loin de la scie.", + "block.create.mechanical_saw.tooltip.condition3": "Lorsqu'en mouvement", + "block.create.mechanical_saw.tooltip.behaviour3": "_Coupe_ tous les _arbres_ avec lesquels la scie entre en collision.", + + "block.create.stockpile_switch.tooltip": "DÉTÉCTEUR DE STOCKAGE", + "block.create.stockpile_switch.tooltip.summary": "Bascule un signal Redstone basé sur _l'espace_ _de_ _stockage_ dans le conteneur attaché.", + "block.create.stockpile_switch.tooltip.condition1": "Lorsqu'en dessous de la limite de stockage minimum", + "block.create.stockpile_switch.tooltip.behaviour1": "Arrête de fournir de _l'énergie_", + "block.create.stockpile_switch.tooltip.condition2": "Lorsqu'au dessus de la limite de stockage maximum", + "block.create.stockpile_switch.tooltip.behaviour2": "Commence à fournir de _l'énergie_ jusqu'à ce que la limite d'énergie soit réatteinte.", + "block.create.stockpile_switch.tooltip.control1": "Clic droit", + "block.create.stockpile_switch.tooltip.action1": "Ouvre l'_interface_ _de_ _configuration_.", + + "block.create.redstone_link.tooltip": "LIAISON REDSTONE", + "block.create.redstone_link.tooltip.summary": "Points de terminaison pour les connexions de _redstone_ _sans-fil_. Peut être attribué des _fréquences_ en utilisant n'importe quel objet. La portée du signal est limitée, quoique raisonnablement loin.", + "block.create.redstone_link.tooltip.condition1": "Lorsqu'alimenté", + "block.create.redstone_link.tooltip.behaviour1": "La réception de liens de la même _fréquence_ produira un signal redstone.", + "block.create.redstone_link.tooltip.control1": "Clic droit avec un objet", + "block.create.redstone_link.tooltip.action1": "Définit la _fréquence_ sur cet élément. Un total de _deux_ _différents_ _objets_ peuvent être utilisés en combinaison pour définir une fréquence.", + "block.create.redstone_link.tooltip.control2": "Clic droit en étant accroupi", + "block.create.redstone_link.tooltip.action2": "TBascule entre le mode _receveur_ et _transmetteur_.", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "redstone_contact REDSTONE", + "block.create.redstone_contact.tooltip.summary": "N'émet de l'énergie que par paires. Il est mobile avec _pistons_ _mécaniques_ ou _roulements_.", + "block.create.redstone_contact.tooltip.condition1": "Lorsque tourné vers un autre redstone_contact", + "block.create.redstone_contact.tooltip.behaviour1": "Fournit un _signal_ _redstone_.", + "block.create.redstone_contact.tooltip.condition2": "Lorsqu'en mouvement", + "block.create.redstone_contact.tooltip.behaviour2": "Déclenche tous les redstone_contacts fixes qu'il passe.", + + "block.create.adjustable_crate.tooltip": "CAISSE AJUSTABLE", + "block.create.adjustable_crate.tooltip.summary": "Ce _conteneur_ _de_ _stockage_ permet un contrôle manuel de sa capacité. Il peut contenir jusqu'à _16_ _piles_ de n'importe quel objet. Prend en charge les _comparateurs_ _de_ _redstone_.", + "block.create.adjustable_crate.tooltip.control1": "Clic droit", + "block.create.adjustable_crate.tooltip.action1": "Ouvre _l'interface_.", + + "block.create.creative_crate.tooltip": "CAISSE CRÉATIVE", + "block.create.creative_crate.tooltip.summary": "Fournit une réserve infinie de blocs aux _Schémacanons_ adjacents.", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "EXTRACTEUR", + "block.create.extractor.tooltip.summary": "_Prend_ des _objets_ d'un _inventaire_ attaché et les laisse tomber sur le sol. Ne laissera pas tomber les objets à moins que l'espace ne soit dégagé. Peut être affecté à une pile d'objets en tant que _filtre_.", + "block.create.extractor.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.extractor.tooltip.behaviour1": "Met l'extracteur en _pause_.", + "block.create.extractor.tooltip.condition2": "Tirage actif du tapis roulant", + "block.create.extractor.tooltip.behaviour2": "Les extracteurs peuvent extraire les objets _de_ _tapis_ renforcés de _boîtiers_ _en_ _laiton_. Lorsque l'extracteur est bloqué, le _tapis_ _roulant_ _va_ _caler_.", + "block.create.extractor.tooltip.control1": "Clic droit sur l'espace du filtre", + "block.create.extractor.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur extrait exclusivement les _types_ et _comptes_ des objets de la pile du filtre.", + + "block.create.transposer.tooltip": "TRANSPOSEUR", + "block.create.transposer.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les place immédiatement dans _l'inventaire_ cible. Peut être affecté à une pile d'objets en tant que _filtre_.", + "block.create.transposer.tooltip.condition1": "Lorsqu'alimenté par de la redstone", + "block.create.transposer.tooltip.behaviour1": "Met le transposeur en _pause_.", + "block.create.transposer.tooltip.condition2": "Tirage actif du tapis roulant", + "block.create.transposer.tooltip.behaviour2": "Les transposeurs peuvent extraire des éléments _de_ _tapis_ _roulants_ renforcés de _boîtiers_ _en_ _laiton_. Lorsque le transposeur est sauvegardé, le _tapis_ _roulant_ _va_ _caler_.", + "block.create.transposer.tooltip.control1": "Clic droit sur l'espace du filtre", + "block.create.transposer.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur tire exclusivement les _types_ et _comptes_ des objets de la pile du filtre.", + + "block.create.deployer.tooltip": "DÉPLOYEUR", + "block.create.deployer.tooltip.summary": "_Frappe_, _utilise_ et _active_. Cette machine essaiera _d'imiter_ un _joueur_ autant que possible. Peut _prendre_ et _déposer_ des _objets_ dans _l'inventaire_ adjacent. Peut être affecté à une pile d'éléments en tant que _filtre_.", + "block.create.deployer.tooltip.condition1": "Lorsque tourné", + "block.create.deployer.tooltip.behaviour1": "Étend son bras et _active_ dans l'espace de bloc _2m_ _devant_ de lui-même.", + "block.create.deployer.tooltip.condition2": "Clic droit avec une clé", + "block.create.deployer.tooltip.behaviour2": "Bascule le mode frappe. Dans le _mode_ _frappe_, le déployeur tentera d'utiliser son élément pour _casser_ les _blocs_ ou infliger des _dégats_ aux _entités_.", + + "block.create.linked_extractor.tooltip": "EXTRACTEUR LIÉ", + "block.create.linked_extractor.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les laisse tomber sur le sol. Ne laissera pas tomber les objets à moins que l'espace ne soit dégagé. Peut être assigné une pile d'éléments en tant que _filtre_. Peut être contrôlé à distance via une _liaison_ _redstone_.", + "block.create.linked_extractor.tooltip.condition1": "Lorsque la liaison redstone est active", + "block.create.linked_extractor.tooltip.behaviour1": "Met l'extracteur en _pause_.", + "block.create.linked_extractor.tooltip.control1": "Clic droit sur l'espace du filtre", + "block.create.linked_extractor.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur extrait exclusivement les _types_ et _comptes_ des objets de la pile du filtre.", + "block.create.linked_extractor.tooltip.control2": "Clic droit sur l'espace des fréquences", + "block.create.linked_extractor.tooltip.action2": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ dans le cadre de la fréquence écoutée. Chaque fois qu'une _liaison_ _redstone_ de la même fréquence est alimenté, cet extracteur s'arrête.", + + "block.create.linked_transposer.tooltip": "TRANSPOSEUR LIÉ", + "block.create.linked_transposer.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les place immédiatement dans _l'inventaire_ cible. Peut être affecté à une pile d'objets en tant que _filtre_. Peut être contrôlé à distance via une _liaison_ _redstone_.", + "block.create.linked_transposer.tooltip.condition1": "Lorsque la liaison redstone est active", + "block.create.linked_transposer.tooltip.behaviour1": "Met le transposeur en _pause_.", + "block.create.linked_transposer.tooltip.control1": "Clic droit sur l'espace du filtre", + "block.create.linked_transposer.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur tire exclusivement les _types_ et _comptes_ des objets de la pile du filtre.", + "block.create.linked_transposer.tooltip.control2": "Clic droit sur l'espace des fréquences", + "block.create.linked_transposer.tooltip.action2": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ dans le cadre de la fréquence écoutée. Chaque fois qu'une _liaison_ _redstone_ de la même fréquence est alimenté, ce transposeur s'arrête.", + + "block.create.funnel.tooltip": "ENTONNOIR AMÉLIORÉ", + "block.create.funnel.tooltip.summary": "_Collecte_ les _objets_ en _approche_ et les insère dans _l'inventaire_ attaché si possible. Peut collecter des objets dans le _monde_ et des objets sur un _tapis_ _roulant_.", + "block.create.funnel.tooltip.condition1": "Passage de tapis roulant passif", + "block.create.funnel.tooltip.behaviour1": "Les entonnoirs améliorés peuvent extraire des éléments _des_ _tapis_ _roulant_ lorsqu'ils sont placés au-dessus d'eux, latéralement ou à l'extrémité. Lorsqu'un entonnoir amélioré latéral est sauvegardé, les éléments sur le _tapis_ roulant_ _ne_ _vont_ _pas_ _caler_.", + + "block.create.belt_tunnel.tooltip": "TUNNEL DE TAPIS ROULANT", + "block.create.belt_tunnel.tooltip.summary": "Une option esthétique pour faire passer vos _tapis_ _roulants_ _mécaniques_ à travers les murs. Les tapis roulants doivent être renforcées avec des _boîtiers_ _en_ _laiton_. Les tunnels peuvent se _synchroniser_ avec _leurs_voisins_, ne laissant passer les éléments que si tous les tunnels du groupe ont un en attente. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "Clic droit avec une clé devant", + "block.create.belt_tunnel.tooltip.action1": "Active le _comportement_ _synchronisé_. Les tunnels synchronisés contiennent des objets jusqu'à ce que leurs voisins en aient également.", + "block.create.belt_tunnel.tooltip.control2": "Clic droit avec une clé sur les côtés", + "block.create.belt_tunnel.tooltip.action2": "_Ajuste_ _les_ _volets_ _des_ _fenêtres_ si le tunnel a une fenêtre sur cette face.", + + "block.create.brass_casing.tooltip": "BOÎTIER EN LAITON", + "block.create.brass_casing.tooltip.summary": "Boîtier de machine robuste avec une variété d'utilisations. Sans danger pour la décoration.", + "block.create.brass_casing.tooltip.condition1": "Lorsqu'utilisé sur un tapis roulant mécanique", + "block.create.brass_casing.tooltip.behaviour1": "_Renforce_ les _tapis_ _roulants_ avec une fondation en laiton. Les tapis roulants renforcées peuvent prendre en charge les _tunnels_, _extracteurs_, _entonnoir améliorés_ et _transposeurs_ interagissant avec le tapis roulant sur les côtés et en dessous.", + + "block.create.belt_observer.tooltip": "OBSERVATEUR DE TAPIS ROULANT", + "block.create.belt_observer.tooltip.summary": "Détecte les éléments et les entités passant sur un _tapis_ _roulant_ _mécanique_ devant lui. Utilisez une _clé_ pour faire défiler son comportement. Les non-éléments seront toujours traités en mode détection quel que soit le paramètre.", + "block.create.belt_observer.tooltip.condition1": "Mode détection", + "block.create.belt_observer.tooltip.behaviour1": "Fournit un redstone _pendant_ qu'un _objet_ _correspondant_ _soit_ sur le segment de tapis roulant observé.", + "block.create.belt_observer.tooltip.condition2": "Mode impulsion", + "block.create.belt_observer.tooltip.behaviour2": "Émet une _impulsion_ lorsqu'un _objet_ _correspondant_ _passe_ au centre du segment de tapis roulant observé.", + "block.create.belt_observer.tooltip.condition3": "Mode éjection", + "block.create.belt_observer.tooltip.behaviour3": "_Éject_ les _objets_ _correspondants_ sur le côté. Si le tapis roulant ou l'espace cible est _occupé_, l'objet sera _tenu_ _en_ _place_.", + "block.create.belt_observer.tooltip.condition4": "Mode partage", + "block.create.belt_observer.tooltip.behaviour4": "_Partage_ une _pile_ _d'objets_ _correspondants_ et _éjecte_ _la_ _moitié_ de celui-ci sur le côté.", + + "block.create.pulse_repeater.tooltip": "RÉPÉTEUR D'IMPULSIONS", + "block.create.pulse_repeater.tooltip.summary": "Un circuit simple pour couper les signaux de redstone passant à une longueur de _1_ _tick_.", + + "block.create.adjustable_repeater.tooltip": "RÉPÉTEUR RÉGLABLE", + "block.create.adjustable_repeater.tooltip.summary": "Un _répéteur_ _de_ _redstone_ avancé avec un _délai_ _configurable_ jusqu'à 30 minutes.", + + "block.create.adjustable_pulse_repeater.tooltip": "RÉPÉTEUR D'IMPULSIONS RÉGLABLE", + "block.create.adjustable_pulse_repeater.tooltip.summary": "Un _répéteur_ _d'impulsions_ avancé avec un _délai_ _configurable_ jusqu'à 30 minutes.", + + "block.create.analog_lever.tooltip": "LEVIER ANALOGIQUE", + "block.create.analog_lever.tooltip.summary": "Un levier avec un _contrôle_ plus _précis_ sur sa _puissance_ _de_ _signal_ émise.", + + "block.create.powered_toggle_latch.tooltip": "LOQUET À BASCULE ALIMENTÉ", + "block.create.powered_toggle_latch.tooltip.summary": "Un levier qui peut être basculé par une _pulsation_ _de_ _redstone_.", + + "block.create.powered_latch.tooltip": "VERROU ALIMENTÉ", + "block.create.powered_latch.tooltip.summary": "Un levier qui peut être contrôlé par un _signal_ _de_ _redstone_. Un signal sur _l'arrière_ _l'active_, un signal sur le _côté_ _va_ _le_ _réinitialiser_.", + + "block.create.speedometer.tooltip": "COMPTEUR DE VITESSE", + "block.create.speedometer.tooltip.summary": "Mesure et affiche la _ vitesse de rotation _ des composants cinétiques attachés. Prend en charge les _comparateurs_ _de_ _redstone_.", + "block.create.speedometer.tooltip.condition1": "Lorsque tourné", + "block.create.speedometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de vitesse. _Vert_ indique une rotation lente, _Bleu_ modérée et _violet_ rapide. Certains composants mécaniques nécessitent une vitesse suffisante pour fonctionner correctement.", + + "block.create.stressometer.tooltip": "STRESSOMÈTRE", + "block.create.stressometer.tooltip.summary": "Mesure et affiche la _stress__ globale du réseau cinétique attaché. Prend en charge les _comparateurs_ _de_ _redstone_.", + "block.create.stressometer.tooltip.condition1": "Lorsque tourné", + "block.create.stressometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de contrainte. Les _réseaux_ _surchargés_ cesseront de bouger. Le stress peut être soulagé en ajoutant plus de _sources_ _rotationnelles_ au réseau.", + + "tool.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", + "tool.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", + "tool.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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "ÉCLAT RAFFINÉ", + "item.create.refined_radiance.tooltip.summary": "Un matériau chromatique forgé à partir de _lumière_ _absorbée_.", + + "item.create.shadow_steel.tooltip": "ACIER SOMBRE", + "item.create.shadow_steel.tooltip.summary": "Un matériau chromatique forgé _dans_ _le_ _néant_.", + + "item.create.crafter_slot_cover.tooltip": "COUVERCLE D'EMPLACEMENT", + "item.create.crafter_slot_cover.tooltip.summary": "Utilisé pour marquer un _établi_ _mécanique_ comme un emplacement vide dans une recette. Les établis ne doivent pas nécessairement former une grille carrée complète. C'est utile quand il y a des recettes où les _ingredients_ _sont_ _en_ _diagonale_ les uns aux autres.", + + "create.tooltip.wip": "En cours", + "create.tooltip.workInProgress": "En cours!", + "create.tooltip.randomWipDescription0": "Veuillez garder cet objet hors de portée des enfants.", + "create.tooltip.randomWipDescription1": "Un bébé panda meurt chaque fois que vous utilisez cet objet. Chaque. Fois.", + "create.tooltip.randomWipDescription2": "À utiliser à vos risques et périls.", + "create.tooltip.randomWipDescription3": "Ce n'est pas l'objet que vous recherchez, *agites les doigts* veuillez vous disperser.", + "create.tooltip.randomWipDescription4": "Cet objet s'autodétruit en 10 secondes. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Croyez-moi, c'est inutile.", + "create.tooltip.randomWipDescription6": "En utilisant cet article, vous êtes responsables et acceptez ses conditions.", + "create.tooltip.randomWipDescription7": "Celui-ci n'est peut-être pas pour vous. Que dire de celui-là?", + "create.tooltip.randomWipDescription8": "Utilisez-le et regrettez immédiatement votre décision.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json new file mode 100644 index 000000000..b91adee26 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 368", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "Baule Regolabile", + "block.create.adjustable_pulley": "Puleggia analogica", + "block.create.adjustable_pulse_repeater": "Ripetitore di Impulsi Regolabile", + "block.create.adjustable_repeater": "Ripetitore Regolabile", + "block.create.analog_lever": "Leva Analogica", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Mattoni di Andesite", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "Involucro di Andesite", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "Bacinella", + "block.create.belt": "Nastro Meccanico", + "block.create.belt_observer": "Osservatore a Cinghia", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.brass_block": "Blocco di Ottone", + "block.create.brass_casing": "Involucro di Ottone", + "block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.cart_assembler": "Assemblatore Carrello da Miniera", + "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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "Supporto del Orologio", + "block.create.clutch": "Frizione", + "block.create.cogwheel": "Ruota Dentata", + "block.create.copper_block": "Blocco di Rame", + "block.create.copper_casing": "Involucro di Rame", + "block.create.copper_ore": "Rame Grezzo", + "block.create.copper_shingles": "Tegole di Rame", + "block.create.creative_crate": "Creatore Cannoneschematico", + "block.create.creative_motor": "Motore", + "block.create.crushing_wheel": "Ruota di Frantumazione", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "Orologio a Cucù", + "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", + "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", + "block.create.dark_scoria": "Scoria Scura", + "block.create.dark_scoria_bricks": "Mattoni di Scoria Scura", + "block.create.dark_scoria_bricks_slab": "Lastra di Mattoni di Scoria Scura", + "block.create.dark_scoria_bricks_stairs": "Scalini di Mattoni di Scoria Scura", + "block.create.dark_scoria_bricks_wall": "Muretto di Mattoni di Scoria Scura", + "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": "Installatore", + "block.create.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "Mattoni di Diorite", + "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.dolomite": "Dolomite", + "block.create.dolomite_bricks": "Mattoni di Dolomite", + "block.create.dolomite_bricks_slab": "Lastra di Mattoni di Dolomite", + "block.create.dolomite_bricks_stairs": "Scalini di Mattoni di Dolomite", + "block.create.dolomite_bricks_wall": "Muretto di Mattoni di Dolomite", + "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_pillar": "Pilastro di Dolomite", + "block.create.encased_belt": "Nastro Incassato", + "block.create.encased_fan": "Ventilatore incassato", + "block.create.encased_shaft": "Albero Incassato", + "block.create.extractor": "Estrattore", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "Volano", + "block.create.framed_glass": "Finestra Grande Vetro", + "block.create.framed_glass_pane": "Pannello di Finestra Grande Vetro", + "block.create.furnace_engine": "Motore Fornace", + "block.create.gabbro": "Gabbro", + "block.create.gabbro_bricks": "Mattoni di Gabbro", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Scalini di Mattoni di Gabbro", + "block.create.gabbro_bricks_wall": "Muretto di Mattoni di Gabbro", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Riduttore", + "block.create.gearshift": "Cambio", + "block.create.granite_bricks": "Mattoni di Granito", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "Manovella", + "block.create.horizontal_framed_glass": "Finestra Orizzontale Vetro", + "block.create.horizontal_framed_glass_pane": "Pannello di Finestra Orizzontale Vetro", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Ruota Dentata Grande", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Silico Calcare", + "block.create.limestone": "Calcare", + "block.create.limestone_bricks": "Mattoni di Calcare", + "block.create.limestone_bricks_slab": "Lastra di Mattoni di Calcare", + "block.create.limestone_bricks_stairs": "Scalini di Mattoni di Calcare Levigato", + "block.create.limestone_bricks_wall": "Muretto di Mattoni di Calcare Levigato", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Pilastro di Calcare", + "block.create.linear_chassis": "Telaio Lineare", + "block.create.linked_extractor": "Estrattore Connesso", + "block.create.linked_transposer": "Traspositore Connesso", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Supporto Meccanico", + "block.create.mechanical_crafter": "Costruttore Meccanico", + "block.create.mechanical_drill": "Trapano Meccanico", + "block.create.mechanical_harvester": "Mietitrice Meccanica", + "block.create.mechanical_mixer": "Miscelatore Meccanico", + "block.create.mechanical_piston": "Pistome Meccanico", + "block.create.mechanical_piston_head": "Testa Pistome Meccanico", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Pressa Meccanica", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "Sega Meccanica", + "block.create.millstone": "Macina", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "Scoria Naturale", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "Ugello", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Palo Pistome", + "block.create.polished_dark_scoria": "Scoria Scura Levigata", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Dolomite Levigato", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Gabbro Levigato", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Calcare Levigato", + "block.create.polished_limestone_slab": "Lastra di Calcare Levigato", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "Scoria Levigata", + "block.create.polished_scoria_slab": "Lastra di Scoria Levigata", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Calcare Consumato Levigato", + "block.create.polished_weathered_limestone_slab": "Lastra di Calcare Consumato Levigato", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "Interfaccia di Archiviazione Portatile", + "block.create.powered_latch": "Leva Alimentata", + "block.create.powered_toggle_latch": "Leva Alimentata Alterata", + "block.create.pulley_magnet": "Magnete della Puleggia", + "block.create.pulse_repeater": "Ripetitore di Impulsi", + "block.create.radial_chassis": "Telaio Radiale", + "block.create.redstone_contact": "Contatto Redstone", + "block.create.redstone_link": "Collegamento Redstone", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "Corda", + "block.create.rope_pulley": "Puleggia della Corda", + "block.create.rotation_speed_controller": "Regolatore di Velocità di Rotazione", + "block.create.schematic_table": "Banco Schematico", + "block.create.schematicannon": "Cannoneschematico", + "block.create.scoria": "Scoria", + "block.create.scoria_bricks": "Mattoni di Scoria", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "Pilastro di Scoria", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "Cambio Sequenziale", + "block.create.shaft": "Albero", + "block.create.speedometer": "Tachimetro", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Pistome Meccanico Appiccicoso", + "block.create.stockpile_switch": "Interruttore Accumulatore", + "block.create.stressometer": "Stressometro", + "block.create.tiled_glass": "Vetro Piastrellato", + "block.create.tiled_glass_pane": "Pannello di Vetro Piastrellato", + "block.create.transposer": "Traspositore", + "block.create.turntable": "Piatto", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "Finestra Verticale Vetro", + "block.create.vertical_framed_glass_pane": "Pannello di Finestra Verticale Vetro", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Ruota d'Acqua", + "block.create.weathered_limestone": "Calcare Consumato", + "block.create.weathered_limestone_bricks": "Mattoni di Calcare Consumato", + "block.create.weathered_limestone_bricks_slab": "Lastra di Mattoni di Calcare Consumato", + "block.create.weathered_limestone_bricks_stairs": "Scalini di Mattoni di Calcare Consumato Levigato", + "block.create.weathered_limestone_bricks_wall": "Muretto di Mattoni di Calcare Consumato Levigato", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Pilastro di Calcare Consumato", + "block.create.zinc_block": "Blocco di Zinco", + "block.create.zinc_ore": "Zinco Grezzo", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "Lega di Andesite", + "item.create.attribute_filter": "Filtro Attributi", + "item.create.belt_connector": "Nastro Meccanico", + "item.create.brass_hand": "Mano", + "item.create.brass_ingot": "Lingotto di Ottone", + "item.create.brass_nugget": "Pepita di Ottone", + "item.create.brass_sheet": "Lamiera di Ottone", + "item.create.chromatic_compound": "Composto Cromatico", + "item.create.copper_ingot": "Lingotto di Rame", + "item.create.copper_nugget": "Pepita di Rame", + "item.create.copper_sheet": "Lamiera di Rame", + "item.create.crafter_slot_cover": "Rivestimento Slot Creazione", + "item.create.crushed_brass": "Ottone Frantumato", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "Deforestatore", + "item.create.dough": "Impasto", + "item.create.electron_tube": "Valvola", + "item.create.empty_schematic": "Schematica Vuota", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Filtro", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "Occhiali da Ingegnere", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Zapper di Blocchi Portatile", + "item.create.handheld_worldshaper": "Plasmatore del Mondo Portatile", + "item.create.integrated_circuit": "Circuito Integrato", + "item.create.iron_sheet": "Lamiera di Ferro", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "Quarzo Rosa Levigato", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Elica", + "item.create.red_sand_paper": "Carta Vetrata Rossa", + "item.create.refined_radiance": "Radiance Raffinata", + "item.create.rose_quartz": "Quarzo Rosa", + "item.create.sand_paper": "Carta Vetrata", + "item.create.schematic": "Schematica", + "item.create.schematic_and_quill": "Schematica e Penna d'Oca", + "item.create.shadow_steel": "Acciaio Oscuro", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Fertilizzante per Alberi", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Asta di Simetria", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "Frusta", + "item.create.wrench": "Chiave Inglese", + "item.create.zinc_ingot": "Barra di Zinco", + "item.create.zinc_nugget": "Pepita di Zinco", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "death.attack.create.crush": "%1$s è stato elaborato dala Ruota di Frantumazione", + "death.attack.create.fan_fire": "%1$s è stato bruciato a morte da aria calda", + "death.attack.create.fan_lava": "%1$s è stato bruciato a morte dal ventilatore di lava", + "death.attack.create.mechanical_drill": "%1$s è stato impalato dal Trapano Meccanico", + "death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà dalla Sega Meccanica", + "death.attack.create.cuckoo_clock_explosion": "%1$s è saltato in aria dall'orologio a cucù manomesso", + + "create.block.deployer.damage_source_name": "un Disadattato", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Frantumazione", + "create.recipe.milling": "Fresatura", + "create.recipe.splashing": "Lavaggio alla Rinfusa", + "create.recipe.splashing.fan": "Ventilatore Dietro l'Acqua Corrente", + "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", + "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", + "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "Pressatura", + "create.recipe.mixing": "Mescolamento", + "create.recipe.packing": "Compattazione", + "create.recipe.mechanical_sawing": "Segagione", + "create.recipe.mechanical_crafting": "Creazione Meccanico", + "create.recipe.block_cutting": "Taglio Blocco", + "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", + "create.recipe.sandpaper_polishing": "Carta Vetrata Levigata", + "create.recipe.mystery_conversion": "Metamorfosi Cromatica", + "create.recipe.processing.catalyst": "Catalizzatore", + "create.recipe.processing.chance": "%1$s%% Possibilità", + "create.recipe.processing.chanceToReturn": "%1$s%% Possibilità di Ritorno", + + "create.generic.range": "Gamma", + "create.generic.radius": "Raggio", + "create.generic.width": "Larghezza", + "create.generic.height": "Altezza", + "create.generic.length": "Lunghezza", + "create.generic.speed": "Velocità", + "create.generic.delay": "Ritardo", + "create.generic.unit.ticks": "Tick", + "create.generic.unit.seconds": "Secondi", + "create.generic.unit.minutes": "Minuti", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "Scorri", + "create.action.confirm": "Conferma", + "create.action.abort": "Annulla", + "create.action.saveToFile": "Salva", + "create.action.discard": "Scarta", + + "create.keyinfo.toolmenu": "Focalizza sul Menu Strumento", + "create.keyinfo.scrollup": "Simula Rotellina del Mouse Verso Su (nel mondo)", + "create.keyinfo.scrolldown": "Simula Rotellina del Mouse Verso Giù (nel mondo)", + + "create.gui.scrollInput.defaultTitle": "Scegli un Opzione:", + "create.gui.scrollInput.scrollToModify": "Scorri per Modificare", + "create.gui.scrollInput.scrollToAdjustAmount": "Scorri Fino a Regolare l'Importo", + "create.gui.scrollInput.scrollToSelect": "Scorri per Selezionare", + "create.gui.scrollInput.shiftScrollsFaster": "Premi Shift per Scorrere più Velocemente", + "create.gui.toolmenu.focusKey": "Premi [%1$s] per Aprire il Menu", + "create.gui.toolmenu.cycle": "[SCORRI] per navigare", + "create.gui.symmetryWand.mirrorType": "Specchio", + "create.gui.symmetryWand.orientation": "Orientamento", + + "create.symmetry.mirror.plane": "Una volta", + "create.symmetry.mirror.doublePlane": "Rettangolare", + "create.symmetry.mirror.triplePlane": "Ottagonale", + + "create.orientation.orthogonal": "Ortogonale", + "create.orientation.diagonal": "Diagonale", + "create.orientation.horizontal": "Orizzontale", + "create.orientation.alongZ": "Lungo Z", + "create.orientation.alongX": "Lungo X", + + "create.gui.blockzapper.title": "Posizionatore di Blocchi", + "create.gui.blockzapper.replaceMode": "Modalità Sostituire", + "create.gui.blockzapper.searchDiagonal": "Segui Diagonali", + "create.gui.blockzapper.searchFuzzy": "Ignora i Bordi dei Materiali", + "create.gui.blockzapper.range": "Gamma Diffusione", + "create.gui.blockzapper.needsUpgradedAmplifier": "Richiede Aggirnamento del Amplificatore", + "create.gui.blockzapper.patternSection": "Schema", + "create.gui.blockzapper.pattern.solid": "Solido", + "create.gui.blockzapper.pattern.checkered": "Scacchiera", + "create.gui.blockzapper.pattern.inversecheckered": "Scacchiera Invertita", + "create.gui.blockzapper.pattern.chance25": "25% Riempito", + "create.gui.blockzapper.pattern.chance50": "50% Riempito", + "create.gui.blockzapper.pattern.chance75": "75% Riempito", + "create.gui.terrainzapper.title": "Plasmatore del Mondo", + "create.gui.terrainzapper.placement": "Piazzamento", + "create.gui.terrainzapper.placement.merged": "Fuso", + "create.gui.terrainzapper.placement.attached": "Attaccato", + "create.gui.terrainzapper.placement.inserted": "Inserito", + "create.gui.terrainzapper.brush": "Pennello", + "create.gui.terrainzapper.brush.cuboid": "Cuboide", + "create.gui.terrainzapper.brush.sphere": "Sferico", + "create.gui.terrainzapper.brush.cylinder": "Cilindrico", + "create.gui.terrainzapper.tool": "Strumento", + "create.gui.terrainzapper.tool.fill": "Riempi", + "create.gui.terrainzapper.tool.place": "Piazza", + "create.gui.terrainzapper.tool.replace": "Sostituisci", + "create.gui.terrainzapper.tool.clear": "Ripulisci", + "create.gui.terrainzapper.tool.overlay": "Ricopri", + "create.gui.terrainzapper.tool.flatten": "Appiattisci", + + "create.terrainzapper.shiftRightClickToSet": "Clic-Destro e Shift per selezionare una forma", + + "create.blockzapper.usingBlock": "In utilizzo: %1$s", + "create.blockzapper.componentUpgrades": "Aggiornamenti dei Componenti:", + "create.blockzapper.component.body": "Corpo", + "create.blockzapper.component.amplifier": "Amplificatore", + "create.blockzapper.component.accelerator": "Acceleratore", + "create.blockzapper.component.retriever": "Cane da Riporto", + "create.blockzapper.component.scope": "Portata", + "create.blockzapper.componentTier.none": "Nessuno", + "create.blockzapper.componentTier.brass": "Ottone", + "create.blockzapper.componentTier.chromatic": "Cromatico", + "create.blockzapper.leftClickToSet": "Clic-Sinistro su un blocco per impostare il materiale", + "create.blockzapper.empty": "Fuori dai Blocchi!", + + "create.contraptions.movement_mode": "Modalità Movimento", + "create.contraptions.movement_mode.move_place": "Posizionare Sempre quando è Fermo", + "create.contraptions.movement_mode.move_place_returned": "Posiziona solo nella Posizione Iniziale", + "create.contraptions.movement_mode.move_never_place": "Posiziona solo quando Ancora Distrutto", + "create.contraptions.movement_mode.rotate_place": "Posiziona Sempre quando è Fermo", + "create.contraptions.movement_mode.rotate_place_returned": "Posiziona solo vicino all'Angolo Iniziale", + "create.contraptions.movement_mode.rotate_never_place": "Posiziona Solo quando l'Ancora viene Distrutta", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Filtro", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "Statistiche del Generatore:", + "create.gui.goggles.kinetic_stats": "Statistiche Cinetiche:", + "create.gui.goggles.at_current_speed": "Alla velocità Attuale", + "create.gui.goggles.base_value": "Valore Base", + "create.gui.gauge.info_header": "Informazioni sul Calibro:", + "create.gui.speedometer.title": "Velocità di Rotazione", + "create.gui.stressometer.title": "Stress della Rete", + "create.gui.stressometer.capacity": "Capacità Rimanente", + "create.gui.stressometer.overstressed": "Sovrastressato", + "create.gui.stressometer.no_rotation": "Nessuna Rotazione", + "create.gui.contraptions.not_fast_enough": "Sembra che questo %1$s _non_ stia girando con una _velocità_ _sufficiente_.", + "create.gui.contraptions.network_overstressed": "Sembra che questo marchingegno sia _sovraccarico_. Aggiungi più fonti o _rallenta_ i componenti con un forte _impatto_ _di_ _stress_.", + "create.gui.adjustable_crate.title": "Baule Regolabile", + "create.gui.adjustable_crate.storageSpace": "Spazio di Immagazzinamento", + "create.gui.stockpile_switch.title": "Interruttore Accumulatore", + "create.gui.stockpile_switch.lowerLimit": "Soglia Inferiore", + "create.gui.stockpile_switch.upperLimit": "Soglia Superiore", + "create.gui.stockpile_switch.startAt": "Inizia Segnale al", + "create.gui.stockpile_switch.startAbove": "Inizia il Segnale dop.", + "create.gui.stockpile_switch.stopAt": "Ferma Segnale al", + "create.gui.stockpile_switch.stopBelow": "Ferma il Segnale dop.", + "create.gui.sequenced_gearshift.title": "Cambio Sequenziale", + "create.gui.sequenced_gearshift.instruction": "Istruzione", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Gira", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angolo", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistone", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distanza", + "create.gui.sequenced_gearshift.instruction.wait": "Aspetta", + "create.gui.sequenced_gearshift.instruction.wait.duration": "Durata", + "create.gui.sequenced_gearshift.instruction.end": "Fine", + "create.gui.sequenced_gearshift.speed": "Velocità, Direzione", + "create.gui.sequenced_gearshift.speed.forward": "Velocità di ingresso, Avanti", + "create.gui.sequenced_gearshift.speed.forward_fast": "Doppia velocità, Avanti", + "create.gui.sequenced_gearshift.speed.back": "Velocità di ingresso, Invertita", + "create.gui.sequenced_gearshift.speed.back_fast": "Doppia velocità, Invertita", + + "create.schematicAndQuill.dimensions": "Dimensione Schematica: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Prima posizione impostata.", + "create.schematicAndQuill.secondPos": "Seconda posizione impostata.", + "create.schematicAndQuill.noTarget": "Premi [Ctrl] per selezionare il Blocco d'Aria.", + "create.schematicAndQuill.abort": "Selezione rimossa.", + "create.schematicAndQuill.prompt": "Immettere un nome per lo schema:", + "create.schematicAndQuill.fallbackName": "La mia Schematica", + "create.schematicAndQuill.saved": "Salvata come %1$s", + + "create.schematic.invalid": "[!] Oggetto non valido - Utilizza invece il Banco Schematico", + "create.schematic.position": "Posizione", + "create.schematic.rotation": "Rotazione", + "create.schematic.rotation.none": "Nessuna", + "create.schematic.rotation.cw90": "Senso Orario 90", + "create.schematic.rotation.cw180": "Senso Orario 180", + "create.schematic.rotation.cw270": "Senso Orario 270", + "create.schematic.mirror": "Specchio", + "create.schematic.mirror.none": "Nessuno", + "create.schematic.mirror.frontBack": "Fronte-Retro", + "create.schematic.mirror.leftRight": "Sinistra-Destra", + "create.schematic.tool.deploy": "Installa", + "create.schematic.tool.move": "Muovi XZ", + "create.schematic.tool.movey": "Muovi Y", + "create.schematic.tool.rotate": "Ruota", + "create.schematic.tool.print": "Stampa", + "create.schematic.tool.flip": "Capovolgi", + "create.schematic.tool.deploy.description.0": "Sposta la struttura in una posizione.", + "create.schematic.tool.deploy.description.1": "Clic-Destro sul terreno per posizionarla.", + "create.schematic.tool.deploy.description.2": "premi [Ctrl] per selezionare a distanza fissa.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Scorri per cambiare la distanza.", + "create.schematic.tool.move.description.0": "Sposta la Schematica in Orizzontale.", + "create.schematic.tool.move.description.1": "Indica la Schematica e [CTRL]-Scorri per spingerla.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Sposta la Schematica verticalmente.", + "create.schematic.tool.movey.description.1": "[CTRL]-Scorri per spostarla su/giù.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Ruota la Schematica attorno al suo centro.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Scorri ruota di 90 gradi.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Posiziona istantaneamente la struttura nel mondo.", + "create.schematic.tool.print.description.1": "[Clic-Destro] per confermare la posizione corrente.", + "create.schematic.tool.print.description.2": "Questo strumento è solo per la modalità creativa.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Capovolge la schematica lungo la faccia selezionata.", + "create.schematic.tool.flip.description.1": "Indica la schematica e [CTRL]-Scorri per capovolgerla.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Sincronizzazione...", + "create.schematics.uploadTooLarge": "La schematica è troppo grande.", + "create.schematics.maxAllowedSize": "La dimensione massima consentita del file schematica è:", + + "create.gui.schematicTable.title": "Banco Schematico", + "create.gui.schematicTable.availableSchematics": "Schatiche disponibili", + "create.gui.schematicTable.noSchematics": "Nessuna Schatica Salvata", + "create.gui.schematicTable.uploading": "Caricamento...", + "create.gui.schematicTable.finished": "Caricamento Finito!", + "create.gui.schematicannon.title": "Cannoneschematico", + "create.gui.schematicannon.settingsTitle": "Impostazioni di Posizionamento", + "create.gui.schematicannon.listPrinter": "Stampante Lisra dei Materiali", + "create.gui.schematicannon.gunpowderLevel": "Polvere da sparo al %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Spari Rimanenti: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Con il backup: %1$s", + "create.gui.schematicannon.optionEnabled": "Attualmente Abilitato", + "create.gui.schematicannon.optionDisabled": "Attualmente Disabilitato", + "create.gui.schematicannon.option.dontReplaceSolid": "Non sostituire i Blocchi Solidi", + "create.gui.schematicannon.option.replaceWithSolid": "Sostituisci Solidi con Solidi", + "create.gui.schematicannon.option.replaceWithAny": "Sostituisci Solidi con Qualsiasi", + "create.gui.schematicannon.option.replaceWithEmpty": "Sostituisci Solidi con il Vuoto", + "create.gui.schematicannon.option.skipMissing": "Salta i Blocchi Mancanti", + "create.gui.schematicannon.option.skipTileEntities": "Proteggi i Blocchi Entità", + "create.gui.schematicannon.option.skipMissing.description": "Se il cannone non riesce a trovare un blocco richiesto per il posizionamento, continuerà nella posizione successiva.", + "create.gui.schematicannon.option.skipTileEntities.description": "Il cannone eviterà di sostituire i blocchi di dati come bauli.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Il cannone non sostituirà mai alcun blocco Solido nella sua area di lavoro, solo non solidi e aria.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Il cannone sostituirà i blocchi solidi nella sua area di lavoro se lo schema contiene un blocco solido nella posizione.", + "create.gui.schematicannon.option.replaceWithAny.description": "Il cannone sostituirà i blocchi solidi nella sua area di lavoro se lo schema contiene qualche blocco nella posizione.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Il cannone eliminerà tutti i blocchi nell'area di lavoro, compresi quelli sostituiti dal aria.", + + "create.schematicannon.status.idle": "Inattivo", + "create.schematicannon.status.ready": "Pronto", + "create.schematicannon.status.running": "In Esecuzione", + "create.schematicannon.status.finished": "Finito", + "create.schematicannon.status.paused": "In Pausa", + "create.schematicannon.status.stopped": "Fermato", + "create.schematicannon.status.noGunpowder": "Niente Polvere da sparo", + "create.schematicannon.status.targetNotLoaded": "Il Blocco non è Caricato", + "create.schematicannon.status.targetOutsideRange": "Obbiettivo Troppo Lontano", + "create.schematicannon.status.searching": "Ricercando", + "create.schematicannon.status.skipping": "Saltando", + "create.schematicannon.status.missingBlock": "Bloc. Mancante:", + "create.schematicannon.status.placing": "Piazzando", + "create.schematicannon.status.clearing": "Cancellando Blocchi", + "create.schematicannon.status.schematicInvalid": "Schematica Non Valida", + "create.schematicannon.status.schematicNotPlaced": "Schematica Non Implementata", + "create.schematicannon.status.schematicExpired": "File Schematica Scaduto", + + "create.gui.filter.blacklist": "Lista Nera", + "create.gui.filter.blacklist.description": "Gli oggetti passano se NON corrispondono a nessuno dei precedenti. Una Lista Nera vuota accetta tutto.", + "create.gui.filter.whitelist": "Lista Bianca", + "create.gui.filter.whitelist.description": "Gli oggetti passano se corrispondono a uno dei precedenti. Una Lista Bianca vuota rifiuta tutto.", + "create.gui.filter.respect_data": "Rispetto dei Dati", + "create.gui.filter.respect_data.description": "Gli oggetti corrispondono solo se la loro durata, incantesimi e altri attributi corrispondono.", + "create.gui.filter.ignore_data": "Ignora Dati", + "create.gui.filter.ignore_data.description": "Gli oggetti corrispondono indipendentemente dai loro attributi.", + + "create.item_attributes.placeable": "è posizionabile", + "create.item_attributes.consumable": "può essere mangiato", + "create.item_attributes.smeltable": "può essere Fuso", + "create.item_attributes.washable": "può essere Lavato", + "create.item_attributes.smokable": "può essere Affumicato", + "create.item_attributes.blastable": "è fondibile in un Forno fusorio", + "create.item_attributes.enchanted": "è incantato", + "create.item_attributes.damaged": "è danneggiato", + "create.item_attributes.badly_damaged": "è gravemente danneggiato", + "create.item_attributes.not_stackable": "non impilabile", + "create.item_attributes.equipable": "può essere equipaggiato", + "create.item_attributes.furnace_fuel": "è il combustibile della fornace", + "create.item_attributes.in_tag": "è etichettato %1$s", + "create.item_attributes.in_item_group": "appartiene a %1$s", + "create.item_attributes.added_by": "è stato aggiunto da %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato", + "create.gui.attribute_filter.selected_attributes": "Attributi selezionati:", + "create.gui.attribute_filter.whitelist_disjunctive": "Lista Bianca (Qualsiasi)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", + "create.gui.attribute_filter.whitelist_conjunctive": "Lista Bianca (Tutti)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "Gli oggetti passano solo se hanno TUTTI gli attributi selezionati.", + "create.gui.attribute_filter.blacklist": "Lista Nera", + "create.gui.attribute_filter.blacklist.description": "Gli oggetti passano se NON hanno nessuno degli attributi selezionati.", + "create.gui.attribute_filter.add_reference_item": "Agg. Oggetto di Riferim.", + + "create.tooltip.holdKey": "Premi [%1$s]", + "create.tooltip.holdKeyOrKey": "Premi [%1$s] o [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "Velocità Richiesta: %1$s", + "create.tooltip.speedRequirement.none": "Nessuna", + "create.tooltip.speedRequirement.medium": "Moderata", + "create.tooltip.speedRequirement.high": "Veloce", + "create.tooltip.stressImpact": "Impatto sullo Stress: %1$s", + "create.tooltip.stressImpact.low": "Basso", + "create.tooltip.stressImpact.medium": "Moderato", + "create.tooltip.stressImpact.high": "Alto", + "create.tooltip.stressImpact.overstressed": "Sovrastressato", + "create.tooltip.capacityProvided": "Capacità dello Stress: %1$s", + "create.tooltip.capacityProvided.low": "Piccola", + "create.tooltip.capacityProvided.medium": "Media", + "create.tooltip.capacityProvided.high": "Grande", + "create.tooltip.capacityProvided.asGenerator": "(Come generatore)", + "create.tooltip.generationSpeed": "Genera %1$s %2$s", + "create.tooltip.analogStrength": "Forza Analogica: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "Ingredienti Min.", + + "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.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Il tick del server è attualmente rallentato di %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Il tick del server è ora rallentato di %s ms >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Il tick del server è tornato alla velocità normale :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: usa /killtps per riportare il tick del server alla velocità normale", + "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps avvia per rallentare artificialmente il tick del server", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "Tiri del Cannoneschematico", + "create.subtitle.schematicannon_finish": "Finiture Cannoneschematico", + "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.mechanical_press_activation": "Pressa Meccanica attiva", + "create.subtitle.mechanical_press_item_break": "Metal clanks", + "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", + "create.subtitle.blockzapper_confirm": "Ding Affermativo", + "create.subtitle.blockzapper_deny": "Boop in Calo", + "create.subtitle.block_funnel_eat": "CHOMPS a Imbuto", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "OGGETTO DI ESEMPIO (solo un indicatore che esiste nella descrizione)", + "item.create.example_item.tooltip.summary": "Una breve descrizione dell'oggetto. La _sottolineatura_ evidenzia un termine.", + "item.create.example_item.tooltip.condition1": "Quando questo", + "item.create.example_item.tooltip.behaviour1": "Quindi questo articolo fa questo. (i comportamenti mostrati con shift)", + "item.create.example_item.tooltip.condition2": "E quando questo", + "item.create.example_item.tooltip.behaviour2": "Puoi aggiungere tutti i comportamenti che desideri", + "item.create.example_item.tooltip.control1": "Quando premi Ctrl", + "item.create.example_item.tooltip.action1": "Questi controlli vengono visualizzati.", + + "item.create.wand_of_symmetry.tooltip": "ASTA DI SIMETRIA", + "item.create.wand_of_symmetry.tooltip.summary": "Rispecchia perfettamente il posizionamento dei blocchi su piani configurati.", + "item.create.wand_of_symmetry.tooltip.condition1": "In Hotbar", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Rimane attivo", + "item.create.wand_of_symmetry.tooltip.control1": "Clic-Destro sul Terreno", + "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _Sposta_ lo Specchio", + "item.create.wand_of_symmetry.tooltip.control2": "Clic-Destro in Aria", + "item.create.wand_of_symmetry.tooltip.action2": "_Rimuove_ lo Specchio attivo", + "item.create.wand_of_symmetry.tooltip.control3": "Clic-Destro da Accovacciato", + "item.create.wand_of_symmetry.tooltip.action3": "Apre l'_Interfaccia_ _di_ _Configurazione_", + + "item.create.handheld_blockzapper.tooltip": "POSIZIONATORE DI BLOCCHI PORTATILE", + "item.create.handheld_blockzapper.tooltip.summary": "Nuovo gadget per posizionare o scambiare blocchi a distanza.", + "item.create.handheld_blockzapper.tooltip.control1": "Clic-Sinistro su un Blocco", + "item.create.handheld_blockzapper.tooltip.action1": "Imposta i blocchi posizionati dallo strumento sul blocco selezionato.", + "item.create.handheld_blockzapper.tooltip.control2": "Clic-Destro su un Blocco", + "item.create.handheld_blockzapper.tooltip.action2": "_Piazza_ o _Sostituisce_ il blocco selezionato.", + "item.create.handheld_blockzapper.tooltip.control3": "Clic-Destro da Accovacciato", + "item.create.handheld_blockzapper.tooltip.action3": "Apre l'_Interfaccia_ _di_ _Configurazione_.", + + "item.create.handheld_worldshaper.tooltip": "PLASMATORE DEL MONDO PORTATILE", + "item.create.handheld_worldshaper.tooltip.summary": "Strumento per la creazione di _paesaggi_ e _caratteristiche_ _del_ _terreno_.", + "item.create.handheld_worldshaper.tooltip.control1": "Clic-Sinistro su un Blocco", + "item.create.handheld_worldshaper.tooltip.action1": "Imposta i blocchi posizionati dallo strumento sul blocco selezionato.", + "item.create.handheld_worldshaper.tooltip.control2": "Clic-Destro su un Blocco", + "item.create.handheld_worldshaper.tooltip.action2": "Applica il _Pennello_ e lo _Strumento_ attualmente selezionati nella posizione selezionata.", + "item.create.handheld_worldshaper.tooltip.control3": "Clic-Destro da Accovacciato", + "item.create.handheld_worldshaper.tooltip.action3": "Apre l'_Interfaccia_ _di_ _Configurazione_", + + "item.create.tree_fertilizer.tooltip": "FERTILIZZANTE PER ALBERI", + "item.create.tree_fertilizer.tooltip.summary": "Una potente combinazione di minerali adatta ad accelerare la crescita di tipi di alberi comuni.", + "item.create.tree_fertilizer.tooltip.condition1": "Se utilizzato su un Arboscello", + "item.create.tree_fertilizer.tooltip.behaviour1": "Cresce gli Alberi _indipendentemente_ dalle _condizioni_ _di_ _spaziatura_", + + "item.create.deforester.tooltip": "DEFORESTATORE", + "item.create.deforester.tooltip.summary": "Un' _ascia_ _radiante_ in grado di abbattere alberi in una frazione di secondo.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "FILTRO", + "item.create.filter.tooltip.summary": "_Controlla_ _gli_ _output_ e gli _input_ dei dispositivi logistici con maggiore _precisione_, confrontandoli con una _serie_ _di_ _oggetti_ o diversi _filtri_ _nidificati_.", + "item.create.filter.tooltip.condition1": "Quando si trova nello slot del filtro", + "item.create.filter.tooltip.behaviour1": "_Controlla_ il flusso degli oggetti in base alla sua _configurazione_.", + "item.create.filter.tooltip.condition2": "Clic-Destro su di esso", + "item.create.filter.tooltip.behaviour2": "Apre l'_Interfaccia_ _di_ _Configurazione_.", + + "item.create.attribute_filter.tooltip": "FILTRO ATTRIBUTI", + "item.create.attribute_filter.tooltip.summary": "_Controlla_ _gli_ _output_ e gli _input_ dei dispositivi logistici con maggiore _precisione_, abbinandolo a una _serie_ _di_ _attributi_ e _categorie_ di oggetti.", + "item.create.attribute_filter.tooltip.condition1": "Quando si trova nello slot del filtro", + "item.create.attribute_filter.tooltip.behaviour1": "_Controlla_ il flusso degli oggetti in base alla sua _configurazione_.", + "item.create.attribute_filter.tooltip.condition2": "Clic-Destro su di esso", + "item.create.attribute_filter.tooltip.behaviour2": "Apre l'_Interfaccia_ _di_ _Configurazione_.", + + "item.create.empty_schematic.tooltip": "SCHEMATICA VUOTA", + "item.create.empty_schematic.tooltip.summary": "Utilizzato come ingrediente per ricette e per la scrittura al _Banco_ _Schematico_.", + + "item.create.schematic.tooltip": "SCHEMATICA", + "item.create.schematic.tooltip.summary": "Contiene una struttura da posizionare e collocare nel mondo. Posiziona l'ologramma come desiderato e usa un _Cannoneschematico_ per costruirla.", + "item.create.schematic.tooltip.condition1": "Quando Tenuto", + "item.create.schematic.tooltip.behaviour1": "Può essere posizionato utilizzando gli Strumenti sullo Schermo.", + "item.create.schematic.tooltip.control1": "Clic-Destro da Accovacciato", + "item.create.schematic.tooltip.action1": "Apre un'_Interfaccia_ per l'immissione di _Coordinate_ esatte.", + + "item.create.schematic_and_quill.tooltip": "SCHEMATICA E PENNA D'OCA", + "item.create.schematic_and_quill.tooltip.summary": "Utilizzato per salvare una struttura nel tuo mondo in un file .nbt.", + "item.create.schematic_and_quill.tooltip.condition1": "Passo 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Seleziona due punti d'angolo usando il Clic-Destro.", + "item.create.schematic_and_quill.tooltip.condition2": "Passo 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scorri_ sui volti per regolare le dimensioni. Clic-Destro di nuovo per salvare.", + "item.create.schematic_and_quill.tooltip.control1": "Clic-Destro", + "item.create.schematic_and_quill.tooltip.action1": "Seleziona un punto d'angolo / conferma il salvataggio.", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl Premuto", + "item.create.schematic_and_quill.tooltip.action2": "Seleziona i punti a _mezz'aria_. _Scorri_ per regolare la distanza.", + "item.create.schematic_and_quill.tooltip.control3": "Clic-Destro da Accovacciato", + "item.create.schematic_and_quill.tooltip.action3": "_Resetta_ e rimuove la selezione.", + + "block.create.schematicannon.tooltip": "CANNONESCHEMATICO", + "block.create.schematicannon.tooltip.summary": "Spara blocchi per ricreare una _Schematica_ distribuita nel Mondo. Usa gli oggetti degli inventari adiacenti e della _Polvere da sparo_ come combustibile.", + "block.create.schematicannon.tooltip.control1": "Clic-Destro su di esso", + "block.create.schematicannon.tooltip.action1": "Apre l'_Interfaccia_", + + "block.create.schematic_table.tooltip": "BANCO SCHEMATICO", + "block.create.schematic_table.tooltip.summary": "Scrive schematiche salvate su una _Schematica_ _Vuota_.", + "block.create.schematic_table.tooltip.condition1": "Quando viene fornita una Schematica Vuota", + "block.create.schematic_table.tooltip.behaviour1": "Carica un file selezionato dalla cartella Schematics.", + + "block.create.shaft.tooltip": "ALBERO", + "block.create.shaft.tooltip.summary": "_Rotazione_ _Relè_ in linea retta.", + + "block.create.cogwheel.tooltip": "RUOTA DENTATA", + "block.create.cogwheel.tooltip.summary": "_Rotazione_ _Relè_ in linea retta e su _Ruote_ _Dentate_ adiacenti.", + + "block.create.large_cogwheel.tooltip": "RUOTA DENTATA GRANDE", + "block.create.large_cogwheel.tooltip.summary": "Una versione più grande della _Ruota_ _Dentata_, consente di _modificare_ la _Velocità_ _di_ _Rotazione_ quando è collegato alla sua controparte più piccola.", + + "block.create.encased_shaft.tooltip": "ALBERO INCASSATO", + "block.create.encased_shaft.tooltip.summary": "_Rotazione_ _Relè_ in linea retta. Adatto per propagare la rotazione attraverso le pareti.", + + "block.create.gearbox.tooltip": "RIDUTTORE", + "block.create.gearbox.tooltip.summary": "_Rotazione_ _Relè_ in _quatro_ _direzioni_ Inverte le connessioni diritte.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "CAMBIO", + "block.create.gearshift.tooltip.summary": "Un controllo per attivare / disattivare la direzione di rotazione per gli alberi collegati.", + "block.create.gearshift.tooltip.condition1": "Quando Alimentato", + "block.create.gearshift.tooltip.behaviour1": "_Inverte_ la rotazione in uscita.", + + "block.create.clutch.tooltip": "FRIZIONE", + "block.create.clutch.tooltip.summary": "Un controllo per innestare / disinnestare la rotazione per gli alberi collegati.", + "block.create.clutch.tooltip.condition1": "Quando Alimentato", + "block.create.clutch.tooltip.behaviour1": "_Interrompe_ il trasferimento della rotazione dall'altro lato.", + + "block.create.encased_belt.tooltip": "NASTRO INCASSATO", + "block.create.encased_belt.tooltip.summary": "_Rotazione_ _Relè_ attraverso il suo blocco attaccato ai _Nastri_ _Incassati_", + "block.create.encased_belt.tooltip.condition1": "Quando Connesso", + "block.create.encased_belt.tooltip.behaviour1": "I blocchi collegati avranno la _stessa_ _velocità_ _di_ _rotazione_ e direzione esatte. Non devono affrontare allo stesso modo.", + + "block.create.adjustable_pulley.tooltip": "PULEGGIA ANALOGICA", + "block.create.adjustable_pulley.tooltip.summary": "_Rotazione_ _Relè_ attraverso il suo blocco attaccato ai _Nastri_ _Incassati_. I nastri incassati attaccati _ruoteranno_ _più_ _velocemente_ in base al _segnale_ _analogico_ _di_ _redstone_ ricevuto da questo blocco.", + "block.create.adjustable_pulley.tooltip.condition1": "Controllo Redstone", + "block.create.adjustable_pulley.tooltip.behaviour1": "Senza un segnale, _non_ _accelererà_ i nastri collegati. Con un segnale a piena forza collegato al nastro, la velocità _raddoppia_.", + + "item.create.belt_connector.tooltip": "NASTRO MECCANICO", + "item.create.belt_connector.tooltip.summary": "Collega due o più _Alberi_ con un _Nastro_ _Meccanico_. Gli alberi collegati avranno la stessa velocità e direzione di rotazione esatte. Il Nastro può fungere da _Trasportatore_ per _Oggetti_ ed _Entità_.", + "item.create.belt_connector.tooltip.control1": "Clic-Destro sui Alberi", + "item.create.belt_connector.tooltip.action1": "Seleziona l'albero come una puleggia del Nastro. Entrambi gli Alberi selezionati devono _allinearsi_ _Verticalmente_, _Orizzontalmente_, o _Diagonalmente_ verso la direzione del Nastro.", + "item.create.belt_connector.tooltip.control2": "Clic-Destro da Accovacciato", + "item.create.belt_connector.tooltip.action2": "_Reimposta_ la prima posizione selezionata per il Nastro.", + + "item.create.goggles.tooltip": "OCCHIALI DA INGEGNERE", + "item.create.goggles.tooltip.summary": "Un paio di occhiali per migliorare la tua visione con utili _informazioni_ _cinetiche_.", + "item.create.goggles.tooltip.condition1": "Quando indossati", + "item.create.goggles.tooltip.behaviour1": "Mostra gli _indicatori_ _colorati_ corrispondenti al _Livello_ _di_ _Velocità_ di un componente cinetico posizionato, nonché all'_Impatto_ _dello_ _Stress_ e la capacità dei singoli componenti.", + "item.create.goggles.tooltip.condition2": "Quando si guarda il calibro", + "item.create.goggles.tooltip.behaviour2": "Mostra informazioni dettagliate sulla _Velocità_ o lo _Stress_ della rete a cui è collegato il misuratore.", + + "item.create.wrench.tooltip": "CHIAVE INGLESE", + "item.create.wrench.tooltip.summary": "Uno strumento utile per lavorare su congegni cinetici. Può essere usato per _Ruotare_, _Smontare_ e _Configurare_ i componenti.", + "item.create.wrench.tooltip.control1": "Clic-Destro su un blocco cinetico", + "item.create.wrench.tooltip.action1": "_Ruota_ _i_ _componenti_ verso o lontano dalla faccia con cui hai interagito.", + "item.create.wrench.tooltip.control2": "Clic-Destro da Accovacciato", + "item.create.wrench.tooltip.action2": "_Smonta_ _i_ _Componenti_ _Cinetici_ e li rimette nel _tuo_ _inventario_.", + + "block.create.creative_motor.tooltip": "MOTORE", + "block.create.creative_motor.tooltip.summary": "Una fonte configurabile di _Forza_ _di_ _Rotazione_.", + + "block.create.water_wheel.tooltip": "RUOTA D'ACQUA", + "block.create.water_wheel.tooltip.summary": "Fornisce un _Forza_ _di_ _Rotazione_ prelevata da correnti d'_Acqua_ _Adiacenti_.", + + "block.create.encased_fan.tooltip": "VENTILATORE INCASSATO", + "block.create.encased_fan.tooltip.summary": "Converte la _Forza_ _di_ _Rotazione_ in _Correnti_ _d'Aria_ e ritorno. Ha una varietà di usi.", + "block.create.encased_fan.tooltip.condition1": "Quando Alimentato da Redstone", + "block.create.encased_fan.tooltip.behaviour1": "Fornisce _forza_ _di_ _rotazione_ da qualsiasi _fonte_ _di_ _calore_ immediatamente al di sotto di sé. Il ventilatore deve essere rivolto verso il basso.", + "block.create.encased_fan.tooltip.condition2": "Quando in Ruotazione", + "block.create.encased_fan.tooltip.behaviour2": "_Spinge_ o _Tira_ Entità, a seconda della velocità di Rotazione in entrata.", + "block.create.encased_fan.tooltip.condition3": "Quando soffia attraverso blocchi speciali", + "block.create.encased_fan.tooltip.behaviour3": "_Liquidi_ e particelle di _Fuoco_ vengono emessi nel flusso d'aria. Questo può essere usato per _elaborare_ _oggetti_.", + + "block.create.nozzle.tooltip": "UGELLO", + "block.create.nozzle.tooltip.summary": "Attacca la parte anteriore di un _Ventilatore_ _Incassato_ per distribuire il suo effetto sulle Entità in _tutte_ _le_ _direzioni_.", + + "block.create.hand_crank.tooltip": "MANOVELLA", + "block.create.hand_crank.tooltip.summary": "Una semplice _fonte_ di _Forza_ _di_ _Rotazione_ che richiede l'interazione dei giocatori.", + "block.create.hand_crank.tooltip.condition1": "Quando usata", + "block.create.hand_crank.tooltip.behaviour1": "Fornisce una _Forza_ _di_ _Rotazione_ a un aggeggio attaccato. _Accovacciati_ _per_ _invertire_ la rotazione.", + + "block.create.cuckoo_clock.tooltip": "OROLOGIO A CUCÙ", + "block.create.cuckoo_clock.tooltip.summary": "Artigianato raffinato per _decorare_ uno spazio e _tener_ _traccia_ _del_ _tempo_.", + "block.create.cuckoo_clock.tooltip.condition1": "Quando Ruotato", + "block.create.cuckoo_clock.tooltip.behaviour1": "Mostra l'_ora_ _corrente_ e suona una melodia due volte al giorno. Si _attiva_ una volta a mezzogiorno e al crepuscolo, non appena i _giocatori_ _possono_ _dormire_.", + + "block.create.turntable.tooltip": "PIATTO", + "block.create.turntable.tooltip.summary": "Trasforma la _Forza_ _di_ _Rotazione_ in una Raffinata Cinetosi.", + + "block.create.millstone.tooltip": "MACINA", + "block.create.millstone.tooltip.summary": "Un componente cinetico adatto per la _rettifica_ dei _materiali_ inseriti. Può essere alimentato da una ruota dentata adiacente o collegandosi all'albero nella parte inferiore. I risultati devono essere estratti dal componente.", + "block.create.millstone.tooltip.condition1": "Quando Ruotato", + "block.create.millstone.tooltip.behaviour1": "Inizia ad applicare le _ricette_ di _fresatura_ a tutti gli elementi inseriti dal lato o dalla parte superiore del blocco.", + "block.create.millstone.tooltip.condition2": "Quando Toccato con Clic-Destro", + "block.create.millstone.tooltip.behaviour2": "Raccogli manualmente gli output.", + + "block.create.crushing_wheel.tooltip": "RUOTA DI FRANTUMAZIONE", + "block.create.crushing_wheel.tooltip.summary": "Grandi ruote girevoli che _rompono_ qualsiasi cosa.", + "block.create.crushing_wheel.tooltip.condition1": "Se collegata ad altre ruote di frantumazione", + "block.create.crushing_wheel.tooltip.behaviour1": "Forma una frantumatrice per la lavorazione di una varietà di cose. I denti delle ruote devono connettersi e muoversi con la _stessa_ _velocità_ in _direzioni_ _opposte_.", + + "block.create.mechanical_press.tooltip": "PRESSA MECCANICA", + "block.create.mechanical_press.tooltip.summary": "Un pistone potente per comprimere gli oggetti sottostanti. Richiede una _Forza_ _di_ _Rotazione_ costante.", + "block.create.mechanical_press.tooltip.condition1": "Quando alimentata da Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "_Inizia_ a comprimere gli oggetti rilasciati al di sotto di esso.", + "block.create.mechanical_press.tooltip.condition2": "Quando sopra a un Nastro Meccanico", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _Automaticamente_ gli oggetti che passano sul Nastro.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "BACINELLA", + "block.create.basin.tooltip.summary": "Un pratico _contenitore_ _di_ _oggetti_ utilizzato nella lavorazione con il _Miscelatore_ _Meccanico_ e la _Pressa_ _Meccanica_. Supporta i _Comparatori_ _Redstone_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "MISCELATORE MECCANICO", + "block.create.mechanical_mixer.tooltip.summary": "Una frusta cinetica per applicare qualsiasi ricetta di creazione informe agli oggetti sottostanti. Richiede una _Forza_ _di_ _Rotazione_ costante e una _Bacinella_ posizionata sotto (con uno spazio in mezzo).", + "block.create.mechanical_mixer.tooltip.condition1": "Quando sopra a una Bacinella", + "block.create.mechanical_mixer.tooltip.behaviour1": "Inizia a mescolare gli oggetti nella bacinella ogni volta che sono presenti tutti gli ingredienti necessari.", + "block.create.mechanical_mixer.tooltip.condition2": "Se utilizzato con la Chiave Inglese", + "block.create.mechanical_mixer.tooltip.behaviour2": "Configura la quantità minima di _ingredienti_ _totali_ per le ricette applicate. Utilizzare questa opzione per _escludere_ _ricette_ _indesiderate_ con ingredienti simili o meno.", + + "block.create.mechanical_crafter.tooltip": "COSTRUTTORE MECCANICO", + "block.create.mechanical_crafter.tooltip.summary": "Un assemblatore cinetico per _automatizzare_ qualsiasi ricetta di _creazione_ _modellata_. Posiziona i _multipli_ _in_ _una_ _griglia_ corrispondente alla tua ricetta, e _disponi_ _i_ _loro_ _nastri_ per creare un _flusso_ che esce dalla griglia su uno degli costruttori.", + "block.create.mechanical_crafter.tooltip.condition1": "Quando ruotato", + "block.create.mechanical_crafter.tooltip.behaviour1": "_Inizia_ _il_ _processo_ _di_ _creazione_ non appena a tutti i costruttori della griglia è stato assegnato un oggetto.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "Quando Strappato sul Davanti", + "block.create.mechanical_crafter.tooltip.action1": "_Cicla_ _la_ _direzione_ verso cui un singolo costruttore _sposta_ _i_ _suoi_ _oggetti_. Per formare una griglia di lavoro, _disporre_ _i_ _nastri_ _in_ _un_ _flusso_ che sposta tutti gli oggetti verso il costruttore finale. Il costruttore finale deve puntare lontano dalla griglia.", + "block.create.mechanical_crafter.tooltip.control2": "Quando Strappato sul Dietro", + "block.create.mechanical_crafter.tooltip.action2": "_Collega_ l'_inventario_ _di_ _input_ _ dei costruttori adiacenti. Usa questo per _combinare_ _gli_ _slot_ nella griglia di creazione e _risparmiare_ _sul_ _lavoro_ _di_ _input_.", + + "block.create.furnace_engine.tooltip": "MOTORE FORNACE", + "block.create.furnace_engine.tooltip.summary": "Una potente fonte di _Potenza_ _Rotazionale_ che richiede un _forno_ _funzionante_ per funzionare.", + "block.create.furnace_engine.tooltip.condition1": "Se Collegato alla Fornace Accesa", + "block.create.furnace_engine.tooltip.behaviour1": "_Inizia_ _a_ _alimentare_ un _Volano_ posto di fronte (a 1m di distanza). Utilizza un Forno Fusorio per velocità più elevate.", + + "block.create.flywheel.tooltip": "VOLANO", + "block.create.flywheel.tooltip.summary": "Una grande ruota di metallo per _imbrigliare_ _e_ _stabilizzare_ la forza generata da un _motore_ _collegato_. I volani si collegano ai motori se sono a _1m_ di distanza e ad un _angolo_ _di_ _90°_ l'uno dall'altro.", + "block.create.flywheel.tooltip.condition1": "Se collegato a un Motore in Funzione", + "block.create.flywheel.tooltip.behaviour1": "Fornisce la _Forza_ _di_ _Rotazione_ a un aggeggio connesso in base alla forza e alla velocità del generatore.", + + "block.create.portable_storage_interface.tooltip": "INTERFACCIA DI ARCHIVIAZIONE PORTATILE", + "block.create.portable_storage_interface.tooltip.summary": "Un punto di interscambio portatile per _spostare_ _oggetti_ da e verso una _struttura_ mossa da un pistone, supporto, carrello da miniera o puleggia.", + "block.create.portable_storage_interface.tooltip.condition1": "In Movimento", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interagisce con i _traspositori_ fissi in modo tale che i traspositori _rivolti_ _lontano_ dall'interfaccia _estraggano_ _gli_ _oggetti_, e i traspositori che puntano l'interfaccia _inseriranno_ _gli_ _oggetti_ dall'inventario allegato. Il congegno si arresterà brevemente quando gli oggetti vengono scambiati.", + + "block.create.rotation_speed_controller.tooltip": "REGOLATORE DI VELOCITÀ DI ROTAZIONE", + "block.create.rotation_speed_controller.tooltip.summary": "Un _relè_ _configurabile_ in grado di accelerare o rallentare il componente selezionato a qualsiasi velocità desiderata.", + "block.create.rotation_speed_controller.tooltip.condition1": "Se collegato a una Ruota Dentata Grande", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Inoltra la forza di rotazione in entrata alla ruota, cercando di far _corrispondere_ la _velocità_ con cui è configurata come obbiettivo. La ruota dentata deve essere fissata sulla parte superiore del controllo.", + + "block.create.mechanical_piston.tooltip": "PISTOME MECCANICO", + "block.create.mechanical_piston.tooltip.summary": "Una versione più avanzata del _Pistone_. Usa la _Forza_ _di_ _Rotazione_ per spostare con precisione le strutture attaccate. I _Pali_ _di_ _Estensione_ _del_ _Pistone_ nella parte posteriore definiscono la _Gamma_ di questo dispositivo. Senza estensioni, il pistone non si muoverà. Usa _Telai_ o _Blocchi_ _di_ _Slime_ per muovere più di una singola linea di blocchi.", + "block.create.mechanical_piston.tooltip.condition1": "Quando Ruotato", + "block.create.mechanical_piston.tooltip.behaviour1": "Inizia a spostare la struttura collegata. La Velocità e la direzione sono correlate alla Velocità di Rotazione in entrata.", + + "block.create.sticky_mechanical_piston.tooltip": "PISTOME MECCANICO APPICCICOSO", + "block.create.sticky_mechanical_piston.tooltip.summary": "Una versione più avanzata del _Pistone_ _Appiccicoso_. Usa la _Forza_ _di_ _Rotazione_ per spostare con precisione le strutture attaccate. I _Pali_ _di_ _Estensione_ _del_ _Pistone_ nella parte posteriore definiscono la _Gamma_ di questo dispositivo. Senza estensioni, il pistone non si muoverà. Usa _Telai_ o _Blocchi_ _di_ _Slime_ per muovere più di una singola linea di blocchi.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "Quando Ruotato", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Inizia a spostare la struttura collegata. La Velocità e la direzione sono correlate alla Velocità di Rotazione in entrata.", + + "block.create.piston_extension_pole.tooltip": "PALO PISTOME", + "block.create.piston_extension_pole.tooltip.summary": "Estende la gamma dei _Pistoni_ _Meccanici_.", + "block.create.piston_extension_pole.tooltip.condition1": "Se collegato al Pistone Meccanico", + "block.create.piston_extension_pole.tooltip.behaviour1": "Estende la gamma di un pistone di 1 blocco", + + "block.create.mechanical_bearing.tooltip": "SUPPORTO MECCANICO", + "block.create.mechanical_bearing.tooltip.summary": "Utilizzato per ruotare _strutture_ _grandi_ o sfruttare la _Forza_ _di_ _Rotazione_ dal vento.", + "block.create.mechanical_bearing.tooltip.condition1": "Quando Ruotato", + "block.create.mechanical_bearing.tooltip.behaviour1": "Inizia a ruotare i blocchi collegati. Usa _Telai_ o _Blocchi_ _di_ _Slime_ per spostare più di un singolo blocco.", + "block.create.mechanical_bearing.tooltip.condition2": "Quando Alimentato da Redstone", + "block.create.mechanical_bearing.tooltip.behaviour2": "Inizia a fornire _Forza_ _di_ _Rotazione_ generata dalla rotazione della struttura collegata. La struttura deve includere _Blocchi_ _di_ _Vela_ adatti (attualmente qualsiasi blocco di lana).", + + "block.create.clockwork_bearing.tooltip": "SUPPORTO DEL OROLOGIO", + "block.create.clockwork_bearing.tooltip.summary": "Una versione avanzata del _Supporto_ _Meccanico_ per ruotare fino a due _lancette_ in base al _tempo_ _di_ _gioco_ corrente.", + "block.create.clockwork_bearing.tooltip.condition1": "Quando Ruotato", + "block.create.clockwork_bearing.tooltip.behaviour1": "Inizia a ruotare la Struttura collegata verso l'_ora_ _corrente_. Se è presente una seconda struttura, fungerà da _lancetta_ _dei_ _minuti_.", + + "block.create.sequenced_gearshift.tooltip": "CAMBIO SEQUENZIALE", + "block.create.sequenced_gearshift.tooltip.summary": "Un _componente_ _di_ _utilità_ _programmabile_, che può cambiare il suo _throughput_ _rotazionale_ secondo un massimo di _5_ _istruzioni_ _consecutive_. Utilizzalo per alimentare i Supporti Meccanici, Pistoni o Pulegge con un maggiore controllo sui tempi e sulla velocità. Può diventare meno preciso a velocità più elevate.", + "block.create.sequenced_gearshift.tooltip.condition1": "Quando alimentato da Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "_Inizia_ _l'esecuzione_ delle istruzioni programmate in base alla velocità in input.", + "block.create.sequenced_gearshift.tooltip.condition2": "Quando Toccato con Clic-Destro", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Apre l'_Interfaccia_ _di_ _Configurazione_", + + "block.create.cart_assembler.tooltip": "ASSEMBLATORE CARRELLO DA MINIERA", + "block.create.cart_assembler.tooltip.summary": "Monta una Struttura connessa su un _Carrello_ _da_ _miniera_ di _passaggio_.", + "block.create.cart_assembler.tooltip.condition1": "Quando Alimentato da Redstone", + "block.create.cart_assembler.tooltip.behaviour1": "Smonta le strutture montate nei _carrelli_ _da_ _miniera_ di _passaggio_ e le rimette nel mondo.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "PULEGGIA DELLA CORDA", + "block.create.rope_pulley.tooltip.summary": "Sposta i blocchi e le strutture collegati in verticale. Usa _Telai_ o _Blocchi_ _di_ _Slime_ per spostare più di un singolo blocco.", + "block.create.rope_pulley.tooltip.condition1": "Quando Ruotato", + "block.create.rope_pulley.tooltip.behaviour1": "Inizia a spostare la struttura collegata. La velocità e la direzione sono correlate alla Velocità di Rotazione in input.", + + "block.create.linear_chassis.tooltip": "TELAIO LINEARE", + "block.create.linear_chassis.tooltip.summary": "Un blocco base configurabile che collega le strutture per il movimento.", + "block.create.linear_chassis.tooltip.condition1": "Quando Spostato", + "block.create.linear_chassis.tooltip.behaviour1": "_Sposta_ tutti i _Telai_ _attaccati_ con lo stesso orientamento e una colonna di Blocchi all'interno della sua gamma. I blocchi verranno tirati solo se la faccia del telaio è _Appiccicosa_ (Vedi con [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "Con Chiave Inglese", + "block.create.linear_chassis.tooltip.behaviour2": "Configura la _gamma_ per questo telaio. Premi CTRL per modificare anche la gamma di tutti i blocchi telaio collegati.", + "block.create.linear_chassis.tooltip.control1": "Quando si fa Clic-Destro con la Palla di slime", + "block.create.linear_chassis.tooltip.action1": "Crea la faccia cliccata _Appiccicosa_. Quando viene spostato, il telaio tirerà i blocchi collegati, indipendentemente dalla direzione del movimento.", + + "block.create.radial_chassis.tooltip": "TELAIO RADIALE", + "block.create.radial_chassis.tooltip.summary": "Un blocco base configurabile che collega le strutture per il movimento.", + "block.create.radial_chassis.tooltip.condition1": "Quando Spostato", + "block.create.radial_chassis.tooltip.behaviour1": "_Sposta_ tutti i _Telai_ _collegati_ in una colonna, e un cilindro di blocchi attorno a se stesso. I blocchi attorno ad esso vengono spostati solo quando si trovano nella gamma e sono attaccati a un lato appiccicoso (Vedi con [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "Con Chiave Inglese", + "block.create.radial_chassis.tooltip.behaviour2": "Configura la _gamma_ per questo telaio. Premi CTRL per modificare anche la gamma di tutti i blocchi telaio collegati.", + "block.create.radial_chassis.tooltip.control1": "Quando si fa Clic-Destro con la Palla di slime", + "block.create.radial_chassis.tooltip.action1": "Crea la faccia cliccata _Appiccicosa_. Quando viene spostato, il telaio tirerà i blocchi collegati, indipendentemente dalla direzione del movimento.", + + "block.create.mechanical_drill.tooltip": "TRAPANO MECCANICO", + "block.create.mechanical_drill.tooltip.summary": "Un dispositivo meccanico adatto per _rompere_ i _blocchi_. È mobile con _Pistoni_ o _Supporti_ _meccanici_.", + "block.create.mechanical_drill.tooltip.condition1": "Quando Ruotato", + "block.create.mechanical_drill.tooltip.behaviour1": "Funziona come un Rompi blocchi _stazionario_. Fa anche _male_ _alle_ _entità_ nella sua area effettiva", + "block.create.mechanical_drill.tooltip.condition2": "In Movimento", + "block.create.mechanical_drill.tooltip.behaviour2": "Rompe i blocchi con cui il trapano si scontra.", + + "block.create.mechanical_harvester.tooltip": "MIETITRICE MECCANICA", + "block.create.mechanical_harvester.tooltip.summary": "Una mietitrice meccanica adatta per l'automazione delle colture di medie dimensioni. È mobile con _Pistoni_ o _Supporti_ _Meccanici_.", + "block.create.mechanical_harvester.tooltip.condition1": "In Movimento", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Raccoglie_ tutte le _colture_ _mature_ con cui la lama si scontra e ripristina il loro stato iniziale di crescita.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "SEGA MECCANICA", + "block.create.mechanical_saw.tooltip.summary": "Adatto per _tagliare_ _alberi_ in modo efficace e per _tagliare_ _blocchi_ nelle loro controparti carpentate. È mobile con _Pistoni_ o _Supporti_ _Meccanici_.", + "block.create.mechanical_saw.tooltip.condition1": "Di fronte", + "block.create.mechanical_saw.tooltip.behaviour1": "Applica le _Ricette_ di _Segatura_ e _Lavorazione_ _della_ _Pietra_ agli oggetti rilasciati o inseriti al suo interno. Quando sono possibili gli output, le scorre ciclicamente a meno che non sia assegnato un _filtro_.", + "block.create.mechanical_saw.tooltip.condition2": "Di fronte in orizzontale", + "block.create.mechanical_saw.tooltip.behaviour2": "_Rompe_ i _tronchi_ di fronte a se. Se il troco supportava un albero da solo, l'albero crollerebbe lontano dalla sega.", + "block.create.mechanical_saw.tooltip.condition3": "In Movimento", + "block.create.mechanical_saw.tooltip.behaviour3": "_Taglia_ tutti gli _alberi_ con cui la sega si scontra.", + + "block.create.stockpile_switch.tooltip": "INTERRUTTORE ACCUMULATORE", + "block.create.stockpile_switch.tooltip.summary": "Attiva / disattiva un segnale Redstone in base allo _Spazio_ _di_ _Stoccaggio_ nel Contenitore collegato.", + "block.create.stockpile_switch.tooltip.condition1": "Quando inferiore al limite inferiore", + "block.create.stockpile_switch.tooltip.behaviour1": "Smette di fornire il _Segnale_ _Redstone_", + "block.create.stockpile_switch.tooltip.condition2": "Quando supera il Limite Superiore.", + "block.create.stockpile_switch.tooltip.behaviour2": "Inizia a fornire un _Segnale_ _Redstone_ fino al raggiungimento del limite inferiore.", + "block.create.stockpile_switch.tooltip.control1": "Quando Toccato con Clic-Destro", + "block.create.stockpile_switch.tooltip.action1": "Apre l'_Interfaccia_ _di_ _Configurazione_.", + + "block.create.redstone_link.tooltip": "COLLEGAMENTO REDSTONE", + "block.create.redstone_link.tooltip.summary": "Endpoint per connessioni _Wireless_ _di_ _Redstone_. Le _Frequenze_ possono essere assegnate utilizzando qualsiasi oggetto. La gamma del segnale è limitata, sebbene ragionevolmente lontana.", + "block.create.redstone_link.tooltip.condition1": "Quando Alimentato", + "block.create.redstone_link.tooltip.behaviour1": "La ricezione di collegamenti della stessa _Frequenza_ produrrà un segnale Redstone.", + "block.create.redstone_link.tooltip.control1": "Quando Clic-Destro su un oggetto", + "block.create.redstone_link.tooltip.action1": "Imposta la _Frequenza_ su quell'oggetto. È possibile utilizzare un totale di _due_ _oggetti_ _differenti_ in combinazione per definire una frequenza.", + "block.create.redstone_link.tooltip.control2": "Clic-Destro da Accovacciato", + "block.create.redstone_link.tooltip.action2": "Alterna tra la modalità _Ricevitore_ e _Trasmettitore_.", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "CONTATTO REDSTONE", + "block.create.redstone_contact.tooltip.summary": "Emette solo un segnale di pietrarossa in coppia. È mobile con _Pistoni_ o _Supporti_ _Meccanici_.", + "block.create.redstone_contact.tooltip.condition1": "Di fronte ad altri Contatti", + "block.create.redstone_contact.tooltip.behaviour1": "Fornisce un _Segnale_ _Redstone_.", + "block.create.redstone_contact.tooltip.condition2": "In Movimento", + "block.create.redstone_contact.tooltip.behaviour2": "Attiva tutti i contatti fissi che passa.", + + "block.create.adjustable_crate.tooltip": "BAULE REGOLABILE", + "block.create.adjustable_crate.tooltip.summary": "Questo _Contenitore_ _di_ _Stoccaggio_ consente il controllo manuale sulla sua capacità. Può contenere fino a _16_ _Pile_ di qualsiasi oggetto. Supporta _Comparatori_ _Redstone_.", + "block.create.adjustable_crate.tooltip.control1": "Quando Cliccato con Clic-Destro", + "block.create.adjustable_crate.tooltip.action1": "Apre l'_Interfaccia_.", + + "block.create.creative_crate.tooltip": "CREATORE CANNONESCHEMATICO", + "block.create.creative_crate.tooltip.summary": "Fornisce una scorta infinita di blocchi ai _Cannoneschematici_ adiacenti.", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "ESTRATTORE", + "block.create.extractor.tooltip.summary": "_Prende_ _Oggetti_ da un _Inventario _ allegato e li lascia cadere a terra. Non lascerà cadere gli oggetti a meno che lo spazio non sia libero. Può essere assegnata una pila di oggetti come _filtro_.", + "block.create.extractor.tooltip.condition1": "Quando alimentato da Redstone", + "block.create.extractor.tooltip.behaviour1": "_Ferma_ l'Estrattore.", + "block.create.extractor.tooltip.condition2": "Attiva Tiraggio del Nastro", + "block.create.extractor.tooltip.behaviour2": "Gli estrattori possono estrarre oggetti _da_ _nastri_ rinforzati con un _involucro_ _di_ _ottone_. Quando l'estrattore è bloccato, il _nastro_ _si_ _arresterà_.", + "block.create.extractor.tooltip.control1": "Clic-Destro sullo Spazio del Filtro", + "block.create.extractor.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.", + + "block.create.transposer.tooltip": "TRASPOSITORE", + "block.create.transposer.tooltip.summary": "_Prende_ _oggetti_ da un _inventario_ allegato e li inserisce immediatamente nell'_inventario_ di destinazione. Può essere assegnata una pila di oggetti come _filtro_.", + "block.create.transposer.tooltip.condition1": "Quando Alimentato da Redstone", + "block.create.transposer.tooltip.behaviour1": "_Ferma_ il Traspositore.", + "block.create.transposer.tooltip.condition2": "Attiva Tiraggio del Nastro", + "block.create.transposer.tooltip.behaviour2": "I Traspositori possono estrarre oggetti _dai_ _nastri_ rinforzati con un _involucro_ _di_ _ottone_. Quando viene eseguito il backup del traspositore, il _nastro_ _si_ _arresterà_.", + "block.create.transposer.tooltip.control1": "Clic-Destro sullo Spazio del Filtro", + "block.create.transposer.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.", + + "block.create.deployer.tooltip": "INSTALLATORE", + "block.create.deployer.tooltip.summary": "_Punzoni_, _Usi_ e _Attivazioni_. Questa macchina proverà a _imitare_ un _giocatore_ il più possibile. Può _Prendere_ e _depositare_ _oggetti_ nell'_Inventario_ adiacente. Può essere assegnata una pila di oggetti come _filtro_.", + "block.create.deployer.tooltip.condition1": "Quando Ruotato", + "block.create.deployer.tooltip.behaviour1": "Allunga il braccio e si _attiva_ nello spazio di un blocco _2m_ _davanti_ a sé.", + "block.create.deployer.tooltip.condition2": "Clic-Destro con la Chiave Inglese", + "block.create.deployer.tooltip.behaviour2": "Attiva / disattiva la modalità di perforazione. In _modalità_ _pugno_, l'Installatore tenterà di usare il suo oggetto per _rompere_ _blocchi_ o _ferire_ _entità_.", + + "block.create.linked_extractor.tooltip": "ESTRATTORE CONNESSO", + "block.create.linked_extractor.tooltip.summary": "_Prende_ _gli_ _oggetti_ da un _Inventario_ attaccato e li lascia cadere a terra. Non lascerà cadere gli oggetti a meno che lo spazio non sia libero. Può essere assegnata una pila di oggetti come _filtro_. Può essere controllato a distanza tramite un _Collegamento_ _Redstone_.", + "block.create.linked_extractor.tooltip.condition1": "Quando il Collegamento Redstone è attivo", + "block.create.linked_extractor.tooltip.behaviour1": "_Ferma_ l'Estrattore.", + "block.create.linked_extractor.tooltip.control1": "Clic-Destro sullo Spazio del Filtro", + "block.create.linked_extractor.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.", + "block.create.linked_extractor.tooltip.control2": "Clic-Destro sullo Spazio di Frequenza", + "block.create.linked_extractor.tooltip.action2": "Assegna l'_oggetto_ attualmente _trattenuto_ come parte della Frequenza ascoltata. Ogni volta che viene alimentato un _Collegamento_ _Redstone_ della stessa frequenza di trasmissione, questo estrattore si mette in pausa.", + + "block.create.linked_transposer.tooltip": "TRASPOSITORE CONNESSO", + "block.create.linked_transposer.tooltip.summary": "_Prende_ _oggetti_ da un _Inventario_ allegato e li inserisce immediatamente nell'_Inventario_ di destinazione. Può essere assegnata una pila di oggetti come _filtro_. Può essere controllato a distanza tramite un _Collegamento_ _Redstone_.", + "block.create.linked_transposer.tooltip.condition1": "Quando il Collegamento Redstone è Attivo", + "block.create.linked_transposer.tooltip.behaviour1": "_Ferma_ il Traspositore.", + "block.create.linked_transposer.tooltip.control1": "Clic-Destro sullo Spazio del Filtro", + "block.create.linked_transposer.tooltip.action1": "Assegna la _pila_ attualmente _tenuta_ come _Filtro_. Il Traspositore estrae solo gli oggetti che corrispondono al tipo di oggetto e al conteggio della pila di filtri.", + "block.create.linked_transposer.tooltip.control2": "Clic-Destro sullo Spazio di Frequenza", + "block.create.linked_transposer.tooltip.action2": "Assegna l'_oggetto_ attualmente _tenuto_ come parte della Frequenza ascoltata. Ogni volta che viene alimentato un _Collegamento_ _Redstone_ della stessa frequenza di trasmissione, questo Traspositore si ferma.", + + "block.create.funnel.tooltip": "IMBUTO", + "block.create.funnel.tooltip.summary": "_Raccoglie_ _gli_ _oggetti_ _in_ _arrivo_ e li inserisce nell'_inventario_ allegato, se possibile. Può raccogliere oggetti nel _mondo_ e oggetti su un _nastro_.", + "block.create.funnel.tooltip.condition1": "Tirare il Nastro passivamente", + "block.create.funnel.tooltip.behaviour1": "Gli imbuti possono estrarre gli oggetti _dai_ _nastri_ quando vengono posizionati sopra di essi, lateralmente o alla fine. Quando viene eseguito il backup di un imbuto laterale, gli oggetti sul _nastro_ _non_ _si_ _arrestano_.", + + "block.create.belt_tunnel.tooltip": "TUNNEL TRASPORTATORE", + "block.create.belt_tunnel.tooltip.summary": "Un'opzione estetica per far passare i tuoi _Nastri_ _Meccanici_ attraverso i muri. I Nastri devono essere rinforzati con l'_Involucro_ _di_ _Ottone_. I tunnel possono _sincronizzarsi_ con _i_ _loro_ _vicini_, lasciando passare gli oggetti solo se tutti i tunnel del gruppo hanno uno in attesa. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "Clic-Destro con la Chiave Inglese sul Davanti", + "block.create.belt_tunnel.tooltip.action1": "Attiva / Disattiva il _comportamento_ _sincronizzato_. I tunnel sincronizzati contengono oggetti fino a quando anche i loro vicini non ne hanno uno.", + "block.create.belt_tunnel.tooltip.control2": "Clic-Destro con la Chiave Inglese sul Lato", + "block.create.belt_tunnel.tooltip.action2": "_Regola_ _le_ _finestre_ se il tunnel ha una finestra su quella faccia.", + + "block.create.brass_casing.tooltip": "INVOLUCRO DI OTTONE", + "block.create.brass_casing.tooltip.summary": "Involucro delle macchine robusto con una varietà di usi. Di sicuro per la decorazione.", + "block.create.brass_casing.tooltip.condition1": "Se utilizzato su un Nastro Meccanico", + "block.create.brass_casing.tooltip.behaviour1": "_Rinforza_ _i_ _nastri_ con una base in ottone. I nastri rinforzati possono supportare i _Tunnel_ _Trasportatori_, _Estrattori_, _Imbuti_ e _Traspositori_ interagendo con i nastri dai lati e sotto.", + + "block.create.belt_observer.tooltip": "OSSERVATORE A CINGHIA", + "block.create.belt_observer.tooltip.summary": "Rileva oggetti ed entità che passano su un _Nastro_ _Meccanico_ di fronte. Usa una _Chiave_ _Inglese_ per scorrere il suo comportamento. I non oggetti verranno sempre gestiti in modalità rilevamento indipendentemente dall'impostazione.", + "block.create.belt_observer.tooltip.condition1": "Modalità di Rilevamento", + "block.create.belt_observer.tooltip.behaviour1": "Fornisce un segnale redstone _mentre_ un _oggetto_ _corrispondente_ si _trova_ nel segmento del nastro osservato.", + "block.create.belt_observer.tooltip.condition2": "Modalità a Impulsi", + "block.create.belt_observer.tooltip.behaviour2": "Emette un _impulso_ quando un _oggetto_ _corrispondente_ _passa_ al centro del segmento del nastro osservato.", + "block.create.belt_observer.tooltip.condition3": "Modalità di Espulsione", + "block.create.belt_observer.tooltip.behaviour3": "_Espelle_ _gli_ _oggetti_ _corrispondenti_ dal lato. Se il nastro bersaglio o lo spazio è _occupato_, l'oggetto verrà _tenuto_ _in_ _posizione_.", + "block.create.belt_observer.tooltip.condition4": "Modalità Divisa", + "block.create.belt_observer.tooltip.behaviour4": "_Divide_ una _pila_ _di_ _oggetti_ _corrispondenti_ ed _espelle_ _metà_ di essa dal lato.", + + "block.create.pulse_repeater.tooltip": "RIPETITORE DI IMPULSI", + "block.create.pulse_repeater.tooltip.summary": "Un semplice circuito per tagliare i segnali redstone di passaggio ad una lunghezza di _1_ _tick_.", + + "block.create.adjustable_repeater.tooltip": "RIPETITORE REGOLABILE", + "block.create.adjustable_repeater.tooltip.summary": "Un _Ripetitore_ _Redstone_ avanzato con un _Ritardo_ _configurabile_ fino a 30 minuti.", + + "block.create.adjustable_pulse_repeater.tooltip": "RIPETITORE DI IMPULSI REGOLABILE", + "block.create.adjustable_pulse_repeater.tooltip.summary": "Un _Ripetitore_ _di_ _Impulsi_ con un _Ritardo_ _configurabile_ fino a 30 minuti.", + + "block.create.analog_lever.tooltip": "LEVA ANALOGICA", + "block.create.analog_lever.tooltip.summary": "Una leva con un _controllo_ _più_ _preciso_ sulla _potenza_ _del_ _segnale_ emesso.", + + "block.create.powered_toggle_latch.tooltip": "LEVA ALIMENTATA ALTERATA", + "block.create.powered_toggle_latch.tooltip.summary": "Una leva che può essere attivata/disattivata da un _Impulso_ _Redstone_.", + + "block.create.powered_latch.tooltip": "LEVA ALIMENTATA", + "block.create.powered_latch.tooltip.summary": "Una leva che può essere controllata dai _Segnali_ _Redstone. Un segnale sul _retro_ _la_ _abilita_, un _segnale_ _laterale_ _la_ _resetterà_ .", + + "block.create.speedometer.tooltip": "TACHIMETRO", + "block.create.speedometer.tooltip.summary": "Misura e visualizza la _velocità_ _di_ _rotazione_ dei componenti cinetici collegati. Supporta _Comparatori_ _Redstone_.", + "block.create.speedometer.tooltip.condition1": "Quando Ruotato", + "block.create.speedometer.tooltip.behaviour1": "Indica un colore corrispondente al livello di velocità. Il _Verde_ indica una rotazione Lenta, _Blu_ Moderata e _Viola_ Veloce. Alcuni componenti meccanici richiedono un livello di velocità sufficiente per funzionare correttamente.", + + "block.create.stressometer.tooltip": "STRESSOMETRO", + "block.create.stressometer.tooltip.summary": "Misura e visualizza lo _stress_ _complessivo_ della rete cinetica collegata. Supporta _Comparatori_ _Redstone_.", + "block.create.stressometer.tooltip.condition1": "Quando Ruotato", + "block.create.stressometer.tooltip.behaviour1": "Indica un colore corrispondente al livello di stress. Le _reti_ _troppo_ _stressate_ cesseranno di muoversi. Lo stress può essere alleviato aggiungendo più _fonti_ _di_ _rotazione_ alla rete.", + + "tool.create.sand_paper.tooltip": "CARTA VETRATA", + "tool.create.sand_paper.tooltip.summary": "Una carta ruvida che può essere utilizzata per _levigare_ _materiali_ o affilare i tuoi _strumenti_.", + "tool.create.sand_paper.tooltip.condition1": "Quando Usata", + "tool.create.sand_paper.tooltip.behaviour1": "Applica la lucidatura agli oggetti _tenuti_ _in_ _mano_ o distesi a _terra_ quando _li_ _guardi_", + + "item.create.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "RADIANCE RAFFINATA", + "item.create.refined_radiance.tooltip.summary": "Un Materiale Cromatico forgiato dalla _luce_ _assorbita_.", + + "item.create.shadow_steel.tooltip": "ACCIAIO OSCURO", + "item.create.shadow_steel.tooltip.summary": "Un Materiale Cromatico forgiato _nel_ _vuoto_.", + + "item.create.crafter_slot_cover.tooltip": "RIVESTIMENTO SLOT CREAZIONE", + "item.create.crafter_slot_cover.tooltip.summary": "Utilizzato per coprire uno slot vuoto in un _Costruttore_ _Meccanico_ in una ricetta. I Costruttori non devono necessariamente formare una griglia quadrata completa. Questo è utile quando ci sono ricette in cui gli _ingredienti_ _sono_ _in_ _diagonale_ tra loro.", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + "create.tooltip.randomWipDescription0": "Si prega di tenere questo oggetto lontano dai bambini.", + "create.tooltip.randomWipDescription1": "Un cucciolo di panda muore ogni volta che usi questo oggetto. Ogni. Volta.", + "create.tooltip.randomWipDescription2": "Da utilizzare a proprio rischio.", + "create.tooltip.randomWipDescription3": "Questo non è l'oggetto che stai cercando, *le dita si muovono* perfavore dispartene.", + "create.tooltip.randomWipDescription4": "Questo oggetto si autodistruggerà tra 10 secondi. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Credimi, è inutile.", + "create.tooltip.randomWipDescription6": "Utilizzando questo articolo, acconsenti al nostro disclaimer e accetti i suoi termini.", + "create.tooltip.randomWipDescription7": "Questo forse non fa per te. Che ne dici di quello?", + "create.tooltip.randomWipDescription8": "Usalo e rimpiangi immediatamente la tua decisione.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json new file mode 100644 index 000000000..16000f239 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 363", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "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": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "安山岩レンガ", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "安山岩ケーシング", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "鉢", + "block.create.belt": "メカニカルベルト", + "block.create.belt_observer": "ベルトオブザーバー", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.brass_block": "真鍮ブロック", + "block.create.brass_casing": "真鍮ケーシング", + "block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "時計仕掛けのベアリング", + "block.create.clutch": "クラッチ", + "block.create.cogwheel": "歯車", + "block.create.copper_block": "銅ブロック", + "block.create.copper_casing": "銅ケーシング", + "block.create.copper_ore": "銅鉱石", + "block.create.copper_shingles": "銅のこけら板", + "block.create.creative_crate": "概略図砲クリエティフィアー", + "block.create.creative_motor": "モーター", + "block.create.crushing_wheel": "破砕ホイール", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "鳩時計", + "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", + "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", + "block.create.dark_scoria": "ダークスコリア", + "block.create.dark_scoria_bricks": "ダークスコリアレンガ", + "block.create.dark_scoria_bricks_slab": "ダークスコリアレンガのハーフブロック", + "block.create.dark_scoria_bricks_stairs": "ダークスコリアレンガの階段", + "block.create.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": "デプロイヤー", + "block.create.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "閃緑岩レンガ", + "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.dolomite": "苦灰石", + "block.create.dolomite_bricks": "苦灰石レンガ", + "block.create.dolomite_bricks_slab": "苦灰石レンガのハーフブロック", + "block.create.dolomite_bricks_stairs": "苦灰石レンガの階段", + "block.create.dolomite_bricks_wall": "苦灰石レンガの塀", + "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_pillar": "苦灰石の柱", + "block.create.encased_belt": "ケース入りベルト", + "block.create.encased_fan": "ケース入りファン", + "block.create.encased_shaft": "ケース入りシャフト", + "block.create.extractor": "エクストラクター", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "勢車", + "block.create.framed_glass": "大きなガラス窓", + "block.create.framed_glass_pane": "大きなガラス窓板", + "block.create.furnace_engine": "かまどエンジン", + "block.create.gabbro": "斑れい岩", + "block.create.gabbro_bricks": "斑れい岩レンガ", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "斑れい岩レンガの階段", + "block.create.gabbro_bricks_wall": "斑れい岩レンガの塀", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "ギアボックス", + "block.create.gearshift": "ギアシフト", + "block.create.granite_bricks": "花崗岩レンガ", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "ハンドクランク", + "block.create.horizontal_framed_glass": "横型ガラス窓", + "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "大きな歯車", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "石灰砕砂", + "block.create.limestone": "石灰岩", + "block.create.limestone_bricks": "石灰岩レンガ", + "block.create.limestone_bricks_slab": "石灰岩レンガのハーフブロック", + "block.create.limestone_bricks_stairs": "石灰岩レンガの階段", + "block.create.limestone_bricks_wall": "石灰岩レンガの塀", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "石灰岩の柱", + "block.create.linear_chassis": "リニアシャーシ", + "block.create.linked_extractor": "リンクされたエクストラクター", + "block.create.linked_transposer": "リンクされたトランスポーザー", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "メカニカルベアリング", + "block.create.mechanical_crafter": "メカニカルクラフター", + "block.create.mechanical_drill": "メカニカルドリル", + "block.create.mechanical_harvester": "メカニカルハーベスター", + "block.create.mechanical_mixer": "メカニカルミキサー", + "block.create.mechanical_piston": "メカニカルピストン", + "block.create.mechanical_piston_head": "メカニカルピストンヘッド", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "メカニカルプレス", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "メカニカル鋸", + "block.create.millstone": "石臼", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "自然スコリア", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "ノズル", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "ピストン延長ポール", + "block.create.polished_dark_scoria": "磨かれたダークスコリア", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "磨かれた苦灰石", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "磨かれた斑れい岩", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "磨かれた石灰岩", + "block.create.polished_limestone_slab": "磨かれた石灰岩のハーフブロック", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "磨かれたスコリア", + "block.create.polished_scoria_slab": "磨かれたスコリアのハーフブロック", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "磨かれた風化石灰岩", + "block.create.polished_weathered_limestone_slab": "磨かれた風化石灰岩のハーフブロック", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "ポータブルストレージインターフェイス", + "block.create.powered_latch": "パワードラッチ", + "block.create.powered_toggle_latch": "パワードトグルラッチ", + "block.create.pulley_magnet": "プーリーマグネット", + "block.create.pulse_repeater": "パルスリピーター", + "block.create.radial_chassis": "ラジアルシャーシ", + "block.create.redstone_contact": "レッドストーンコンタクト", + "block.create.redstone_link": "レッドストーンリンク", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "ロープ", + "block.create.rope_pulley": "ローププーリー", + "block.create.rotation_speed_controller": "回転速度制御器", + "block.create.schematic_table": "概略図テーブル", + "block.create.schematicannon": "概略図砲", + "block.create.scoria": "スコリア", + "block.create.scoria_bricks": "スコリアレンガ", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "スコリアの柱", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "シーケンスギアシフト", + "block.create.shaft": "軸", + "block.create.speedometer": "スピードメーター", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", + "block.create.stockpile_switch": "在庫スイッチ", + "block.create.stressometer": "ストレスメーター", + "block.create.tiled_glass": "タイルガラス", + "block.create.tiled_glass_pane": "タイルガラス板", + "block.create.transposer": "トランスポーザー", + "block.create.turntable": "ターンテーブル", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "垂直ガラス窓", + "block.create.vertical_framed_glass_pane": "垂直ガラス窓板", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "水車", + "block.create.weathered_limestone": "風化した石灰岩", + "block.create.weathered_limestone_bricks": "風化した石灰岩レンガ", + "block.create.weathered_limestone_bricks_slab": "風化した石灰岩レンガのハーフブロック", + "block.create.weathered_limestone_bricks_stairs": "風化した石灰岩レンガの階段", + "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの塀", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", + "block.create.zinc_block": "亜鉛ブロック", + "block.create.zinc_ore": "亜鉛鉱石", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "安山岩合金", + "item.create.attribute_filter": "属性フィルター", + "item.create.belt_connector": "メカニカルベルト", + "item.create.brass_hand": "手", + "item.create.brass_ingot": "真鍮インゴット", + "item.create.brass_nugget": "真鍮ナゲット", + "item.create.brass_sheet": "真鍮シート", + "item.create.chromatic_compound": "色彩の化合物", + "item.create.copper_ingot": "銅インゴット", + "item.create.copper_nugget": "銅塊", + "item.create.copper_sheet": "銅板", + "item.create.crafter_slot_cover": "クラフタースロットカバー", + "item.create.crushed_brass": "砕いた真鍮", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "デフォレスター", + "item.create.dough": "生地", + "item.create.electron_tube": "電子管", + "item.create.empty_schematic": "空の概略図", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "フィルター", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "エンジニアのゴーグル", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "携帯型ブロックザッパー", + "item.create.handheld_worldshaper": "携帯型ワールドシェイパー", + "item.create.integrated_circuit": "集積回路", + "item.create.iron_sheet": "鉄板", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "磨かれたローズクォーツ", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "プロペラ", + "item.create.red_sand_paper": "赤い紙やすり", + "item.create.refined_radiance": "洗練された輝き", + "item.create.rose_quartz": "ローズクォーツ", + "item.create.sand_paper": "紙やすり", + "item.create.schematic": "概略図", + "item.create.schematic_and_quill": "概略図と羽根ペン", + "item.create.shadow_steel": "シャドウスチール", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "木の肥料", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "対称の杖", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "泡立て器", + "item.create.wrench": "レンチ", + "item.create.zinc_ingot": "亜鉛棒", + "item.create.zinc_nugget": "亜鉛塊", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "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 はメカニカルドリルに突き刺さった", + "death.attack.create.mechanical_saw": "%1$s はメカニカル鋸で半分にカットされた", + "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", + + "create.block.deployer.damage_source_name": "悪いデプロイヤー", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "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.pressing": "押しつぶし", + "create.recipe.mixing": "混合", + "create.recipe.packing": "圧縮", + "create.recipe.mechanical_sawing": "製材", + "create.recipe.mechanical_crafting": "メカニカルクラフト", + "create.recipe.block_cutting": "ブロックカット", + "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", + "create.recipe.sandpaper_polishing": "紙やすりでの研磨", + "create.recipe.mystery_conversion": "色彩変態", + "create.recipe.processing.catalyst": "触媒", + "create.recipe.processing.chance": "%1$s%%チャンス", + "create.recipe.processing.chanceToReturn": "%1$s%%チャンスで戻る", + + "create.generic.range": "範囲", + "create.generic.radius": "半径", + "create.generic.width": "幅", + "create.generic.height": "高さ", + "create.generic.length": "長さ", + "create.generic.speed": "速度", + "create.generic.delay": "遅延", + "create.generic.unit.ticks": "ティック", + "create.generic.unit.seconds": "秒", + "create.generic.unit.minutes": "分", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "スクロール", + "create.action.confirm": "確認", + "create.action.abort": "中止", + "create.action.saveToFile": "保存", + "create.action.discard": "捨てる", + + "create.keyinfo.toolmenu": "フォーカスツールメニュー", + "create.keyinfo.scrollup": "マウスホイールアップをシミュレート(この世界で)", + "create.keyinfo.scrolldown": "マウスホイールダウンをシミュレーション(この世界で)", + + "create.gui.scrollInput.defaultTitle": "オプションを選択:", + "create.gui.scrollInput.scrollToModify": "スクロールして変更", + "create.gui.scrollInput.scrollToAdjustAmount": "スクロールして金額を調整", + "create.gui.scrollInput.scrollToSelect": "スクロールして選択", + "create.gui.scrollInput.shiftScrollsFaster": "シフトを押してスクロールを加速", + "create.gui.toolmenu.focusKey": "[%1$s] 長押しでフォーカス", + "create.gui.toolmenu.cycle": "[SCROLL] でサイクル", + "create.gui.symmetryWand.mirrorType": "ミラー", + "create.gui.symmetryWand.orientation": "オリエンテーション", + + "create.symmetry.mirror.plane": "線対称", + "create.symmetry.mirror.doublePlane": "長方形", + "create.symmetry.mirror.triplePlane": "八角形", + + "create.orientation.orthogonal": "直交", + "create.orientation.diagonal": "対角線", + "create.orientation.horizontal": "横型", + "create.orientation.alongZ": "Zに沿る", + "create.orientation.alongX": "Xに沿る", + + "create.gui.blockzapper.title": "携帯型ブロックザッパー", + "create.gui.blockzapper.replaceMode": "置換モード", + "create.gui.blockzapper.searchDiagonal": "対角線にフォロー", + "create.gui.blockzapper.searchFuzzy": "マテリアルの境界を無視", + "create.gui.blockzapper.range": "範囲", + "create.gui.blockzapper.needsUpgradedAmplifier": "増幅アップグレードが必要", + "create.gui.blockzapper.patternSection": "模様", + "create.gui.blockzapper.pattern.solid": "敷き詰め", + "create.gui.blockzapper.pattern.checkered": "チェッカーボード", + "create.gui.blockzapper.pattern.inversecheckered": "逆チェッカーボード", + "create.gui.blockzapper.pattern.chance25": "25% ロール", + "create.gui.blockzapper.pattern.chance50": "50% ロール", + "create.gui.blockzapper.pattern.chance75": "75% ロール", + "create.gui.terrainzapper.title": "携帯型ワールドシェイパー", + "create.gui.terrainzapper.placement": "配置", + "create.gui.terrainzapper.placement.merged": "合併", + "create.gui.terrainzapper.placement.attached": "添える", + "create.gui.terrainzapper.placement.inserted": "挿入", + "create.gui.terrainzapper.brush": "磨き", + "create.gui.terrainzapper.brush.cuboid": "立方体", + "create.gui.terrainzapper.brush.sphere": "球体", + "create.gui.terrainzapper.brush.cylinder": "円筒", + "create.gui.terrainzapper.tool": "ツール", + "create.gui.terrainzapper.tool.fill": "埋立", + "create.gui.terrainzapper.tool.place": "設置", + "create.gui.terrainzapper.tool.replace": "置換", + "create.gui.terrainzapper.tool.clear": "削除", + "create.gui.terrainzapper.tool.overlay": "重ねる", + "create.gui.terrainzapper.tool.flatten": "平坦化", + + "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", + + "create.blockzapper.usingBlock": "使用中: %1$s", + "create.blockzapper.componentUpgrades": "コンポーネントアップグレード:", + "create.blockzapper.component.body": "ボディー", + "create.blockzapper.component.amplifier": "増幅", + "create.blockzapper.component.accelerator": "加速", + "create.blockzapper.component.retriever": "レトリーバー", + "create.blockzapper.component.scope": "範囲", + "create.blockzapper.componentTier.none": "無し", + "create.blockzapper.componentTier.brass": "真鍮", + "create.blockzapper.componentTier.chromatic": "色彩", + "create.blockzapper.leftClickToSet": "ブロックをシフト-左クリックでマテリアルを選択", + "create.blockzapper.empty": "ブロック不足!", + + "create.contraptions.movement_mode": "移動モード", + "create.contraptions.movement_mode.move_place": "停止時に常に配置", + "create.contraptions.movement_mode.move_place_returned": "開始位置のみに配置", + "create.contraptions.movement_mode.move_never_place": "アンカーが破壊されたときにのみ配置", + "create.contraptions.movement_mode.rotate_place": "停止時に常に配置", + "create.contraptions.movement_mode.rotate_place_returned": "初期角度付近のみ配置", + "create.contraptions.movement_mode.rotate_never_place": "アンカーが破壊されたときにのみ配置", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "フィルタ", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "ジェネレータの統計:", + "create.gui.goggles.kinetic_stats": "動力の統計:", + "create.gui.goggles.at_current_speed": "現在の速度", + "create.gui.goggles.base_value": "基本値", + "create.gui.gauge.info_header": "計器の情報:", + "create.gui.speedometer.title": "回転速度", + "create.gui.stressometer.title": "ネットワークの応力", + "create.gui.stressometer.capacity": "残りの容量", + "create.gui.stressometer.overstressed": "超過応力", + "create.gui.stressometer.no_rotation": "回転なし", + "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", + "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらにソースを追加するか、コンポーネントに_負荷をかけ_応力の影響を大きくします。", + "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.sequenced_gearshift.title": "シーケンスギアシフト", + "create.gui.sequenced_gearshift.instruction": "命令", + "create.gui.sequenced_gearshift.instruction.turn_angle": "回転", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance": "ピストン", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", + "create.gui.sequenced_gearshift.instruction.wait": "待機", + "create.gui.sequenced_gearshift.instruction.wait.duration": "期間", + "create.gui.sequenced_gearshift.instruction.end": "終了", + "create.gui.sequenced_gearshift.speed": "速度, 方向", + "create.gui.sequenced_gearshift.speed.forward": "入力速度, フォワード", + "create.gui.sequenced_gearshift.speed.forward_fast": "倍速, フォワード", + "create.gui.sequenced_gearshift.speed.back": "入力速度, 反転", + "create.gui.sequenced_gearshift.speed.back_fast": "倍速, 反転", + + "create.schematicAndQuill.dimensions": "概略図サイズ: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "最初の位置セット。", + "create.schematicAndQuill.secondPos": "2番目の位置セット。", + "create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します", + "create.schematicAndQuill.abort": "選択を削除しました。", + "create.schematicAndQuill.prompt": "概略図の名前を入力してください:", + "create.schematicAndQuill.fallbackName": "My Schematic", + "create.schematicAndQuill.saved": "%1$s として保存しました", + + "create.schematic.invalid": "[!] 無効なアイテム-代わりに概略図テーブルを使用してください", + "create.schematic.position": "位置", + "create.schematic.rotation": "回転", + "create.schematic.rotation.none": "無し", + "create.schematic.rotation.cw90": "時計回りに90", + "create.schematic.rotation.cw180": "時計回りに180", + "create.schematic.rotation.cw270": "時計回りに270", + "create.schematic.mirror": "ミラー", + "create.schematic.mirror.none": "無し", + "create.schematic.mirror.frontBack": "正面-背面", + "create.schematic.mirror.leftRight": "左-右", + "create.schematic.tool.deploy": "配置する", + "create.schematic.tool.move": "XZを移動", + "create.schematic.tool.movey": "Yを移動", + "create.schematic.tool.rotate": "回転", + "create.schematic.tool.print": "印刷", + "create.schematic.tool.flip": "フリップ", + "create.schematic.tool.deploy.description.0": "構造を特定の場所に移動します。", + "create.schematic.tool.deploy.description.1": "地面を右クリックして配置します。", + "create.schematic.tool.deploy.description.2": "[Ctrl] を押したまま、一定の距離で選択します。", + "create.schematic.tool.deploy.description.3": "[Ctrl]-スクロールして距離を変更します。", + "create.schematic.tool.move.description.0": "概略図を水平に動かします。", + "create.schematic.tool.move.description.1": "概略図をポイントし、 [Ctrl]-スクロールして押し出します。", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "概略図を垂直に動かします。", + "create.schematic.tool.movey.description.1": "[Ctrl]-スクロールして上下に移動します。", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "概略図をその中心を中心に回転させます。", + "create.schematic.tool.rotate.description.1": "[Ctrl]-スクロールして90度回転します。", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "構造物を即座にワールドに配置します。", + "create.schematic.tool.print.description.1": "[右クリック] して、現在の場所への配置を確認します。", + "create.schematic.tool.print.description.2": "このツールはクリエイティブモード専用です。", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "選択した面に沿って概略図を反転します。", + "create.schematic.tool.flip.description.1": "概略図をポイントし、 [CTRL]-スクロールして反転します。", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "同期しています...", + "create.schematics.uploadTooLarge": "概略図が大きすぎます。", + "create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:", + + "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.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.option.skipMissing.description": "大砲が配置に必要なブロックを見つけられない場合、次の場所に進みます。", + "create.gui.schematicannon.option.skipTileEntities.description": "大砲は、チェストなどのデータ保持ブロックの交換を回避します。", + "create.gui.schematicannon.option.dontReplaceSolid.description": "大砲は、その作業領域の固体ブロックを置き換えることはなく、非固体と空気のみを置き換えます。", + "create.gui.schematicannon.option.replaceWithSolid.description": "大砲は、概略図の位置にソリッドブロックが含まれている場合にのみ、その作業領域のソリッドブロックを置き換えます。", + "create.gui.schematicannon.option.replaceWithAny.description": "概略図のロケーションにブロックが含まれている場合、大砲はその作業領域の個体ブロックを置き換えます。", + "create.gui.schematicannon.option.replaceWithEmpty.description": "大砲は、空気に置き換えられたものを含め、その作業エリア内のすべてのブロックを一掃します。", + + "create.schematicannon.status.idle": "停止中", + "create.schematicannon.status.ready": "準備完了", + "create.schematicannon.status.running": "稼働中", + "create.schematicannon.status.finished": "完成", + "create.schematicannon.status.paused": "一時停止中", + "create.schematicannon.status.stopped": "停止", + "create.schematicannon.status.noGunpowder": "火薬不足", + "create.schematicannon.status.targetNotLoaded": "ブロックが読み込まれていません", + "create.schematicannon.status.targetOutsideRange": "ターゲットが遠すぎます", + "create.schematicannon.status.searching": "検索中", + "create.schematicannon.status.skipping": "スキップ", + "create.schematicannon.status.missingBlock": "不明なブロック:", + "create.schematicannon.status.placing": "配置中", + "create.schematicannon.status.clearing": "ブロックをクリア中", + "create.schematicannon.status.schematicInvalid": "概略図が無効です", + "create.schematicannon.status.schematicNotPlaced": "配置されていない概略図です", + "create.schematicannon.status.schematicExpired": "概略図ファイルが期限切れです", + + "create.gui.filter.blacklist": "ブラックリスト", + "create.gui.filter.blacklist.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.whitelist": "ホワイトリスト", + "create.gui.filter.whitelist.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.respect_data": "データを重視", + "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", + "create.gui.filter.ignore_data": "データを無視", + "create.gui.filter.ignore_data.description": "アイテムは属性に関係なく一致します。", + + "create.item_attributes.placeable": "設置可能か", + "create.item_attributes.consumable": "食べられるか", + "create.item_attributes.smeltable": "精錬可能か", + "create.item_attributes.washable": "洗えるか", + "create.item_attributes.smokable": "燻製可能か", + "create.item_attributes.blastable": "高炉で製錬可能か", + "create.item_attributes.enchanted": "エンチャント済みか", + "create.item_attributes.damaged": "破損してるか", + "create.item_attributes.badly_damaged": "ひどく損傷してるか", + "create.item_attributes.not_stackable": "スタック可能か", + "create.item_attributes.equipable": "装備可能か", + "create.item_attributes.furnace_fuel": "かまどの燃料か", + "create.item_attributes.in_tag": "%1$s のタグが付けられてるか", + "create.item_attributes.in_item_group": "%1$s に属してるか", + "create.item_attributes.added_by": "%1$s によって追加されたか", + + "create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません", + "create.gui.attribute_filter.selected_attributes": "選択された属性:", + "create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.blacklist": "ブラックリスト", + "create.gui.attribute_filter.blacklist.description": "選択された属性を持たない場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.add_reference_item": "参照アイテムを追加", + + "create.tooltip.holdKey": "[%1$s] を長押し", + "create.tooltip.holdKeyOrKey": "[%1$s] または [%2$s] を長押し", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "スピード要件: %1$s", + "create.tooltip.speedRequirement.none": "無し", + "create.tooltip.speedRequirement.medium": "中速", + "create.tooltip.speedRequirement.high": "高速", + "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.low": "小", + "create.tooltip.capacityProvided.medium": "中", + "create.tooltip.capacityProvided.high": "大", + "create.tooltip.capacityProvided.asGenerator": "(ジェネレータとして)", + "create.tooltip.generationSpeed": "%1$s %2$sを生成", + "create.tooltip.analogStrength": "アナログ強度: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "最小 材料", + + "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.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]:サーバーティックは現在 %s ms 遅くなっています :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: サーバーティックが %s ms 遅くなりました >:)", + "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": "tickTime", + + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.schematicannon_finish": "概略図砲が終了する", + "create.subtitle.slime_added": "スライムスクイーズ", + "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", + "create.subtitle.mechanical_press_item_break": "金属クランク", + "create.subtitle.blockzapper_place": "ブロックザップされる", + "create.subtitle.blockzapper_confirm": "アファーマティブディン", + "create.subtitle.blockzapper_deny": "衰退するブープ", + "create.subtitle.block_funnel_eat": "ファンネルCHOMPS", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "アイテムの例(このツールチップが存在する単なるマーカー)", + "item.create.example_item.tooltip.summary": "アイテムの簡単な説明。 _アンダースコア_用語を強調表示します。", + "item.create.example_item.tooltip.condition1": "これは", + "item.create.example_item.tooltip.behaviour1": "次に、このアイテムはこれを行います。 (行動はシフトで示されます)", + "item.create.example_item.tooltip.condition2": "そしてこれは", + "item.create.example_item.tooltip.behaviour2": "あなたは好きなだけ行動を追加することができます", + "item.create.example_item.tooltip.control1": "Ctrlを押したとき", + "item.create.example_item.tooltip.action1": "これらのコントロールが表示されます。", + + "item.create.wand_of_symmetry.tooltip": "対称性が必要", + "item.create.wand_of_symmetry.tooltip.summary": "構成されたプレーン全体のブロック配置を完全にミラーリングします。", + "item.create.wand_of_symmetry.tooltip.condition1": "ホットバーにあるとき", + "item.create.wand_of_symmetry.tooltip.behaviour1": "アクティブのまま", + "item.create.wand_of_symmetry.tooltip.control1": "地面を右クリックしたとき", + "item.create.wand_of_symmetry.tooltip.action1": "ミラーを_作成_または_移動_", + "item.create.wand_of_symmetry.tooltip.control2": "空中を右クリックしたとき", + "item.create.wand_of_symmetry.tooltip.action2": "アクティブなミラーを_削除_", + "item.create.wand_of_symmetry.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.wand_of_symmetry.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.handheld_blockzapper.tooltip": "ブロックザッパー", + "item.create.handheld_blockzapper.tooltip.summary": "離れた場所にブロックを配置または交換するための新しいガジェット。", + "item.create.handheld_blockzapper.tooltip.control1": "ブロックを左クリックしたとき", + "item.create.handheld_blockzapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", + "item.create.handheld_blockzapper.tooltip.control2": "ブロックを右クリックしたとき", + "item.create.handheld_blockzapper.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", + "item.create.handheld_blockzapper.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.handheld_blockzapper.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.handheld_worldshaper.tooltip": "ハンドヘルドワールドシェーパー", + "item.create.handheld_worldshaper.tooltip.summary": "_風景_や_地形の特徴_を作成するための便利なツール。", + "item.create.handheld_worldshaper.tooltip.control1": "ブロックを左クリックしたとき", + "item.create.handheld_worldshaper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", + "item.create.handheld_worldshaper.tooltip.control2": "ブロックを右クリックしたとき", + "item.create.handheld_worldshaper.tooltip.action2": "現在選択されている_ブラシ_と_ツール_をターゲットの場所に適用します。", + "item.create.handheld_worldshaper.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.handheld_worldshaper.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.tree_fertilizer.tooltip": "木質肥料", + "item.create.tree_fertilizer.tooltip.summary": "一般的な木の種類の成長を加速するのに適したミネラルの強力な組み合わせ。", + "item.create.tree_fertilizer.tooltip.condition1": "苗木に使用したとき", + "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_ツリーを成長させる", + + "item.create.deforester.tooltip": "デフォレスター", + "item.create.deforester.tooltip.summary": "一瞬で木を切り倒すことができる_輝く斧_。", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "フィルタ", + "item.create.filter.tooltip.summary": "ロジスティックデバイスの_出力_と_入力_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_ネストされたフィルター_と照合します。", + "item.create.filter.tooltip.condition1": "フィルタースロットにセットしたとき", + "item.create.filter.tooltip.behaviour1": "_構成_に応じてアイテムの流れを_制御_します。", + "item.create.filter.tooltip.condition2": "右クリックしたとき", + "item.create.filter.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "item.create.attribute_filter.tooltip": "属性フィルター", + "item.create.attribute_filter.tooltip.summary": "ロジスティックデバイスの_出力_と_入力_をより_正確_に_制御_し、アイテムの_属性_と_カテゴリのセット_と照合します。", + "item.create.attribute_filter.tooltip.condition1": "フィルタースロットにセットしたとき", + "item.create.attribute_filter.tooltip.behaviour1": "_構成_に応じてアイテムの流れを_制御_します。", + "item.create.attribute_filter.tooltip.condition2": "右クリックしたとき", + "item.create.attribute_filter.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "item.create.empty_schematic.tooltip": "空のスキーマ", + "item.create.empty_schematic.tooltip.summary": "レシピの材料として、および_概略図テーブル_での記述に使用されます。", + + "item.create.schematic.tooltip": "概略図", + "item.create.schematic.tooltip.summary": "ワールドに配置および配置される構造を保持します。 ホログラムを必要に応じて配置し、_概略図砲_を使用して作成します。", + "item.create.schematic.tooltip.condition1": "持ったとき", + "item.create.schematic.tooltip.behaviour1": "画面上のツールを使用して配置できます。", + "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", + "item.create.schematic.tooltip.action1": "正確な_座標_を入力するための_インターフェース_を開きます。", + + "item.create.schematic_and_quill.tooltip": "概略図と羽根ペン", + "item.create.schematic_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存するために使用されます。", + "item.create.schematic_and_quill.tooltip.condition1": "ステップ1", + "item.create.schematic_and_quill.tooltip.behaviour1": "右クリックして2つのコーナーポイントを選択します。", + "item.create.schematic_and_quill.tooltip.condition2": "ステップ2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。 もう一度右クリックして保存します。", + "item.create.schematic_and_quill.tooltip.control1": "右クリックしたとき", + "item.create.schematic_and_quill.tooltip.action1": "コーナーポイントを選択/保存を確認します。", + "item.create.schematic_and_quill.tooltip.control2": "Ctrlを長押してるとき", + "item.create.schematic_and_quill.tooltip.action2": "_空中_でポイントを選択します。 _スクロール_して距離を調整します。", + "item.create.schematic_and_quill.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", + + "block.create.schematicannon.tooltip": "スキーマキャノン", + "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。 隣接するインベントリからのアイテムを供給し、_火薬_を燃料として使用します。", + "block.create.schematicannon.tooltip.control1": "右クリックしたとき", + "block.create.schematicannon.tooltip.action1": "_インターフェイス_を開きます", + + "block.create.schematic_table.tooltip": "概略図テーブル", + "block.create.schematic_table.tooltip.summary": "保存された概略図を_空の概略図_に書き込みます。", + "block.create.schematic_table.tooltip.condition1": "空の概略図が与えられたとき", + "block.create.schematic_table.tooltip.behaviour1": "Schematicsフォルダから選択したファイルをアップロードします。", + + "block.create.shaft.tooltip": "軸", + "block.create.shaft.tooltip.summary": "_回転_を直線で_中継_します。", + + "block.create.cogwheel.tooltip": "コグホイール", + "block.create.cogwheel.tooltip.summary": "_回転_を直線で、隣接する_歯車_に_中継_します。", + + "block.create.large_cogwheel.tooltip": "大型コグホイール", + "block.create.large_cogwheel.tooltip.summary": "より大きなバージョンの_歯車_により、小さな対応物に接続したときに_回転速度_を_変更_できます。", + + "block.create.encased_shaft.tooltip": "内蔵シャフト", + "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_中継_します。 壁を通過する回転の伝播に適しています。", + + "block.create.gearbox.tooltip": "ギアボックス", + "block.create.gearbox.tooltip.summary": "_中継_する_4方向_の_回転_直線接続を逆にします。", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "ギアシフト", + "block.create.gearshift.tooltip.summary": "接続されたシャフトの回転方向を切り替えるコントロール。", + "block.create.gearshift.tooltip.condition1": "パワーが入ってるとき", + "block.create.gearshift.tooltip.behaviour1": "出て行く回転を_逆_にします。", + + "block.create.clutch.tooltip": "クラッチ", + "block.create.clutch.tooltip.summary": "接続されたシャフトの回転をオン/オフするコントロール。", + "block.create.clutch.tooltip.condition1": "パワーが入ってるとき", + "block.create.clutch.tooltip.behaviour1": "反対側への回転の伝達を_停止_します。", + + "block.create.encased_belt.tooltip": "ケース入りベルト", + "block.create.encased_belt.tooltip.summary": "_回転_をそのブロックと接続された_ケース入りベルト_に_中継_します。", + "block.create.encased_belt.tooltip.condition1": "接続したとき", + "block.create.encased_belt.tooltip.behaviour1": "アタッチされたブロックの_回転速度_と方向はまったく_同じ_です。 彼らは同じように向き合う必要はありません。", + + "block.create.adjustable_pulley.tooltip": "アナログベルトプーリー", + "block.create.adjustable_pulley.tooltip.summary": "ブロックを介して_回転を中継_し、取り付けられた_ケース入りベルト_に伝達します。 取り付けられた包み込まれたベルトは、このブロックが受信する_アナログレッドストーン信号_に基づいて_より速く回転_します。", + "block.create.adjustable_pulley.tooltip.condition1": "レッドストーンコントロール", + "block.create.adjustable_pulley.tooltip.behaviour1": "信号がないと、接続されているベルトの_速度が上がりません_。 フルストレングスシグナル接続ベルトにより、_速度は2倍になります_。", + + "item.create.belt_connector.tooltip": "ベルトコネクター", + "item.create.belt_connector.tooltip.summary": "2つ以上の_シャフト_を_メカニカルベルト_で接続します。 接続されたシャフトの回転速度と方向はまったく同じです。 ベルトは、_アイテム_と_エンティティ_の_コンベア_として機能できます。", + "item.create.belt_connector.tooltip.control1": "シャフトを右クリックしたとき", + "item.create.belt_connector.tooltip.action1": "ベルトの1つのプーリーとしてシャフトを選択します。 選択した両方のシャフトは、_ベルトの方向_に向かって_垂直_、_水平_、または_斜め_に整列する必要があります。", + "item.create.belt_connector.tooltip.control2": "スニークしながらシャフトを右クリックしたとき", + "item.create.belt_connector.tooltip.action2": "ベルトの最初に選択された位置を_リセット_します。", + + "item.create.goggles.tooltip": "ゴーグル", + "item.create.goggles.tooltip.summary": "有用な動力情報で視覚を強化するための眼鏡。", + "item.create.goggles.tooltip.condition1": "着用したとき", + "item.create.goggles.tooltip.behaviour1": "配置されたキネティックコンポーネントの_速度レベル_に対応する_色付きのインジケーター_と、個々のコンポーネント_の応力の影響_と_容量_を表示します。", + "item.create.goggles.tooltip.condition2": "計器を見たとき", + "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの速度または応力に関する詳細情報を表示します。", + + "item.create.wrench.tooltip": "レンチ", + "item.create.wrench.tooltip.summary": "動力論的からくりに取り組むための便利なツール。 コンポーネントの_回転_、_解体_、_設定_に使用できます。", + "item.create.wrench.tooltip.control1": "動力ブロックを右クリックしたとき", + "item.create.wrench.tooltip.action1": "_操作した面に向かって、または面から離れるように_コンポーネントを回転させます_。", + "item.create.wrench.tooltip.control2": "スニークしながら右クリックしたとき", + "item.create.wrench.tooltip.action2": "_動力コンポーネントを分解_し、_インベントリ_に戻します。", + + "block.create.creative_motor.tooltip": "クリエイティブモーター", + "block.create.creative_motor.tooltip.summary": "_回転力_を設定可能なソース。", + + "block.create.water_wheel.tooltip": "水車", + "block.create.water_wheel.tooltip.summary": "_隣接する水流_から取得される_回転力_を提供します。", + + "block.create.encased_fan.tooltip": "内蔵ファン", + "block.create.encased_fan.tooltip.summary": "_回転力_を_気流_に変換し、戻します。さまざまな用途があります。", + "block.create.encased_fan.tooltip.condition1": "レッドストーン動力を与えたとき", + "block.create.encased_fan.tooltip.behaviour1": "直下の_熱源_から_回転力_を提供します。 ファンは下向きにする必要があります。", + "block.create.encased_fan.tooltip.condition2": "回転したとき", + "block.create.encased_fan.tooltip.behaviour2": "入力回転速度に応じて、エンティティを_押す_または_引き戻_します。", + "block.create.encased_fan.tooltip.condition3": "特別なブロックを吹き抜けるとき", + "block.create.encased_fan.tooltip.behaviour3": "_液体_と_炎_の粒子が空気の流れに放出されます。 これは、_アイテムの処理_に使用できます。", + + "block.create.nozzle.tooltip": "ノズル", + "block.create.nozzle.tooltip.summary": "_ケース入りファン_の前面に取り付けて、エンティティへの影響を_全方向_に分散します。", + + "block.create.hand_crank.tooltip": "ハンドクランク", + "block.create.hand_crank.tooltip.summary": "プレイヤーの相互作用を必要とする_回転力の単純な情報源_。", + "block.create.hand_crank.tooltip.condition1": "使用してるとき", + "block.create.hand_crank.tooltip.behaviour1": "付属の仕掛けに_回転力_を提供します。 _スニークで回転を逆_にします。", + + "block.create.cuckoo_clock.tooltip": "鳩時計", + "block.create.cuckoo_clock.tooltip.summary": "空間を_飾り_、_時間を追跡する_ための素晴らしい職人技。", + "block.create.cuckoo_clock.tooltip.condition1": "回転したとき", + "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。 _プレイヤーが眠れるようになる_とすぐに、_正午_と夕暮れに1回_アクティブ_になります。", + + "block.create.turntable.tooltip": "ターンテーブル", + "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", + + "block.create.millstone.tooltip": "石臼", + "block.create.millstone.tooltip.summary": "挿入された_材料_の_研削_に適したキネティックコンポーネント。 隣接する歯車によって、または下部のシャフトに接続することによって、動力を供給できます。 結果はコンポーネントから抽出する必要があります。", + "block.create.millstone.tooltip.condition1": "回転したとき", + "block.create.millstone.tooltip.behaviour1": "ブロックの側面または上面から挿入されたアイテムを_粉砕_を開始します。", + "block.create.millstone.tooltip.condition2": "右クリックしたとき", + "block.create.millstone.tooltip.behaviour2": "出力物を手動で収集します。", + + "block.create.crushing_wheel.tooltip": "クラッシングホイール", + "block.create.crushing_wheel.tooltip.summary": "何かを_分解_する大きな回転可能なホイール。", + "block.create.crushing_wheel.tooltip.condition1": "他の破砕ホイールに取り付けたとき", + "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理するための破砕機を形成します。 ホイールの歯は、同じ速度で接続し、反対方向に動く必要があります。", + + "block.create.mechanical_press.tooltip": "メカニカルプレス", + "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮するための強力なピストン。 一定の_回転力_が必要です。", + "block.create.mechanical_press.tooltip.condition1": "レッドストーン動力を受けたとき", + "block.create.mechanical_press.tooltip.behaviour1": "その下にドロップされたアイテムの圧縮を_開始_します。", + "block.create.mechanical_press.tooltip.condition2": "メカニカルベルトの上にあるとき", + "block.create.mechanical_press.tooltip.behaviour2": "ベルト上のバイパスアイテムを_自動的_に圧縮します。", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "鉢", + "block.create.basin.tooltip.summary": "_メカニカルミキサー_と_メカニカルプレス_での処理に使用される便利な_アイテムの入れ物_。_レッドストーンコンパレータ_をサポートします。", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "メカニカルミキサー", + "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": "メカニカルクラフト", + "block.create.mechanical_crafter.tooltip.summary": "_あらゆる形状の製作レシピ_を自動化するための動的アセンブラー。 _レシピに対応するグリッドに複数を配置_し、_フェアベルトを配置して_、いずれかのクラフターのグリッドから出る_流れ_を作成します。", + "block.create.mechanical_crafter.tooltip.condition1": "回転したとき", + "block.create.mechanical_crafter.tooltip.behaviour1": "グリッド内の_すべてのクラフター_にテンプレートが_与えられる_とすぐに、_生産プロセスを開始_します。", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "フロントでレンチしたとき", + "block.create.mechanical_crafter.tooltip.action1": "_個々の生産者が_アイテムを移動_する_方向_を循環させます。 作業グリッドを形成するには、すべてのアイテムを最終的なクラフターに向かって_移動させる流れ_に_ベルト_を配置します。 最終的なクラフターはグリッドから_離れる_方向を指さなければなりません。", + "block.create.mechanical_crafter.tooltip.control2": "後ろでレンチしたとき", + "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_入力インベントリ_を_接続_します。 これを使用して、クラフトグリッドの_スロットを結合_し、_入力作業を節約_します。", + + "block.create.furnace_engine.tooltip": "かまどエンジン", + "block.create.furnace_engine.tooltip.summary": "_稼働するかまど_が機能することを必要とする強力な_回転動力源_。", + "block.create.furnace_engine.tooltip.condition1": "燃えてるかまどに取り付けたとき", + "block.create.furnace_engine.tooltip.behaviour1": "その前(1m離れて)に配置された_フライホイールへの動力供給を開始_します。 高速化するには高炉を使用してください。", + + "block.create.flywheel.tooltip": "勢車", + "block.create.flywheel.tooltip.summary": "_取り付けたのエンジン_が発生する_力を利用して安定_させる大型の金属ホイール。 勢車が_1 m離れていて_、_互いに90°の角度にある_場合、エンジンに接続します。", + "block.create.flywheel.tooltip.condition1": "実行中のエンジンに取り付けられてるとき", + "block.create.flywheel.tooltip.behaviour1": "ジェネレータの強度と速度に基づいて、取り付けた仕掛けに_回転力_を提供します。", + + "block.create.portable_storage_interface.tooltip": "ポータブルストレージインターフェイス", + "block.create.portable_storage_interface.tooltip.summary": "ピストン、ベアリング、トロッコ、またはプーリーによって移動される_構造物_との間で_アイテムを移動_するためのポータブル交換ポイント。", + "block.create.portable_storage_interface.tooltip.condition1": "移動してるとき", + "block.create.portable_storage_interface.tooltip.behaviour1": "インターフェースの_反対側_にある_トランスポーザー_が_アイテムを引っ張り_、インターフェースをターゲットとするトランスポーザーが接続されたインベントリから_アイテムを挿入_するように、固定トランスポーザーと相互作用します。 アイテムが交換されると、からくりは一時的に停止します。", + + "block.create.rotation_speed_controller.tooltip": "回転速度コントローラー", + "block.create.rotation_speed_controller.tooltip.summary": "ターゲットコンポーネントを任意の速度に加速または減速できる_構成可能な中継_。", + "block.create.rotation_speed_controller.tooltip.condition1": "大きな歯車に取り付けたとき", + "block.create.rotation_speed_controller.tooltip.behaviour1": "入ってくる回転力をホイールに中継し、目標とするように構成された_速度に一致_させようとします。 _歯車はコントローラーの上に取り付ける_必要があります。", + + "block.create.mechanical_piston.tooltip": "メカニカルピストン", + "block.create.mechanical_piston.tooltip.summary": "_ピストン_より高度なもの。 _回転力_を使用して、取り付けられた構造物を正確に移動します。 背面の_ピストン延長極_は、このデバイスの_範囲_を定義します。 延長がないと、ピストンは動きません。 _シャーシ_または_スライムブロック_を使用して、1行以上のブロックを移動します。", + "block.create.mechanical_piston.tooltip.condition1": "回転したとき", + "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + + "block.create.sticky_mechanical_piston.tooltip": "粘着メカニカルピストン", + "block.create.sticky_mechanical_piston.tooltip.summary": "_粘着ピストン_より高度なもの。 _回転力_を使用して、取り付けられた構造物を正確に移動します。 背面の_ピストン延長極_は、このデバイスの_範囲_を定義します。 延長がないと、ピストンは動きません。 _シャーシ_または_スライムブロック_を使用して、1行以上のブロックを移動します。", + "block.create.sticky_mechanical_piston.tooltip.condition1": "回転したとき", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + + "block.create.piston_extension_pole.tooltip": "ピストンポール", + "block.create.piston_extension_pole.tooltip.summary": "メカニカルピストンの範囲を拡張します。", + "block.create.piston_extension_pole.tooltip.condition1": "メカニカルピストンに取り付けたとき", + "block.create.piston_extension_pole.tooltip.behaviour1": "ピストンの範囲を1ブロック拡張", + + "block.create.mechanical_bearing.tooltip": "メカニカルベアリング", + "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.clockwork_bearing.tooltip": "時計仕掛けベアリング", + "block.create.clockwork_bearing.tooltip.summary": "現在の_ゲーム内時間_に応じて最大2つの_時計の針_を回転させる、_メカニカルベアリング_より高度なもの。", + "block.create.clockwork_bearing.tooltip.condition1": "回転したとき", + "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。 2番目の構造が存在する場合、それは分針として機能します。", + + "block.create.sequenced_gearshift.tooltip": "順次ギアシフト", + "block.create.sequenced_gearshift.tooltip.summary": "最大_5つの連続する命令_に従って_回転スループット_を変更できる_プログラム可能_な_ユーティリティコンポーネント_。 これを使用して、メカニカルベアリング、ピストン、またはプーリーに動力を供給し、タイミングと速度をより細かく制御します。 高速では精度が低下する可能性があります。", + "block.create.sequenced_gearshift.tooltip.condition1": "レッドストーン信号を与えたとき", + "block.create.sequenced_gearshift.tooltip.behaviour1": "入力速度に基づいてプログラムされた命令の実行を開始します。", + "block.create.sequenced_gearshift.tooltip.condition2": "右クリックしたとき", + "block.create.sequenced_gearshift.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "block.create.cart_assembler.tooltip": "カートアッセンブラー", + "block.create.cart_assembler.tooltip.summary": "接続された構造物を_通過するトロッコ_に取り付けます。", + "block.create.cart_assembler.tooltip.condition1": "レッドストーン信号を与えたとき", + "block.create.cart_assembler.tooltip.behaviour1": "_通過するカート_のマウントされた構造物を_分解_し、それらをワールドに戻します。", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "ローププーリー", + "block.create.rope_pulley.tooltip.summary": "取り付けた_ブロックと構造物を垂直_に移動します。 _シャーシブロック_または_スライムブロック_を使用して、1つ以上のブロックを移動します。", + "block.create.rope_pulley.tooltip.condition1": "回転したとき", + "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。 速度と方向は、入力される回転速度に相関します。", + + "block.create.linear_chassis.tooltip": "トランスシャーシ", + "block.create.linear_chassis.tooltip.summary": "移動用の構造を接続する構成可能なベースブロック。", + "block.create.linear_chassis.tooltip.condition1": "移動したとき", + "block.create.linear_chassis.tooltip.behaviour1": "_取り付けられるすべてのシャーシ_を同じ方向に移動し、ブロックの列をその範囲内に移動します。 ブロックは、シャーシの表面が_粘着性_がある場合にのみ引っ張られます([Ctrl]を参照)。", + "block.create.linear_chassis.tooltip.condition2": "レンチしたとき", + "block.create.linear_chassis.tooltip.behaviour2": "このシャーシブロックの_範囲_を構成します。 CTRLキーを押したまま、接続されているすべてのシャーシブロックの範囲も変更します。", + "block.create.linear_chassis.tooltip.control1": "スライムボールで右クリックしたとき", + "block.create.linear_chassis.tooltip.action1": "クリックした面を_粘着性_にします。 移動すると、シャーシは移動方向に関係なく、取り付けられたブロックを_引っ張り_ます。", + + "block.create.radial_chassis.tooltip": "回転シャーシ", + "block.create.radial_chassis.tooltip.summary": "移動用の構造を取り付ける構成可能なベースブロック。", + "block.create.radial_chassis.tooltip.condition1": "動かしたとき", + "block.create.radial_chassis.tooltip.behaviour1": "列に_取り付けられてるすべてのシャーシ_、およびそれ自体の周りのブロックのシリンダーを_移動_します。 周囲のブロックは、範囲内にあり、粘着面に接続されている場合にのみ移動されます([Ctrl]を参照)。", + "block.create.radial_chassis.tooltip.condition2": "レンチを使ったとき", + "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの_範囲_を構成します。 CTRLキーを押したまま、接続されているすべてのシャーシブロックの範囲も変更します。", + "block.create.radial_chassis.tooltip.control1": "スライムボールで右クリックしたとき", + "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着性_にします。 シャーシが移動すると、粘着面に接続されているすべての指定ブロックが一緒に移動します。", + + "block.create.mechanical_drill.tooltip": "機械ドリル", + "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した機械装置。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.mechanical_drill.tooltip.condition1": "回転したとき", + "block.create.mechanical_drill.tooltip.behaviour1": "_静止_したブロックブレーカーとして機能します。 また、有効領域の_エンティティを傷つけます_。", + "block.create.mechanical_drill.tooltip.condition2": "動かしたとき", + "block.create.mechanical_drill.tooltip.behaviour2": "ドリルが衝突するブロックを壊します。", + + "block.create.mechanical_harvester.tooltip": "メカニカルハーベスター", + "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.mechanical_harvester.tooltip.condition1": "動かしたとき", + "block.create.mechanical_harvester.tooltip.behaviour1": "ブレードが衝突する_すべての成熟した作物を収穫_し、それらを初期の成長状態にリセットします。", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "メカニカル鋸", + "block.create.mechanical_saw.tooltip.summary": "木を効果的に切断したり、大工したものにブロックを切断したりするのに適しています。 メカニカルピストンまたはベアリングを使用して移動可能です。", + "block.create.mechanical_saw.tooltip.condition1": "上向きのとき", + "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは挿入されたアイテムに_製材_およびストーンカッティングレシピを適用します。 複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", + "block.create.mechanical_saw.tooltip.condition2": "横向きの場合", + "block.create.mechanical_saw.tooltip.behaviour2": "その前で_原木を分割_します。 原木がそれ自体でツリーをサポートしていた場合、_木はのこぎりから離れて崩壊_します。", + "block.create.mechanical_saw.tooltip.condition3": "動かしたとき", + "block.create.mechanical_saw.tooltip.behaviour3": "のこぎりが衝突する_すべての木を切り倒します_。", + + "block.create.stockpile_switch.tooltip": "在庫スイッチ", + "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.redstone_link.tooltip": "レッドストーンリンク", + "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続のエンドポイント。 任意のアイテムを使用して_周波数_を割り当てることができます。 信号範囲は限られていますが、かなり離れています。", + "block.create.redstone_link.tooltip.condition1": "入力があるとき", + "block.create.redstone_link.tooltip.behaviour1": "同じ周波数のリンクを受信すると、レッドストーン信号が生成されます。", + "block.create.redstone_link.tooltip.control1": "アイテムで右クリックしたとき", + "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。 周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使用できます。", + "block.create.redstone_link.tooltip.control2": "スニークしながら右クリックしたとき", + "block.create.redstone_link.tooltip.action2": "_受信機_モードと_送信機_モードを切り替えます。", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "レッドストーンコンタクト", + "block.create.redstone_contact.tooltip.summary": "レッドストーンパワーのみをペアで放出します。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.redstone_contact.tooltip.condition1": "他のコンタクトに直面したとき", + "block.create.redstone_contact.tooltip.behaviour1": "レッドストーン信号を提供します。", + "block.create.redstone_contact.tooltip.condition2": "動かしたとき", + "block.create.redstone_contact.tooltip.behaviour2": "通過するすべての固定接点をトリガーします。", + + "block.create.adjustable_crate.tooltip": "調整可能なクレート", + "block.create.adjustable_crate.tooltip.summary": "この_ストレージコンテナ_では、容量を手動で制御できます。 任意のアイテムの最大_16スタック_を保持できます。 _レッドストーンコンパレータ_をサポートします。", + "block.create.adjustable_crate.tooltip.control1": "右クリックしたとき", + "block.create.adjustable_crate.tooltip.action1": "_インターフェース_を開きます", + + "block.create.creative_crate.tooltip": "クリエイティブクレート", + "block.create.creative_crate.tooltip.summary": "隣接する概略図砲へブロックの無限に供給します。", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "抽出器", + "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": "トランスポーザー", + "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": "デプロイヤ", + "block.create.deployer.tooltip.summary": "_パンチ_、_使用_、_有効化_。 このマシンは、_プレイヤー_をできるだけ_真似_しようとします。 隣接するインベントリの_アイテムを受け取り_、_預ける_ことができます。 _フィルター_としてアイテムスタックを割り当てることができます。", + "block.create.deployer.tooltip.condition1": "回転したとき", + "block.create.deployer.tooltip.behaviour1": "腕を伸ばし、_2m先_のブロックスペースで_発動_。", + "block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき", + "block.create.deployer.tooltip.behaviour2": "パンチモードを切り替えます。 _パンチモード_では、デプロイヤはそのアイテムを使用して_ブロックを壊したりエンティティを傷つけ_たりしようとします。", + + "block.create.linked_extractor.tooltip": "リンクエクストラクター", + "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": "リンクされたトランスポーザー", + "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": "漏斗", + "block.create.funnel.tooltip.summary": "_入力アイテムを収集_し、可能な場合はそれらを取り付けた_インベントリ_に挿入します。 _世界_のアイテムや_ベルト_のアイテムを集めることができます。", + "block.create.funnel.tooltip.condition1": "パッシブベルト引っ張り", + "block.create.funnel.tooltip.behaviour1": "漏斗は、_ベルトの上_から横または端に配置すると、ベルトからアイテムを引き出すことができます。 横向きのファンネルをバックアップすると、_ベルト上のアイテムが停止することはありません_。", + + "block.create.belt_tunnel.tooltip": "ベルトトンネル", + "block.create.belt_tunnel.tooltip.summary": "_メカニカルベルト_を壁に通すための美的なオプション。 ベルトは真鍮の_ケーシング_で_補強_する必要があります。 トンネルは_隣接_グループと同期でき、グループ内のすべてのトンネルに1つの待機がある場合にのみアイテムを通過させます。 [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.brass_casing.tooltip": "真ちゅうのケーシング", + "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。 装飾用にも安全です。", + "block.create.brass_casing.tooltip.condition1": "メカニカルベルトに使用したとき", + "block.create.brass_casing.tooltip.behaviour1": "真鍮製のファンデーションでベルトを補強します。 強化ベルトは、ベルトトンネル、エクストラクタ、ファンネル、およびトランスポーザをベルトの側面および下から相互作用することをサポートできます。", + + "block.create.belt_observer.tooltip": "ベルトオブザーバー", + "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.pulse_repeater.tooltip": "パルスリピーター", + "block.create.pulse_repeater.tooltip.summary": "通過するレッドストーン信号を_1ティック_の長さにカットする簡単な回路。", + + "block.create.adjustable_repeater.tooltip": "フレックスリピーター", + "block.create.adjustable_repeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な高度な_レッドストーンリピーター_。", + + "block.create.adjustable_pulse_repeater.tooltip": "フレックスパルスリピーター", + "block.create.adjustable_pulse_repeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な_パルスリピーター_。", + + "block.create.analog_lever.tooltip": "アナログレバー", + "block.create.analog_lever.tooltip.summary": "_発信信号強度_をより_正確に制御_するレバー。", + + "block.create.powered_toggle_latch.tooltip": "パワードトグルラッチ", + "block.create.powered_toggle_latch.tooltip.summary": "レッドストーンパルスによってトグルできるレバー。", + + "block.create.powered_latch.tooltip": "パワードラッチ", + "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。 _背面の信号_はそれを可能にし、_側面からの信号_はそれをリセットします。", + + "block.create.speedometer.tooltip": "スピードメーター", + "block.create.speedometer.tooltip.summary": "接続された動力コンポーネントの_回転速度_を測定して表示します。 _レッドストーンコンパレータ_をサポートします。", + "block.create.speedometer.tooltip.condition1": "回転したとき", + "block.create.speedometer.tooltip.behaviour1": "速度のレベルに対応する色を示します。 _緑_は低速、_青_は中程度、_紫_は高速回転を示します。 一部の機械コンポーネントは、適切に機能するために十分なレベルの速度を必要とします。", + + "block.create.stressometer.tooltip": "ストレスメーター", + "block.create.stressometer.tooltip.summary": "接続された動力ネットワークの全体的な応力を測定して表示します。 レッドストーンコンパレータをサポートします。", + "block.create.stressometer.tooltip.condition1": "回転したとき", + "block.create.stressometer.tooltip.behaviour1": "応力のレベルに対応する色を示します。 _過度に応力がかかったネットワーク_は動きを止めます。 ネットワークに_回転源_を追加することで、応力を軽減できます。", + + "tool.create.sand_paper.tooltip": "サンドペーパー", + "tool.create.sand_paper.tooltip.summary": "_素材を磨いたり_、_道具_を研ぐために使用できる粗い紙。", + "tool.create.sand_paper.tooltip.condition1": "使用したとき", + "tool.create.sand_paper.tooltip.behaviour1": "オフハンドで持っているアイテムや地面に落ちているアイテムを見ると研磨します", + + "item.create.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "洗練された放射", + "item.create.refined_radiance.tooltip.summary": "_吸収された光_から鍛造されたクロマチックマテリアル。", + + "item.create.shadow_steel.tooltip": "シャドウスチール", + "item.create.shadow_steel.tooltip.summary": "_虚無_から鍛造されたクロマティックマテリアル。", + + "item.create.crafter_slot_cover.tooltip": "スロットカバー", + "item.create.crafter_slot_cover.tooltip.summary": "_メカニカルクラフター_でレシピの空のスロットとしてマークするために使用されます。 クラフターは必ずしも完全な正方格子を形成する必要はありません。 これは、_成分が互いに対角線_であるレシピがある場合に役立ちます。", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "作業中です!", + "create.tooltip.randomWipDescription0": "お子様の手の届かないところに保管してください。", + "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使用するたびに死にます。そう、すべての時間。", + "create.tooltip.randomWipDescription2": "自己責任。", + "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。* finger-wiggles *を分散させてください。", + "create.tooltip.randomWipDescription4": "このアイテムは10秒で自己破壊します。 10、9、8 ...", + "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", + "create.tooltip.randomWipDescription6": "このアイテムを使用することにより、お客様はここに免責事項に同意し、その条件に同意するものとします。", + "create.tooltip.randomWipDescription7": "これはあなたのためではないかもしれません。 あれはどう??", + "create.tooltip.randomWipDescription8": "それを使ってすぐに決断したことに後悔してください。", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json new file mode 100644 index 000000000..ac39c9e93 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 368", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "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": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "안산안 벽돌", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "안산암 케이스", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "대야", + "block.create.belt": "컨베이어 벨트", + "block.create.belt_observer": "벨트 감지기", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.brass_block": "황동 블럭", + "block.create.brass_casing": "황동 케이스", + "block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "시계 베어링", + "block.create.clutch": "클러치", + "block.create.cogwheel": "톱나버퀴", + "block.create.copper_block": "구리 블럭", + "block.create.copper_casing": "구리 케이스", + "block.create.copper_ore": "구리 광석", + "block.create.copper_shingles": "구리 판자", + "block.create.creative_crate": "청사진 대포 지원기", + "block.create.creative_motor": "모터", + "block.create.crushing_wheel": "분쇄 휠", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "뻐꾸기 시계", + "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", + "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", + "block.create.dark_scoria": "짙은 스코리아", + "block.create.dark_scoria_bricks": "짙은 스코리아 벽돌", + "block.create.dark_scoria_bricks_slab": "짙은 스코리아 벽돌 반 블록", + "block.create.dark_scoria_bricks_stairs": "짙은 스코리아 벽돌 계단", + "block.create.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": "배포기", + "block.create.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "섬록암 벽돌", + "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.dolomite": "백운암", + "block.create.dolomite_bricks": "백운암 벽돌", + "block.create.dolomite_bricks_slab": "백운암 벽돌 반 블록", + "block.create.dolomite_bricks_stairs": "백운암 벽돌 계단", + "block.create.dolomite_bricks_wall": "백운암 벽돌 담장", + "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_pillar": "백운암 기둥", + "block.create.encased_belt": "덮힌 벨트", + "block.create.encased_fan": "덮힌 환풍기", + "block.create.encased_shaft": "덮힌 축", + "block.create.extractor": "추출기", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "플라이휠", + "block.create.framed_glass": "큰 유리", + "block.create.framed_glass_pane": "큰 유리판", + "block.create.furnace_engine": "화로 엔진", + "block.create.gabbro": "반려암", + "block.create.gabbro_bricks": "반려암 벽돌", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "반려암 벽돌 계단", + "block.create.gabbro_bricks_wall": "반려암 벽돌 담장", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "기어박스", + "block.create.gearshift": "기어쉬프트", + "block.create.granite_bricks": "화강암 벽돌", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "핸드 크랭크", + "block.create.horizontal_framed_glass": "수평 유리", + "block.create.horizontal_framed_glass_pane": "수평 유리판", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "큰 톱니바퀴", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "석회모래", + "block.create.limestone": "석회암", + "block.create.limestone_bricks": "석회암 벽돌", + "block.create.limestone_bricks_slab": "석회암 벽돌 반 블록", + "block.create.limestone_bricks_stairs": "석회암 벽돌 계단", + "block.create.limestone_bricks_wall": "석회암 벽돌 담장", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "석회암 기둥", + "block.create.linear_chassis": "직선 섀시", + "block.create.linked_extractor": "무선 추출기", + "block.create.linked_transposer": "무선 트랜스포저", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "베어링", + "block.create.mechanical_crafter": "기계식 조합기", + "block.create.mechanical_drill": "드릴", + "block.create.mechanical_harvester": "수확기", + "block.create.mechanical_mixer": "믹서", + "block.create.mechanical_piston": "기계식 피스톤", + "block.create.mechanical_piston_head": "기계식 피스톤 머리", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "압착기", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "톱", + "block.create.millstone": "맷돌", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "자연 스코리아", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "노즐", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "피스톤 연장 축", + "block.create.polished_dark_scoria": "윤나는 짙은 스코리아", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "윤나는 백운암", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "윤나는 반려암", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "윤나는 석회암", + "block.create.polished_limestone_slab": "윤나는 석회암 반 블록", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "윤나는 스코리아", + "block.create.polished_scoria_slab": "윤나는 스코리아 반 블록", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "윤나는 풍화된 석회암", + "block.create.polished_weathered_limestone_slab": "윤나는 풍화된 석회암 반 블록", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "이동식 저장소 인터페이스", + "block.create.powered_latch": "레드스톤 걸쇠", + "block.create.powered_toggle_latch": "레드스톤 토글 걸쇠", + "block.create.pulley_magnet": "도르래 자석", + "block.create.pulse_repeater": "펄스 리피터", + "block.create.radial_chassis": "원형 섀시", + "block.create.redstone_contact": "동형 감지기", + "block.create.redstone_link": "레드스톤 링크", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "밧줄", + "block.create.rope_pulley": "밧줄 도르래", + "block.create.rotation_speed_controller": "회전 속도 컨트롤러", + "block.create.schematic_table": "청사진 테이블", + "block.create.schematicannon": "청사진 대포", + "block.create.scoria": "스코리아", + "block.create.scoria_bricks": "스코리아 벽돌", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "스코리아 기둥", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "순서 기어쉬프트", + "block.create.shaft": "축", + "block.create.speedometer": "속도 계측기", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", + "block.create.stockpile_switch": "수량 스위치", + "block.create.stressometer": "피로도 계측기", + "block.create.tiled_glass": "타일 유리", + "block.create.tiled_glass_pane": "타일 유리판", + "block.create.transposer": "트랜스포저", + "block.create.turntable": "돌림판", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "수직 유리", + "block.create.vertical_framed_glass_pane": "수직 유리판", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "물레방아", + "block.create.weathered_limestone": "풍화된 석회암", + "block.create.weathered_limestone_bricks": "풍화된 석회암 벽돌", + "block.create.weathered_limestone_bricks_slab": "풍화된 석회암 벽돌 반 블록", + "block.create.weathered_limestone_bricks_stairs": "풍화된 석회암 벽돌 계단", + "block.create.weathered_limestone_bricks_wall": "풍화된 석회암 벽돌 담장", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", + "block.create.zinc_block": "아연 블럭", + "block.create.zinc_ore": "아연 광석", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "안산암 합금", + "item.create.attribute_filter": "속성 필터 틀", + "item.create.belt_connector": "기계식 벨트", + "item.create.brass_hand": "황동 손", + "item.create.brass_ingot": "황동 주괴", + "item.create.brass_nugget": "황동 조각", + "item.create.brass_sheet": "황동 판", + "item.create.chromatic_compound": "색채 혼합물", + "item.create.copper_ingot": "구리 주괴", + "item.create.copper_nugget": "구리 조각", + "item.create.copper_sheet": "구리 판", + "item.create.crafter_slot_cover": "작업대 슬롯 덮개", + "item.create.crushed_brass": "분쇄된 황동", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "산림파괴자", + "item.create.dough": "반죽", + "item.create.electron_tube": "전지 튜브", + "item.create.empty_schematic": "빈 청사진", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "필터 틀", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "엔지니어의 고글", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "휴대용 블럭발사기", + "item.create.handheld_worldshaper": "휴대용 세계편집기", + "item.create.integrated_circuit": "집적 회로", + "item.create.iron_sheet": "철 판", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "프로펠러", + "item.create.red_sand_paper": "붉은 사포", + "item.create.refined_radiance": "정제된 광채", + "item.create.rose_quartz": "장밋빛 석영", + "item.create.sand_paper": "사포", + "item.create.schematic": "청사진", + "item.create.schematic_and_quill": "청사진과 깃펜", + "item.create.shadow_steel": "그림자 강철", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "나무 비료", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "대칭의 지팡이", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "혼합기", + "item.create.wrench": "렌치", + "item.create.zinc_ingot": "아연 주괴", + "item.create.zinc_nugget": "아연 조각", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "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이(가) 드릴에 관통당했습니다", + "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", + "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", + + "create.block.deployer.damage_source_name": "순수한 배포기", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "분쇄", + "create.recipe.milling": "맷돌질", + "create.recipe.splashing": "세척", + "create.recipe.splashing.fan": "물과 환풍기", + "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", + "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", + "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "압착", + "create.recipe.mixing": "혼합", + "create.recipe.packing": "압축", + "create.recipe.mechanical_sawing": "제재", + "create.recipe.mechanical_crafting": "기계 조합", + "create.recipe.block_cutting": "블럭 절단", + "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", + "create.recipe.sandpaper_polishing": "사포 연마", + "create.recipe.mystery_conversion": "?", + "create.recipe.processing.catalyst": "촉매", + "create.recipe.processing.chance": "%1$s%% 확률", + "create.recipe.processing.chanceToReturn": "%1$s%% 확률로 반환", + + "create.generic.range": "범위", + "create.generic.radius": "반지름", + "create.generic.width": "폭", + "create.generic.height": "높이", + "create.generic.length": "길이", + "create.generic.speed": "속도", + "create.generic.delay": "딜레이", + "create.generic.unit.ticks": "틱", + "create.generic.unit.seconds": "초", + "create.generic.unit.minutes": "분", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "스크롤하세요", + "create.action.confirm": "확인", + "create.action.abort": "중단", + "create.action.saveToFile": "저장", + "create.action.discard": "삭제", + + "create.keyinfo.toolmenu": "메뉴 세부정보 보기", + "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "옵션을 선택하세요:", + "create.gui.scrollInput.scrollToModify": "스크롤로 수정하기", + "create.gui.scrollInput.scrollToAdjustAmount": "스크롤로 수량 조절하기", + "create.gui.scrollInput.scrollToSelect": "스크롤로 선택", + "create.gui.scrollInput.shiftScrollsFaster": "쉬프트-스크롤로 빨리 수정하기", + "create.gui.toolmenu.focusKey": "[%1$s]를 눌러 세부정보 보기", + "create.gui.toolmenu.cycle": "스크롤로 순환", + "create.gui.symmetryWand.mirrorType": "반사", + "create.gui.symmetryWand.orientation": "방위", + + "create.symmetry.mirror.plane": "거울 모드", + "create.symmetry.mirror.doublePlane": "사각형 모드", + "create.symmetry.mirror.triplePlane": "팔각형 모드", + + "create.orientation.orthogonal": "수직으로", + "create.orientation.diagonal": "대각선으로", + "create.orientation.horizontal": "수평으로", + "create.orientation.alongZ": "Z좌표를 따라", + "create.orientation.alongX": "X좌표를 따라", + + "create.gui.blockzapper.title": "휴대용 블럭발사기", + "create.gui.blockzapper.replaceMode": "대체 모드", + "create.gui.blockzapper.searchDiagonal": "대각선을 따라", + "create.gui.blockzapper.searchFuzzy": "물질 경계 무시", + "create.gui.blockzapper.range": "범위", + "create.gui.blockzapper.needsUpgradedAmplifier": "업그레이드가 필요합니다", + "create.gui.blockzapper.patternSection": "패턴 설정", + "create.gui.blockzapper.pattern.solid": "원형", + "create.gui.blockzapper.pattern.checkered": "체스판", + "create.gui.blockzapper.pattern.inversecheckered": "반전된 체스판", + "create.gui.blockzapper.pattern.chance25": "램덤으로 25% 채우기", + "create.gui.blockzapper.pattern.chance50": "램덤으로 50% 채우기", + "create.gui.blockzapper.pattern.chance75": "랜덤으로 75% 채우기", + "create.gui.terrainzapper.title": "휴대용 세계편집기", + "create.gui.terrainzapper.placement": "설치방식", + "create.gui.terrainzapper.placement.merged": "선택한 블럭에", + "create.gui.terrainzapper.placement.attached": "선택한 블럭 옆에", + "create.gui.terrainzapper.placement.inserted": "선택한 블럭 안에", + "create.gui.terrainzapper.brush": "브러쉬", + "create.gui.terrainzapper.brush.cuboid": "정육면체", + "create.gui.terrainzapper.brush.sphere": "구", + "create.gui.terrainzapper.brush.cylinder": "원통", + "create.gui.terrainzapper.tool": "도구", + "create.gui.terrainzapper.tool.fill": "채우기", + "create.gui.terrainzapper.tool.place": "설치", + "create.gui.terrainzapper.tool.replace": "대체", + "create.gui.terrainzapper.tool.clear": "지우기", + "create.gui.terrainzapper.tool.overlay": "덮어씌우기", + "create.gui.terrainzapper.tool.flatten": "평탄화", + + "create.terrainzapper.shiftRightClickToSet": "쉬프트-우클릭으로 모양 설정하기", + + "create.blockzapper.usingBlock": "현재 블럭: %1$s", + "create.blockzapper.componentUpgrades": "부품 업그레이드:", + "create.blockzapper.component.body": "몸통", + "create.blockzapper.component.amplifier": "증폭기", + "create.blockzapper.component.accelerator": "가속기", + "create.blockzapper.component.retriever": "회수기", + "create.blockzapper.component.scope": "스코프", + "create.blockzapper.componentTier.none": "없음", + "create.blockzapper.componentTier.brass": "황동", + "create.blockzapper.componentTier.chromatic": "혼돈의 결정체", + "create.blockzapper.leftClickToSet": "좌클릭으로 블럭 설정하기", + "create.blockzapper.empty": "블럭이 없습니다!", + + "create.contraptions.movement_mode": "이동 설정", + "create.contraptions.movement_mode.move_place": "멈췄을때 항상 블럭 설치하기", + "create.contraptions.movement_mode.move_place_returned": "멈췄을떄 최초 위치에서만 블럭 설치하기", + "create.contraptions.movement_mode.move_never_place": "멈춰도 블럭 설치하지 않기", + "create.contraptions.movement_mode.rotate_place": "멈췄을때 항상 블럭 설치하기", + "create.contraptions.movement_mode.rotate_place_returned": "멈췄을떄 최초 각도에서만 블럭 설치하기", + "create.contraptions.movement_mode.rotate_never_place": "멈춰도 블럭 설치하지 않기", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "필터", + "create.logistics.firstFrequency": "주파수. #1", + "create.logistics.secondFrequency": "주파수. #2", + + "create.gui.goggles.generator_stats": "발전 상태:", + "create.gui.goggles.kinetic_stats": "가동 상태:", + "create.gui.goggles.at_current_speed": "현재 속도", + "create.gui.goggles.base_value": "기본 수치", + "create.gui.gauge.info_header": "게이지 정보:", + "create.gui.speedometer.title": "회전 속도", + "create.gui.stressometer.title": "네트워크 부하", + "create.gui.stressometer.capacity": "용량", + "create.gui.stressometer.overstressed": "과부하됨", + "create.gui.stressometer.no_rotation": "회전없음", + "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", + "create.gui.contraptions.network_overstressed": "이 장치는 _과부하_되었습니다. _높은 피로도_ 용량을 가진 발전기를 추가로 설치하거나 장치 _속도_를 _늦추세요_.", + "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.sequenced_gearshift.title": "순서 기어쉬프트", + "create.gui.sequenced_gearshift.instruction": "설명", + "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도", + "create.gui.sequenced_gearshift.instruction.turn_distance": "피스톤", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리", + "create.gui.sequenced_gearshift.instruction.wait": "정지", + "create.gui.sequenced_gearshift.instruction.wait.duration": "지속시간", + "create.gui.sequenced_gearshift.instruction.end": "마침", + "create.gui.sequenced_gearshift.speed": "속도, 방향", + "create.gui.sequenced_gearshift.speed.forward": "입력된 속도, 그대로 회전", + "create.gui.sequenced_gearshift.speed.forward_fast": "입력된 속도의 2배, 그대로 회전", + "create.gui.sequenced_gearshift.speed.back": "입력된 속도, 반대로 회전", + "create.gui.sequenced_gearshift.speed.back_fast": "입력된 속도의 2배, 반대로 회전", + + "create.schematicAndQuill.dimensions": "청사진 크기: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "첫번쨰 위치 지정됨.", + "create.schematicAndQuill.secondPos": "두번째 위치 지정됨.", + "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블럭을 선택하기.", + "create.schematicAndQuill.abort": "위치 제거됨.", + "create.schematicAndQuill.prompt": "청사진의 제목을 작성하기:", + "create.schematicAndQuill.fallbackName": "내 청사진", + "create.schematicAndQuill.saved": "%1$s로 저장됨", + + "create.schematic.invalid": "[!] 없는 아이템 - 청사진 테이블을 이용하세요", + "create.schematic.position": "위치", + "create.schematic.rotation": "회전", + "create.schematic.rotation.none": "없음", + "create.schematic.rotation.cw90": "90도 시계방향 회전", + "create.schematic.rotation.cw180": "180도 시계방향 회전", + "create.schematic.rotation.cw270": "270도 시계방향 회전", + "create.schematic.mirror": "거울", + "create.schematic.mirror.none": "없음", + "create.schematic.mirror.frontBack": "전-후", + "create.schematic.mirror.leftRight": "좌-우", + "create.schematic.tool.deploy": "전개", + "create.schematic.tool.move": "X/Z좌표 이동", + "create.schematic.tool.movey": "Y좌표 이동", + "create.schematic.tool.rotate": "회전", + "create.schematic.tool.print": "설치", + "create.schematic.tool.flip": "뒤집기", + "create.schematic.tool.deploy.description.0": "구조물을 해당 위치로 고정합니다.", + "create.schematic.tool.deploy.description.1": "땅에다 우클릭으로 설치합니다.", + "create.schematic.tool.deploy.description.2": "[Ctrl]을 눌러 플레이어-청사진의 거리를 설정합니다.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-스크롤로 거리를 조정합니다.", + "create.schematic.tool.move.description.0": "청사진을 수평 이동시킵니다.", + "create.schematic.tool.move.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "청사진을 수직 이동시킵니다.", + "create.schematic.tool.movey.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "청사진을 돌립니다.", + "create.schematic.tool.rotate.description.1": "[CTRL]-스크롤로 90도 돌립니다.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "구조물을 즉시 설치합니다.", + "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치를 허가합니다.", + "create.schematic.tool.print.description.2": "이 도구는 크리에이티브 모드 전용입니다.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "당신이 보는 면으로 청사진을 뒤집습니다.", + "create.schematic.tool.flip.description.1": "청사진을 보고 [CTRL]-스크롤로 뒤집습니다.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "동기화 중...", + "create.schematics.uploadTooLarge": "청사진이 너무 큽니다!.", + "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", + + "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.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.option.skipMissing.description": "만약 대포가 설치에 필요한 블럭을 찾지 못할 경우,건너뛰고 다음 블럭 설치를 진행합니다.", + "create.gui.schematicannon.option.skipTileEntities.description": "대포가 상세정보가 든 상자같은 타일 엔티티 설치를 무시합니다.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블럭을 대체하지 않습니다.", + "create.gui.schematicannon.option.replaceWithSolid.description": "대포가 작업구역의 온전한 블럭을 대포가 가진 재료로 대체합니다.", + "create.gui.schematicannon.option.replaceWithAny.description": "대포가 작업구역의 온전한 블럭을 대포가 가진 어떠한 재료로든 대체합니다.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블럭들을 제거하고 공기로 채웁니다.", + + "create.schematicannon.status.idle": "휴식", + "create.schematicannon.status.ready": "준비됨", + "create.schematicannon.status.running": "가동 중", + "create.schematicannon.status.finished": "완료", + "create.schematicannon.status.paused": "멈춤", + "create.schematicannon.status.stopped": "중단됨", + "create.schematicannon.status.noGunpowder": "화약이 부족함", + "create.schematicannon.status.targetNotLoaded": "블럭이 준비되지 않음", + "create.schematicannon.status.targetOutsideRange": "목표가 너무 멀리 떨어져 있습니다.", + "create.schematicannon.status.searching": "검색 중", + "create.schematicannon.status.skipping": "건너뛰는 중", + "create.schematicannon.status.missingBlock": "부족한 블럭:", + "create.schematicannon.status.placing": "설치 중", + "create.schematicannon.status.clearing": "블럭을 제거하는 중", + "create.schematicannon.status.schematicInvalid": "청사진 없음", + "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", + "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", + + "create.gui.filter.blacklist": "블랙리스트", + "create.gui.filter.blacklist.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", + "create.gui.filter.whitelist": "화이트리스트", + "create.gui.filter.whitelist.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", + "create.gui.filter.respect_data": "상세정보 일치", + "create.gui.filter.respect_data.description": "위 목록 아이템의 내구도, 마법부여, 그리고 다른 NBT와 일치할 때 통과시킵니다.", + "create.gui.filter.ignore_data": "상세정보 무시", + "create.gui.filter.ignore_data.description": "상세정보와 상관없이 아이템 종류만 일치한다면 통과시킵니다.", + + "create.item_attributes.placeable": "설치할 수 있음", + "create.item_attributes.consumable": "먹을 수 있음", + "create.item_attributes.smeltable": "구워질 수 있음", + "create.item_attributes.washable": "세척될 수 있음", + "create.item_attributes.smokable": "훈연될 수 있음", + "create.item_attributes.blastable": "용광로에 녹일 수 있음", + "create.item_attributes.enchanted": "마법부여됨", + "create.item_attributes.damaged": "내구도가 닮", + "create.item_attributes.badly_damaged": "심각하게 내구도가 닮", + "create.item_attributes.not_stackable": "겹쳐질 수 없음", + "create.item_attributes.equipable": "장착할 수 있음", + "create.item_attributes.furnace_fuel": "화로 연료로 쓸 수 있음", + "create.item_attributes.in_tag": "%1$s로 등록됨", + "create.item_attributes.in_item_group": "%1$s탭에 속함", + "create.item_attributes.added_by": "%1$s가 추가함", + + "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", + "create.gui.attribute_filter.selected_attributes": "선택된 속성:", + "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.blacklist": "블랙리스트", + "create.gui.attribute_filter.blacklist.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", + "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", + + "create.tooltip.holdKey": "[%1$s]를 눌러 설명보기", + "create.tooltip.holdKeyOrKey": "[%1$s] 또는 [%2$s]를 눌러 설명보기", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "회전속도 요구: %1$s", + "create.tooltip.speedRequirement.none": "없음", + "create.tooltip.speedRequirement.medium": "보통", + "create.tooltip.speedRequirement.high": "빠름", + "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.low": "적음", + "create.tooltip.capacityProvided.medium": "보통", + "create.tooltip.capacityProvided.high": "큼", + "create.tooltip.capacityProvided.asGenerator": "(발전기로써)", + "create.tooltip.generationSpeed": "%1$s %2$s만큼 발전함", + "create.tooltip.analogStrength": "레드스톤 출력: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "최소 재료 종류", + + "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.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.mechanical_press_activation": "압착기가 가동됨", + "create.subtitle.mechanical_press_item_break": "금속이 부딫힘", + "create.subtitle.blockzapper_place": "블럭이 순간이동됨", + "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.blockzapper_deny": "취소 효과음", + "create.subtitle.block_funnel_eat": "깔때기가 흡입함", + + + "_": "->------------------------] 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.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블럭 설치를 똑같이 재현합니다.", + "item.create.wand_of_symmetry.tooltip.condition1": "단축바에 있을 때", + "item.create.wand_of_symmetry.tooltip.behaviour1": "활성화 유지", + "item.create.wand_of_symmetry.tooltip.control1": "땅에다 우클릭", + "item.create.wand_of_symmetry.tooltip.action1": "거울을 _생성하거나_ _옮깁니다_.", + "item.create.wand_of_symmetry.tooltip.control2": "공중에 우클릭", + "item.create.wand_of_symmetry.tooltip.action2": "활성화된 거을을 _제거합니다_.", + "item.create.wand_of_symmetry.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.wand_of_symmetry.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "멀리있는 블럭을 교체, 설치하는 놀라운 도구입니다.", + "item.create.handheld_blockzapper.tooltip.control1": "블럭을 보고 좌클릭", + "item.create.handheld_blockzapper.tooltip.action1": "이 도구로 설치할 블럭을 설정합니다.", + "item.create.handheld_blockzapper.tooltip.control2": "블럭을 보고 우클릭", + "item.create.handheld_blockzapper.tooltip.action2": "해당 위치에 설정된 블럭으로 설치하거나 교체합니다.", + "item.create.handheld_blockzapper.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.handheld_blockzapper.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "_지형경관_을 만들 때 좋은 간편한 도구입니다.", + "item.create.handheld_worldshaper.tooltip.control1": "블럭을 보고 좌클릭", + "item.create.handheld_worldshaper.tooltip.action1": "이 도구로 설치할 블럭을 설정합니다.", + "item.create.handheld_worldshaper.tooltip.control2": "블럭을 보고 우클릭", + "item.create.handheld_worldshaper.tooltip.action2": "해당 위치에 설정된 _브러쉬_ 와 _도구_를 적용합니다.", + "item.create.handheld_worldshaper.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.handheld_worldshaper.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "일반적인 나무 종류들의 성장을 촉진시킬 강력한 미네랄의 혼합물입니다.", + "item.create.tree_fertilizer.tooltip.condition1": "묘목에 사용했을 때", + "item.create.tree_fertilizer.tooltip.behaviour1": "묘목을 주위 공간과 _상관없이_ 성장시킵니다.", + + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "수 초 만에 나무를 쓰러뜨리는 _경이로운_ _도끼_입니다.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _아이템_ 목록에 따라 정확하게 _조정_합니다.", + "item.create.filter.tooltip.condition1": "필터 슬롯에 있을 때", + "item.create.filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", + "item.create.filter.tooltip.condition2": "우클릭", + "item.create.filter.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _속성_ 목록에 따라 정확하게 _조정_합니다.", + "item.create.attribute_filter.tooltip.condition1": "필터 슬롯에 있을 때", + "item.create.attribute_filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", + "item.create.attribute_filter.tooltip.condition2": "우클릭", + "item.create.attribute_filter.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip.summary": "조합 재료로 쓰이거나 청사진 테이블에서 청사진을 불러올 때 쓰입니다.", + + "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip.summary": "세계에 구조물을 홀로그램으로 불러와 지정하고 설치합니다. 지정된 홀로그램은 청사진 대포의 작업 영역이 됩니다.", + "item.create.schematic.tooltip.condition1": "들고 있을 떄", + "item.create.schematic.tooltip.behaviour1": "UI의 도구로 변경/설치 할 수 있습니다.", + "item.create.schematic.tooltip.control1": "웅크린 상태에서 우클릭", + "item.create.schematic.tooltip.action1": "정확한 _좌표_ 입력을 위한 창을 엽니다.", + + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip.summary": "세계에 있는 구조물을 .nbt 파일로 저장할 때 쓰입니다.", + "item.create.schematic_and_quill.tooltip.condition1": "1단계", + "item.create.schematic_and_quill.tooltip.behaviour1": "두 모서리를 우클릭으로 선택하세요.", + "item.create.schematic_and_quill.tooltip.condition2": "2단계", + "item.create.schematic_and_quill.tooltip.behaviour2": "면을 바라보고 _Ctrl-스크롤_하여 크기를 조정하세요. 우클릭을 다시 하면 저장됩니다.", + "item.create.schematic_and_quill.tooltip.control1": "우클릭", + "item.create.schematic_and_quill.tooltip.action1": "모서리 선택 / 저장 확인", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl를 누르고 있을 때", + "item.create.schematic_and_quill.tooltip.action2": "_Scroll_를 이용하여 거리를 조정합니다.", + "item.create.schematic_and_quill.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.schematic_and_quill.tooltip.action3": "선택 영역을 리셋하고 _삭제_합니다.", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블럭들을 발포합니다. 화약을 연료로 사용하고 주변 인벤토리 공간에서 아이템을 사용합니다.", + "block.create.schematicannon.tooltip.control1": "우클릭", + "block.create.schematicannon.tooltip.action1": "창을 엽니다.", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "_빈_ _청사진_에 저장된 청사진을 불러옵니다.", + "block.create.schematic_table.tooltip.condition1": "빈 청사진을 넣을 때", + "block.create.schematic_table.tooltip.behaviour1": "Schematics 폴더에서 선택한 파일을 업로드합니다.", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": " _일직선_이나 _옆_ _톱니바퀴_로 _회전_을 _전달_합니다.", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "큰 톱니바퀴입니다. 작은 톱니바퀴와 맞물렸을때, _회전 속도_가 _변합니다_.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다. _벽을_ _넘어_ 회전을 보낼 때 유용합니다.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "_전후좌우_ / _상하전후_로 회전을 보냅니다. 한번 더 조합해서 설정을 바꿀 수 있습니다.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "연결된 축의 회전 방향을 _변경_합니다.", + "block.create.gearshift.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.gearshift.tooltip.behaviour1": "_출력_ 회전 방향을 _반전_시킵니다.", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "연결된 축의 회전을 끄고 킬 수 있습니다.", + "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.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "덮힌 벨트와 같은 역할을 가집니다. 또한 입/출력 부분에 설치하고 레드스톤 신호 세기에 따라 _회전_ _속도_를 _조정_할 수 있습니다.", + "block.create.adjustable_pulley.tooltip.condition1": "레드스톤 신호 설정", + "block.create.adjustable_pulley.tooltip.behaviour1": "_입력_ 부분에 설치하면 출력 회전 속도를 _낮추고_ (최대 0.5배), _출력_ 부분에 설치하면 출력 회전 속도를 _증가시킵니다_ (최대 2배).", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "두 개 이상의 _축_을 벨트로 연결할 수 있습니다. 연결된 축들은 _모두_ _같은_ _속도_와 _방향_을 가집니다. 벨트는 _아이템_이나 _엔티티_를 _옮길_ _수_ _있습니다_.", + "item.create.belt_connector.tooltip.control1": "축에다 우클릭", + "item.create.belt_connector.tooltip.action1": "첫번째 벨트 끝부분을 설정합니다. 두번째 축은 반드시 _수평_이나 _수직_, _대각선_ 방향에 있는 축에 연결해야합니다.", + "item.create.belt_connector.tooltip.control2": "웅크린 상태에서 우클릭", + "item.create.belt_connector.tooltip.action2": "첫번째 벨트 설정을 초기화합니다.", + + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "장치 정보를 착용자의 시야에 띄어주는 안경입니다.", + "item.create.goggles.tooltip.condition1": "장착했을 때", + "item.create.goggles.tooltip.behaviour1": "해당 장치의 _속도_, _피로도_, _용량_을 레벨에 따라 에 따라 색상 UI를 보여줍니다.", + "item.create.goggles.tooltip.condition2": "계측기를 바라볼 때", + "item.create.goggles.tooltip.behaviour2": "계측기가 연결된 네트워크의 _속도_나 _스트레스_의 자세한 정보를 보여줍니다.", + + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "장치 구성에 유용한 도구입니다. 장치를 _회전_, _설정_, _해체_하는 데 쓰입니다.", + "item.create.wrench.tooltip.control1": "장치에 우클릭", + "item.create.wrench.tooltip.action1": "사용자가 바라보는 _면으로_ 혹은 _반대로_ 장치를 돌립니다.", + "item.create.wrench.tooltip.control2": "웅크린 상태에서 우클릭", + "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _인벤토리_로 넣습니다.", + + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "회전 속도를 _조정_할 수 있는 장치입니다.", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "인접한 _물의_ _흐름_에서 얻은 회전을 제공합니다.", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "회전력을 바람으로 전환합니다. 다양한 용도로 사용 가능합니다.", + "block.create.encased_fan.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.encased_fan.tooltip.behaviour1": "장치 아래의 _열_을 _회전력_으로 _바꾸어_ 제공합니다. 날개가 아래를 바라보아야 합니다.", + "block.create.encased_fan.tooltip.condition2": "돌려질 때", + "block.create.encased_fan.tooltip.behaviour2": "들어오는 회적 속도에 따라 엔티티를 밀거나 당깁니다.", + "block.create.encased_fan.tooltip.condition3": "특정 블럭을 통해 바람을 보낼 때", + "block.create.encased_fan.tooltip.behaviour3": "공기 흐름에 _액체_ 혹은 _불꽃_ 효과가 _추가_됩니다. 이는 아이템을 _공정_하는데 쓰일 수 있습니다.", + + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "덮힌 환풍기 _앞_에 붙여 환풍기의 효과를 _전방_으로 _확대_합니다.", + + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "간단한 회전력의 원천입니다. 플레이어의 _상호작용_이 필요합니다.", + "block.create.hand_crank.tooltip.condition1": "사용될 때", + "block.create.hand_crank.tooltip.behaviour1": "연결된 장치에 _회전력_을 _제공_합니다. 웅크리면 _반대로_ 회전시킵니다.", + + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "_시간의_ _흐름_을 알고 공간을 _꾸미는_ 데 좋은 공예품입니다.", + "block.create.cuckoo_clock.tooltip.condition1": "회전할 때", + "block.create.cuckoo_clock.tooltip.behaviour1": "현재 시각을 보여주고 하루에 두 번 울립니다. 점심과 플레이어가 바로 잘 수 있는 저녁에 울립니다.", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "_회전력_으로 _멀미_를 일으킵니다.", + + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "투입된 _재료_를 _가는_ 데 좋은 장치입니다. 측면 톱니바퀴나 바닥에 축을 이어 작동합니다. 결과물은 직접 빼내야 합니다.", + "block.create.millstone.tooltip.condition1": "회전 할 때", + "block.create.millstone.tooltip.behaviour1": "옆이나 위에서 투입된 아이템을 _맷돌질_합니다.", + "block.create.millstone.tooltip.condition2": "우클릭할때", + "block.create.millstone.tooltip.behaviour2": "결과물을 직접 꺼냅니다.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "모든 것을 _부숴버리는_ 큰 바퀴입니다.", + "block.create.crushing_wheel.tooltip.condition1": "다른 분쇄 휠과 붙어있을 때", + "block.create.crushing_wheel.tooltip.behaviour1": "다양한 것을 _분쇄_하는 분쇄 기계를 형성합니다. 휠의 이빨이 _같은_ _속력_으로, _반대_ _방향_으로 맞물려야합니다.", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "아래있는 아이템을 _눌러버리는_ 힘센 피스톤입니다. _지속적인_ _회전력_이 필요합니다.", + "block.create.mechanical_press.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.mechanical_press.tooltip.behaviour1": "_아래 있는_ 아이템을 누르기 시작합니다.", + "block.create.mechanical_press.tooltip.condition2": "컨베이어 벨트 위에 있을 때", + "block.create.mechanical_press.tooltip.behaviour2": "_자동으로_ 벨트 위를 지나가는 아이템을 누릅니다.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "믹서나 압착기와 같이 쓰이는 간편한 _아이템_ _저장소_입니다. 레드스톤 비교기와 호환됩니다.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "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": "모든 조합법을 _자동화_할 장치입니다. 조합법대로 여러개를 _격자_로 설치하고, 화살표를 돌려 _한_ _곳으로_ _모이게_ 설정해야합니다.", + "block.create.mechanical_crafter.tooltip.condition1": "회전할 때", + "block.create.mechanical_crafter.tooltip.behaviour1": "모든 조합칸에 있는 아이템들을 조합하기 시작합니다.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "전면을 렌치로 조정할 때", + "block.create.mechanical_crafter.tooltip.action1": "각 기계식 조합기의 아이템 이동 방향을 설정합니다. 모든 조합기의 방향은 _하나의_ _최종_ _조합기_로 이동해야하며, 최종 조합기는 조합기 _바깥으로_ 아이템을 운송해야합니다.", + "block.create.mechanical_crafter.tooltip.control2": "측면/후면에서 렌치로 조정할 때", + "block.create.mechanical_crafter.tooltip.action2": "인접한 조합기와 입력 공간을 _연결_합니다. 이를 통해 일일히 아이템을 넣는 노력을 줄일 수 있습니다.", + + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "_화로의_ _작동_을 필요로 하는 강력한 회전 동력원입니다.", + "block.create.furnace_engine.tooltip.condition1": "작동하는 화로에 붙였을 때", + "block.create.furnace_engine.tooltip.behaviour1": "붙어있는(한칸 띄어져있는) _플라이휠_에 동력을 공급합니다. _용광로_는 _두_ _배_의 화력을 냅니다.", + + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "붙어있는 _화로_ _엔진_에서 생산된 힘을 안정시키고 _동력화_하는 거대한 금속 바퀴입니다. 화로 엔진으로부터 _한_ _칸_ _떨어져_ 설치해야 합니다.", + "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.condition1": "움직일 때", + "block.create.portable_storage_interface.tooltip.behaviour1": "고정된 트랜스포저의 _방향에_ _따라_ 아이템을 _주거나_ _받습니다_. 아이템이 이동하는 동안 움직이는 기기는 _멈춥니다_.", + + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "해당 톱니바퀴의 속도를 _변경_할 수 있는 컨트롤러입니다.", + "block.create.rotation_speed_controller.tooltip.condition1": "큰 톱니바퀴와 연결되었을 때", + "block.create.rotation_speed_controller.tooltip.behaviour1": "들어오는 회전력을 받아, 대상의 속도를 변경합니다. _큰_ _톱니바퀴_가 컨트롤러 위에 있어야합니다.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "피스톤의 업그레이드 버전입니다. 회전력을 사용해 연결된 구조물을 옮깁니다. _피스톤_ _연장_ _축_을 후면에 붙여 이 장치의 사거리를 늘이거나 줄일 수 있습니다. 축이 없다면 움직이지 않습니다. _섀시_나 _슬라임_ _블럭_을 붙여 일직선의 블럭들을 움직일 수 있습니다.", + "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": "기계식 피스톤에 연결했을 때", + "block.create.piston_extension_pole.tooltip.behaviour1": "피스톤의 사거리를 한 블럭 늘립니다.", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "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.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "현재 _인게임_ _시간_을 알려주는 _시침_, _분침_을 돌리는 업그레이드된 베어링입니다.", + "block.create.clockwork_bearing.tooltip.condition1": "회전될 때", + "block.create.clockwork_bearing.tooltip.behaviour1": "현재 시간에 맞춰 연결된 구조물을 _시침_으로써 돌리기 시작합니다. _다른_ _종류의_ _섀시_가 있다면, _분침_처럼 돌립니다.", + + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "연속으로 5개의 회전 명령을 내릴 수 있는 _프로그램이_ _가능한_ 장치입니다. 이것으로 베어링, 피스톤, 도르래의 움직임과 타이밍을 정할 수 있습니다. 빠른 속력에는 부정확해질 수 있습니다.", + "block.create.sequenced_gearshift.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.sequenced_gearshift.tooltip.behaviour1": "입력 속도에 따른 프로그램된 명령들을 수행하기 시작합니다.", + "block.create.sequenced_gearshift.tooltip.condition2": "우클릭했을 때", + "block.create.sequenced_gearshift.tooltip.behaviour2": "설정 창을 엽니다.", + + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "지나가는 _광산_ _수레_에 연결된 구조물을 붙입니다.", + "block.create.cart_assembler.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.cart_assembler.tooltip.behaviour1": "지나가는 광산 수레에 장착된 구조물을 분리시키고 조립기에 다시 설치합니다.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "_수직으로_ 붙은 구조물을 움직입니다. _섀시_나 _슬라임_ _블럭_을 붙여 일직선의 블럭들을 움직일 수 있습니다.", + "block.create.rope_pulley.tooltip.condition1": "회전될 때", + "block.create.rope_pulley.tooltip.behaviour1": "연결된 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도, 방향에 따라 다릅니다.", + + "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", + "block.create.linear_chassis.tooltip.summary": "연결된 구조물의 이동을 위한 베이스 블럭입니다.", + "block.create.linear_chassis.tooltip.condition1": "움직일 때", + "block.create.linear_chassis.tooltip.behaviour1": "섀시의 _기둥_ _방향_으로 붙어있는 모든 블럭들을 같은 방향으로 옮깁니다. 블럭들은 섀시가 끈끈할 때만 당겨집니다 ([Ctrl]를 누르세요).", + "block.create.linear_chassis.tooltip.condition2": "렌치로 조정할 때", + "block.create.linear_chassis.tooltip.behaviour2": "대상 섀시의 사거리를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", + "block.create.linear_chassis.tooltip.control1": "슬라임 볼로 우클릭", + "block.create.linear_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 섀시는 연결된 _모든_ _블럭_을 움직이는 방향에 상관없이 당깁니다.", + + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "연결된 구조물의 이동을 위한 베이스 블럭입니다.", + "block.create.radial_chassis.tooltip.condition1": "움직일 때", + "block.create.radial_chassis.tooltip.behaviour1": "섀시의 _원_ _방향_으로 붙어있는 모든 블럭들을 같은 방향으로 옮깁니다. 블럭들이 섀시가 끈끈한 면에 붙어있을 때만 움직입니다 ([Ctrl]를 누르세요).", + "block.create.radial_chassis.tooltip.condition2": "렌치로 조정할 때", + "block.create.radial_chassis.tooltip.behaviour2": "대상 섀시의 사거리를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", + "block.create.radial_chassis.tooltip.control1": "슬라임 볼로 우클릭", + "block.create.radial_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 끈끈한 면에 붙은 _모든_ _블럭_을 움직이게 합니다", + + "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", + "block.create.mechanical_drill.tooltip.summary": "블럭을 _파괴하는_ 데 적합한 장치입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_drill.tooltip.condition1": "회전될 때", + "block.create.mechanical_drill.tooltip.behaviour1": "고정되어 블럭을 부숩니다. 또한 해당영역의 엔티티에게 피해를 줍니다.", + "block.create.mechanical_drill.tooltip.condition2": "움직일 때", + "block.create.mechanical_drill.tooltip.behaviour2": "드릴이 부딫히는 모든 블럭을 부숩니다.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", + "block.create.mechanical_harvester.tooltip.summary": "중간 크기의 작물 자동화에 적합한 _작물_ _수확기_입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_harvester.tooltip.condition1": "움직일 때", + "block.create.mechanical_harvester.tooltip.behaviour1": "칼날에 닿는 모두 자란 작물을 수확하고 최초 성장 상태로 변경합니다.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "MECHANICAL mechanical_saw", + "block.create.mechanical_saw.tooltip.summary": "효율적인 _벌목_과 블럭을 _제재_하는데 적합합니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_saw.tooltip.condition1": "위를 바라볼 때", + "block.create.mechanical_saw.tooltip.behaviour1": "_제재_와 _석재_ _절단_ 조합법을 떨어진/투입된 아이템에 적용합니다. 결과물이 여러 종류고 필터가 적용이 되지 않았다면, 결과물은 _목록_ _순서_대로 배출됩니다.", + "block.create.mechanical_saw.tooltip.condition2": "옆을 바라볼 때", + "block.create.mechanical_saw.tooltip.behaviour2": "앞에 있는 원목을 자릅니다. 나무의 원목이라면, 나무가 쓰러지면서 아이템을 떨굽니다.", + "block.create.mechanical_saw.tooltip.condition3": "움직일 때", + "block.create.mechanical_saw.tooltip.behaviour3": "톱이 만나는 모든 나무를 벱니다.", + + "block.create.stockpile_switch.tooltip": "stockpile_switch", + "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.redstone_link.tooltip": "REDSTONE LINK", + "block.create.redstone_link.tooltip.summary": "_무선_ 레드스톤 단말기입니다. 아무 아이템으로 두 개의 _주파수_를 설정할 수 있습니다. 통신거리는 제한되어 있지만, 그래도 충분히 넓습니다.", + "block.create.redstone_link.tooltip.condition1": "신호를 줄 때", + "block.create.redstone_link.tooltip.behaviour1": "같은 주파주의 다른 단말기에서 레드스톤 신호를 받습니다.", + "block.create.redstone_link.tooltip.control1": "아이템을 들고 우클릭", + "block.create.redstone_link.tooltip.action1": "그 아이템으로 주파수를 설정합니다. 주파수는 최대 두가지 아이템 조합으로 이룰 수 있습니다.", + "block.create.redstone_link.tooltip.control2": "웅크린 상태에서 우클릭", + "block.create.redstone_link.tooltip.action2": "수신/발신 모드로 바꿉니다.", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", + "block.create.redstone_contact.tooltip.summary": "_한_ _쌍_이 _서로_ _바라보고_ 있을 때 레드스톤 신호를 보냅니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.redstone_contact.tooltip.condition1": "다른 동형 감지기를 맞댈 때", + "block.create.redstone_contact.tooltip.behaviour1": "레드스톤 신호를 보냅니다.", + "block.create.redstone_contact.tooltip.condition2": "움직일 때", + "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.control1": "우클릭 했을 때", + "block.create.adjustable_crate.tooltip.action1": "창을 엽니다.", + + "block.create.creative_crate.tooltip": "CREATIVE CRATE", + "block.create.creative_crate.tooltip.summary": "옆 _청사진 대포_에 _무한한_ 재료를 공급합니다.", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "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": "팔을 늘려 한 칸앞에 있는 공간에서 행동합니다.", + "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.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": "감지기 앞에 아이템이 _지나갈_ _때_ 레드스톤 신호를 _1틱_ 줍니다.", + "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.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "_1틱_의 레드스톤 신호를 보내는 간단한 리피터입니다.", + + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", + "block.create.adjustable_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 업그레이드된 _레드스톤_ _리피터_입니다.", + + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 _펄스_ _리피터_입니다.", + + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "레드스톤 _신호_ _세기_를 자세히 _조정_할 수 있는 레버입니다.", + + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "레드스톤 신호로 끄고 켤 수 있는 _레버_입니다.", + + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "레드스톤 신호로 컨트롤 할 수 있는 _레버_입니다. 후면에서 들어오는 신호는 레버를 키고, 측면에서 들어오는 신호는 레버를 초기화합니다.", + + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "연결된 장치의 _회전_ _속도_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", + "block.create.speedometer.tooltip.condition1": "회전될 때", + "block.create.speedometer.tooltip.behaviour1": "속도에 따라 색깔을 나타냅니다. _초록색_은 _느림_을, _파랑색_은 _보통_, _보라색_은 _빠른_ _속도_를 나타냅니다. 몇몇 장치들은 작동하기 위해 일정수준 이상의 속도가 필요합니다.", + + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "연결된 네트워크의 _전체_ _피로도_ _수치_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", + "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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "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.crafter_slot_cover.tooltip": "SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "기계 조합기에서 _빈_ _슬롯_을 표시하기 위해 쓰입니다. 조합기들은 정사각형 모양을 형성할 필요는 없습니다. 재료가 서로 대각선인 조합법이있을 때 유용합니다.", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + "create.tooltip.randomWipDescription0": "Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "Use at your own risk.", + "create.tooltip.randomWipDescription3": "This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json new file mode 100644 index 000000000..6bbaa48c1 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 718", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "FlexKrat", + "block.create.adjustable_pulley": "UNLOCALIZED: Adjustable Pulley", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "FlexSterker", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Andesietstenen", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "Bekken", + "block.create.belt": "Mechanische Transportband", + "block.create.belt_observer": "Transportband Observeerder", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.cart_assembler": "Kar 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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", + "block.create.clutch": "Koppeling", + "block.create.cogwheel": "Tandwiel", + "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.creative_crate": "Bouwtekeningkannon Creatiefeerder", + "block.create.creative_motor": "UNLOCALIZED: Creative Motor", + "block.create.crushing_wheel": "Verpulveraar", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "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.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "Diorietstenen", + "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.dolomite": "Dolomiet", + "block.create.dolomite_bricks": "Dolomietstenen", + "block.create.dolomite_bricks_slab": "Dolomietstenen Plaat", + "block.create.dolomite_bricks_stairs": "Dolomietstenen Trap", + "block.create.dolomite_bricks_wall": "Dolomietstenen Muur", + "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_pillar": "Dolomiet Pilaar", + "block.create.encased_belt": "Omhulsde Transportband", + "block.create.encased_fan": "Omhulsde Ventilator", + "block.create.encased_shaft": "Omhulsde Drijfas", + "block.create.extractor": "Extractor", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "UNLOCALIZED: Flywheel", + "block.create.framed_glass": "Ingelijst Glas", + "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", + "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", + "block.create.gabbro": "Gabbro", + "block.create.gabbro_bricks": "Gabbrostenen", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Gabbrostenen Trap", + "block.create.gabbro_bricks_wall": "Gabbrostenen Muur", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Versnellingsbak", + "block.create.gearshift": "Versnellingspook", + "block.create.granite_bricks": "Granietstenen", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", + "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Groot Tandwiel", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Kalkzand", + "block.create.limestone": "Kalksteen", + "block.create.limestone_bricks": "Kalksteenstenen", + "block.create.limestone_bricks_slab": "Kalksteenstenen Plaat", + "block.create.limestone_bricks_stairs": "Kalksteenstenen Trap", + "block.create.limestone_bricks_wall": "Kalksteenstenen Muur", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Kalksteen Pillar", + "block.create.linear_chassis": "Lineaar Frame", + "block.create.linked_extractor": "Gelinkte Extractor", + "block.create.linked_transposer": "UNLOCALIZED: Linked Transposer", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Mechanische Lager", + "block.create.mechanical_crafter": "Mechanische Werkbank", + "block.create.mechanical_drill": "Mechanische Boor", + "block.create.mechanical_harvester": "Mechanische Oogster", + "block.create.mechanical_mixer": "Mechanische Menger", + "block.create.mechanical_piston": "Mechanische Kleefzuiger", + "block.create.mechanical_piston_head": "Mechanische Zuigerhoofd", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Mechanische Pers", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "Mechanische Zaag", + "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "UNLOCALIZED: Natural Scoria", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "UNLOCALIZED: Nozzle", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Zuiger Verlengpaal", + "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Gepolijste Dolomiet", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Gepolijste Gabbro", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Gepolijste Kalksteen", + "block.create.polished_limestone_slab": "Gepolijste Kalksteen Plaat", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", + "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Gepolijste Verweerde Kalksteen", + "block.create.polished_weathered_limestone_slab": "Gepolijste Verweerde Kalksteen Plaat", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "UNLOCALIZED: Portable Storage Interface", + "block.create.powered_latch": "UNLOCALIZED: Powered Latch", + "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", + "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", + "block.create.pulse_repeater": "Pulse Versterker", + "block.create.radial_chassis": "Rotation Frame", + "block.create.redstone_contact": "Redstone redstone_contact", + "block.create.redstone_link": "Redstone Brug", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "UNLOCALIZED: Rope", + "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", + "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.schematic_table": "Bouwtekening Tafel", + "block.create.schematicannon": "Bouwtekeningkannon", + "block.create.scoria": "UNLOCALIZED: Scoria", + "block.create.scoria_bricks": "UNLOCALIZED: Scoria Bricks", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", + "block.create.shaft": "Drijfas", + "block.create.speedometer": "Snelheidsmeter", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Mechanische Zuiger", + "block.create.stockpile_switch": "Voorraad Schakelaar", + "block.create.stressometer": "Stressmeter", + "block.create.tiled_glass": "Getegeld Glas", + "block.create.tiled_glass_pane": "Getegeld Glazen Paneel", + "block.create.transposer": "UNLOCALIZED: Transposer", + "block.create.turntable": "Draaischijf", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", + "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Waterrad", + "block.create.weathered_limestone": "Verweerde Kalksteen", + "block.create.weathered_limestone_bricks": "Verweerde Kalksteenstenen", + "block.create.weathered_limestone_bricks_slab": "Verweerde Kalksteenstenen Plaat", + "block.create.weathered_limestone_bricks_stairs": "Verweerde Kalksteenstenen Trap", + "block.create.weathered_limestone_bricks_wall": "Verweerde Kalksteenstenen Muur", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar", + "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", + "item.create.belt_connector": "Mechanische Transportband", + "item.create.brass_hand": "UNLOCALIZED: Brass Hand", + "item.create.brass_ingot": "UNLOCALIZED: Brass Ingot", + "item.create.brass_nugget": "Brons klompje", + "item.create.brass_sheet": "Brons Platen", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.copper_ingot": "Koperstaaf", + "item.create.copper_nugget": "Koper klompje", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crushed_brass": "Gemalen Brons", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "Ontbosser", + "item.create.dough": "Deeg", + "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_schematic": "Lege bouwtekening", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Filter", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "Ingenieur's Bril", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Blokzapper", + "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", + "item.create.iron_sheet": "IJzeren Platen", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Propeller", + "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", + "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", + "item.create.rose_quartz": "Roze Kwarts", + "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.schematic": "Bouwtekening", + "item.create.schematic_and_quill": "Bouwtekening en Veer", + "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Boom mest", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Symmetrie Staf", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "UNLOCALIZED: Whisk", + "item.create.wrench": "Moersleutel", + "item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", + "item.create.zinc_nugget": "Zink Nugget", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen", + "death.attack.create.fan_fire": "%1$s is verbrand door hete lucht", + "death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", + "death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Verpulveren", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.splashing": "Bulk Wassen", + "create.recipe.splashing.fan": "Ventilator achter vloeiend water", + "create.recipe.smoking_via_fan": "Bulk Rook", + "create.recipe.smoking_via_fan.fan": "Ventilator achter vuur", + "create.recipe.blasting_via_fan": "Bulk Smelten", + "create.recipe.blasting_via_fan.fan": "Ventilator achter Lava", + "create.recipe.pressing": "Persen", + "create.recipe.mixing": "Mengen", + "create.recipe.packing": "Compressen", + "create.recipe.mechanical_sawing": "Zagen", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.block_cutting": "Blok Zagen", + "create.recipe.blockzapper_upgrade": "Blokzapper", + "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", + "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", + "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.processing.chance": "%1$s%% Kans", + "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", + + "create.generic.range": "Omvang", + "create.generic.radius": "Radius", + "create.generic.width": "UNLOCALIZED: Width", + "create.generic.height": "UNLOCALIZED: Height", + "create.generic.length": "UNLOCALIZED: Length", + "create.generic.speed": "Snelheid", + "create.generic.delay": "Vertraging", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Seconden", + "create.generic.unit.minutes": "Minuten", + "create.generic.unit.rpm": "UNLOCALIZED: RPM", + "create.generic.unit.stress": "UNLOCALIZED: su", + "create.generic.unit.degrees": "UNLOCALIZED: °", + + "create.action.scroll": "Scroll", + "create.action.confirm": "Bevestigen", + "create.action.abort": "Afbreken", + "create.action.saveToFile": "Opslaan", + "create.action.discard": "Weggooien", + + "create.keyinfo.toolmenu": "Focus Gereedschap Menu", + "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "Kies een optie:", + "create.gui.scrollInput.scrollToModify": "Scroll om aan te passen", + "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", + "create.gui.scrollInput.scrollToSelect": "Scroll om te selecteren", + "create.gui.scrollInput.shiftScrollsFaster": "Shift om sneller te Scrollen", + "create.gui.toolmenu.focusKey": "Hou [%1$s] ingedrukt om te Focusen", + "create.gui.toolmenu.cycle": "[SCROLL] om te Cycleën", + "create.gui.symmetryWand.mirrorType": "Spiegelen", + "create.gui.symmetryWand.orientation": "Orientatie", + + "create.symmetry.mirror.plane": "Spiegel één keer", + "create.symmetry.mirror.doublePlane": "Rechthoekig", + "create.symmetry.mirror.triplePlane": "Achthoekig", + + "create.orientation.orthogonal": "Orthogonaal", + "create.orientation.diagonal": "Diagonaal", + "create.orientation.horizontal": "Horizontaal", + "create.orientation.alongZ": "Langs Z-as", + "create.orientation.alongX": "Langs X-as", + + "create.gui.blockzapper.title": "Blokzapper", + "create.gui.blockzapper.replaceMode": "Vervang Modus", + "create.gui.blockzapper.searchDiagonal": "Volg Diagonalen", + "create.gui.blockzapper.searchFuzzy": "Negeer materiaal granzen", + "create.gui.blockzapper.range": "Verspreid bereik", + "create.gui.blockzapper.needsUpgradedAmplifier": "Benodigd een opgewaardeerde versterker", + "create.gui.blockzapper.patternSection": "Patronen", + "create.gui.blockzapper.pattern.solid": "Vast", + "create.gui.blockzapper.pattern.checkered": "Schaakbord", + "create.gui.blockzapper.pattern.inversecheckered": "Omgekeerd Schaakbord", + "create.gui.blockzapper.pattern.chance25": "25% Gedraaid", + "create.gui.blockzapper.pattern.chance50": "50% Gedraaid", + "create.gui.blockzapper.pattern.chance75": "75% Gedraaid", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", + "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", + "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", + "create.gui.terrainzapper.placement.inserted": "UNLOCALIZED: Inserted", + "create.gui.terrainzapper.brush": "UNLOCALIZED: Brush", + "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", + "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", + "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", + "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", + "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", + "create.gui.terrainzapper.tool.replace": "UNLOCALIZED: Replace", + "create.gui.terrainzapper.tool.clear": "UNLOCALIZED: Clear", + "create.gui.terrainzapper.tool.overlay": "UNLOCALIZED: Overlay", + "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", + + "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", + + "create.blockzapper.usingBlock": "Gebruikt: %1$s", + "create.blockzapper.componentUpgrades": "Component Upgrades:", + "create.blockzapper.component.body": "Lichaam", + "create.blockzapper.component.amplifier": "Versterker", + "create.blockzapper.component.accelerator": "Accelerator", + "create.blockzapper.component.retriever": "Ontvanger", + "create.blockzapper.component.scope": "Omvang", + "create.blockzapper.componentTier.none": "Geen", + "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", + "create.blockzapper.leftClickToSet": "Klik met links op een Blok om een Materiaal te kiezen", + "create.blockzapper.empty": "De Blokken zijn op!", + + "create.contraptions.movement_mode": "UNLOCALIZED: Movement Mode", + "create.contraptions.movement_mode.move_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.move_place_returned": "UNLOCALIZED: Place only in Starting Position", + "create.contraptions.movement_mode.move_never_place": "UNLOCALIZED: Place only when Anchor Destroyed", + "create.contraptions.movement_mode.rotate_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.rotate_place_returned": "UNLOCALIZED: Only Place near Initial Angle", + "create.contraptions.movement_mode.rotate_never_place": "UNLOCALIZED: Only Place when Anchor Destroyed", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Filter", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", + "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", + "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", + "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", + "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", + "create.gui.stressometer.capacity": "UNLOCALIZED: Remaining Capacity", + "create.gui.stressometer.overstressed": "UNLOCALIZED: Overstressed", + "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", + "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.adjustable_crate.title": "FlexKrat", + "create.gui.adjustable_crate.storageSpace": "Opslagruimte", + "create.gui.stockpile_switch.title": "Voorraad Schakelaar", + "create.gui.stockpile_switch.lowerLimit": "Lagere drempel", + "create.gui.stockpile_switch.upperLimit": "Hogere drempel", + "create.gui.stockpile_switch.startAt": "Start Signaal op", + "create.gui.stockpile_switch.startAbove": "Start Signaal boven", + "create.gui.stockpile_switch.stopAt": "Stop Signaal op", + "create.gui.stockpile_switch.stopBelow": "Stop Signaal onder", + "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", + "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", + "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", + "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", + "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", + "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", + "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", + "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", + + "create.schematicAndQuill.dimensions": "Bouwtekening Groote: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Eerste positie ingesteld.", + "create.schematicAndQuill.secondPos": "Tweede positie ingesteld.", + "create.schematicAndQuill.noTarget": "Houd [Ctrl] ingedrukt om een Lucht block te kiezen.", + "create.schematicAndQuill.abort": "Keuze verwijderd.", + "create.schematicAndQuill.prompt": "Vul een naam in voor de bouwtekening:", + "create.schematicAndQuill.fallbackName": "Mijn Bouwtekening", + "create.schematicAndQuill.saved": "Opgeslagen als %1$s", + + "create.schematic.invalid": "[!] Invalide object - Gebruik inplaats hiervan de Bouwtekening Tafel", + "create.schematic.position": "Positie", + "create.schematic.rotation": "Rotatie", + "create.schematic.rotation.none": "Geen", + "create.schematic.rotation.cw90": "Met de klok mee 90", + "create.schematic.rotation.cw180": "Met de klok mee 180", + "create.schematic.rotation.cw270": "Met de klok mee 270", + "create.schematic.mirror": "Spiegel", + "create.schematic.mirror.none": "Geen", + "create.schematic.mirror.frontBack": "Voor naar achter", + "create.schematic.mirror.leftRight": "Links naar rechts", + "create.schematic.tool.deploy": "Inzetten", + "create.schematic.tool.move": "Verplaats XZ", + "create.schematic.tool.movey": "Verplaats Y", + "create.schematic.tool.rotate": "Draai", + "create.schematic.tool.print": "Print", + "create.schematic.tool.flip": "Omdraaien", + "create.schematic.tool.deploy.description.0": "Verplaatst de structuur naar een locatie.", + "create.schematic.tool.deploy.description.1": "Klik met rechts op de grond om te plaatsen.", + "create.schematic.tool.deploy.description.2": "Houd [Ctrl] ingedrukt om op een afstand te selecteren.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Scroll om de afstand te veranderen.", + "create.schematic.tool.move.description.0": "Verschuift de Bouwtekening Horizontaal", + "create.schematic.tool.move.description.1": "Wijs naar de Bouwtekening and [CTRL]-Scroll om hem te duwen.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Verschuift de Bouwtekening Verticaal", + "create.schematic.tool.movey.description.1": "[CTRL]-Scroll om het omhoog/omlaag te bewegen", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Draait de Bouwtekening om zijn midden..", + "create.schematic.tool.rotate.description.1": "[CTRL]-Scroll om te draaien met 90 graden", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Plaats onmiddelijk de structuur in de wereld.", + "create.schematic.tool.print.description.1": "Klik met rechts om het plaatsen in de wereld te bevestigen.", + "create.schematic.tool.print.description.2": "Deze tool is alleen voor de creatieve modus.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Hiermee draait u de Bouwtekening langs het gezicht dat u selecteert.", + "create.schematic.tool.flip.description.1": "Wijs naar de Bouwtekening en [CTRL]-Scroll om hem om te draaien.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Synchroniseren...", + "create.schematics.uploadTooLarge": "Jouw Bouwtekening is te groot!", + "create.schematics.maxAllowedSize": "De maximum toegestane grote van een Bouwtekings bestand is:", + + "create.gui.schematicTable.title": "Bouwtekening Tafel", + "create.gui.schematicTable.availableSchematics": "Beschikbare Bouwtekeningen", + "create.gui.schematicTable.noSchematics": "Geen Bouwtekeningen opgeslagen", + "create.gui.schematicTable.uploading": "Uploaden...", + "create.gui.schematicTable.finished": "Upload Klaar!", + "create.gui.schematicannon.title": "Bouwtekeningkannon", + "create.gui.schematicannon.settingsTitle": "Plaatsing Instellingen", + "create.gui.schematicannon.listPrinter": "Materiaal lijst Printer", + "create.gui.schematicannon.gunpowderLevel": "Buskruit op %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Schoten over: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Met backup: %1$s", + "create.gui.schematicannon.optionEnabled": "Momenteel Ingeschakeld", + "create.gui.schematicannon.optionDisabled": "Momenteel Uitgeschakeld", + "create.gui.schematicannon.option.dontReplaceSolid": "Niet vaste blokken vervangen", + "create.gui.schematicannon.option.replaceWithSolid": "Vervang vast met vast", + "create.gui.schematicannon.option.replaceWithAny": "Vervang vast met alles", + "create.gui.schematicannon.option.replaceWithEmpty": "Vervang vast met leeg", + "create.gui.schematicannon.option.skipMissing": "Sla missende blokken over", + "create.gui.schematicannon.option.skipTileEntities": "Bescherm Tile Entities", + "create.gui.schematicannon.option.skipMissing.description": "Als het Bouwtekeningkannon niet een geschikt blok kan vinden om te plaatsen gaat hij door bij de volgende locatie.", + "create.gui.schematicannon.option.skipTileEntities.description": "Het Bouwtekeningkannon probeert blokken met data zoals kisten te vermijden", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Het Bouwtekeningkannon zal nooit vaste blokken in zijn gebied vervangen, alleen niet-vaste blokken en lucht", + "create.gui.schematicannon.option.replaceWithSolid.description": "Het Bouwtekeningkannon zal alleen vaste blokken in zijn gebied veranderen, als de bouwtekening een vast blok bevat op zijn locatie.", + "create.gui.schematicannon.option.replaceWithAny.description": "Het Bouwtekeningkannon zal vaste blokken in zijn gebied vervangen als, de bouwtekening een blok op bevat op zijn locatie.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Het Bouwtekeningkannon zal alle blokken in zijn gebied vervangen, inclusief blokken vervangen door lucht.", + + "create.schematicannon.status.idle": "IJdel", + "create.schematicannon.status.ready": "Paraat", + "create.schematicannon.status.running": "Draaiend", + "create.schematicannon.status.finished": "Klaar", + "create.schematicannon.status.paused": "Gepauzeerd", + "create.schematicannon.status.stopped": "Gestopt", + "create.schematicannon.status.noGunpowder": "Buskruit op", + "create.schematicannon.status.targetNotLoaded": "Blok is niet geladen", + "create.schematicannon.status.targetOutsideRange": "Doel is te ver weg", + "create.schematicannon.status.searching": "Aan het zoeken", + "create.schematicannon.status.skipping": "Aan het overslaan", + "create.schematicannon.status.missingBlock": "Missende Blok:", + "create.schematicannon.status.placing": "Aan het plaatsen", + "create.schematicannon.status.clearing": "Blokken aan het verwijderen", + "create.schematicannon.status.schematicInvalid": "Bouwtekening niet valide", + "create.schematicannon.status.schematicNotPlaced": "Bouwtekening niet geplaatst", + "create.schematicannon.status.schematicExpired": "Bouwtekening verlopen", + + "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", + "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", + "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", + "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", + "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", + "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", + + "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", + "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", + + "create.tooltip.holdKey": "Houd [%1$s] ingedrukt", + "create.tooltip.holdKeyOrKey": "Houd [%1$s] of [%2$s] ingedrukt", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "Snelheid eis: %1$s", + "create.tooltip.speedRequirement.none": "Geen", + "create.tooltip.speedRequirement.medium": "Gemiddeld", + "create.tooltip.speedRequirement.high": "Snel", + "create.tooltip.stressImpact": "Stress Impact: %1$s", + "create.tooltip.stressImpact.low": "Laag", + "create.tooltip.stressImpact.medium": "Gemiddeld", + "create.tooltip.stressImpact.high": "Hoog", + "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.capacityProvided": "Stress Capacity: %1$s", + "create.tooltip.capacityProvided.low": "Klein", + "create.tooltip.capacityProvided.medium": "Gemiddeld", + "create.tooltip.capacityProvided.high": "Groot", + "create.tooltip.capacityProvided.asGenerator": "UNLOCALIZED: (As Generator)", + "create.tooltip.generationSpeed": "UNLOCALIZED: Generates at %1$s %2$s", + "create.tooltip.analogStrength": "UNLOCALIZED: Analog Strength: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "Min. Ingredieënten", + + "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.command.killTPSCommand": "UNLOCALIZED: killtps", + "create.command.killTPSCommand.status.slowed_by.0": "UNLOCALIZED: [Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "UNLOCALIZED: [Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "UNLOCALIZED: [Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "UNLOCALIZED: [Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", + "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", + + + "_": "->------------------------] 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.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRIE STAF", + "item.create.wand_of_symmetry.tooltip.summary": "Spiegelt uw blokplaatsing perfect over de geconfigureerde vlakken.", + "item.create.wand_of_symmetry.tooltip.condition1": "Waneer in de Actiebalk", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Blijft actief", + "item.create.wand_of_symmetry.tooltip.control1": "R-Klik op de Grond", + "item.create.wand_of_symmetry.tooltip.action1": "_Creëerd_ of _Beweegt_ de Spiegel", + "item.create.wand_of_symmetry.tooltip.control2": "R-Klik in de Lucht", + "item.create.wand_of_symmetry.tooltip.action2": "_Verwijderd_ de actieve Spiegel", + "item.create.wand_of_symmetry.tooltip.control3": "R-Klik terwijl je Sluipt", + "item.create.wand_of_symmetry.tooltip.action3": "Opent de _Configuratie_ _Interface_", + + "item.create.handheld_blockzapper.tooltip": "BLOKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "Ongebruikelijke gadget voor het plaatsen en verwissel van blokken over een afstand", + "item.create.handheld_blockzapper.tooltip.control1": "L-Klik op een Blok", + "item.create.handheld_blockzapper.tooltip.action1": "Zet het doelwit blok om naar het geselecteerde blok.", + "item.create.handheld_blockzapper.tooltip.control2": "R-Klik op een Blok", + "item.create.handheld_blockzapper.tooltip.action2": "_Plaatst_ of _Vervangt_ het doelwit blok.", + "item.create.handheld_blockzapper.tooltip.control3": "R-Click while Sneaking", + "item.create.handheld_blockzapper.tooltip.action3": "Opent de _Configuratie_ _Interface_", + + "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain_ _features_.", + "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", + "item.create.handheld_worldshaper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_worldshaper.tooltip.control2": "UNLOCALIZED: R-Click at Block", + "item.create.handheld_worldshaper.tooltip.action2": "UNLOCALIZED: Applies the currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration_ _Interface_", + + "item.create.tree_fertilizer.tooltip": "BOOM MEST", + "item.create.tree_fertilizer.tooltip.summary": "Een krachtige combinatie van mineralen geschikt voor de meest voorkomende typen bomen.", + "item.create.tree_fertilizer.tooltip.condition1": "Wanneer gebruikt op Kiemplanten", + "item.create.tree_fertilizer.tooltip.behaviour1": "Groeit bomen onafhankelijk van beschikbare ruimte", + + "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", + "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant_ _axe_ able to chop down trees in a split second.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "UNLOCALIZED: FILTER", + "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.", + "item.create.filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.attribute_filter.tooltip": "UNLOCALIZED: ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ item _attributes_ and _categories_.", + "item.create.attribute_filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.attribute_filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.empty_schematic.tooltip": "LEGE BOUWTEKENING", + "item.create.empty_schematic.tooltip.summary": "Bruikbaar als ingredient in recepten en voor het schrijven aan de _BOUWTEKENING_ _TAFEL._", + + "item.create.schematic.tooltip": "BOUWTEKENING", + "item.create.schematic.tooltip.summary": "Bevat een structuur die gepositioneerd en geplaatst van worden in de wereld. Positineer het Hologram als gewilt en gebruik een _BOUWTEKENINGKANNON_ om het te bouwen.", + "item.create.schematic.tooltip.condition1": "Wanneer ingedrukt", + "item.create.schematic.tooltip.behaviour1": "Kan gepositioneerd worden met de knoppen op het scherm", + "item.create.schematic.tooltip.control1": "R-Klik terwijl je sluipt", + "item.create.schematic.tooltip.action1": "Opent een_Interface_ voor het invullen van preciese _coordinaten._", + + "item.create.schematic_and_quill.tooltip": "BOUWTEKENING EN VEER", + "item.create.schematic_and_quill.tooltip.summary": "Bruikbaar om een contructie in je wereld op te slaan naar een .nbt bestand.", + "item.create.schematic_and_quill.tooltip.condition1": "Stap 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecteer twee hoekpunten met R-Klik", + "item.create.schematic_and_quill.tooltip.condition2": "Stap 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ op de zijden om de groote aan te passen. R-Klik nogmaals om op te slaan.", + "item.create.schematic_and_quill.tooltip.control1": "R-Klik", + "item.create.schematic_and_quill.tooltip.action1": "Selecteer een hoekpunt / opslaan bevestigen", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl Ingedrukt houden", + "item.create.schematic_and_quill.tooltip.action2": "Selecteer punten in _de lucht._ _Scroll_ om de afstand aan te passen.", + "item.create.schematic_and_quill.tooltip.control3": "R-Klik terwijl je sluipt", + "item.create.schematic_and_quill.tooltip.action3": "_Resets_ en verwijderd de selectie.", + + "block.create.schematicannon.tooltip": "BOUWTEKENINGKANNON", + "block.create.schematicannon.tooltip.summary": "Schiet blokken om een gepostioneerde _Bouwtekening_ in de Wereld te creëeren. Gebruikt blokken uit naastgelegen inventarissen en _Buskruit_ als brandstof.", + "block.create.schematicannon.tooltip.control1": "Wanneer R-Geklikt", + "block.create.schematicannon.tooltip.action1": "Opent de _Interface_", + + "block.create.schematic_table.tooltip": "BOUWTEKENING TAFEL", + "block.create.schematic_table.tooltip.summary": "Schrijft opgeslagen bouwtekeningen op een _Lege_ _Bouwtekening_", + "block.create.schematic_table.tooltip.condition1": "Wanneer voorzien van een lege Bouwtekening", + "block.create.schematic_table.tooltip.behaviour1": "Uploadt een gekozen bestand uit uw bouwtekeningenmap", + + "block.create.shaft.tooltip": "DRIJFAS", + "block.create.shaft.tooltip.summary": "_Geeft_ _Rotatie_ _door_ in een rechte lijn.", + + "block.create.cogwheel.tooltip": "TANDWIEL", + "block.create.cogwheel.tooltip.summary": "Geeft _Rotatie_ door in een rechte lijn, en naar naastgelegen _Tandwielen._", + + "block.create.large_cogwheel.tooltip": "GROOT TANDWIEL", + "block.create.large_cogwheel.tooltip.summary": "Een grotere versie van het _TANDWIEL,_ waardoor _veranderingen_ in _Rotatiesnelheid_ mogelijk zijn indien verbonden met zijn kleinere tegenhanger.", + + "block.create.encased_shaft.tooltip": "OMHULSDE DRIJFAS", + "block.create.encased_shaft.tooltip.summary": "_Geeft_ _Rotatie_ _door_ in een rechte lijn. Geschikt voor het doorgeven van rotatie door muren.", + + "block.create.gearbox.tooltip": "VERSNELLINGSBAK", + "block.create.gearbox.tooltip.summary": "_Geeft_ _Rotatie_ _door_ in _Vier_ _richtingen._ Keert rechte verbindingen om.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "VERSNELLINGSPOOK", + "block.create.gearshift.tooltip.summary": "Een verstelbare _rotatie_ _schakelaar_ voor aangesloten drijfassen.", + "block.create.gearshift.tooltip.condition1": "Wanneer voorzien van kracht", + "block.create.gearshift.tooltip.behaviour1": "_Keert_ de binnenkomende rotatie.", + + "block.create.clutch.tooltip": "KOPPELING", + "block.create.clutch.tooltip.summary": "Een verstelbare _rotatie_ _schakelaar_ for connected shafts.", + "block.create.clutch.tooltip.condition1": "Wanneer voorzien van kracht", + "block.create.clutch.tooltip.behaviour1": "_Stopt_ met het doorgeven van kracht aan de andere kant.", + + "block.create.encased_belt.tooltip": "OMHULSDE TRANSPORTBAND", + "block.create.encased_belt.tooltip.summary": "_Geeft_ _Rotatie_ _door_ aan zichzelf en andere _Omhulsde_ _Transportbanden._", + "block.create.encased_belt.tooltip.condition1": "Wanneer aangesloten", + "block.create.encased_belt.tooltip.behaviour1": "Aangesloten blokken zullen precies _dezelfde_ _Rotatiesnelheid_ en _richting_ hebben. Ze hoeven niet dezelfde kant op te staan.", + + "block.create.adjustable_pulley.tooltip": "UNLOCALIZED: ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ through its block and to attached _Encased_ _Belts_. Attached encased belts will _rotate_ _faster_ based on the _analog_ _redstone_ _signal_ this block receives.", + "block.create.adjustable_pulley.tooltip.condition1": "UNLOCALIZED: Redstone Control", + "block.create.adjustable_pulley.tooltip.behaviour1": "UNLOCALIZED: Without a signal, it will _not_ _speed_ _up_ connected belts. With a full strength signal connected belt, speed _doubles_.", + + "item.create.belt_connector.tooltip": "TRANSPORTBAND CONNECTOR", + "item.create.belt_connector.tooltip.summary": "Verbind twee _Drijfassen_ met een _Mechanische_ _Transportband._ Verbonden drijfassen zullen dezelfde rotatiesneheid en richting hebben. De Transportband kan ook Entiteiten transporteren", + "item.create.belt_connector.tooltip.control1": "R-Klikken op drijfas", + "item.create.belt_connector.tooltip.action1": "Selecteer de Drijfas als een katrol van de transportband. Beide geselecteerde drijfassen moeten _verticaal_, _horizontaal_ of _diagonaal_ in _één_ _lijn_ staan in de richting van de Transportbanden.", + "item.create.belt_connector.tooltip.control2": "R-Klikken terwijl je sluipt", + "item.create.belt_connector.tooltip.action2": "_Reset_ de eerste geselecteerde positie van de Transportband", + + "item.create.goggles.tooltip": "BRIL", + "item.create.goggles.tooltip.summary": "Een bril om je visie te augmenteren met _kinetische_ _informatie._", + "item.create.goggles.tooltip.condition1": "Wanneer gedragen", + "item.create.goggles.tooltip.behaviour1": "Laat _gekleurde_ _indicaties_ zien die corresponderen met de _Snelheid_ van een geplaatst kinetisch onderdeel.", + "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", + "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + + "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", + "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", + "item.create.wrench.tooltip.control1": "UNLOCALIZED: Right-Click a kinetic block", + "item.create.wrench.tooltip.action1": "UNLOCALIZED: _Rotates_ _components_ toward or away from the face with which you interacted.", + "item.create.wrench.tooltip.control2": "UNLOCALIZED: R-Click while Sneaking", + "item.create.wrench.tooltip.action2": "UNLOCALIZED: _Disassembles_ _Kinetic_ _components_ and places them back in _your_ _inventory_.", + + "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational_ _Force_.", + + "block.create.water_wheel.tooltip": "WATERRAD", + "block.create.water_wheel.tooltip.summary": "Bied _Rotatiekracht_ van naastgelegen _water_ _stromen._", + + "block.create.encased_fan.tooltip": "OMHULSDE VENTILATOR", + "block.create.encased_fan.tooltip.summary": "Zet _Rotatiekracht_ om naar een _Luchtstroom_ en terug. Heeft een verscheidenheid aan toepassingen.", + "block.create.encased_fan.tooltip.condition1": "Wanneer aangestuurd door Redstone", + "block.create.encased_fan.tooltip.behaviour1": "Bied _Rotatiekracht_ aan van alle _hitte_ _bronnen_ direct onder zichzelf. De ventilator moet naar beneden wijzen.", + "block.create.encased_fan.tooltip.condition2": "Wanneer gedraaid", + "block.create.encased_fan.tooltip.behaviour2": "_Duwt_ of _Trekt_ Entiteiten, afhankelijk van de binnenkomende rotatiesnelheid.", + "block.create.encased_fan.tooltip.condition3": "Bij het doorblazen van speciale blokken", + "block.create.encased_fan.tooltip.behaviour3": "_Vloeitstoffen_ en _Vuur_ zenden deeltjes uit in de luchtstroom. Dit kan gebruikt worden om _objecten_ te _verwerken_", + + "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", + "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased_ _Fan_ to distribute its effect on Entities in _all_ _directions_.", + + "block.create.hand_crank.tooltip": "UNLOCALIZED: HAND CRANK", + "block.create.hand_crank.tooltip.summary": "UNLOCALIZED: A simple _source_ of _Rotational_ _Force_ that requires the interaction of players.", + "block.create.hand_crank.tooltip.condition1": "UNLOCALIZED: When Used", + "block.create.hand_crank.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + + "block.create.cuckoo_clock.tooltip": "UNLOCALIZED: CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "UNLOCALIZED: Fine craftsmanship for _decorating_ a space and _keeping_ _track_ _of_ _time_.", + "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current_ _time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players_ _can_ _sleep_.", + + "block.create.turntable.tooltip": "DRAAISCHIJF", + "block.create.turntable.tooltip.summary": "Verandert _Rotatiekracht_ in verfijnde bewegingsziekte.", + + "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", + "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "VERPULVERAAR", + "block.create.crushing_wheel.tooltip.summary": "Grote draaibare wielen die alles _verpulveren_ wat hun tegen houdt.", + "block.create.crushing_wheel.tooltip.condition1": "Wanneer aangesloten op een andere Verpulveraar", + "block.create.crushing_wheel.tooltip.behaviour1": "Creëert een verpulverende installatie voor het verwerken van verschillende dingen. De tanden van de wielen moeten met elkaar in redstone_contact staan en beweken met _dezelfde_ _snelheid_ in _tegenovergestelde_ _richting._", + + "block.create.mechanical_press.tooltip": "MECHANISCHE PERS", + "block.create.mechanical_press.tooltip.summary": "Een krachtige zuiger voor het samenpersen van objecten onder zich. Heeft een constante _Rotatiekracht_ nodig.", + "block.create.mechanical_press.tooltip.condition1": "Wanneer aangestuurd door Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "_Begint_ met het samenpersen van objecten onder zich.", + "block.create.mechanical_press.tooltip.condition2": "Wanneer boven een Transportband Connector", + "block.create.mechanical_press.tooltip.behaviour2": "Perst _Automatisch_ langskomende objecten op de transportband.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "UNLOCALIZED: BASIN", + "block.create.basin.tooltip.summary": "UNLOCALIZED: A handy _item_ _container_ used in processing with the _Mechanical_ _Mixer_ and the _Mechanical_ _Press_. Supports _Redstone_ _Comparators_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "MECHANISCHE MIXER", + "block.create.mechanical_mixer.tooltip.summary": "Een kinetische garde voor het toepassen van vormloze recepten op objecten eronder. Vereist constante _Rotatiekracht_ en een _Bekken_ hieronder geplaatst (met een tussenruimte).", + "block.create.mechanical_mixer.tooltip.condition1": "Wanneer boven een Bekken", + "block.create.mechanical_mixer.tooltip.behaviour1": "Begint objecten in het bekken te mengen wanneer alle benodigde ingrediënten aanwezig zijn.", + "block.create.mechanical_mixer.tooltip.condition2": "Wanneer gebruikt met een Sleutel", + "block.create.mechanical_mixer.tooltip.behaviour2": "_Configureert_ de minimale hoeveelheid _totale_ _ingredienten_ voor toegepaste recepten. Gebruik deze optie om _ongewenste_ _recepten_ met vergelijkbare maar minder ingrediënten _te_ _vermijden._", + + "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", + "block.create.mechanical_crafter.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.mechanical_crafter.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _the_ _crafting_ _process_ as soon as _all_ _crafters_ in the grid have been _given_ _an_ _item_.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "UNLOCALIZED: When Wrenched at Front", + "block.create.mechanical_crafter.tooltip.action1": "UNLOCALIZED: _Cycles_ _the_ _direction_ an individual crafter _moves_ _its_ _items_ towards. To form a working grid, _arrange_ _the_ _belts_ _in_ _a_ _flow_ which moves all items towards a final crafter. The final crafter must _point_ _away_ from the grid.", + "block.create.mechanical_crafter.tooltip.control2": "UNLOCALIZED: When Wrenched at back", + "block.create.mechanical_crafter.tooltip.action2": "UNLOCALIZED: _Connects_ the _input_ _inventory_ of adjacent crafters. Use this to _combine_ _slots_ in the crafting grid and _save_ _on_ _input_ _work_.", + + "block.create.furnace_engine.tooltip": "UNLOCALIZED: FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "UNLOCALIZED: A powerful source of _Rotational_ _Power_ that requires a _running_ _furnace_ to work.", + "block.create.furnace_engine.tooltip.condition1": "UNLOCALIZED: When Attached to Lit Furnace", + "block.create.furnace_engine.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + + "block.create.flywheel.tooltip": "UNLOCALIZED: FLYWHEEL", + "block.create.flywheel.tooltip.summary": "UNLOCALIZED: A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", + "block.create.flywheel.tooltip.condition1": "UNLOCALIZED: When Attached to Running Engine", + "block.create.flywheel.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", + + "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", + "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + + "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", + "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", + "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached_ _on_ _top_ of the controller.", + + "block.create.mechanical_piston.tooltip": "MECHANISCHE ZUIGER", + "block.create.mechanical_piston.tooltip.summary": "Een meer geavanceerde versie van de _Zuiger,_ die _Rotatiekracht_ gebruikt om gekoppelde constructies nauwkeurig te verplaatsen. _Zuiger_ _Verlgenpaalen_ aan de achterzijde definiëren het _Bereik_ van dit apparaat. Zonder verlengingen zal de zuiger niet bewegen. Gebruik _Lineaar_ _Frame_ om meer dan een enkele rij blokken te verplaatsen.", + "block.create.mechanical_piston.tooltip.condition1": "Wanneer gedraaid", + "block.create.mechanical_piston.tooltip.behaviour1": "Begint de bijgevoegde structuur te verplaatsen. Snelheid en richting correleren met de inkomende rotatiesnelheid.", + + "block.create.sticky_mechanical_piston.tooltip": "MECHANISCHE KLEEFZUIGER", + "block.create.sticky_mechanical_piston.tooltip.summary": "Een meer geavanceerde versie van de _Kleefzuiger,_ die _Rotatiekracht_ gebruikt om gekoppelde constructies nauwkeurig te verplaatsen. _Zuiger_ _Verlgenpaalen_ aan de achterzijde definiëren het _Bereik_ van dit apparaat. Zonder verlengingen zal de zuiger niet bewegen. Gebruik _Lineaar_ _Frame_ om meer dan een enkele rij blokken te verplaatsen.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "Wanneer gedraaid", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Begint de bijgevoegde structuur te verplaatsen. Snelheid en richting correleren met de inkomende rotatiesnelheid.", + + "block.create.piston_extension_pole.tooltip": "ZUIGER VERLENGPAAL", + "block.create.piston_extension_pole.tooltip.summary": "Gebruikt om het bereik van _MECHANISCHE_ _ZUIGERS_ te vergroten.", + "block.create.piston_extension_pole.tooltip.condition1": "Wanneer aangesloten op een Mechanische zuiger", + "block.create.piston_extension_pole.tooltip.behaviour1": "Verlengt het bereik van de zuigers met 1 blok", + + "block.create.mechanical_bearing.tooltip": "MECHANISCHE LAGER", + "block.create.mechanical_bearing.tooltip.summary": "Gebruikt voor het roteren van _grotere_ _structuren_ of het genereren van _Rotatiekracht_ uit wind.", + "block.create.mechanical_bearing.tooltip.condition1": "Wanneer gedraaid", + "block.create.mechanical_bearing.tooltip.behaviour1": "Begint fysiek gekoppelde _ROTATIE_ _FRAME_ te roteren inclusief hun gekoppelde blokken respectievelijk.", + "block.create.mechanical_bearing.tooltip.condition2": "When Powered by Redstone", + "block.create.mechanical_bearing.tooltip.behaviour2": "Begint met het aanbieden van _Rotatiekracht_ uit het roteren van de bijbehorende structuur. De structuur moet geschikte _Zijl_ _Blokken_ bevatten (momenteel een wollen blok).", + + "block.create.clockwork_bearing.tooltip": "UNLOCALIZED: CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "UNLOCALIZED: An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", + "block.create.clockwork_bearing.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.clockwork_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", + + "block.create.sequenced_gearshift.tooltip": "UNLOCALIZED: SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "UNLOCALIZED: A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", + "block.create.sequenced_gearshift.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _executing_ programmed instructions based on the input speed.", + "block.create.sequenced_gearshift.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.sequenced_gearshift.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface._", + + "block.create.cart_assembler.tooltip": "UNLOCALIZED: CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "UNLOCALIZED: When _placed_ _on_ a _Rail_, adopts functionality and _assembles/disassebles_ _structures_ on passing _carts_.", + "block.create.cart_assembler.tooltip.condition1": "UNLOCALIZED: When placed above Rail", + "block.create.cart_assembler.tooltip.behaviour1": "UNLOCALIZED: _Assembles_ onto passing _carts_ _when_ _powered_, _disassembles_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "UNLOCALIZED: ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "UNLOCALIZED: Moves attached _blocks_ and _structures_ _vertically_. Use _Chassis_ or _Slime_ _Blocks_ to move more than a single block.", + "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + + "block.create.linear_chassis.tooltip": "LINEAAR FRAME", + "block.create.linear_chassis.tooltip.summary": "A configurable base for Structures moved by a _Mechanische_ _Zuiger._ These Blocks have to form the first Layer of blocks in front of the Zuiger.", + "block.create.linear_chassis.tooltip.condition1": "Wanneer bewogen door een Mechanische Zuiger", + "block.create.linear_chassis.tooltip.behaviour1": "_Beweegt_ alle _aangesloten_ _Frames_ met dezelfde oriëntatie, en daaraan bevestigde blokken. Wanneer de Zuiger wordt ingetrokken, worden blokken alleen getrokken als het framevlak _Kleverig_ (zie [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.linear_chassis.tooltip.control1": "Wanneer R-Geklikt met een slijmbal", + "block.create.linear_chassis.tooltip.action1": "Maakt het geklikte vlak _Kleverig._ Wanneer de Zuiger zich terugtrekt, zal het frame alle bevestigde blokken in zijn kolom en binnen het geconfigureerde bereik _terugtrekken._", + + "block.create.radial_chassis.tooltip": "ROTATIE FRAME", + "block.create.radial_chassis.tooltip.summary": "Vereist voor het roten van structeren met de _Mechanisch_ _Lager._ ", + "block.create.radial_chassis.tooltip.condition1": "Wanneer gedraaid door een Lager", + "block.create.radial_chassis.tooltip.behaviour1": "_Roteert_ alle blokken bevestigd aan _Klevende-zijden_ (zie [Ctrl]) binnen het geconfigureerde bereik rondom zichzelf. _Zendt_ de rotatie over naar verder bevestigd rotatie frame.", + "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.radial_chassis.tooltip.control1": "Wanneer R-Geklikt met een slijmbal", + "block.create.radial_chassis.tooltip.action1": "Maakt het geklikte vlak _Klevend._ Wanneer het frame roteert, worden alle blokken die aan deze zijde zijn bevestigd mee gedraaid.", + + "block.create.mechanical_drill.tooltip": "MECHANISCHE BOOR", + "block.create.mechanical_drill.tooltip.summary": "Een mechanisch apparaat geschikt voor het _breken_ _van_ _blokken_", + "block.create.mechanical_drill.tooltip.condition1": "Wanneer gedraaid", + "block.create.mechanical_drill.tooltip.behaviour1": "Gedraagd zich als een stationaair blok breker. Doet ook pijn aan alle entiteiten binnen zijn bereik.", + "block.create.mechanical_drill.tooltip.condition2": "Wanneer geduwt door een Mechanische Zuiger", + "block.create.mechanical_drill.tooltip.behaviour2": "Breekt blokken waar de boor mee in redstone_contact komt.", + + "block.create.mechanical_harvester.tooltip": "MECHANISCHE OOGSTER", + "block.create.mechanical_harvester.tooltip.summary": "Een Mechanische plantensnijder geschikt voor middelgrote gewasautomatisering", + "block.create.mechanical_harvester.tooltip.condition1": "Wanneer geduwt door een Mechanische Zuiger", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Oogst_ alle _Rijpe_ _Planten_ dat het mes raakt aan en zet ze terug naar hun oorspronkelijke staat van groei.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "UNLOCALIZED: MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "UNLOCALIZED: Suitable for _cutting_ _trees_ effectively and for _cutting_ _blocks_ into their carpentered counterparts. It is movable using _Mechanical_ _Pistons_ or _Bearings_.", + "block.create.mechanical_saw.tooltip.condition1": "UNLOCALIZED: When facing up", + "block.create.mechanical_saw.tooltip.behaviour1": "UNLOCALIZED: Applies _Sawing_ and _Stonecutting_ _Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", + "block.create.mechanical_saw.tooltip.condition2": "UNLOCALIZED: When facing horizontally", + "block.create.mechanical_saw.tooltip.behaviour2": "UNLOCALIZED: _Breaks_ _logs_ in front of it. If the log supported a tree on its own, the _tree_ _will_ _collapse_ away from the saw.", + "block.create.mechanical_saw.tooltip.condition3": "UNLOCALIZED: While Moving", + "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", + + "block.create.stockpile_switch.tooltip": "VOORRAAD SCHAKELAAR", + "block.create.stockpile_switch.tooltip.summary": "Schakelt een Redstone signaal op basis van de _Opslagruimte_ in de aangesloten Container.", + "block.create.stockpile_switch.tooltip.condition1": "Wanneer onder de laagste limiet", + "block.create.stockpile_switch.tooltip.behaviour1": "Stopt met het aanbieden van _Redstone_ _Kracht_", + "block.create.stockpile_switch.tooltip.condition2": "Wanneer boven de hoogste limiet", + "block.create.stockpile_switch.tooltip.behaviour2": "Start met het aanbieden van _Redstone_ _Kracht_ tot de laagste limiet weer is bereikt", + "block.create.stockpile_switch.tooltip.control1": "Wanneer R-Geklikt", + "block.create.stockpile_switch.tooltip.action1": "Opent de _Configuratie_ _Interface_", + + "block.create.redstone_link.tooltip": "REDSTONE BRUG", + "block.create.redstone_link.tooltip.summary": "Eindpunten voor _Draadloze_ _Redstone-verbindingen._ Kan met elk object _Frequencies_ worden toegewezen. Signaalbereik is beperkt, maar redelijk ver.", + "block.create.redstone_link.tooltip.condition1": "Wanneer aangestuurd", + "block.create.redstone_link.tooltip.behaviour1": "Het ontvangen van verbindingen met dezelfde frequentie levert een Redstone-signaal.", + "block.create.redstone_link.tooltip.control1": "Wanneer R-Geklikt met een object", + "block.create.redstone_link.tooltip.action1": "Stelt de _Frequentie_ in op dat object. Een totaal van _twee_ _verschillende_ _objecten_ kan in combinatie worden gebruikt voor het definiëren van een frequentie", + "block.create.redstone_link.tooltip.control2": "Wanneer R-Geklikt terwijl je sluipt", + "block.create.redstone_link.tooltip.action2": "Schakelt tussen _ontvanger_ en _zender_modus.", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", + "block.create.redstone_contact.tooltip.summary": "A simple device for advanced Redstone Apparaten.", + "block.create.redstone_contact.tooltip.condition1": "Wanneer gericht op een ander redstone_contact", + "block.create.redstone_contact.tooltip.behaviour1": "Bied een _Redstone_ _Signaal_", + "block.create.redstone_contact.tooltip.condition2": "Wanneer verplaatst door een Mechanische Zuiger", + "block.create.redstone_contact.tooltip.behaviour2": "Activeert alle stationaire voorbijkomende redstone_contacten", + + "block.create.adjustable_crate.tooltip": "FLEXKRAT", + "block.create.adjustable_crate.tooltip.summary": "Met deze _Opslag_ _Container_ kan de capaciteit handmatig worden geregeld. Het kan tot _16_ _Stapels_ van elk item bevatten", + "block.create.adjustable_crate.tooltip.control1": "Wanneer R-Geklikt", + "block.create.adjustable_crate.tooltip.action1": "Opent de _Interface_", + + "block.create.creative_crate.tooltip": "CREATIEF KRAT", + "block.create.creative_crate.tooltip.summary": "Bied een eindloze vooraad blokken aan een aangeloten _Bouwtekeningkannon_", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "EXTRACTOR", + "block.create.extractor.tooltip.summary": "_Haalt_ _objecten_ uit een aangesloten _inventaris_ en laat ze op de grond vallen. Laat items niet vallen totdat de ruimte is leeggemaakt. Kan een item-stapel worden toegewezen als een _filter._", + "block.create.extractor.tooltip.condition1": "Wanneer aangestuurd door redstone", + "block.create.extractor.tooltip.behaviour1": "_Pauzeerd_ de Extractor", + "block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.", + "block.create.extractor.tooltip.control1": "R-Klik op Filter Plek", + "block.create.extractor.tooltip.action1": "Wijst momenteel _vastgehouden_ _stapel_ toe als de _Filter._ Extractor zal uitsluitend het object _type_ en _hoevelheid_ van de stapel op de grond gooien.", + + "block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER", + "block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.", + "block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.", + + "block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER", + "block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.deployer.tooltip.behaviour1": "UNLOCALIZED: Extends its arm and _activates_ in the block space _2m_ _ahead_ of itself.", + "block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench", + "block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.", + + "block.create.linked_extractor.tooltip": "LINKED EXTRACTOR", + "block.create.linked_extractor.tooltip.summary": "_Haalt_ _objecten_ uit een aangesloten _inventaris_ en laat ze op de grond vallen. Laat items niet vallen totdat de ruimte is leeggemaakt. Kan een item-stapel worden toegewezen als een _filter._ Kan op afstand worden bediend via een _Redstone_ _Brug._", + "block.create.linked_extractor.tooltip.condition1": "Wanneer Redstone verbinding actief is", + "block.create.linked_extractor.tooltip.behaviour1": "_Pauzeerd_ de Extractor", + "block.create.linked_extractor.tooltip.control1": "R-Klik op Filter Plek", + "block.create.linked_extractor.tooltip.action1": "Wijst momenteel _vastgehouden_ _stapel_ toe als de _Filter._ Extractor zal uitsluitend het object _type_ en _hoevelheid_ van de stapel op de grond gooien.", + "block.create.linked_extractor.tooltip.control2": "R-Klik op Frequency Plek", + "block.create.linked_extractor.tooltip.action2": "Wijst momenteel _vastgehouden_ _object_ toe als onderdeel van de geluisterde frequentie. Wanneer een zendende _Redstone_ _Brug_ van dezelfde frequentie wordt ingeschakeld, pauzeert deze Extractor.", + + "block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", + "block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active", + "block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.", + "block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space", + "block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.", + + "block.create.funnel.tooltip": "TRANSPORTBAND TRECHTER", + "block.create.funnel.tooltip.summary": "Verzamelt inkomende items op een _Mechanische_ _Transportband_ en plaatst deze indien mogelijk in de bijgevoegde _Inventaris._ Moet zich direct op een transportband bevinden, met de opening tegenover de bewegingsrichting van de transportband. Het inventaris moet op dezelfde hoogte zijn als de trechter.", + "block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling", + "block.create.funnel.tooltip.behaviour1": "UNLOCALIZED: Funnels can pull items _from_ _belts_ when placed above them, either sideways or at the end. When a side-ways funnel is backed up, items on the _belt_ _will_ _not_ _stall_.", + + "block.create.belt_tunnel.tooltip": "UNLOCALIZED: BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "UNLOCALIZED: An aesthetic option for running your _Mechanical_ _Belts_ through walls. Belts have to be reinforced with _Brass_ _Casing_. Tunnels can _synchronize_ with _their_ _neighbours_, only letting items pass if all tunnels in the group have one waiting. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Front", + "block.create.belt_tunnel.tooltip.action1": "UNLOCALIZED: Toggles _synchronized_ _behaviour_. Synchronized tunnels hold items until their neighbours have an item as well.", + "block.create.belt_tunnel.tooltip.control2": "UNLOCALIZED: R-Click with Wrench on Side", + "block.create.belt_tunnel.tooltip.action2": "UNLOCALIZED: _Adjusts_ _window_ _shutters_ if the tunnel has a window on that face.", + + "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", + "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration.", + "block.create.brass_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", + "block.create.brass_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a brass foundation. Reinforced Belts can support _Belt_ _Tunnels_, _Extractors_, _Funnels_, and _Transposers_ interacting with the belt from the sides and below.", + + "block.create.belt_observer.tooltip": "TRANSPORTBAND OBSERVEERDER", + "block.create.belt_observer.tooltip.summary": "Detecteert passerende items op een _Mechanische_ _Transportband_ ervoor. Werkt goed met een _Zuiger_ bovenop, waardoor bepaalde items worden verwijderd.", + "block.create.belt_observer.tooltip.condition1": "Wanneer een object overeenkomt met Filter", + "block.create.belt_observer.tooltip.behaviour1": "Biedt een korte _Redstone_ _pulse_ aan alle kanten. Een leeg filter komt overeen met alle passerende objecten.", + "block.create.belt_observer.tooltip.condition2": "UNLOCALIZED: Pulse Mode", + "block.create.belt_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _pulse_ when a _matching_ _item_ _passes_ the center of the observed belt segment.", + "block.create.belt_observer.tooltip.condition3": "UNLOCALIZED: Eject Mode", + "block.create.belt_observer.tooltip.behaviour3": "UNLOCALIZED: _Ejects_ _matching_ _items_ off the side. If the target belt or space is _occupied_, the item will be _held_ _in_ _place_.", + "block.create.belt_observer.tooltip.condition4": "UNLOCALIZED: Split Mode", + "block.create.belt_observer.tooltip.behaviour4": "UNLOCALIZED: _Splits_ a _matching_ _item_ _stack_ and _ejects_ _half_ of it off the side.", + + "block.create.pulse_repeater.tooltip": "PULSE VERSTERKER", + "block.create.pulse_repeater.tooltip.summary": "Een eenvoudig circuit voor het knippen van passerende redstone-signalen tot een lengte van _1_ _tick._", + + "block.create.adjustable_repeater.tooltip": "FLEXSTERKER", + "block.create.adjustable_repeater.tooltip.summary": "Een geavanceerde _Redstone_ _Verserker_ met een _configurable_ _Delay_ tot 30 minuten.", + + "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.", + + "block.create.analog_lever.tooltip": "UNLOCALIZED: ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "UNLOCALIZED: A lever with more _precise_ _control_ over its emitted _signal_ _strength_.", + + "block.create.powered_toggle_latch.tooltip": "UNLOCALIZED: POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "UNLOCALIZED: A lever that can be toggled by a _Redstone_ _Pulse_.", + + "block.create.powered_latch.tooltip": "UNLOCALIZED: POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "UNLOCALIZED: A lever that can be controlled by _Redstone_ _Signals_. A signal on the _back_ _enables_ it, a signal from the _side_ _will_ _reset_ it.", + + "block.create.speedometer.tooltip": "SNELHEIDSMETER", + "block.create.speedometer.tooltip.summary": "Meet en toont de _Rotatiesnelheid_ van gekoppelde kinetische componenten.", + "block.create.speedometer.tooltip.condition1": "Wanneer gedraaid", + "block.create.speedometer.tooltip.behaviour1": "Geeft een kleur aan die overeenkomt met het snelheidsniveau. _Groen_ geeft een trage, _Blauw_ gematigde en _Paars_ een snelle rotatie aan. Sommige Mechanische componenten vereisen voldoende snelheid om goed te werken.", + + "block.create.stressometer.tooltip": "STRESSMETER", + "block.create.stressometer.tooltip.summary": "Meet en toont de _algemene_ _stress_ van het bijgevoegde kinetische netwerk.", + "block.create.stressometer.tooltip.condition1": "Wanneer gedraaid", + "block.create.stressometer.tooltip.behaviour1": "Geeft een kleur aan die overeenkomt met het stressniveau. _Overbelaste_ _netwerken_ zullen niet meer bewegen. Stress kan worden verlicht door meer _Rotatie_ _bronnen_ toe te voegen aan het netwerk.", + + "tool.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", + "tool.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", + "tool.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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "UNLOCALIZED: REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "UNLOCALIZED: A Chromatic material forged from _absorbed_ _light_.", + + "item.create.shadow_steel.tooltip": "UNLOCALIZED: SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "UNLOCALIZED: A Chromatic material forged _in_ _the_ _void_.", + + "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + "create.tooltip.randomWipDescription0": "Houdt dit object buiten bereik van kinderen.", + "create.tooltip.randomWipDescription1": "Een baby panda sterft elke keer als je dit object gebruikt.", + "create.tooltip.randomWipDescription2": "Gebruikt dit object op eigen risico.", + "create.tooltip.randomWipDescription3": "Niks te zien hier, vervolg uw weg.", + "create.tooltip.randomWipDescription4": "Dit object zal zichzelf vernietigen in 10 seconden.", + "create.tooltip.randomWipDescription5": "Geloof me, het is nuteloos.", + "create.tooltip.randomWipDescription6": "Door dit object te gebruiken stemt u in met onze disclaimer en gaat u akkoord met de algemene voorwaarden.", + "create.tooltip.randomWipDescription7": "Deze is misschien niet geschikt voor jou.", + "create.tooltip.randomWipDescription8": "Gebruikt het en je zal meteen spijt hebben.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json new file mode 100644 index 000000000..d49c96b2a --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 788", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "adjustable_crate", + "block.create.adjustable_pulley": "UNLOCALIZED: Adjustable Pulley", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "Repetidor Flex", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Tijolos de Andesite", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "UNLOCALIZED: Basin", + "block.create.belt": "Esteira Mecânica", + "block.create.belt_observer": "Observador de Esteira", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", + "block.create.clutch": "Embreagem", + "block.create.cogwheel": "Roda Dentada", + "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.creative_crate": "Criativador Esquemaannon", + "block.create.creative_motor": "UNLOCALIZED: Creative Motor", + "block.create.crushing_wheel": "Roda de Moer", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "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.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "Tijolos de Diorito", + "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.dolomite": "Dolomite", + "block.create.dolomite_bricks": "Tijolos de Dolomite", + "block.create.dolomite_bricks_slab": "Lajotas de Tijolos de Dolomite", + "block.create.dolomite_bricks_stairs": "Escadas de Tijolos de Dolomite", + "block.create.dolomite_bricks_wall": "Muro de Tijolos de Dolomite", + "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_pillar": "Pilar de Dolomite", + "block.create.encased_belt": "Esteira Revestida", + "block.create.encased_fan": "Ventilador Revestida", + "block.create.encased_shaft": "Eixo Revestido", + "block.create.extractor": "Extrator", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "UNLOCALIZED: Flywheel", + "block.create.framed_glass": "UNLOCALIZED: Framed Glass", + "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", + "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", + "block.create.gabbro": "Gabbro", + "block.create.gabbro_bricks": "Tijolos de Gabbro", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Escadas de Tijolos de Gabbro", + "block.create.gabbro_bricks_wall": "Muros de Tijolos de Gabbro", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Caixa de Transmissão", + "block.create.gearshift": "Câmbio", + "block.create.granite_bricks": "Tijolos de Granito", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", + "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Roda Dentada Grande", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Areia Calcária", + "block.create.limestone": "Calcário", + "block.create.limestone_bricks": "Tijolos de Calcário", + "block.create.limestone_bricks_slab": "Lajotas de Tijolos de Calcário", + "block.create.limestone_bricks_stairs": "Escadas de Tijolos de Calcário", + "block.create.limestone_bricks_wall": "Muro de Tijolos de Calcário", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Pilar de Calcário", + "block.create.linear_chassis": "Chassis de Translado", + "block.create.linked_extractor": "Extrator Conectado", + "block.create.linked_transposer": "UNLOCALIZED: Linked Transposer", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Rolamento Mecânico", + "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", + "block.create.mechanical_drill": "Furadeira Mecânica", + "block.create.mechanical_harvester": "Coletor Mecânico", + "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", + "block.create.mechanical_piston": "Pistão Mecânico", + "block.create.mechanical_piston_head": "Cabeça do Pistão Mecânico", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Prensa Mecânico", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", + "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "UNLOCALIZED: Natural Scoria", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "UNLOCALIZED: Nozzle", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Vara de Extensão do Pistão", + "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Dolomite Polido", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Gabbro Polido", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Calcário Polido", + "block.create.polished_limestone_slab": "Lajotas de Calcário Polido", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", + "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Calcário Polido Resistido", + "block.create.polished_weathered_limestone_slab": "Lajota de Calcário Polido Resistido", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "UNLOCALIZED: Portable Storage Interface", + "block.create.powered_latch": "UNLOCALIZED: Powered Latch", + "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", + "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", + "block.create.pulse_repeater": "Repetidor de Pulso", + "block.create.radial_chassis": "Chassis de Rotação", + "block.create.redstone_contact": "Contato de Redstone", + "block.create.redstone_link": "Conexão de Redstone", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "UNLOCALIZED: Rope", + "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", + "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.schematic_table": "Mesa de Esquematizar", + "block.create.schematicannon": "Esquemaannon", + "block.create.scoria": "UNLOCALIZED: Scoria", + "block.create.scoria_bricks": "UNLOCALIZED: Scoria Bricks", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", + "block.create.shaft": "Eixo", + "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento", + "block.create.stockpile_switch": "Disjuntor de Armazenamento", + "block.create.stressometer": "UNLOCALIZED: Stressometer", + "block.create.tiled_glass": "Vidro Entalhado", + "block.create.tiled_glass_pane": "Vidraça Entalhada", + "block.create.transposer": "UNLOCALIZED: Transposer", + "block.create.turntable": "Mesa giratória", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", + "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Roda de Água", + "block.create.weathered_limestone": "Calcário Resistido", + "block.create.weathered_limestone_bricks": "Tijolos de Calcário Resistido", + "block.create.weathered_limestone_bricks_slab": "Lajota de Tijolos de Calcário Resistido", + "block.create.weathered_limestone_bricks_stairs": "Escadas de Tijolos de Calcário Resistido", + "block.create.weathered_limestone_bricks_wall": "Muro de Tijolos de Calcário Resistido", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido", + "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", + "item.create.belt_connector": "Esteira Mecânica", + "item.create.brass_hand": "UNLOCALIZED: Brass Hand", + "item.create.brass_ingot": "UNLOCALIZED: Brass Ingot", + "item.create.brass_nugget": "UNLOCALIZED: Brass Nugget", + "item.create.brass_sheet": "UNLOCALIZED: Brass Sheet", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", + "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "UNLOCALIZED: Deforester", + "item.create.dough": "Massa", + "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_schematic": "Esquema vazio", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Filtro", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Blockzapper Portátil", + "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", + "item.create.iron_sheet": "Placas de Ferro", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Hélice", + "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", + "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", + "item.create.rose_quartz": "Quartzo Rosa", + "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.schematic": "Esquema", + "item.create.schematic_and_quill": "Esquema e pena", + "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Fertilizante de Árvore", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Varinha de Simetria", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "UNLOCALIZED: Whisk", + "item.create.wrench": "UNLOCALIZED: Wrench", + "item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", + "item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", + "death.attack.create.fan_fire": "%1$s foi queimado por ar quente", + "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", + "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Moendo", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.splashing": "Lavando em Massa", + "create.recipe.splashing.fan": "Ventilador atras de Água corrente", + "create.recipe.smoking_via_fan": "Fumaceando em Massa", + "create.recipe.smoking_via_fan.fan": "Ventilador atras de Fogo", + "create.recipe.blasting_via_fan": "Fundindo em Massa", + "create.recipe.blasting_via_fan.fan": "Ventilador atras de Lava", + "create.recipe.pressing": "Prensa Mecânica", + "create.recipe.mixing": "UNLOCALIZED: Mixing", + "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.mechanical_sawing": "UNLOCALIZED: mechanical_sawing", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", + "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", + "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", + "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.processing.chance": "%1$s%% de chance", + "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", + + "create.generic.range": "Área", + "create.generic.radius": "Raio", + "create.generic.width": "UNLOCALIZED: Width", + "create.generic.height": "UNLOCALIZED: Height", + "create.generic.length": "UNLOCALIZED: Length", + "create.generic.speed": "Velocidade", + "create.generic.delay": "Demorada", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Segundos", + "create.generic.unit.minutes": "Minutos", + "create.generic.unit.rpm": "UNLOCALIZED: RPM", + "create.generic.unit.stress": "UNLOCALIZED: su", + "create.generic.unit.degrees": "UNLOCALIZED: °", + + "create.action.scroll": "Rolar", + "create.action.confirm": "Confirmar", + "create.action.abort": "Abortar", + "create.action.saveToFile": "Salvar", + "create.action.discard": "Descartar", + + "create.keyinfo.toolmenu": "Menu Focal da Ferramenta", + "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "Escolha uma Opção:", + "create.gui.scrollInput.scrollToModify": "Role o mouse para Modificar", + "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", + "create.gui.scrollInput.scrollToSelect": "Role o mouse para Selecionar", + "create.gui.scrollInput.shiftScrollsFaster": "UNLOCALIZED: Shift to Scroll Faster", + "create.gui.toolmenu.focusKey": "Segure [%1$s] para Focar", + "create.gui.toolmenu.cycle": "[SCROLL] para Circular", + "create.gui.symmetryWand.mirrorType": "Espelhar", + "create.gui.symmetryWand.orientation": "Orientação", + + "create.symmetry.mirror.plane": "Espelhar uma vez", + "create.symmetry.mirror.doublePlane": "Retangular", + "create.symmetry.mirror.triplePlane": "Octagonal", + + "create.orientation.orthogonal": "Ortogonal", + "create.orientation.diagonal": "Diagonal", + "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "Através de Z", + "create.orientation.alongX": "Através de X", + + "create.gui.blockzapper.title": "Blockzapper Portátil", + "create.gui.blockzapper.replaceMode": "Modo de Substituição", + "create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais", + "create.gui.blockzapper.searchFuzzy": "Ignorar Material nas Bordas", + "create.gui.blockzapper.range": "Raio de Expansão", + "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", + "create.gui.blockzapper.patternSection": "Padrões", + "create.gui.blockzapper.pattern.solid": "Sólido", + "create.gui.blockzapper.pattern.checkered": "Xadrez", + "create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido", + "create.gui.blockzapper.pattern.chance25": "25% de chance", + "create.gui.blockzapper.pattern.chance50": "50% de chance", + "create.gui.blockzapper.pattern.chance75": "75% de chance", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", + "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", + "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", + "create.gui.terrainzapper.placement.inserted": "UNLOCALIZED: Inserted", + "create.gui.terrainzapper.brush": "UNLOCALIZED: Brush", + "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", + "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", + "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", + "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", + "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", + "create.gui.terrainzapper.tool.replace": "UNLOCALIZED: Replace", + "create.gui.terrainzapper.tool.clear": "UNLOCALIZED: Clear", + "create.gui.terrainzapper.tool.overlay": "UNLOCALIZED: Overlay", + "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", + + "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", + + "create.blockzapper.usingBlock": "Usando: %1$s", + "create.blockzapper.componentUpgrades": "Melhorias do Componente:", + "create.blockzapper.component.body": "Corpo", + "create.blockzapper.component.amplifier": "Amplificador", + "create.blockzapper.component.accelerator": "Acelerador", + "create.blockzapper.component.retriever": "Retornador", + "create.blockzapper.component.scope": "Mira", + "create.blockzapper.componentTier.none": "Nada", + "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", + "create.blockzapper.leftClickToSet": "Botão-Esquerdo em um Bloco para selecionar Material", + "create.blockzapper.empty": "Sem Blocos!", + + "create.contraptions.movement_mode": "UNLOCALIZED: Movement Mode", + "create.contraptions.movement_mode.move_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.move_place_returned": "UNLOCALIZED: Place only in Starting Position", + "create.contraptions.movement_mode.move_never_place": "UNLOCALIZED: Place only when Anchor Destroyed", + "create.contraptions.movement_mode.rotate_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.rotate_place_returned": "UNLOCALIZED: Only Place near Initial Angle", + "create.contraptions.movement_mode.rotate_never_place": "UNLOCALIZED: Only Place when Anchor Destroyed", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Filtros", + "create.logistics.firstFrequency": "UNLOCALIZED: Freq. #1", + "create.logistics.secondFrequency": "UNLOCALIZED: Freq. #2", + + "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", + "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", + "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", + "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", + "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", + "create.gui.stressometer.capacity": "UNLOCALIZED: Remaining Capacity", + "create.gui.stressometer.overstressed": "UNLOCALIZED: Overstressed", + "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", + "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.adjustable_crate.title": "adjustable_crate", + "create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento", + "create.gui.stockpile_switch.title": "Disjuntor de Armazenamento", + "create.gui.stockpile_switch.lowerLimit": "Limite Mínimo", + "create.gui.stockpile_switch.upperLimit": "Limite Máximo", + "create.gui.stockpile_switch.startAt": "Iniciar Sinal em", + "create.gui.stockpile_switch.startAbove": "Iniciar Sinal acima de", + "create.gui.stockpile_switch.stopAt": "Parar Sinal em", + "create.gui.stockpile_switch.stopBelow": "Parar Sinal abaixo de", + "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", + "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", + "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", + "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", + "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", + "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", + "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", + "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", + + "create.schematicAndQuill.dimensions": "Tamanho Esquema: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Primeira posição feita.", + "create.schematicAndQuill.secondPos": "Segunda posição feita.", + "create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.", + "create.schematicAndQuill.abort": "Seleção removida.", + "create.schematicAndQuill.prompt": "Informe um nome para o Esquema:", + "create.schematicAndQuill.fallbackName": "Meu Esquema", + "create.schematicAndQuill.saved": "Salvo como %1$s", + + "create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar", + "create.schematic.position": "Posição", + "create.schematic.rotation": "Rotação", + "create.schematic.rotation.none": "Nada", + "create.schematic.rotation.cw90": "Sentido horário 90", + "create.schematic.rotation.cw180": "Sentido horário 180", + "create.schematic.rotation.cw270": "Sentido horário 270", + "create.schematic.mirror": "Espelhar", + "create.schematic.mirror.none": "Nada", + "create.schematic.mirror.frontBack": "Frente para Trás", + "create.schematic.mirror.leftRight": "Esquerda para Direita", + "create.schematic.tool.deploy": "Concluir", + "create.schematic.tool.move": "Mover XZ", + "create.schematic.tool.movey": "Mover Y", + "create.schematic.tool.rotate": "Rodar", + "create.schematic.tool.print": "Imprimir", + "create.schematic.tool.flip": "Virar", + "create.schematic.tool.deploy.description.0": "Move o lugar da estrutura.", + "create.schematic.tool.deploy.description.1": "Botão-direito no chão para colocar.", + "create.schematic.tool.deploy.description.2": "Segure [Ctrl] para selecionar em uma distância fixa.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Rolar para mudar a distância.", + "create.schematic.tool.move.description.0": "Vira o Esquema Horizontalmente", + "create.schematic.tool.move.description.1": "Aponte ao Esquema e [CTRL]-Rolar para empurrar.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Vira o Esquema Verticalmente", + "create.schematic.tool.movey.description.1": "[CTRL]-Rolar para mover para cima/baixo", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Roda o Esquema em torno do seu centro.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Rolar para rolar 90 Graus", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Coloca estrutura no mundo instantaneamente", + "create.schematic.tool.print.description.1": "[Botão-Direito] para confirmar a posição atual.", + "create.schematic.tool.print.description.2": "Esta ferramenta é para o Modo Criativo apenas.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Gira o Esquema ao longo da face que você selecionar.", + "create.schematic.tool.flip.description.1": "Aponte para o Esquema e [CTRL]-Rolar para virá-lo.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Sincronizando...", + "create.schematics.uploadTooLarge": "Seu esquema é muito grande", + "create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:", + + "create.gui.schematicTable.title": "Mesa de Desenho", + "create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics", + "create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved", + "create.gui.schematicTable.uploading": "Importando...", + "create.gui.schematicTable.finished": "Envio Concluído!", + "create.gui.schematicannon.title": "Esquemaannon", + "create.gui.schematicannon.settingsTitle": "Parâmetros de Posicionamento", + "create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais", + "create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s", + "create.gui.schematicannon.optionEnabled": "Habilitado Atualmente", + "create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente", + "create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos", + "create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos", + "create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer", + "create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio", + "create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes", + "create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas", + "create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.", + "create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.", + "create.gui.schematicannon.option.replaceWithSolid.description": "O canhão irá apenas substituir Blocos sólidos na área de trabalho, se o Esquema conter um bloco Sólido naquela posição.", + "create.gui.schematicannon.option.replaceWithAny.description": "O canhão irá substituir Blocos sólidos na área de trabalho, se o Esquema conter qualquer Bloco naquela posição.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "O canhão irá limpar todos os blocos na área de trabalho, incluindo os substituídos por Ar.", + + "create.schematicannon.status.idle": "Ocioso", + "create.schematicannon.status.ready": "Pronto", + "create.schematicannon.status.running": "Trabalhando", + "create.schematicannon.status.finished": "Concluído", + "create.schematicannon.status.paused": "Pausado", + "create.schematicannon.status.stopped": "Parada", + "create.schematicannon.status.noGunpowder": "UNLOCALIZED: Out of Gunpowder", + "create.schematicannon.status.targetNotLoaded": "Bloco não carregado", + "create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe", + "create.schematicannon.status.searching": "Procurando", + "create.schematicannon.status.skipping": "Pulando", + "create.schematicannon.status.missingBlock": "Bloco Faltante:", + "create.schematicannon.status.placing": "Colocando", + "create.schematicannon.status.clearing": "Limpando Blocos", + "create.schematicannon.status.schematicInvalid": "Esquema Inválido", + "create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado", + "create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado", + + "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", + "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", + "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", + "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", + "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", + "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", + + "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", + "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", + + "create.tooltip.holdKey": "Segure [%1$s]", + "create.tooltip.holdKeyOrKey": "Segure [%1$s] or [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "UNLOCALIZED: Speed Requirement: %1$s", + "create.tooltip.speedRequirement.none": "UNLOCALIZED: None", + "create.tooltip.speedRequirement.medium": "UNLOCALIZED: Moderate", + "create.tooltip.speedRequirement.high": "UNLOCALIZED: Fast", + "create.tooltip.stressImpact": "UNLOCALIZED: Stress Impact: %1$s", + "create.tooltip.stressImpact.low": "UNLOCALIZED: Low", + "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", + "create.tooltip.stressImpact.high": "UNLOCALIZED: High", + "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", + "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", + "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", + "create.tooltip.capacityProvided.high": "UNLOCALIZED: Large", + "create.tooltip.capacityProvided.asGenerator": "UNLOCALIZED: (As Generator)", + "create.tooltip.generationSpeed": "UNLOCALIZED: Generates at %1$s %2$s", + "create.tooltip.analogStrength": "UNLOCALIZED: Analog Strength: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "UNLOCALIZED: Min. Ingredients", + + "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.command.killTPSCommand": "UNLOCALIZED: killtps", + "create.command.killTPSCommand.status.slowed_by.0": "UNLOCALIZED: [Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "UNLOCALIZED: [Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "UNLOCALIZED: [Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "UNLOCALIZED: [Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", + "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", + + + "_": "->------------------------] 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.", + "item.create.example_item.tooltip.condition1": "Quando this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And Quando this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "Quando Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "VARINHA DE SIMETRIA", + "item.create.wand_of_symmetry.tooltip.summary": "Espelhar perfeitamente a colocação de blocos nos planos configurados.", + "item.create.wand_of_symmetry.tooltip.condition1": "Quando na Hotbar", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Mantem-se Ativo", + "item.create.wand_of_symmetry.tooltip.control1": "B-Direito no Chão", + "item.create.wand_of_symmetry.tooltip.action1": "_Cria_ ou _Move_ o Espelho", + "item.create.wand_of_symmetry.tooltip.control2": "B-Direito no Ar", + "item.create.wand_of_symmetry.tooltip.action2": "_Remove_ o Espelho ativo", + "item.create.wand_of_symmetry.tooltip.control3": "B-Direito enquanto Abaixado", + "item.create.wand_of_symmetry.tooltip.action3": "Abre _Interface_ de _Configuração_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "Gadget imaginário para colocar ou substituir blocos a distância.", + "item.create.handheld_blockzapper.tooltip.control1": "B-Esquerdo no Bloco", + "item.create.handheld_blockzapper.tooltip.action1": "Define os blocos colocados pela ferramenta no bloco de destino.", + "item.create.handheld_blockzapper.tooltip.control2": "B-Direito em Bloco", + "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ ou _Substitui_ o bloco alvo.", + "item.create.handheld_blockzapper.tooltip.control3": "B-Direito equando Abaixado", + "item.create.handheld_blockzapper.tooltip.action3": "Abre _Interface_ de _Configuração_", + + "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain_ _features_.", + "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", + "item.create.handheld_worldshaper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_worldshaper.tooltip.control2": "UNLOCALIZED: R-Click at Block", + "item.create.handheld_worldshaper.tooltip.action2": "UNLOCALIZED: Applies the currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration_ _Interface_", + + "item.create.tree_fertilizer.tooltip": "FERTILIZANTE DE ARVORE", + "item.create.tree_fertilizer.tooltip.summary": "Uma combinação poderosa de minerais para tipos comuns de arvores", + "item.create.tree_fertilizer.tooltip.condition1": "Quando usada em Mudas", + "item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço", + + "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", + "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant_ _axe_ able to chop down trees in a split second.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "UNLOCALIZED: FILTER", + "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.", + "item.create.filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.attribute_filter.tooltip": "UNLOCALIZED: ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ item _attributes_ and _categories_.", + "item.create.attribute_filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.attribute_filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.empty_schematic.tooltip": "ESQUEMA VAZIO", + "item.create.empty_schematic.tooltip.summary": "Usado como ingrediente em receitas e para escrever na _Mesa_ _de_ _Esquematizar_", + + "item.create.schematic.tooltip": "ESQUEMA", + "item.create.schematic.tooltip.summary": "Contem uma estrutura para ser posicionada e colocada no mundo. Posicione o Holograma como desejar e use um _Esquemaannon_ para construí-lo.", + "item.create.schematic.tooltip.condition1": "Quando Em mãos", + "item.create.schematic.tooltip.behaviour1": "Pode ser posicionado usando as Ferramentas em Tela", + "item.create.schematic.tooltip.control1": "B-Direito enquanto Abaixado", + "item.create.schematic.tooltip.action1": "Abre uma _Interface_ para informar as _Coordenadas_ exatas.", + + "item.create.schematic_and_quill.tooltip": "ESQUEMA E PENA", + "item.create.schematic_and_quill.tooltip.summary": "Usado para salvar uma Estrutura no mundo para um arquivo .nbt.", + "item.create.schematic_and_quill.tooltip.condition1": "Passo 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecione duas coordenadas de extremidade usando B-Direito", + "item.create.schematic_and_quill.tooltip.condition2": "Passo 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Rolar_ nas faces para ajustar o tamanho. B-Direito de novo para Salvar.", + "item.create.schematic_and_quill.tooltip.control1": "B-Direito", + "item.create.schematic_and_quill.tooltip.action1": "Selecione um canto / confirmar salvamento", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl Pressionado", + "item.create.schematic_and_quill.tooltip.action2": "Selecione pontos no _meio_ _do_ _ar_. _Rolar_ para ajustar a distância.", + "item.create.schematic_and_quill.tooltip.control3": "B-Direito enquanto Abaixado", + "item.create.schematic_and_quill.tooltip.action3": "_Cancela_ e remove a seleção.", + + "block.create.schematicannon.tooltip": "ESQUEMAANNON", + "block.create.schematicannon.tooltip.summary": "Dispara blocos para recriar um _Esquema_ no Mundo. Usa itens de Inventários adjacentes e _Pólvora_ como combustível.", + "block.create.schematicannon.tooltip.control1": "Quando Apertado com B-Direito", + "block.create.schematicannon.tooltip.action1": "Abre a _Interface_", + + "block.create.schematic_table.tooltip": "MESA DE ESQUEMATIZAR", + "block.create.schematic_table.tooltip.summary": "Escreve Esquemas salvos into um _Esquema_ _Vazio_", + "block.create.schematic_table.tooltip.condition1": "Quando recebe um Esquema Vazio", + "block.create.schematic_table.tooltip.behaviour1": "Importa um Arquivo escolhido da sua Pasta de Esquemas", + + "block.create.shaft.tooltip": "EIXO", + "block.create.shaft.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta.", + + "block.create.cogwheel.tooltip": "RODA DENTADA", + "block.create.cogwheel.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta, e para _Rodas_ _Dentadas_ adjacentes.", + + "block.create.large_cogwheel.tooltip": "RODA DENTADA GRADE", + "block.create.large_cogwheel.tooltip.summary": "Uma versão maior da _Roda_ _Dentada,_ permitindo mudança na _Velocidade_ de _Rotação_ quando conectada a sua Contraparte.", + + "block.create.encased_shaft.tooltip": "EIXO REVESTIDO", + "block.create.encased_shaft.tooltip.summary": " _Transmite_ _Rotação_ em uma linha reta. Apropriada para propagar Rotação através de Muros.", + + "block.create.gearbox.tooltip": "CAIXA DE TRANSMISSÃO", + "block.create.gearbox.tooltip.summary": "_Transmite_ _Rotação_ em _Quatro_ _direções._ Reverte conexões diretas.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "CÂMBIO", + "block.create.gearshift.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para eixos conectados.", + "block.create.gearshift.tooltip.condition1": "Quando Ligado", + "block.create.gearshift.tooltip.behaviour1": "_Inverte_ a rotação de saída.", + + "block.create.clutch.tooltip": "EMBREAGEM", + "block.create.clutch.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para os eixos conectados.", + "block.create.clutch.tooltip.condition1": "Quando Ligado", + "block.create.clutch.tooltip.behaviour1": "_Para_ de prover rotação para o outro lado.", + + "block.create.encased_belt.tooltip": "ESTEIRA REVESTIDA", + "block.create.encased_belt.tooltip.summary": "_Transmite_ _Rotação_ através de si e para _Esteiras_ _Revestidas_ conectadas.", + "block.create.encased_belt.tooltip.condition1": "Quando Conectadas com outra Esteira Revestida", + "block.create.encased_belt.tooltip.behaviour1": "Bloco Conectado irá ter a mesma velocidade de rotação, na mesma direção. Esteiras Conectadas não precisam estar viradas para mesma direção.", + + "block.create.adjustable_pulley.tooltip": "UNLOCALIZED: ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ through its block and to attached _Encased_ _Belts_. Attached encased belts will _rotate_ _faster_ based on the _analog_ _redstone_ _signal_ this block receives.", + "block.create.adjustable_pulley.tooltip.condition1": "UNLOCALIZED: Redstone Control", + "block.create.adjustable_pulley.tooltip.behaviour1": "UNLOCALIZED: Without a signal, it will _not_ _speed_ _up_ connected belts. With a full strength signal connected belt, speed _doubles_.", + + "item.create.belt_connector.tooltip": "ESTEIRA MECÂNICA", + "item.create.belt_connector.tooltip.summary": "Conecta dois _Eixos_ com uma _Esteira_ _Mecânica._ Eixos conectados irá ter exatamente a mesma velocidade e direção de rotação. A Esteira pode atuar como um _Transporte_ para _Entidades._", + "item.create.belt_connector.tooltip.control1": "B-Direito em um Eixo", + "item.create.belt_connector.tooltip.action1": "Seleciona o eixo como uma polia da Esteira. Os dois Eixos selecionadas precisam estar _alinhados_ seja na _Vertical,_ _Horizontal_ ou _Diagonal_ na direção da Esteira.", + "item.create.belt_connector.tooltip.control2": "B-Direito enquanto Abaixado", + "item.create.belt_connector.tooltip.action2": "_Cancela_ a seleção da Posição para a Esteira", + + "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", + "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic_ _information_.", + "item.create.goggles.tooltip.condition1": "UNLOCALIZED: When worn", + "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored_ _indicators_ corresponding to the _Speed_ _Level_ of a placed kinetic component as well as _Stress_ _Impact_ and _Capacity_ of individual components.", + "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", + "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + + "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", + "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", + "item.create.wrench.tooltip.control1": "UNLOCALIZED: Right-Click a kinetic block", + "item.create.wrench.tooltip.action1": "UNLOCALIZED: _Rotates_ _components_ toward or away from the face with which you interacted.", + "item.create.wrench.tooltip.control2": "UNLOCALIZED: R-Click while Sneaking", + "item.create.wrench.tooltip.action2": "UNLOCALIZED: _Disassembles_ _Kinetic_ _components_ and places them back in _your_ _inventory_.", + + "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational_ _Force_.", + + "block.create.water_wheel.tooltip": "RODA DE ÁGUA", + "block.create.water_wheel.tooltip.summary": "Prove _Força_ _Rotacional_ tirada de _Correntes_ de _Água_ próximas.", + + "block.create.encased_fan.tooltip": "VENTILADO REVESTIDO", + "block.create.encased_fan.tooltip.summary": "Converte _Força_ _Rotacional_ em _Correntes_ de _Ar_ e vice-versa. Muitos usos.", + "block.create.encased_fan.tooltip.condition1": "Quando sobre Fogo", + "block.create.encased_fan.tooltip.behaviour1": "Prove _Força_ _Rotacional_ (precisa ser na vertical)", + "block.create.encased_fan.tooltip.condition2": "Quando Invertido", + "block.create.encased_fan.tooltip.behaviour2": "_Empurra_ Entidades em um lado, _Puxa_ entidades no outro. Força e Velocidade dependem da Rotação de entrada.", + "block.create.encased_fan.tooltip.condition3": "Quando ar flui através de blocos especiais", + "block.create.encased_fan.tooltip.behaviour3": "Processa itens na frente do Bloco: _Água_ alva, _Fogo_ defuma, e _Lava_ derrete o ingrediente.", + + "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", + "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased_ _Fan_ to distribute its effect on Entities in _all_ _directions_.", + + "block.create.hand_crank.tooltip": "UNLOCALIZED: HAND CRANK", + "block.create.hand_crank.tooltip.summary": "UNLOCALIZED: A simple _source_ of _Rotational_ _Force_ that requires the interaction of players.", + "block.create.hand_crank.tooltip.condition1": "UNLOCALIZED: When Used", + "block.create.hand_crank.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + + "block.create.cuckoo_clock.tooltip": "UNLOCALIZED: CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "UNLOCALIZED: Fine craftsmanship for _decorating_ a space and _keeping_ _track_ _of_ _time_.", + "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current_ _time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players_ _can_ _sleep_.", + + "block.create.turntable.tooltip": "MESA GIRATÓRIA", + "block.create.turntable.tooltip.summary": "Muda a _Força_ _Rotacional_ em uma forma refinada de Enjoo.", + + "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", + "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "RODA DE MOER", + "block.create.crushing_wheel.tooltip.summary": "Grandes rodas giratórias que _esmagam_ qualquer coisa que impeça seu movimento.", + "block.create.crushing_wheel.tooltip.condition1": "Quando conectado a outras Rodas de Moer", + "block.create.crushing_wheel.tooltip.behaviour1": "Forma uma estrutura de esmagamento para processar uma variedade de coisas. Os Dentes da rota precisam estar conectados e se movimentando com a _mesma_ _velocidade_ em _direções_ _opostas._", + + "block.create.mechanical_press.tooltip": "PRENSA MECÂNICA", + "block.create.mechanical_press.tooltip.summary": "Um forte pistão usado para comprimir itens abaixo dele. Precisa de _Força_ _Rotacional_ constante", + "block.create.mechanical_press.tooltip.condition1": "Quando Ligado com Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "_Inicia_ compressão de itens jogados abaixo dele.", + "block.create.mechanical_press.tooltip.condition2": "Quando Sobre uma Esteira Mecânica", + "block.create.mechanical_press.tooltip.behaviour2": "_Automaticamente_ comprime itens que passando na Esteira.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "UNLOCALIZED: BASIN", + "block.create.basin.tooltip.summary": "UNLOCALIZED: A handy _item_ _container_ used in processing with the _Mechanical_ _Mixer_ and the _Mechanical_ _Press_. Supports _Redstone_ _Comparators_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "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.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.", + "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", + "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + + "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", + "block.create.mechanical_crafter.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.mechanical_crafter.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _the_ _crafting_ _process_ as soon as _all_ _crafters_ in the grid have been _given_ _an_ _item_.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "UNLOCALIZED: When Wrenched at Front", + "block.create.mechanical_crafter.tooltip.action1": "UNLOCALIZED: _Cycles_ _the_ _direction_ an individual crafter _moves_ _its_ _items_ towards. To form a working grid, _arrange_ _the_ _belts_ _in_ _a_ _flow_ which moves all items towards a final crafter. The final crafter must _point_ _away_ from the grid.", + "block.create.mechanical_crafter.tooltip.control2": "UNLOCALIZED: When Wrenched at back", + "block.create.mechanical_crafter.tooltip.action2": "UNLOCALIZED: _Connects_ the _input_ _inventory_ of adjacent crafters. Use this to _combine_ _slots_ in the crafting grid and _save_ _on_ _input_ _work_.", + + "block.create.furnace_engine.tooltip": "UNLOCALIZED: FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "UNLOCALIZED: A powerful source of _Rotational_ _Power_ that requires a _running_ _furnace_ to work.", + "block.create.furnace_engine.tooltip.condition1": "UNLOCALIZED: When Attached to Lit Furnace", + "block.create.furnace_engine.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + + "block.create.flywheel.tooltip": "UNLOCALIZED: FLYWHEEL", + "block.create.flywheel.tooltip.summary": "UNLOCALIZED: A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", + "block.create.flywheel.tooltip.condition1": "UNLOCALIZED: When Attached to Running Engine", + "block.create.flywheel.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", + + "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", + "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + + "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", + "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", + "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached_ _on_ _top_ of the controller.", + + "block.create.mechanical_piston.tooltip": "PISTÃO MECÂNICO", + "block.create.mechanical_piston.tooltip.summary": "Uma verão melhorada do _Pistão,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. _Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.", + "block.create.mechanical_piston.tooltip.condition1": "Quando Rodado", + "block.create.mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.", + + "block.create.sticky_mechanical_piston.tooltip": "PISTÃO MECÂNICO GRUDENTO", + "block.create.sticky_mechanical_piston.tooltip.summary": "Uma versão melhorada do _Pistão_ _Grudento,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "Quando Rodado", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.", + + "block.create.piston_extension_pole.tooltip": "VARA DE EXTENSÃO DO PISTÃO", + "block.create.piston_extension_pole.tooltip.summary": "Aumenta o alcance de _Pistões_ _Mecânicos_", + "block.create.piston_extension_pole.tooltip.condition1": "Quando preso a um Pistão Mecânico", + "block.create.piston_extension_pole.tooltip.behaviour1": "Aumenta a extensão dos pistões em 1 bloco", + + "block.create.mechanical_bearing.tooltip": "ROLAMENTO MECÂNICO", + "block.create.mechanical_bearing.tooltip.summary": "Usado para rotacionar _estruturas_ _grandes_ ou geração de _Força_ _Rotacional_ do vento.", + "block.create.mechanical_bearing.tooltip.condition1": "Quando Rodado", + "block.create.mechanical_bearing.tooltip.behaviour1": "Começa a rotacionar _Chassis_ de _Rotação_ conectados e blocos conectados a eles.", + "block.create.mechanical_bearing.tooltip.condition2": "Quando Ligado por Redstone", + "block.create.mechanical_bearing.tooltip.behaviour2": "Começa a passar _Força_ _Rotacional_ das estruturas conectadas. A estrutura dele incluir _Blocos_ de _Vela_ válidos (atualmente qualquer Bloco de Lã).", + + "block.create.clockwork_bearing.tooltip": "UNLOCALIZED: CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "UNLOCALIZED: An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", + "block.create.clockwork_bearing.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.clockwork_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", + + "block.create.sequenced_gearshift.tooltip": "UNLOCALIZED: SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "UNLOCALIZED: A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", + "block.create.sequenced_gearshift.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _executing_ programmed instructions based on the input speed.", + "block.create.sequenced_gearshift.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.sequenced_gearshift.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface._", + + "block.create.cart_assembler.tooltip": "UNLOCALIZED: CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "UNLOCALIZED: When _placed_ _on_ a _Rail_, adopts functionality and _assembles/disassebles_ _structures_ on passing _carts_.", + "block.create.cart_assembler.tooltip.condition1": "UNLOCALIZED: When placed above Rail", + "block.create.cart_assembler.tooltip.behaviour1": "UNLOCALIZED: _Assembles_ onto passing _carts_ _when_ _powered_, _disassembles_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "UNLOCALIZED: ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "UNLOCALIZED: Moves attached _blocks_ and _structures_ _vertically_. Use _Chassis_ or _Slime_ _Blocks_ to move more than a single block.", + "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + + "block.create.linear_chassis.tooltip": "CHASSIS DE TRANSLADO", + "block.create.linear_chassis.tooltip.summary": "Uma base configurável para Estruturas serem movidas por um _Pistão_ _Mecânico._ Esses Blocos precisam formas uma camada de blocos na frente do Pistão.", + "block.create.linear_chassis.tooltip.condition1": "Quando movido por Pistão Mecânico", + "block.create.linear_chassis.tooltip.behaviour1": "_Move_ todos os _Chassis_ _conectados_ na mesma orientação, e Blocos conectados a frente dele. Quando o Pistão volta, blocos apenas serão puxados se a face do chassis for _Grudenta_ (Ver [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.linear_chassis.tooltip.control1": "Quando clicado com B-Direito com Gosma de Slime", + "block.create.linear_chassis.tooltip.action1": "Torna a face clicada _Grudenta._ Quando o pistão volta, o chassis irá _puxar_ _junto_ todos os Blocos conectados na sua coluna e no Alcance configurado.", + + "block.create.radial_chassis.tooltip": "CHASSIS DE ROTAÇÃO", + "block.create.radial_chassis.tooltip.summary": "Nessário para rotacionar estruturas om um _Rolamento_ _Mecânico._ ", + "block.create.radial_chassis.tooltip.condition1": "Quando Rotacionado por Rolamento", + "block.create.radial_chassis.tooltip.behaviour1": "_Rotaciona_ todos os blocos conectados a lados _Grudentos_ (Veja [Ctrl]) dentro do alcance configurado no seu entorno. _Propaga_ a rotação para outros Chassis de Rotação conectados.", + "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.radial_chassis.tooltip.control1": "Quando clicado com B-Direito com Goma de Slime", + "block.create.radial_chassis.tooltip.action1": "Torna face clicada em _Grudenta._ Quando o Chassis girar, todos os blocos conectados nesse lado irão girar junto.", + + "block.create.mechanical_drill.tooltip": "FURADEIRA MECÂNICA", + "block.create.mechanical_drill.tooltip.summary": "Um dispositivo mecânido feito para _quebrar_ _blocos._", + "block.create.mechanical_drill.tooltip.condition1": "Quando Rodado", + "block.create.mechanical_drill.tooltip.behaviour1": "Atua como um Bloco Quebrador _estacionário._ Também _machuca_ _entidades_ na sua área de efeito.", + "block.create.mechanical_drill.tooltip.condition2": "Quando Empurrado por Pistão Mecânico", + "block.create.mechanical_drill.tooltip.behaviour2": "Quebra os Blocos na direção do avanço da broca.", + + "block.create.mechanical_harvester.tooltip": "COLETOR MECÂNICO", + "block.create.mechanical_harvester.tooltip.summary": "Um cortador de plantas mecânico indicado para automação de culturas de médio porte", + "block.create.mechanical_harvester.tooltip.condition1": "Quando Empurrado por Pistão Mecânico", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Colhe_ todas as _safra_ _madura_ que a lâmina passar sobre, e os retorna a estado de crescimento inicial.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "UNLOCALIZED: MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "UNLOCALIZED: Suitable for _cutting_ _trees_ effectively and for _cutting_ _blocks_ into their carpentered counterparts. It is movable using _Mechanical_ _Pistons_ or _Bearings_.", + "block.create.mechanical_saw.tooltip.condition1": "UNLOCALIZED: When facing up", + "block.create.mechanical_saw.tooltip.behaviour1": "UNLOCALIZED: Applies _Sawing_ and _Stonecutting_ _Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", + "block.create.mechanical_saw.tooltip.condition2": "UNLOCALIZED: When facing horizontally", + "block.create.mechanical_saw.tooltip.behaviour2": "UNLOCALIZED: _Breaks_ _logs_ in front of it. If the log supported a tree on its own, the _tree_ _will_ _collapse_ away from the saw.", + "block.create.mechanical_saw.tooltip.condition3": "UNLOCALIZED: While Moving", + "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", + + "block.create.stockpile_switch.tooltip": "DISJUNTOR DE ARMAZENAMENTO", + "block.create.stockpile_switch.tooltip.summary": "Alterna um sinal de Redstone com base no _Espaço_ de _Armazenamento_ do Reciente conectado.", + "block.create.stockpile_switch.tooltip.condition1": "Quando abaixo do Limite Mínimo", + "block.create.stockpile_switch.tooltip.behaviour1": "Para de enviar _Sinal_ de _Redstone_", + "block.create.stockpile_switch.tooltip.condition2": "Quando acima do Limite Máximo", + "block.create.stockpile_switch.tooltip.behaviour2": "Começa a enviar _Sinal_ de _Redstone_ até chegar no Limite Mínio novamente.", + "block.create.stockpile_switch.tooltip.control1": "Quando clicado com B-Direito", + "block.create.stockpile_switch.tooltip.action1": "Abre a _Interface_ de _Configuração_", + + "block.create.redstone_link.tooltip": "CONEXÃO DE REDSTONE", + "block.create.redstone_link.tooltip.summary": "Saida para conexões _Redstone_ _Sem-Fio._ Pode ter _Frequências_ usando qualquer item. Distancia do Sinal é limitada, mas resoavelmente justa.", + "block.create.redstone_link.tooltip.condition1": "Quando Ligado", + "block.create.redstone_link.tooltip.behaviour1": "Recebendo Conexões da mesma _Frequência_ irá gerar um sinal de Redstone.", + "block.create.redstone_link.tooltip.control1": "Quando clicado com B-Direito com um Item", + "block.create.redstone_link.tooltip.action1": "Altera a _Frequência_ para aquele item. Até _dois_ _itens_ _diferentes_ podem ser combinados para definir uma Frequência.", + "block.create.redstone_link.tooltip.control2": "Quando clicado com B-Direito enquanto Abaixado", + "block.create.redstone_link.tooltip.action2": "Muda entre Modo _Receptor_ e _Transmissor_ .", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "CONTATO DE REDSTONE", + "block.create.redstone_contact.tooltip.summary": "Um dispositivo simples para Mecanimos de Redstone avançados.", + "block.create.redstone_contact.tooltip.condition1": "Quando apontando para outro Contato", + "block.create.redstone_contact.tooltip.behaviour1": "Provê um _Sinal_ de _Redstone_", + "block.create.redstone_contact.tooltip.condition2": "Quando movido por Pistão Mecânico", + "block.create.redstone_contact.tooltip.behaviour2": "Ativa todos os Contatos imóveis na passagem", + + "block.create.adjustable_crate.tooltip": "adjustable_crate", + "block.create.adjustable_crate.tooltip.summary": "Este _Recipiente_ de _Armazenamento_ permite controle Manual da sua capacidade. Pode conter até _16_ _Pilhas_ de qualquer Item", + "block.create.adjustable_crate.tooltip.control1": "Quando clicado com B-Direito", + "block.create.adjustable_crate.tooltip.action1": "Abre a _Interface_", + + "block.create.creative_crate.tooltip": "CRIATIVADOR ESQUEMAANNON", + "block.create.creative_crate.tooltip.summary": "Provê um suprimento infinito de blocos para _Esquemaannons_ próximos", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.extractor.tooltip": "EXTRATOR", + "block.create.extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ conectado e os joga no chão. Não irá jogar Itens até o espaço ser limpo. Pode ser configurado como para ser um _filtro._", + "block.create.extractor.tooltip.condition1": "Quando Ligado por Redstone", + "block.create.extractor.tooltip.behaviour1": "_Para_ o Extractor", + "block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.", + "block.create.extractor.tooltip.control1": "B-Direito no Espaço de Filtro", + "block.create.extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.", + + "block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER", + "block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.", + "block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.", + + "block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER", + "block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.deployer.tooltip.behaviour1": "UNLOCALIZED: Extends its arm and _activates_ in the block space _2m_ _ahead_ of itself.", + "block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench", + "block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.", + + "block.create.linked_extractor.tooltip": "EXTRATOR CONECTADO", + "block.create.linked_extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ e os joga no chão. Não vai jogar Itens até que o espaço ser limpo. Pode ser configurado como para ser um _filtro._ Pode ser controlado remotamente via _Conexão_ de _Redstone._", + "block.create.linked_extractor.tooltip.condition1": "Quando Conexão de Redstone Ativa", + "block.create.linked_extractor.tooltip.behaviour1": "_Para_ o Extrator", + "block.create.linked_extractor.tooltip.control1": "B-Direito no Espaço de Filtro", + "block.create.linked_extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.", + "block.create.linked_extractor.tooltip.control2": "B-Direito no Espaço de Frequência", + "block.create.linked_extractor.tooltip.action2": "Configura a _pilha_ atualmente _presente_ como parte da Frequência a ouvir. Quando um _Conexão_ de _Redstone_ transmissor da mesma frequência é ligado, esse Extrator irá parar.", + + "block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", + "block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active", + "block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.", + "block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space", + "block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.", + + "block.create.funnel.tooltip": "FUNIL DE ESTEIRA", + "block.create.funnel.tooltip.summary": "Coleta itens passando numa _Esteira_ _Mecânica_ e os insere no _Inventário_ conetado, se possível. Precisa estar diretamente _sobre_ uma Esteira, com a abertura virada contra o movimento da Esteira. O inventário precisa estar na mesma altura que o funil.", + "block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling", + "block.create.funnel.tooltip.behaviour1": "UNLOCALIZED: Funnels can pull items _from_ _belts_ when placed above them, either sideways or at the end. When a side-ways funnel is backed up, items on the _belt_ _will_ _not_ _stall_.", + + "block.create.belt_tunnel.tooltip": "UNLOCALIZED: BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "UNLOCALIZED: An aesthetic option for running your _Mechanical_ _Belts_ through walls. Belts have to be reinforced with _Brass_ _Casing_. Tunnels can _synchronize_ with _their_ _neighbours_, only letting items pass if all tunnels in the group have one waiting. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Front", + "block.create.belt_tunnel.tooltip.action1": "UNLOCALIZED: Toggles _synchronized_ _behaviour_. Synchronized tunnels hold items until their neighbours have an item as well.", + "block.create.belt_tunnel.tooltip.control2": "UNLOCALIZED: R-Click with Wrench on Side", + "block.create.belt_tunnel.tooltip.action2": "UNLOCALIZED: _Adjusts_ _window_ _shutters_ if the tunnel has a window on that face.", + + "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", + "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration.", + "block.create.brass_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", + "block.create.brass_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a brass foundation. Reinforced Belts can support _Belt_ _Tunnels_, _Extractors_, _Funnels_, and _Transposers_ interacting with the belt from the sides and below.", + + "block.create.belt_observer.tooltip": "OBSERVADOR DE ESTEIRA", + "block.create.belt_observer.tooltip.summary": "Detecta os itens passando numa _Esteira_ _Mecânica_ a sua frente. Funciona bem com um _Pistão_ em cima, empurrando certos itens.", + "block.create.belt_observer.tooltip.condition1": "Quando item bate com Filtro", + "block.create.belt_observer.tooltip.behaviour1": "Provê um _Pulso_ curto de _Redstone_ para todos os lados. Um Filtro vazio considera todos os itens passando.", + "block.create.belt_observer.tooltip.condition2": "UNLOCALIZED: Pulse Mode", + "block.create.belt_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _pulse_ when a _matching_ _item_ _passes_ the center of the observed belt segment.", + "block.create.belt_observer.tooltip.condition3": "UNLOCALIZED: Eject Mode", + "block.create.belt_observer.tooltip.behaviour3": "UNLOCALIZED: _Ejects_ _matching_ _items_ off the side. If the target belt or space is _occupied_, the item will be _held_ _in_ _place_.", + "block.create.belt_observer.tooltip.condition4": "UNLOCALIZED: Split Mode", + "block.create.belt_observer.tooltip.behaviour4": "UNLOCALIZED: _Splits_ a _matching_ _item_ _stack_ and _ejects_ _half_ of it off the side.", + + "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO", + "block.create.pulse_repeater.tooltip.summary": "Um circuito simples para cortar pulsos de Redstone até um comprimento de _1_ _tick._", + + "block.create.adjustable_repeater.tooltip": "REPETIDOR FLEX", + "block.create.adjustable_repeater.tooltip.summary": "Um um _Repetidor_ de _Redstone_ avançado com um _Delay_ _configurável_ de até 30 Minutos.", + + "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.", + + "block.create.analog_lever.tooltip": "UNLOCALIZED: ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "UNLOCALIZED: A lever with more _precise_ _control_ over its emitted _signal_ _strength_.", + + "block.create.powered_toggle_latch.tooltip": "UNLOCALIZED: POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "UNLOCALIZED: A lever that can be toggled by a _Redstone_ _Pulse_.", + + "block.create.powered_latch.tooltip": "UNLOCALIZED: POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "UNLOCALIZED: A lever that can be controlled by _Redstone_ _Signals_. A signal on the _back_ _enables_ it, a signal from the _side_ _will_ _reset_ it.", + + "block.create.speedometer.tooltip": "UNLOCALIZED: SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _rotational_ _speed_ of attached kinetic components. Supports _Redstone_ _Comparators_.", + "block.create.speedometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.speedometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", + + "block.create.stressometer.tooltip": "UNLOCALIZED: STRESSOMETER", + "block.create.stressometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _overall_ _stress_ of the attached kinetic network. Supports _Redstone_ _Comparators_.", + "block.create.stressometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.stressometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of stress. _Over-stressed_ _networks_ will cease to move. Stress can be relieved by adding more _rotational_ _sources_ to the network.", + + "tool.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", + "tool.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", + "tool.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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "UNLOCALIZED: REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "UNLOCALIZED: A Chromatic material forged from _absorbed_ _light_.", + + "item.create.shadow_steel.tooltip": "UNLOCALIZED: SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "UNLOCALIZED: A Chromatic material forged _in_ _the_ _void_.", + + "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.", + + "create.tooltip.wip": "UNLOCALIZED: WIP", + "create.tooltip.workInProgress": "UNLOCALIZED: Work in progress!", + "create.tooltip.randomWipDescription0": "UNLOCALIZED: Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "UNLOCALIZED: A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "UNLOCALIZED: Use at your own risk.", + "create.tooltip.randomWipDescription3": "UNLOCALIZED: This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "UNLOCALIZED: This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "UNLOCALIZED: Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "UNLOCALIZED: By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json new file mode 100644 index 000000000..cf9239c4f --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 782", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_crate": "Гибкий ящик", + "block.create.adjustable_pulley": "UNLOCALIZED: Adjustable Pulley", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "Настраиваемый повторитель", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "Андезитовые кирпичи", + "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", + "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", + "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", + "block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", + "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", + "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", + "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "UNLOCALIZED: Basin", + "block.create.belt": "Механическая лента", + "block.create.belt_observer": "Ленточный сканер", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "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.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", + "block.create.clutch": "Переключаемая муфта", + "block.create.cogwheel": "Шестерня", + "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.creative_crate": "Креативный ящик", + "block.create.creative_motor": "UNLOCALIZED: Creative Motor", + "block.create.crushing_wheel": "Дробильное колесо", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", + "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "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.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "Диоритовые кирпичи", + "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.dolomite": "Доломит", + "block.create.dolomite_bricks": "Доломитовые кирпичи", + "block.create.dolomite_bricks_slab": "Плита из доломитового кирпича", + "block.create.dolomite_bricks_stairs": "Ступеньки из доломитового кирпича", + "block.create.dolomite_bricks_wall": "Ограда из доломитового кирпича", + "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_pillar": "Доломитовая колонна", + "block.create.encased_belt": "Ленточный привод", + "block.create.encased_fan": "Вентилятор", + "block.create.encased_shaft": "Вальный привод", + "block.create.extractor": "Экстрактор", + "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.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", + "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", + "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", + "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", + "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", + "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", + "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", + "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", + "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", + "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", + "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", + "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", + "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", + "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", + "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", + "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", + "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", + "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", + "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", + "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", + "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", + "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", + "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", + "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", + "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", + "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", + "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.flywheel": "UNLOCALIZED: Flywheel", + "block.create.framed_glass": "UNLOCALIZED: Framed Glass", + "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", + "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", + "block.create.gabbro": "Габбро", + "block.create.gabbro_bricks": "Габбровые кирпичи", + "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", + "block.create.gabbro_bricks_stairs": "Ступеньки из габбрового кирпича", + "block.create.gabbro_bricks_wall": "Ограда из габбрового кирпича", + "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", + "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", + "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.gearbox": "Муфта", + "block.create.gearshift": "Реверсивная муфта", + "block.create.granite_bricks": "Гранитные кирпичи", + "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", + "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", + "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", + "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", + "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", + "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", + "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", + "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", + "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.jungle_window": "UNLOCALIZED: Jungle Window", + "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_cogwheel": "Большая шестерня", + "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", + "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", + "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", + "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", + "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", + "block.create.layered_granite": "UNLOCALIZED: Layered Granite", + "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", + "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", + "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.limesand": "Известь", + "block.create.limestone": "Известняк", + "block.create.limestone_bricks": "Известковые кирпичи", + "block.create.limestone_bricks_slab": "Плита из известкового кирпича", + "block.create.limestone_bricks_stairs": "Ступеньки из известкового кирпича", + "block.create.limestone_bricks_wall": "Ограда из известкового кирпича", + "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", + "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", + "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", + "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_pillar": "Известняковая колонна", + "block.create.linear_chassis": "Поступательная рама", + "block.create.linked_extractor": "Сигнальный экстрактор", + "block.create.linked_transposer": "UNLOCALIZED: Linked Transposer", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "Механический подшипник", + "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", + "block.create.mechanical_drill": "Механический бур", + "block.create.mechanical_harvester": "Механический комбайнер", + "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", + "block.create.mechanical_piston": "Механический поршень", + "block.create.mechanical_piston_head": "Ствол механического поршня", + "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_press": "Механический пресс", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", + "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", + "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", + "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", + "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", + "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", + "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", + "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", + "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", + "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", + "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", + "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.natural_scoria": "UNLOCALIZED: Natural Scoria", + "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", + "block.create.nozzle": "UNLOCALIZED: Nozzle", + "block.create.oak_window": "UNLOCALIZED: Oak Window", + "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", + "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", + "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", + "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", + "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", + "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", + "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", + "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", + "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", + "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", + "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", + "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", + "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", + "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", + "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", + "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", + "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", + "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", + "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", + "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", + "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", + "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", + "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", + "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", + "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", + "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", + "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", + "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", + "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", + "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", + "block.create.paved_granite": "UNLOCALIZED: Paved Granite", + "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", + "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", + "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", + "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", + "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", + "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", + "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", + "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", + "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", + "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", + "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", + "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", + "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", + "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", + "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.piston_extension_pole": "Удлинитель поршня", + "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", + "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", + "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", + "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dolomite": "Полированный доломит", + "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", + "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", + "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", + "block.create.polished_gabbro": "Полированный габбро", + "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", + "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", + "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_limestone": "Полированный известняк", + "block.create.polished_limestone_slab": "Плита из полированного известняка", + "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", + "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", + "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", + "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", + "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", + "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", + "block.create.polished_weathered_limestone": "Полированный обветренный известняк", + "block.create.polished_weathered_limestone_slab": "Плита из полированного обветренного известняка", + "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", + "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", + "block.create.portable_storage_interface": "UNLOCALIZED: Portable Storage Interface", + "block.create.powered_latch": "UNLOCALIZED: Powered Latch", + "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", + "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", + "block.create.pulse_repeater": "Повторитель импульса", + "block.create.radial_chassis": "Поворотная рама", + "block.create.redstone_contact": "Контактное соединение", + "block.create.redstone_link": "Сигнальное соединение", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "UNLOCALIZED: Rope", + "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", + "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.schematic_table": "Стол для схем", + "block.create.schematicannon": "Схемопушка", + "block.create.scoria": "UNLOCALIZED: Scoria", + "block.create.scoria_bricks": "UNLOCALIZED: Scoria Bricks", + "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", + "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", + "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", + "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", + "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", + "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", + "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", + "block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar", + "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", + "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", + "block.create.shaft": "Вал", + "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spruce_window": "UNLOCALIZED: Spruce Window", + "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticky_mechanical_piston": "Липкий механический поршень", + "block.create.stockpile_switch": "Коммутатор хранилища", + "block.create.stressometer": "UNLOCALIZED: Stressometer", + "block.create.tiled_glass": "Плиточное стекло", + "block.create.tiled_glass_pane": "Плиточная стеклянная панель", + "block.create.transposer": "UNLOCALIZED: Transposer", + "block.create.turntable": "Поворотный стол", + "block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor", + "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", + "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", + "block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor", + "block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer", + "block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer", + "block.create.water_wheel": "Водяное колесо", + "block.create.weathered_limestone": "Обветренный известняк", + "block.create.weathered_limestone_bricks": "Кирпичи из обветренного известняка", + "block.create.weathered_limestone_bricks_slab": "Плита из кирпича из обветренного известняка", + "block.create.weathered_limestone_bricks_stairs": "Ступеньки из кирпича из обветренного известняка", + "block.create.weathered_limestone_bricks_wall": "Ограда из кирпича из обветренного известняка", + "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", + "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", + "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", + "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", + "block.create.weathered_limestone_pillar": "Колонна из обветренного известняка", + "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", + "item.create.belt_connector": "Механическая лента", + "item.create.brass_hand": "UNLOCALIZED: Brass Hand", + "item.create.brass_ingot": "UNLOCALIZED: Brass Ingot", + "item.create.brass_nugget": "UNLOCALIZED: Brass Nugget", + "item.create.brass_sheet": "UNLOCALIZED: Brass Sheet", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", + "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", + "item.create.deforester": "UNLOCALIZED: Deforester", + "item.create.dough": "Тесто", + "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_schematic": "Пустая схема", + "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.filter": "Фильтр", + "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", + "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", + "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", + "item.create.handheld_blockzapper": "Портативный размещатель блоков", + "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", + "item.create.iron_sheet": "Железная пластина", + "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.propeller": "Пропеллер", + "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", + "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", + "item.create.rose_quartz": "Розовый Кварц", + "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.schematic": "Схема", + "item.create.schematic_and_quill": "Схема и перо", + "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", + "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.tree_fertilizer": "Удобрение для деревьев", + "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", + "item.create.wand_of_symmetry": "Посох симметрии", + "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.whisk": "UNLOCALIZED: Whisk", + "item.create.wrench": "UNLOCALIZED: Wrench", + "item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", + "item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "UNLOCALIZED: Welcome to Create", + "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", + "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", + "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", + "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", + "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", + "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gear", + "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a large to a small cogwheel allowing you to change the speed of your contraption.", + "advancement.create.overstressed": "UNLOCALIZED: Overstressed", + "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", + "advancement.create.belt": "UNLOCALIZED: Convey it all", + "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", + "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", + "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", + "advancement.create.goggles": "UNLOCALIZED: Stress-o-vision", + "advancement.create.goggles.desc": "UNLOCALIZED: Create some goggles to aid you in getting more kinetic information for components.", + "advancement.create.speedometer": "UNLOCALIZED: But how fast exactly?", + "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", + "advancement.create.stressometer": "UNLOCALIZED: But how stressed exactly?", + "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", + "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", + "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", + "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", + "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", + "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", + "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone", + "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", + "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", + "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary breakers", + "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_drill", + "advancement.create.press": "UNLOCALIZED: Press goes 'Bonk!'", + "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Plates.", + "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", + "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", + "advancement.create.electron_tube": "UNLOCALIZED: Beep boop", + "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", + "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", + "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical mechanical_saw", + "advancement.create.basin": "UNLOCALIZED: Basin Operation", + "advancement.create.basin.desc": "UNLOCALIZED: Place a basin and try throwing items into it.", + "advancement.create.mixer": "UNLOCALIZED: Mixin' it Up", + "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", + "advancement.create.compact": "UNLOCALIZED: Automated Compacting", + "advancement.create.compact.desc": "UNLOCALIZED: Use a press and a basin to compact some items.", + "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", + "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", + "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", + "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", + "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", + "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", + "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", + "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some copper sheets to create Copper Casing.", + "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", + "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters", + "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", + "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "UNLOCALIZED: Pound It, Bro!", + "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", + "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", + "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", + "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", + "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", + "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", + "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", + "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", + "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", + "advancement.create.zapper": "UNLOCALIZED: Building with style", + "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", + "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", + "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", + "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", + "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", + "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", + "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", + "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", + "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", + "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", + "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", + "advancement.create.eob": "UNLOCALIZED: End of Beta", + "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "UNLOCALIZED: Create", + "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + + "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 был проколот механическим буром", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "Дробление", + "create.recipe.milling": "UNLOCALIZED: 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.pressing": "Механический пресс", + "create.recipe.mixing": "UNLOCALIZED: Mixing", + "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.mechanical_sawing": "UNLOCALIZED: mechanical_sawing", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.blockzapper_upgrade": "Портативный размещатель блоков", + "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", + "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", + "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.processing.chance": "%1$s%% шанс выпадения", + "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", + + "create.generic.range": "Зона", + "create.generic.radius": "Радиус", + "create.generic.width": "UNLOCALIZED: Width", + "create.generic.height": "UNLOCALIZED: Height", + "create.generic.length": "UNLOCALIZED: Length", + "create.generic.speed": "Скорость", + "create.generic.delay": "Задержка", + "create.generic.unit.ticks": "тик", + "create.generic.unit.seconds": "сек", + "create.generic.unit.minutes": "мин", + "create.generic.unit.rpm": "UNLOCALIZED: RPM", + "create.generic.unit.stress": "UNLOCALIZED: su", + "create.generic.unit.degrees": "UNLOCALIZED: °", + + "create.action.scroll": "КолМыши", + "create.action.confirm": "Подтвердить", + "create.action.abort": "Отменить", + "create.action.saveToFile": "Сохранить", + "create.action.discard": "Сбросить", + + "create.keyinfo.toolmenu": "Фокусировка меню иструментов", + "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "Выберите:", + "create.gui.scrollInput.scrollToModify": "КолМыши, чтобы изменить", + "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", + "create.gui.scrollInput.scrollToSelect": "КолМыши, чтобы выделить", + "create.gui.scrollInput.shiftScrollsFaster": "Зажмите Shift, чтобы прокручивать быстрее", + "create.gui.toolmenu.focusKey": "Зажмите [%1$s], чтобы сфокусироваться", + "create.gui.toolmenu.cycle": "[КолМыши] , чтобы выбрать", + "create.gui.symmetryWand.mirrorType": "Зеркало", + "create.gui.symmetryWand.orientation": "Ориентация", + + "create.symmetry.mirror.plane": "Линейно", + "create.symmetry.mirror.doublePlane": "Прямоугольно", + "create.symmetry.mirror.triplePlane": "Восьмиугольно", + + "create.orientation.orthogonal": "Перпендикулярно", + "create.orientation.diagonal": "Диагонально", + "create.orientation.horizontal": "Горизонтально", + "create.orientation.alongZ": "По оси Z", + "create.orientation.alongX": "По оси X", + + "create.gui.blockzapper.title": "Порт. размещ. блоков", + "create.gui.blockzapper.replaceMode": "Режим замены", + "create.gui.blockzapper.searchDiagonal": "Следовать диагоналям", + "create.gui.blockzapper.searchFuzzy": "Игнорировать материальные границы", + "create.gui.blockzapper.range": "Радиус", + "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", + "create.gui.blockzapper.patternSection": "Шаблоны", + "create.gui.blockzapper.pattern.solid": "Сплошной", + "create.gui.blockzapper.pattern.checkered": "Шахматная доска", + "create.gui.blockzapper.pattern.inversecheckered": "Обратная шахматная доска", + "create.gui.blockzapper.pattern.chance25": "25% покрытия", + "create.gui.blockzapper.pattern.chance50": "50% покрытия", + "create.gui.blockzapper.pattern.chance75": "75% покрытия", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", + "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", + "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", + "create.gui.terrainzapper.placement.inserted": "UNLOCALIZED: Inserted", + "create.gui.terrainzapper.brush": "UNLOCALIZED: Brush", + "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", + "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", + "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", + "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", + "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", + "create.gui.terrainzapper.tool.replace": "UNLOCALIZED: Replace", + "create.gui.terrainzapper.tool.clear": "UNLOCALIZED: Clear", + "create.gui.terrainzapper.tool.overlay": "UNLOCALIZED: Overlay", + "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", + + "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", + + "create.blockzapper.usingBlock": "Материал: %1$s", + "create.blockzapper.componentUpgrades": "Улучшения компонентов:", + "create.blockzapper.component.body": "Корпус", + "create.blockzapper.component.amplifier": "Усилитель", + "create.blockzapper.component.accelerator": "Ускоритель", + "create.blockzapper.component.retriever": "Коллектор", + "create.blockzapper.component.scope": "Прицел", + "create.blockzapper.componentTier.none": "Ничего", + "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", + "create.blockzapper.leftClickToSet": "ЛКМ на блок, чтобы выбрать материал", + "create.blockzapper.empty": "Закончились блоки!", + + "create.contraptions.movement_mode": "UNLOCALIZED: Movement Mode", + "create.contraptions.movement_mode.move_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.move_place_returned": "UNLOCALIZED: Place only in Starting Position", + "create.contraptions.movement_mode.move_never_place": "UNLOCALIZED: Place only when Anchor Destroyed", + "create.contraptions.movement_mode.rotate_place": "UNLOCALIZED: Always Place when Stopped", + "create.contraptions.movement_mode.rotate_place_returned": "UNLOCALIZED: Only Place near Initial Angle", + "create.contraptions.movement_mode.rotate_never_place": "UNLOCALIZED: Only Place when Anchor Destroyed", + "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", + "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", + "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", + "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + + "create.logistics.filter": "Фильтр", + "create.logistics.firstFrequency": "Част. #1", + "create.logistics.secondFrequency": "Част. #2", + + "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", + "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", + "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", + "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", + "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", + "create.gui.stressometer.capacity": "UNLOCALIZED: Remaining Capacity", + "create.gui.stressometer.overstressed": "UNLOCALIZED: Overstressed", + "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", + "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.adjustable_crate.title": "Гибкий ящик", + "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.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", + "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", + "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", + "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", + "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", + "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", + "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", + "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", + + "create.schematicAndQuill.dimensions": "Размер схемы: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Первая позиция установлена.", + "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", + "create.schematicAndQuill.noTarget": "Зажмите [Ctrl], чтобы выделять блоки воздуха.", + "create.schematicAndQuill.abort": "Выделение удалено.", + "create.schematicAndQuill.prompt": "Введите название для новой схемы:", + "create.schematicAndQuill.fallbackName": "Моя схема", + "create.schematicAndQuill.saved": "Сохранено как %1$s", + + "create.schematic.invalid": "[!] Недействительный предмет - используйте стол для схем", + "create.schematic.position": "Позиция", + "create.schematic.rotation": "Вращение", + "create.schematic.rotation.none": "Ничего", + "create.schematic.rotation.cw90": "90° по часовой", + "create.schematic.rotation.cw180": "180° по часовой", + "create.schematic.rotation.cw270": "270° по часовой", + "create.schematic.mirror": "Отразить", + "create.schematic.mirror.none": "Ничего", + "create.schematic.mirror.frontBack": "Перед-зад", + "create.schematic.mirror.leftRight": "Лево-право", + "create.schematic.tool.deploy": "Разместить", + "create.schematic.tool.move": "Сдвиг по XZ", + "create.schematic.tool.movey": "Сдвиг по Y", + "create.schematic.tool.rotate": "Повернуть", + "create.schematic.tool.print": "Напечатать", + "create.schematic.tool.flip": "Отразить", + "create.schematic.tool.deploy.description.0": "Размещает конструкцию.", + "create.schematic.tool.deploy.description.1": "ПКМ на земле для размещения.", + "create.schematic.tool.deploy.description.2": "Зажмите [Ctrl] для перемещения на фикс. дистанции.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-КолМыши для изменения дистанции.", + "create.schematic.tool.move.description.0": "Сдвигает схему по горизонтали", + "create.schematic.tool.move.description.1": "Смотрите на схему и [CTRL]-КолМыши для сдвига.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Сдвигает схему по вертикали", + "create.schematic.tool.movey.description.1": "[CTRL]-КолМыши для сдвига вверх/вниз", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Вращает схему вокруг центра.", + "create.schematic.tool.rotate.description.1": "[CTRL]-КолМыши для поворота на 90°", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Моментально размещает структуру в мире", + "create.schematic.tool.print.description.1": "[ПКМ] для размещения в текущем месте.", + "create.schematic.tool.print.description.2": "Только для креативного режима.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Отражает схему вдоль выбранной стороны.", + "create.schematic.tool.flip.description.1": "Смотрите на схему и [CTRL]-КолМыши для отражения.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Синхронизация...", + "create.schematics.uploadTooLarge": "Схема слишком большая", + "create.schematics.maxAllowedSize": "Максимальный размер файла схемы:", + + "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": "C запасом: %1$s", + "create.gui.schematicannon.optionEnabled": "Включена", + "create.gui.schematicannon.optionDisabled": "Отключена", + "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.option.skipMissing.description": "Если схемопушка не найдёт нужный блок, то она продолжит в следующем месте.", + "create.gui.schematicannon.option.skipTileEntities.description": "Схемопушка будет избегать замены блоков с данными, например сундуки.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Схемопушка никогда не заменит целые блоки, только не целые и воздух.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Схемопушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", + "create.gui.schematicannon.option.replaceWithAny.description": "Схемопушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Схемопушка отчистит все блоки, включая замену на воздух.", + + "create.schematicannon.status.idle": "Бездействует", + "create.schematicannon.status.ready": "Готова", + "create.schematicannon.status.running": "Работает", + "create.schematicannon.status.finished": "Закончила", + "create.schematicannon.status.paused": "Приостановлена", + "create.schematicannon.status.stopped": "Остановлена", + "create.schematicannon.status.noGunpowder": "Кончился порох", + "create.schematicannon.status.targetNotLoaded": "Блок не загружен", + "create.schematicannon.status.targetOutsideRange": "Цель слишком далеко", + "create.schematicannon.status.searching": "Поиск", + "create.schematicannon.status.skipping": "Пропуск", + "create.schematicannon.status.missingBlock": "Нет блока:", + "create.schematicannon.status.placing": "Размещение", + "create.schematicannon.status.clearing": "Отчистка", + "create.schematicannon.status.schematicInvalid": "Схема недействительна", + "create.schematicannon.status.schematicNotPlaced": "Схема не размещена", + "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", + + "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", + "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", + "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", + "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", + "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", + "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", + + "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", + "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", + "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", + + "create.tooltip.holdKey": "Зажмите [%1$s]", + "create.tooltip.holdKeyOrKey": "Зажмите [%1$s] или [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "UNLOCALIZED: Speed Requirement: %1$s", + "create.tooltip.speedRequirement.none": "UNLOCALIZED: None", + "create.tooltip.speedRequirement.medium": "UNLOCALIZED: Moderate", + "create.tooltip.speedRequirement.high": "UNLOCALIZED: Fast", + "create.tooltip.stressImpact": "UNLOCALIZED: Stress Impact: %1$s", + "create.tooltip.stressImpact.low": "UNLOCALIZED: Low", + "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", + "create.tooltip.stressImpact.high": "UNLOCALIZED: High", + "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", + "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", + "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", + "create.tooltip.capacityProvided.high": "UNLOCALIZED: Large", + "create.tooltip.capacityProvided.asGenerator": "UNLOCALIZED: (As Generator)", + "create.tooltip.generationSpeed": "UNLOCALIZED: Generates at %1$s %2$s", + "create.tooltip.analogStrength": "UNLOCALIZED: Analog Strength: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "UNLOCALIZED: Min. Ingredients", + + "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.command.killTPSCommand": "UNLOCALIZED: killtps", + "create.command.killTPSCommand.status.slowed_by.0": "UNLOCALIZED: [Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "UNLOCALIZED: [Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "UNLOCALIZED: [Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "UNLOCALIZED: [Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", + "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", + + + "_": "->------------------------] 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.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", + "item.create.wand_of_symmetry.tooltip.condition1": "На панели быстрого доступа", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Остаётся активным", + "item.create.wand_of_symmetry.tooltip.control1": "ПКМ на землю", + "item.create.wand_of_symmetry.tooltip.action1": "_Создаёт_ или _Перемещает_ зеркало", + "item.create.wand_of_symmetry.tooltip.control2": "ПКМ в воздух", + "item.create.wand_of_symmetry.tooltip.action2": "_Убирает_ зеркало", + "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадясь", + "item.create.wand_of_symmetry.tooltip.action3": "Открывает _Меню_ _настройки_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "Новейшее устройство для размещения или замены блоков на расстоянии.", + "item.create.handheld_blockzapper.tooltip.control1": "ЛКМ на блок", + "item.create.handheld_blockzapper.tooltip.action1": "Устанавливает выбранный блок как материал.", + "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", + "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", + "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_blockzapper.tooltip.action3": "Открывает _Меню_ _настройки_", + + "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain_ _features_.", + "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", + "item.create.handheld_worldshaper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_worldshaper.tooltip.control2": "UNLOCALIZED: R-Click at Block", + "item.create.handheld_worldshaper.tooltip.action2": "UNLOCALIZED: Applies the currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration_ _Interface_", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "Сильная смесь минералов, подходящая обычным видам деревьев.", + "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", + "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья независимо от свободного пространства", + + "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", + "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant_ _axe_ able to chop down trees in a split second.", + + "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "UNLOCALIZED: FILTER", + "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.", + "item.create.filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.attribute_filter.tooltip": "UNLOCALIZED: ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ item _attributes_ and _categories_.", + "item.create.attribute_filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", + "item.create.attribute_filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip.summary": "Используется для крафта и записи в _Столе_ _для_ _схем._", + + "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip.summary": "Хранит структуру для размещения. Расположите голограмму и используйте _Схемопушку_ для построения голограммы.", + "item.create.schematic.tooltip.condition1": "Когда в руке", + "item.create.schematic.tooltip.behaviour1": "Может быть размещена с помошью инструментов на экране", + "item.create.schematic.tooltip.control1": "ПКМ крадясь", + "item.create.schematic.tooltip.action1": "Открывает _Меню_ для ввода точных _Координат._", + + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в .nbt файл.", + "item.create.schematic_and_quill.tooltip.condition1": "Шаг 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две точки с помощью ПКМ", + "item.create.schematic_and_quill.tooltip.condition2": "Шаг 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-КолМыши_ на сторону для изменения размера. ПКМ еще раз для сохранения.", + "item.create.schematic_and_quill.tooltip.control1": "ПКМ", + "item.create.schematic_and_quill.tooltip.action1": "Выбрать точку / Сохранить", + "item.create.schematic_and_quill.tooltip.control2": "С зажатым Ctrl", + "item.create.schematic_and_quill.tooltip.action2": "Выбрать точки в _воздухе._ _КолМыши_ для изменения расстояния.", + "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадясь", + "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _Удаляет_ выделение.", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "Стреляет блоками для воссоздания размещенной _Схемы._ Использует блоки из соседних инвентарей и _Порох_ в качестве топлива.", + "block.create.schematicannon.tooltip.control1": "ПКМ по пушке", + "block.create.schematicannon.tooltip.action1": "Открывает _Меню_", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схемы на _Пустые_ _схемы._", + "block.create.schematic_table.tooltip.condition1": "Если положить пустую схему.", + "block.create.schematic_table.tooltip.behaviour1": "Записывает выбранный файл из папки со схемами", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": "_Передаёт_ _вращение_ по прямой и к присоеденённым _Шестерням._", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "Увеличенная версия _Шестерни,_ позволяющая _изменять_ _скорость_ _вращения_ при соединении с меньшим аналогом.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой. Подходит для передачи вращения через стены.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", + + "item.create.vertical_gearbox.tooltip": "UNLOCALIZED: VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ in _four_ _directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", + "block.create.gearshift.tooltip.condition1": "Когда запитан", + "block.create.gearshift.tooltip.behaviour1": "_Реверсирует_ выходящее _вращение._", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", + "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.adjustable_pulley.tooltip": "UNLOCALIZED: ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ through its block and to attached _Encased_ _Belts_. Attached encased belts will _rotate_ _faster_ based on the _analog_ _redstone_ _signal_ this block receives.", + "block.create.adjustable_pulley.tooltip.condition1": "UNLOCALIZED: Redstone Control", + "block.create.adjustable_pulley.tooltip.behaviour1": "UNLOCALIZED: Without a signal, it will _not_ _speed_ _up_ connected belts. With a full strength signal connected belt, speed _doubles_.", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _Механической_ _ленты._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _Конвейер_ для _Существ._", + "item.create.belt_connector.tooltip.control1": "ПКМ по валу", + "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива ленты. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению ленты.", + "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", + "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для ленты.", + + "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", + "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic_ _information_.", + "item.create.goggles.tooltip.condition1": "UNLOCALIZED: When worn", + "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored_ _indicators_ corresponding to the _Speed_ _Level_ of a placed kinetic component as well as _Stress_ _Impact_ and _Capacity_ of individual components.", + "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", + "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + + "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", + "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", + "item.create.wrench.tooltip.control1": "UNLOCALIZED: Right-Click a kinetic block", + "item.create.wrench.tooltip.action1": "UNLOCALIZED: _Rotates_ _components_ toward or away from the face with which you interacted.", + "item.create.wrench.tooltip.control2": "UNLOCALIZED: R-Click while Sneaking", + "item.create.wrench.tooltip.action2": "UNLOCALIZED: _Disassembles_ _Kinetic_ _components_ and places them back in _your_ _inventory_.", + + "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational_ _Force_.", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "Предоставляет _силу_ _вращения_ из смежных _источников_ _воды._", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "Преобразовывает _силу_ _вращения_ в _воздушный_ _поток_ и обратно. Имеет множество применений.", + "block.create.encased_fan.tooltip.condition1": "При нахождении над огнём", + "block.create.encased_fan.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ (должен стоять вертикально)", + "block.create.encased_fan.tooltip.condition2": "При вращении", + "block.create.encased_fan.tooltip.behaviour2": "_Толкает_ существ с одной стороны, _притягивает_ с другой. Сила и скорость зависят от входящего вращения.", + "block.create.encased_fan.tooltip.condition3": "Когда воздух проходит через специальные блоки", + "block.create.encased_fan.tooltip.behaviour3": "Обрабатывает предметы перед блоком: _вода_ моет, _огонь_ коптит, _лава_ плавит.", + + "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", + "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased_ _Fan_ to distribute its effect on Entities in _all_ _directions_.", + + "block.create.hand_crank.tooltip": "UNLOCALIZED: HAND CRANK", + "block.create.hand_crank.tooltip.summary": "UNLOCALIZED: A simple _source_ of _Rotational_ _Force_ that requires the interaction of players.", + "block.create.hand_crank.tooltip.condition1": "UNLOCALIZED: When Used", + "block.create.hand_crank.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + + "block.create.cuckoo_clock.tooltip": "UNLOCALIZED: CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "UNLOCALIZED: Fine craftsmanship for _decorating_ a space and _keeping_ _track_ _of_ _time_.", + "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current_ _time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players_ _can_ _sleep_.", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "Преобразует _силу_ _вращения_ прямиком в морскую болезнь.", + + "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", + "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "Большие вращающиеся колеса, которые _дробят_ всё, что мешает их движению.", + "block.create.crushing_wheel.tooltip.condition1": "При присоеденении к другому дробильному колесу", + "block.create.crushing_wheel.tooltip.behaviour1": "Формирует дробильную установку для обработки различных вещей. Зубцы колёс должны соединяться и двигаться с _одинаковой_ _скоростью_ в _противоположных_ _направлениях._", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "Мощный поршень для спрессовывания предметов под ним. Требуется постоянная _сила_ _вращения._", + "block.create.mechanical_press.tooltip.condition1": "Когда запитан", + "block.create.mechanical_press.tooltip.behaviour1": "_Начинает_ спрессовывать предметы под ним.", + "block.create.mechanical_press.tooltip.condition2": "При нахождении над механической лентой", + "block.create.mechanical_press.tooltip.behaviour2": "_Автоматически_ спрессовывает проходящие по ленте предметы.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "UNLOCALIZED: BASIN", + "block.create.basin.tooltip.summary": "UNLOCALIZED: A handy _item_ _container_ used in processing with the _Mechanical_ _Mixer_ and the _Mechanical_ _Press_. Supports _Redstone_ _Comparators_.", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "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.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.", + "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", + "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + + "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", + "block.create.mechanical_crafter.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.mechanical_crafter.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _the_ _crafting_ _process_ as soon as _all_ _crafters_ in the grid have been _given_ _an_ _item_.", + "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "UNLOCALIZED: When Wrenched at Front", + "block.create.mechanical_crafter.tooltip.action1": "UNLOCALIZED: _Cycles_ _the_ _direction_ an individual crafter _moves_ _its_ _items_ towards. To form a working grid, _arrange_ _the_ _belts_ _in_ _a_ _flow_ which moves all items towards a final crafter. The final crafter must _point_ _away_ from the grid.", + "block.create.mechanical_crafter.tooltip.control2": "UNLOCALIZED: When Wrenched at back", + "block.create.mechanical_crafter.tooltip.action2": "UNLOCALIZED: _Connects_ the _input_ _inventory_ of adjacent crafters. Use this to _combine_ _slots_ in the crafting grid and _save_ _on_ _input_ _work_.", + + "block.create.furnace_engine.tooltip": "UNLOCALIZED: FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "UNLOCALIZED: A powerful source of _Rotational_ _Power_ that requires a _running_ _furnace_ to work.", + "block.create.furnace_engine.tooltip.condition1": "UNLOCALIZED: When Attached to Lit Furnace", + "block.create.furnace_engine.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + + "block.create.flywheel.tooltip": "UNLOCALIZED: FLYWHEEL", + "block.create.flywheel.tooltip.summary": "UNLOCALIZED: A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", + "block.create.flywheel.tooltip.condition1": "UNLOCALIZED: When Attached to Running Engine", + "block.create.flywheel.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", + + "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", + "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + + "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", + "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", + "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached_ _on_ _top_ of the controller.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "Более продвинутая версия _Поршня,_ использующая _силу_ _вращения_ для более точного перемещения присоединенных конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без удлинителей поршень не будет двигаться. Используйте _Поступательную_ _раму_ для перемещения более чем одной линии блоков.", + "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": "При присоеденении к механическому поршню", + "block.create.piston_extension_pole.tooltip.behaviour1": "Увеличивает длину поршня на 1 блок", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "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.clockwork_bearing.tooltip": "UNLOCALIZED: CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "UNLOCALIZED: An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", + "block.create.clockwork_bearing.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.clockwork_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", + + "block.create.sequenced_gearshift.tooltip": "UNLOCALIZED: SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "UNLOCALIZED: A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", + "block.create.sequenced_gearshift.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _executing_ programmed instructions based on the input speed.", + "block.create.sequenced_gearshift.tooltip.condition2": "UNLOCALIZED: When R-Clicked", + "block.create.sequenced_gearshift.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface._", + + "block.create.cart_assembler.tooltip": "UNLOCALIZED: CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "UNLOCALIZED: When _placed_ _on_ a _Rail_, adopts functionality and _assembles/disassebles_ _structures_ on passing _carts_.", + "block.create.cart_assembler.tooltip.condition1": "UNLOCALIZED: When placed above Rail", + "block.create.cart_assembler.tooltip.behaviour1": "UNLOCALIZED: _Assembles_ onto passing _carts_ _when_ _powered_, _disassembles_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", + "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", + "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "UNLOCALIZED: ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "UNLOCALIZED: Moves attached _blocks_ and _structures_ _vertically_. Use _Chassis_ or _Slime_ _Blocks_ to move more than a single block.", + "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + + "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", + "block.create.linear_chassis.tooltip.summary": "Настраиваемая основа для конструкций, перемещаемых _Механическим_ _поршнем._ Эти блоки должны формировать первый слой блоков перед поршнем.", + "block.create.linear_chassis.tooltip.condition1": "При движении механическим поршнем", + "block.create.linear_chassis.tooltip.behaviour1": "_Перемещает_ все _прикрепленные_ _рамы_ с одинаковой ориентацией, и блоки перед ним. При возврате поршня в исходное положение блоки будут втягиваться, только если лицевая сторона рамы _липкая_ (см. [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.linear_chassis.tooltip.control1": "ПКМ со сгустком слизи", + "block.create.linear_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При возвращении поршня, рама будет _втягивать_ все подсоединенные блоки в своей колонне и в пределах заданного диапазона.", + + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "Требуется для вращающихся конструкций с _Механическим_ _подшипником._", + "block.create.radial_chassis.tooltip.condition1": "При вращении с помощью подшипника", + "block.create.radial_chassis.tooltip.behaviour1": "_Поворачивает_ все блоки, прикрепленные к _липким_ сторонам (см. [Ctrl]) в пределах заданного диапазона вокруг себя. _Передает_ вращение на присоединенные поворотные рамы.", + "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.radial_chassis.tooltip.control1": "ПКМ со сгустком слизи", + "block.create.radial_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При вращении, все присоединенные блоки в пределах заданного диапазона будут вращаться вместе с ней.", + + "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", + "block.create.mechanical_drill.tooltip.summary": "Механическое устройство, пригодное для _разрушения_ _блоков._", + "block.create.mechanical_drill.tooltip.condition1": "При вращении", + "block.create.mechanical_drill.tooltip.behaviour1": "Действует как _стационарный_ разрушитель блоков. Также _наносит_ _урон_ _существам_ в рабочей области.", + "block.create.mechanical_drill.tooltip.condition2": "При движении механическим поршнем", + "block.create.mechanical_drill.tooltip.behaviour2": "Разрушает блоки, на которые наталкивается.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", + "block.create.mechanical_harvester.tooltip.summary": "Механический резак для растений, подходящий для автоматизации выращивания средних растений", + "block.create.mechanical_harvester.tooltip.condition1": "При движении механическим поршнем", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Срезает_ все _зрелые_ _посевы_ и сбрасывает их в исходное состояние роста.", + + "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "UNLOCALIZED: MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "UNLOCALIZED: Suitable for _cutting_ _trees_ effectively and for _cutting_ _blocks_ into their carpentered counterparts. It is movable using _Mechanical_ _Pistons_ or _Bearings_.", + "block.create.mechanical_saw.tooltip.condition1": "UNLOCALIZED: When facing up", + "block.create.mechanical_saw.tooltip.behaviour1": "UNLOCALIZED: Applies _Sawing_ and _Stonecutting_ _Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", + "block.create.mechanical_saw.tooltip.condition2": "UNLOCALIZED: When facing horizontally", + "block.create.mechanical_saw.tooltip.behaviour2": "UNLOCALIZED: _Breaks_ _logs_ in front of it. If the log supported a tree on its own, the _tree_ _will_ _collapse_ away from the saw.", + "block.create.mechanical_saw.tooltip.condition3": "UNLOCALIZED: While Moving", + "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", + + "block.create.stockpile_switch.tooltip": "stockpile_switch", + "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.redstone_link.tooltip": "REDSTONE LINK", + "block.create.redstone_link.tooltip.summary": "Конечные точки для _беспроводных_ соединений. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", + "block.create.redstone_link.tooltip.condition1": "Когда запитан", + "block.create.redstone_link.tooltip.behaviour1": "Получает сигнал на той же _частоте_ и выводит его.", + "block.create.redstone_link.tooltip.control1": "ПКМ с предметом", + "block.create.redstone_link.tooltip.action1": "Устанавливает _частоту_ для этого звена. Всего для определения частоты можно использовать _2_ _предмета._", + "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", + "block.create.redstone_link.tooltip.action2": "Переключение между режимами _приёма_ и _передачи._", + + "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", + "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + + "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", + "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов.", + "block.create.redstone_contact.tooltip.condition1": "Когда смотрит на другое контактное соединение", + "block.create.redstone_contact.tooltip.behaviour1": "Подаёт _сигнал_", + "block.create.redstone_contact.tooltip.condition2": "При движении механическим поршнем", + "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.control1": "ПКМ", + "block.create.adjustable_crate.tooltip.action1": "Открывает _Меню_", + + "block.create.creative_crate.tooltip": "CREATIVE CRATE", + "block.create.creative_crate.tooltip.summary": "Снабжает _Схемопушку_ бесконечным запасом блоков", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "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": "UNLOCALIZED: Active Belt pulling", + "block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.", + "block.create.extractor.tooltip.control1": "ПКМ по фильтру", + "block.create.extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Экстрактор будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_ по фильтру.", + + "block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER", + "block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", + "block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling", + "block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.", + "block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.", + + "block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER", + "block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.", + "block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.deployer.tooltip.behaviour1": "UNLOCALIZED: Extends its arm and _activates_ in the block space _2m_ _ahead_ of itself.", + "block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench", + "block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.", + + "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": "UNLOCALIZED: LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", + "block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active", + "block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.", + "block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space", + "block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.", + "block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space", + "block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.", + + "block.create.funnel.tooltip": "BELT FUNNEL", + "block.create.funnel.tooltip.summary": "Собирает входящие предметы на _Механической_ _ленте_ и по возможности кладет их в прилагаемый _инвентарь._ Должен быть непосредственно _над_ лентой, с проёмом, смотрящим против направления ленты. Инвентарь должен быть на той же высоте, что и воронка.", + "block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling", + "block.create.funnel.tooltip.behaviour1": "UNLOCALIZED: Funnels can pull items _from_ _belts_ when placed above them, either sideways or at the end. When a side-ways funnel is backed up, items on the _belt_ _will_ _not_ _stall_.", + + "block.create.belt_tunnel.tooltip": "UNLOCALIZED: BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "UNLOCALIZED: An aesthetic option for running your _Mechanical_ _Belts_ through walls. Belts have to be reinforced with _Brass_ _Casing_. Tunnels can _synchronize_ with _their_ _neighbours_, only letting items pass if all tunnels in the group have one waiting. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Front", + "block.create.belt_tunnel.tooltip.action1": "UNLOCALIZED: Toggles _synchronized_ _behaviour_. Synchronized tunnels hold items until their neighbours have an item as well.", + "block.create.belt_tunnel.tooltip.control2": "UNLOCALIZED: R-Click with Wrench on Side", + "block.create.belt_tunnel.tooltip.action2": "UNLOCALIZED: _Adjusts_ _window_ _shutters_ if the tunnel has a window on that face.", + + "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", + "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration.", + "block.create.brass_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", + "block.create.brass_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a brass foundation. Reinforced Belts can support _Belt_ _Tunnels_, _Extractors_, _Funnels_, and _Transposers_ interacting with the belt from the sides and below.", + + "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": "UNLOCALIZED: Pulse Mode", + "block.create.belt_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _pulse_ when a _matching_ _item_ _passes_ the center of the observed belt segment.", + "block.create.belt_observer.tooltip.condition3": "UNLOCALIZED: Eject Mode", + "block.create.belt_observer.tooltip.behaviour3": "UNLOCALIZED: _Ejects_ _matching_ _items_ off the side. If the target belt or space is _occupied_, the item will be _held_ _in_ _place_.", + "block.create.belt_observer.tooltip.condition4": "UNLOCALIZED: Split Mode", + "block.create.belt_observer.tooltip.behaviour4": "UNLOCALIZED: _Splits_ a _matching_ _item_ _stack_ and _ejects_ _half_ of it off the side.", + + "block.create.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "Простая схема для уменьшения времени проходящего сигнала до _1_ _тика._", + + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", + "block.create.adjustable_repeater.tooltip.summary": "Продвинутый _Повторитель_ с _настраиваемой_ _задержкой_ вплоть до 30 минут.", + + "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.", + + "block.create.analog_lever.tooltip": "UNLOCALIZED: ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "UNLOCALIZED: A lever with more _precise_ _control_ over its emitted _signal_ _strength_.", + + "block.create.powered_toggle_latch.tooltip": "UNLOCALIZED: POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "UNLOCALIZED: A lever that can be toggled by a _Redstone_ _Pulse_.", + + "block.create.powered_latch.tooltip": "UNLOCALIZED: POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "UNLOCALIZED: A lever that can be controlled by _Redstone_ _Signals_. A signal on the _back_ _enables_ it, a signal from the _side_ _will_ _reset_ it.", + + "block.create.speedometer.tooltip": "UNLOCALIZED: SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _rotational_ _speed_ of attached kinetic components. Supports _Redstone_ _Comparators_.", + "block.create.speedometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.speedometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", + + "block.create.stressometer.tooltip": "UNLOCALIZED: STRESSOMETER", + "block.create.stressometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _overall_ _stress_ of the attached kinetic network. Supports _Redstone_ _Comparators_.", + "block.create.stressometer.tooltip.condition1": "UNLOCALIZED: When Rotated", + "block.create.stressometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of stress. _Over-stressed_ _networks_ will cease to move. Stress can be relieved by adding more _rotational_ _sources_ to the network.", + + "tool.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", + "tool.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", + "tool.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.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", + "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", + "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + + "item.create.refined_radiance.tooltip": "UNLOCALIZED: REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "UNLOCALIZED: A Chromatic material forged from _absorbed_ _light_.", + + "item.create.shadow_steel.tooltip": "UNLOCALIZED: SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "UNLOCALIZED: A Chromatic material forged _in_ _the_ _void_.", + + "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.", + + "create.tooltip.wip": "UNLOCALIZED: WIP", + "create.tooltip.workInProgress": "UNLOCALIZED: Work in progress!", + "create.tooltip.randomWipDescription0": "UNLOCALIZED: Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "UNLOCALIZED: A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "UNLOCALIZED: Use at your own risk.", + "create.tooltip.randomWipDescription3": "UNLOCALIZED: This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "UNLOCALIZED: This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "UNLOCALIZED: Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "UNLOCALIZED: By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json new file mode 100644 index 000000000..b691687f8 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -0,0 +1,1376 @@ +{ + "_": "Missing Localizations: 44", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "金合欢窗户", + "block.create.acacia_window_pane": "金合欢窗户板", + "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": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_bricks": "安山岩砖", + "block.create.andesite_bricks_slab": "安山岩砖台阶", + "block.create.andesite_bricks_stairs": "安山岩砖楼梯", + "block.create.andesite_bricks_wall": "安山岩砖墙", + "block.create.andesite_casing": "安山机壳", + "block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel", + "block.create.andesite_cobblestone": "安山岩圆石", + "block.create.andesite_cobblestone_slab": "安山岩圆石台阶", + "block.create.andesite_cobblestone_stairs": "安山岩圆石楼梯", + "block.create.andesite_cobblestone_wall": "安山岩圆石墙", + "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_pillar": "竖纹安山岩", + "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.basin": "工作盆", + "block.create.belt": "传送带", + "block.create.belt_observer": "传送带侦测器", + "block.create.birch_window": "白桦窗户", + "block.create.birch_window_pane": "白桦窗户板", + "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.brass_block": "黄铜块", + "block.create.brass_casing": "黄铜机壳", + "block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel", + "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", + "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.cart_assembler": "矿车装配站", + "block.create.chiseled_dark_scoria": "錾制深色熔渣", + "block.create.chiseled_dolomite": "錾制白云岩", + "block.create.chiseled_gabbro": "錾制辉长岩", + "block.create.chiseled_limestone": "錾制石灰岩", + "block.create.chiseled_scoria": "錾制熔渣", + "block.create.chiseled_weathered_limestone": "錾制风化石灰岩", + "block.create.chute": "UNLOCALIZED: Chute", + "block.create.clockwork_bearing": "时钟轴承", + "block.create.clutch": "离合器", + "block.create.cogwheel": "齿轮", + "block.create.copper_block": "铜块", + "block.create.copper_casing": "铜机壳", + "block.create.copper_ore": "铜矿石", + "block.create.copper_shingles": "铜瓦", + "block.create.creative_crate": "创造板条箱", + "block.create.creative_motor": "创造马达", + "block.create.crushing_wheel": "粉碎轮", + "block.create.crushing_wheel_controller": "粉碎轮控制器", + "block.create.cuckoo_clock": "布谷鸟闹钟", + "block.create.dark_oak_window": "深色橡木窗户", + "block.create.dark_oak_window_pane": "深色橡木窗户板", + "block.create.dark_scoria": "深色熔渣", + "block.create.dark_scoria_bricks": "深色熔渣砖", + "block.create.dark_scoria_bricks_slab": "深色熔渣砖台阶", + "block.create.dark_scoria_bricks_stairs": "深色熔渣砖楼梯", + "block.create.dark_scoria_bricks_wall": "深色熔渣砖墙", + "block.create.dark_scoria_cobblestone": "深色熔渣圆石", + "block.create.dark_scoria_cobblestone_slab": "深色熔渣圆石台阶", + "block.create.dark_scoria_cobblestone_stairs": "深色熔渣圆石楼梯", + "block.create.dark_scoria_cobblestone_wall": "深色熔渣圆石墙", + "block.create.dark_scoria_pillar": "竖纹深色熔渣", + "block.create.deployer": "机械手", + "block.create.depot": "UNLOCALIZED: Depot", + "block.create.diorite_bricks": "闪长岩砖", + "block.create.diorite_bricks_slab": "闪长岩砖台阶", + "block.create.diorite_bricks_stairs": "闪长岩砖楼梯", + "block.create.diorite_bricks_wall": "闪长岩砖墙", + "block.create.diorite_cobblestone": "闪长岩圆石", + "block.create.diorite_cobblestone_slab": "闪长岩圆石台阶", + "block.create.diorite_cobblestone_stairs": "闪长岩圆石楼梯", + "block.create.diorite_cobblestone_wall": "闪长岩圆石墙", + "block.create.diorite_pillar": "竖纹闪长岩", + "block.create.dolomite": "白云岩", + "block.create.dolomite_bricks": "白云岩砖", + "block.create.dolomite_bricks_slab": "白云岩砖台阶", + "block.create.dolomite_bricks_stairs": "白云岩砖楼梯", + "block.create.dolomite_bricks_wall": "白云岩砖墙", + "block.create.dolomite_cobblestone": "白云岩圆石", + "block.create.dolomite_cobblestone_slab": "白云岩圆石台阶", + "block.create.dolomite_cobblestone_stairs": "白云岩圆石楼梯", + "block.create.dolomite_cobblestone_wall": "白云岩圆石墙", + "block.create.dolomite_pillar": "竖纹白云岩", + "block.create.encased_belt": "连携齿轮箱", + "block.create.encased_fan": "鼓风机", + "block.create.encased_shaft": "齿轮箱", + "block.create.extractor": "提取器", + "block.create.fancy_andesite_bricks": "方纹安山岩砖", + "block.create.fancy_andesite_bricks_slab": "方纹安山岩砖台阶", + "block.create.fancy_andesite_bricks_stairs": "方纹安山岩砖楼梯", + "block.create.fancy_andesite_bricks_wall": "方纹安山岩砖墙", + "block.create.fancy_dark_scoria_bricks": "方纹深色熔渣砖", + "block.create.fancy_dark_scoria_bricks_slab": "方纹深色熔渣砖台阶", + "block.create.fancy_dark_scoria_bricks_stairs": "方纹深色熔渣砖楼梯", + "block.create.fancy_dark_scoria_bricks_wall": "方纹深色熔渣砖墙", + "block.create.fancy_diorite_bricks": "方纹闪长岩砖", + "block.create.fancy_diorite_bricks_slab": "方纹闪长岩砖台阶", + "block.create.fancy_diorite_bricks_stairs": "方纹闪长岩砖楼梯", + "block.create.fancy_diorite_bricks_wall": "方纹闪长岩砖墙", + "block.create.fancy_dolomite_bricks": "方纹白云岩砖", + "block.create.fancy_dolomite_bricks_slab": "方纹白云岩砖台阶", + "block.create.fancy_dolomite_bricks_stairs": "方纹白云岩砖楼梯", + "block.create.fancy_dolomite_bricks_wall": "方纹白云岩砖墙", + "block.create.fancy_gabbro_bricks": "方纹辉长岩砖", + "block.create.fancy_gabbro_bricks_slab": "方纹辉长岩砖台阶", + "block.create.fancy_gabbro_bricks_stairs": "方纹辉长岩砖楼梯", + "block.create.fancy_gabbro_bricks_wall": "方纹辉长岩砖墙", + "block.create.fancy_granite_bricks": "方纹花岗岩砖", + "block.create.fancy_granite_bricks_slab": "方纹花岗岩砖台阶", + "block.create.fancy_granite_bricks_stairs": "方纹花岗岩砖楼梯", + "block.create.fancy_granite_bricks_wall": "方纹花岗岩砖墙", + "block.create.fancy_limestone_bricks": "方纹石灰岩砖", + "block.create.fancy_limestone_bricks_slab": "方纹石灰岩砖台阶", + "block.create.fancy_limestone_bricks_stairs": "方纹石灰岩砖楼梯", + "block.create.fancy_limestone_bricks_wall": "方纹石灰岩砖墙", + "block.create.fancy_scoria_bricks": "方纹熔渣砖", + "block.create.fancy_scoria_bricks_slab": "方纹熔渣砖台阶", + "block.create.fancy_scoria_bricks_stairs": "方纹熔渣砖楼梯", + "block.create.fancy_scoria_bricks_wall": "方纹熔渣砖墙", + "block.create.fancy_weathered_limestone_bricks": "方纹风化石灰岩砖", + "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.flywheel": "飞轮", + "block.create.framed_glass": "边框玻璃", + "block.create.framed_glass_pane": "边框玻璃板", + "block.create.furnace_engine": "熔炼引擎", + "block.create.gabbro": "辉长岩", + "block.create.gabbro_bricks": "辉长岩砖", + "block.create.gabbro_bricks_slab": "辉长岩砖台阶", + "block.create.gabbro_bricks_stairs": "辉长岩砖楼梯", + "block.create.gabbro_bricks_wall": "辉长岩砖墙", + "block.create.gabbro_cobblestone": "辉长岩圆石", + "block.create.gabbro_cobblestone_slab": "辉长岩圆石台阶", + "block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯", + "block.create.gabbro_cobblestone_wall": "辉长岩圆石墙", + "block.create.gabbro_pillar": "竖纹辉长岩", + "block.create.gearbox": "十字齿轮箱", + "block.create.gearshift": "红石齿轮箱", + "block.create.granite_bricks": "花岗岩砖", + "block.create.granite_bricks_slab": "花岗岩砖台阶", + "block.create.granite_bricks_stairs": "花岗岩砖楼梯", + "block.create.granite_bricks_wall": "花岗岩砖墙", + "block.create.granite_cobblestone": "花岗岩圆石", + "block.create.granite_cobblestone_slab": "花岗岩圆石台阶", + "block.create.granite_cobblestone_stairs": "花岗岩圆石楼梯", + "block.create.granite_cobblestone_wall": "花岗岩圆石墙", + "block.create.granite_pillar": "竖纹花岗岩", + "block.create.hand_crank": "手摇曲柄", + "block.create.horizontal_framed_glass": "竖直边框玻璃", + "block.create.horizontal_framed_glass_pane": "竖直边框玻璃板", + "block.create.jungle_window": "丛林窗户", + "block.create.jungle_window_pane": "丛林窗户板", + "block.create.large_cogwheel": "大齿轮", + "block.create.layered_andesite": "层叠安山岩", + "block.create.layered_dark_scoria": "层叠深色熔渣", + "block.create.layered_diorite": "层叠闪长岩", + "block.create.layered_dolomite": "层叠白云岩", + "block.create.layered_gabbro": "层叠辉长岩", + "block.create.layered_granite": "层叠花岗岩", + "block.create.layered_limestone": "层叠石灰岩", + "block.create.layered_scoria": "层叠熔渣", + "block.create.layered_weathered_limestone": "层叠风化石灰岩", + "block.create.limesand": "石灰沙", + "block.create.limestone": "石灰岩", + "block.create.limestone_bricks": "石灰岩砖", + "block.create.limestone_bricks_slab": "石灰岩砖台阶", + "block.create.limestone_bricks_stairs": "石灰岩砖楼梯", + "block.create.limestone_bricks_wall": "石灰岩砖墙", + "block.create.limestone_cobblestone": "石灰岩圆石", + "block.create.limestone_cobblestone_slab": "石灰岩圆石台阶", + "block.create.limestone_cobblestone_stairs": "石灰岩圆石楼梯", + "block.create.limestone_cobblestone_wall": "石灰岩圆石墙", + "block.create.limestone_pillar": "竖纹石灰岩", + "block.create.linear_chassis": "机壳底盘", + "block.create.linked_extractor": "无线提取器", + "block.create.linked_transposer": "无线传输器", + "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.mechanical_bearing": "动力轴承", + "block.create.mechanical_crafter": "动力制造器", + "block.create.mechanical_drill": "动力钻头", + "block.create.mechanical_harvester": "动力收割机", + "block.create.mechanical_mixer": "动力搅拌器", + "block.create.mechanical_piston": "动力活塞", + "block.create.mechanical_piston_head": "动力活塞头", + "block.create.mechanical_plough": "动力犁", + "block.create.mechanical_press": "动力辊压机", + "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_saw": "动力切割机", + "block.create.millstone": "石磨", + "block.create.minecart_anchor": "矿车锚", + "block.create.mossy_andesite": "生苔安山岩", + "block.create.mossy_dark_scoria": "生苔深色熔渣", + "block.create.mossy_diorite": "生苔闪长岩", + "block.create.mossy_dolomite": "生苔白云岩", + "block.create.mossy_gabbro": "生苔辉长岩", + "block.create.mossy_granite": "生苔花岗岩", + "block.create.mossy_limestone": "生苔石灰岩", + "block.create.mossy_scoria": "生苔熔渣", + "block.create.mossy_weathered_limestone": "生苔风化石灰岩", + "block.create.mysterious_cuckoo_clock": "布谷鸟闹钟", + "block.create.natural_scoria": "天然熔渣", + "block.create.nixie_tube": "辉光管", + "block.create.nozzle": "分散网", + "block.create.oak_window": "橡木窗户", + "block.create.oak_window_pane": "橡木窗户板", + "block.create.ornate_iron_window": "华丽铁窗户", + "block.create.ornate_iron_window_pane": "华丽铁窗户板", + "block.create.overgrown_andesite": "生草安山岩", + "block.create.overgrown_dark_scoria": "生草深色熔渣", + "block.create.overgrown_diorite": "生草闪长岩", + "block.create.overgrown_dolomite": "生草白云岩", + "block.create.overgrown_gabbro": "生草辉长岩", + "block.create.overgrown_granite": "生草花岗岩", + "block.create.overgrown_limestone": "生草石灰岩", + "block.create.overgrown_scoria": "生草熔渣", + "block.create.overgrown_weathered_limestone": "生草风化石灰岩", + "block.create.packager": "UNLOCALIZED: Packager", + "block.create.paved_andesite": "安山岩铺路石", + "block.create.paved_andesite_slab": "安山岩铺路石台阶", + "block.create.paved_andesite_stairs": "安山岩铺路石楼梯", + "block.create.paved_andesite_wall": "安山岩铺路石墙", + "block.create.paved_dark_scoria": "深色熔渣铺路石", + "block.create.paved_dark_scoria_slab": "深色熔渣铺路石台阶", + "block.create.paved_dark_scoria_stairs": "深色熔渣铺路石楼梯", + "block.create.paved_dark_scoria_wall": "深色熔渣铺路石墙", + "block.create.paved_diorite": "闪长岩铺路石", + "block.create.paved_diorite_slab": "闪长岩铺路石台阶", + "block.create.paved_diorite_stairs": "闪长岩铺路石楼梯", + "block.create.paved_diorite_wall": "闪长岩铺路石墙", + "block.create.paved_dolomite": "白云岩铺路石", + "block.create.paved_dolomite_slab": "白云岩铺路石台阶", + "block.create.paved_dolomite_stairs": "白云岩铺路石楼梯", + "block.create.paved_dolomite_wall": "白云岩铺路石墙", + "block.create.paved_gabbro": "辉长岩铺路石", + "block.create.paved_gabbro_slab": "辉长岩铺路石台阶", + "block.create.paved_gabbro_stairs": "辉长岩铺路石楼梯", + "block.create.paved_gabbro_wall": "辉长岩铺路石墙", + "block.create.paved_granite": "花岗岩铺路石", + "block.create.paved_granite_slab": "花岗岩铺路石台阶", + "block.create.paved_granite_stairs": "花岗岩铺路石楼梯", + "block.create.paved_granite_wall": "花岗岩铺路石墙", + "block.create.paved_limestone": "石灰岩铺路石", + "block.create.paved_limestone_slab": "石灰岩铺路石台阶", + "block.create.paved_limestone_stairs": "石灰岩铺路石楼梯", + "block.create.paved_limestone_wall": "石灰岩铺路石墙", + "block.create.paved_scoria": "熔渣铺路石", + "block.create.paved_scoria_slab": "熔渣铺路石台阶", + "block.create.paved_scoria_stairs": "熔渣铺路石楼梯", + "block.create.paved_scoria_wall": "熔渣铺路石墙", + "block.create.paved_weathered_limestone": "风化石灰岩铺路石", + "block.create.paved_weathered_limestone_slab": "风化石灰岩铺路石台阶", + "block.create.paved_weathered_limestone_stairs": "风化石灰岩铺路石楼梯", + "block.create.paved_weathered_limestone_wall": "风化石灰岩铺路石墙", + "block.create.piston_extension_pole": "活塞杆", + "block.create.polished_dark_scoria": "磨制深色熔渣", + "block.create.polished_dark_scoria_slab": "磨制深色熔渣台阶", + "block.create.polished_dark_scoria_stairs": "磨制深色熔渣楼梯", + "block.create.polished_dark_scoria_wall": "磨制深色熔渣墙", + "block.create.polished_dolomite": "磨制白云岩", + "block.create.polished_dolomite_slab": "磨制白云岩台阶", + "block.create.polished_dolomite_stairs": "磨制白云岩楼梯", + "block.create.polished_dolomite_wall": "磨制白云岩墙", + "block.create.polished_gabbro": "磨制辉长岩", + "block.create.polished_gabbro_slab": "磨制辉长岩台阶", + "block.create.polished_gabbro_stairs": "磨制辉长岩楼梯", + "block.create.polished_gabbro_wall": "磨制辉长岩墙", + "block.create.polished_limestone": "磨制石灰岩", + "block.create.polished_limestone_slab": "磨制石灰岩台阶", + "block.create.polished_limestone_stairs": "磨制石灰岩楼梯", + "block.create.polished_limestone_wall": "磨制石灰岩墙", + "block.create.polished_scoria": "磨制熔渣", + "block.create.polished_scoria_slab": "磨制熔渣台阶", + "block.create.polished_scoria_stairs": "磨制熔渣楼梯", + "block.create.polished_scoria_wall": "磨制熔渣墙", + "block.create.polished_weathered_limestone": "磨制风化石灰岩", + "block.create.polished_weathered_limestone_slab": "磨制风化石灰岩台阶", + "block.create.polished_weathered_limestone_stairs": "磨制风化石灰岩楼梯", + "block.create.polished_weathered_limestone_wall": "磨制风化石灰岩墙", + "block.create.portable_storage_interface": "移动式存储接口", + "block.create.powered_latch": "锁存器", + "block.create.powered_toggle_latch": "T触发器", + "block.create.pulley_magnet": "传送带磁铁", + "block.create.pulse_repeater": "脉冲中继器", + "block.create.radial_chassis": "旋转底盘", + "block.create.redstone_contact": "信号检测器", + "block.create.redstone_link": "无限红石信号终端", + "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", + "block.create.rope": "绳索", + "block.create.rope_pulley": "绳索滑轮", + "block.create.rotation_speed_controller": "转速控制器", + "block.create.schematic_table": "蓝图桌", + "block.create.schematicannon": "蓝图加农炮", + "block.create.scoria": "熔渣", + "block.create.scoria_bricks": "熔渣砖", + "block.create.scoria_bricks_slab": "熔渣砖台阶", + "block.create.scoria_bricks_stairs": "熔渣砖楼梯", + "block.create.scoria_bricks_wall": "熔渣砖墙", + "block.create.scoria_cobblestone": "熔渣圆石", + "block.create.scoria_cobblestone_slab": "熔渣圆石台阶", + "block.create.scoria_cobblestone_stairs": "熔渣圆石楼梯", + "block.create.scoria_cobblestone_wall": "熔渣圆石墙", + "block.create.scoria_pillar": "竖纹熔渣", + "block.create.secondary_linear_chassis": "机壳底盘2号", + "block.create.sequenced_gearshift": "可编程齿轮箱", + "block.create.shaft": "传动杆", + "block.create.speedometer": "速度表", + "block.create.spruce_window": "云杉窗户", + "block.create.spruce_window_pane": "云杉窗户板", + "block.create.sticky_mechanical_piston": "粘性动力活塞", + "block.create.stockpile_switch": "存储检测器", + "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_linked_extractor": "竖直无限提取器", + "block.create.vertical_linked_transposer": "竖直无线传输器", + "block.create.vertical_transposer": "竖直传输器", + "block.create.water_wheel": "水车", + "block.create.weathered_limestone": "风化石灰岩", + "block.create.weathered_limestone_bricks": "风化石灰岩砖", + "block.create.weathered_limestone_bricks_slab": "风化石灰岩砖台阶", + "block.create.weathered_limestone_bricks_stairs": "风化石灰岩砖楼梯", + "block.create.weathered_limestone_bricks_wall": "风化石灰岩砖墙", + "block.create.weathered_limestone_cobblestone": "风化石灰岩圆石", + "block.create.weathered_limestone_cobblestone_slab": "风化石灰岩圆石台阶", + "block.create.weathered_limestone_cobblestone_stairs": "风化石灰岩圆石楼梯", + "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", + "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", + "block.create.zinc_block": "锌块", + "block.create.zinc_ore": "锌矿石", + + "entity.create.contraption": "结构", + "entity.create.stationary_contraption": "固定结构", + "entity.create.super_glue": "强力胶", + + "item.create.andesite_alloy": "安山合金", + "item.create.attribute_filter": "属性过滤器", + "item.create.belt_connector": "传送带", + "item.create.brass_hand": "黄铜手部零件", + "item.create.brass_ingot": "黄铜锭", + "item.create.brass_nugget": "黄铜粒", + "item.create.brass_sheet": "黄铜板", + "item.create.chromatic_compound": "异彩化合物", + "item.create.copper_ingot": "铜锭", + "item.create.copper_nugget": "铜粒", + "item.create.copper_sheet": "铜板", + "item.create.crafter_slot_cover": "制造器盖板", + "item.create.crushed_brass": "粉碎黄铜", + "item.create.crushed_copper_ore": "粉碎铜矿石", + "item.create.crushed_gold_ore": "粉碎金矿石", + "item.create.crushed_iron_ore": "粉碎铁矿石", + "item.create.crushed_zinc_ore": "粉碎锌矿石", + "item.create.deforester": "树林毁灭者", + "item.create.dough": "面团", + "item.create.electron_tube": "电子管", + "item.create.empty_schematic": "空白蓝图", + "item.create.extendo_grip": "伸缩机械手", + "item.create.filter": "过滤器", + "item.create.furnace_minecart_contraption": "装配过的动力矿车", + "item.create.goggles": "工程师护目镜", + "item.create.golden_sheet": "金板", + "item.create.handheld_blockzapper": "手持式方块放置器", + "item.create.handheld_worldshaper": "手持式环境塑形器", + "item.create.integrated_circuit": "集成电路板", + "item.create.iron_sheet": "铁板", + "item.create.lapis_sheet": "青金石板", + "item.create.minecart_contraption": "装配过的矿车", + "item.create.polished_rose_quartz": "磨制玫瑰石英", + "item.create.powdered_obsidian": "黑曜石粉末", + "item.create.propeller": "扇叶", + "item.create.red_sand_paper": "红砂纸", + "item.create.refined_radiance": "光辉石", + "item.create.rose_quartz": "玫瑰石英", + "item.create.sand_paper": "砂纸", + "item.create.schematic": "蓝图", + "item.create.schematic_and_quill": "蓝图与笔", + "item.create.shadow_steel": "暗影金属", + "item.create.super_glue": "强力胶", + "item.create.tree_fertilizer": "树木肥料", + "item.create.vertical_gearbox": "竖直十字齿轮箱", + "item.create.wand_of_symmetry": "对称法杖", + "item.create.wheat_flour": "小麦粉", + "item.create.whisk": "搅拌器", + "item.create.wrench": "扳手", + "item.create.zinc_ingot": "锌锭", + "item.create.zinc_nugget": "锌粒", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "欢迎来到机械动力", + "advancement.create.root.desc": "是时候来制作一些超赞的机械结构了!", + "advancement.create.andesite_alloy": "原始人类的合金替代品", + "advancement.create.andesite_alloy.desc": "机械动力有着许多的材料和合金,但由于技术有限,原始的人类暂时们只能制作出安山合金", + "advancement.create.its_alive": "鲜活的机械生命", + "advancement.create.its_alive.desc": "首次激活齿轮结构的旋转.", + "advancement.create.shifting_gears": "换挡,加速,起飞!", + "advancement.create.shifting_gears.desc": "将大齿轮连接到小齿轮上, 机械结构的转速将会翻倍", + "advancement.create.overstressed": "超载", + "advancement.create.overstressed.desc": "首次使能量网络超载.", + "advancement.create.belt": "大批流水作业", + "advancement.create.belt.desc": "用传送带连接两个传动杆", + "advancement.create.wrench": "细节调整", + "advancement.create.wrench.desc": "做出一个方便调整方块的扳手", + "advancement.create.goggles": "目力工程师", + "advancement.create.goggles.desc": "做出一个能看到机器动能信息的工程师护目镜", + "advancement.create.speedometer": "精密的速度控制", + "advancement.create.speedometer.desc": "放置一个速度表,并且带上工程师护目镜来读取速度数据", + "advancement.create.stressometer": "精密的应力控制", + "advancement.create.stressometer.desc": "放置一个应力表,并且带上工程师护目镜来读取应力数据", + "advancement.create.water_wheel": "治水", + "advancement.create.water_wheel.desc": "放置一个水车并且让它开始旋转", + "advancement.create.lava_wheel": "风火轮", + "advancement.create.lava_wheel.desc": "你确定岩浆能带动水车?", + "advancement.create.millstone": "便携式粉碎机", + "advancement.create.millstone.desc": "放置一个石磨并且为其供能", + "advancement.create.andesite_casing": "安山纪元", + "advancement.create.andesite_casing.desc": "使用安山合金和木头来合成一个安山机壳", + "advancement.create.mechanical_drill": "坚如磐石,势如破竹", + "advancement.create.mechanical_drill.desc": "放置一个动力钻头并且为其供能", + "advancement.create.press": "'Duang!'", + "advancement.create.press.desc": "使用辊压机来辊压一些板子", + "advancement.create.polished_rose_quartz": "粉丝钻石", + "advancement.create.polished_rose_quartz.desc": "用砂纸将玫瑰石英打磨至透明", + "advancement.create.electron_tube": "哔~~哔~~", + "advancement.create.electron_tube.desc": "制作一个可用于合成高级机器的电子管", + "advancement.create.mechanical_saw": "一刀两断", + "advancement.create.mechanical_saw.desc": "放置一个切割机并且为其供能", + "advancement.create.basin": "快到碗里来", + "advancement.create.basin.desc": "放置一个工作盆,并且往里面放些东西", + "advancement.create.mixer": "均匀搅拌", + "advancement.create.mixer.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.crafter": "自动化流水作业", + "advancement.create.crafter.desc": "放置一些机械合成台并且为其供能", + "advancement.create.deployer": "我就指着你了咋地?", + "advancement.create.deployer.desc": "放置并且功能一个机械手。这可是你右手的完美复制品", + "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do 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.fist_bump": "来碰个拳,哥们~", + "advancement.create.fist_bump.desc": "使两个机械臂互相碰拳", + "advancement.create.crushing_wheel": "一对大家伙", + "advancement.create.crushing_wheel.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.zapper": "讲究的建筑师", + "advancement.create.zapper.desc": "制作一个非常方便的手持方块放置器", + "advancement.create.upgraded_zapper": "来自异世界的超频", + "advancement.create.upgraded_zapper.desc": "制作一个完全升级的手持方块放置器", + "advancement.create.wand_of_symmetry": "简单的镜面几何学", + "advancement.create.wand_of_symmetry.desc": "制作一个对称法杖", + "advancement.create.deforester": "超时空砍伐", + "advancement.create.deforester.desc": "制作一个森林毁灭者, 然后跟你后院的树林说再见吧", + "advancement.create.extendo_grip": "biu biu biu!", + "advancement.create.extendo_grip.desc": "拿到一个伸缩机械手", + "advancement.create.dual_extendo_grip": "biu——biu——biu——", + "advancement.create.dual_extendo_grip.desc": "双持伸缩机械手加长距离", + "advancement.create.eob": "Beta版结束", + "advancement.create.eob.desc": "期待未来会有更多的内容. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "机械动力", + "itemGroup.create.palettes": "机械动力建筑方块", + + "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 被钻头钻的坏掉了", + "death.attack.create.mechanical_saw": "%1$s 被圆锯切成了两截", + "death.attack.create.cuckoo_clock_explosion": "%1$s 被布谷鸟钟炸得粉身碎骨", + + "create.block.deployer.damage_source_name": "二五仔机械臂", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + + "create.recipe.crushing": "粉碎", + "create.recipe.milling": "研磨", + "create.recipe.splashing": "洗涤", + "create.recipe.splashing.fan": "在鼓风机前方倒水", + "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", + "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", + "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "金属压片", + "create.recipe.mixing": "混合搅拌", + "create.recipe.packing": "压块塑形", + "create.recipe.mechanical_sawing": "木材切割", + "create.recipe.mechanical_crafting": "自动合成", + "create.recipe.block_cutting": "方块切割", + "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", + "create.recipe.sandpaper_polishing": "砂纸抛光", + "create.recipe.mystery_conversion": "化合物变异", + "create.recipe.processing.catalyst": "催化剂", + "create.recipe.processing.chance": "%1$s%% 概率", + "create.recipe.processing.chanceToReturn": "%1$s%% 概率返还", + + "create.generic.range": "范围", + "create.generic.radius": "半径", + "create.generic.width": "宽度", + "create.generic.height": "高度", + "create.generic.length": "长度", + "create.generic.speed": "速度", + "create.generic.delay": "延时", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "秒", + "create.generic.unit.minutes": "分钟", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "滚轮", + "create.action.confirm": "确认", + "create.action.abort": "退出", + "create.action.saveToFile": "保存", + "create.action.discard": "丢弃", + + "create.keyinfo.toolmenu": "工具菜单", + "create.keyinfo.scrollup": "(游戏中)向上鼠标滚轮", + "create.keyinfo.scrolldown": "(游戏中)向下鼠标滚轮", + + "create.gui.scrollInput.defaultTitle": "选择一个选项:", + "create.gui.scrollInput.scrollToModify": "滚动修改", + "create.gui.scrollInput.scrollToAdjustAmount": "滚动修改数量", + "create.gui.scrollInput.scrollToSelect": "滚动选择", + "create.gui.scrollInput.shiftScrollsFaster": "按住Shift滚动更快", + "create.gui.toolmenu.focusKey": "按住 [%1$s] 鼠标滚轮选择", + "create.gui.toolmenu.cycle": "[SCROLL] 循环", + "create.gui.symmetryWand.mirrorType": "镜子类型", + "create.gui.symmetryWand.orientation": "方向", + + "create.symmetry.mirror.plane": "镜像", + "create.symmetry.mirror.doublePlane": "矩形", + "create.symmetry.mirror.triplePlane": "八角", + + "create.orientation.orthogonal": "垂直", + "create.orientation.diagonal": "对角线", + "create.orientation.horizontal": "水平", + "create.orientation.alongZ": "以z轴对齐", + "create.orientation.alongX": "以x轴对齐", + + "create.gui.blockzapper.title": "手持式方块放置机", + "create.gui.blockzapper.replaceMode": "替换模式", + "create.gui.blockzapper.searchDiagonal": "根据对角线", + "create.gui.blockzapper.searchFuzzy": "忽视边界", + "create.gui.blockzapper.range": "扩散范围", + "create.gui.blockzapper.needsUpgradedAmplifier": "需要升级扩散器", + "create.gui.blockzapper.patternSection": "模式", + "create.gui.blockzapper.pattern.solid": "实心", + "create.gui.blockzapper.pattern.checkered": "棋盘", + "create.gui.blockzapper.pattern.inversecheckered": "反转棋盘", + "create.gui.blockzapper.pattern.chance25": "25% ", + "create.gui.blockzapper.pattern.chance50": "50% ", + "create.gui.blockzapper.pattern.chance75": "75% ", + "create.gui.terrainzapper.title": "手持式环境塑形器", + "create.gui.terrainzapper.placement": "放置模式", + "create.gui.terrainzapper.placement.merged": "结合", + "create.gui.terrainzapper.placement.attached": "依附", + "create.gui.terrainzapper.placement.inserted": "插入", + "create.gui.terrainzapper.brush": "塑形类型", + "create.gui.terrainzapper.brush.cuboid": "矩形体", + "create.gui.terrainzapper.brush.sphere": "球体", + "create.gui.terrainzapper.brush.cylinder": "圆柱体", + "create.gui.terrainzapper.tool": "填充类型", + "create.gui.terrainzapper.tool.fill": "填充", + "create.gui.terrainzapper.tool.place": "复写", + "create.gui.terrainzapper.tool.replace": "替换", + "create.gui.terrainzapper.tool.clear": "清除", + "create.gui.terrainzapper.tool.overlay": "覆盖", + "create.gui.terrainzapper.tool.flatten": "平整", + + "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右键 以设置塑形类型", + + "create.blockzapper.usingBlock": "使用: %1$s", + "create.blockzapper.componentUpgrades": "组件升级:", + "create.blockzapper.component.body": "机体", + "create.blockzapper.component.amplifier": "增大", + "create.blockzapper.component.accelerator": "加速", + "create.blockzapper.component.retriever": "寻回", + "create.blockzapper.component.scope": "范围", + "create.blockzapper.componentTier.none": "无", + "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", + "create.blockzapper.leftClickToSet": "左键点击方块以设定方块", + "create.blockzapper.empty": "方块不足!", + + "create.contraptions.movement_mode": "运动模式", + "create.contraptions.movement_mode.move_place": "停止时总是实体化方块", + "create.contraptions.movement_mode.move_place_returned": "停止时只在初始位置实体化方块", + "create.contraptions.movement_mode.move_never_place": "只有在动力方块摧毁后才实体化方块", + "create.contraptions.movement_mode.rotate_place": "停止时总是实体化方块", + "create.contraptions.movement_mode.rotate_place_returned": "停止时只在接近初始角度实体化方块", + "create.contraptions.movement_mode.rotate_never_place": "只有在旋转轴摧毁后才实体化方块", + "create.contraptions.cart_movement_mode": "矿车运动模式", + "create.contraptions.cart_movement_mode.rotate": "结构与矿车保持相同方向", + "create.contraptions.cart_movement_mode.rotate_paused": "矿车转向时机器停止工作", + "create.contraptions.cart_movement_mode.rotation_locked": "结构方向保持不变", + + "create.logistics.filter": "过滤器", + "create.logistics.firstFrequency": "频道. #1", + "create.logistics.secondFrequency": "频道. #2", + + "create.gui.goggles.generator_stats": "产能器状态:", + "create.gui.goggles.kinetic_stats": "动能状态:", + "create.gui.goggles.at_current_speed": "当前速度应力值", + "create.gui.goggles.base_value": "应力基础值", + "create.gui.gauge.info_header": "仪表信息:", + "create.gui.speedometer.title": "旋转速度", + "create.gui.stressometer.title": "网络应力", + "create.gui.stressometer.capacity": "剩余应力", + "create.gui.stressometer.overstressed": "超载", + "create.gui.stressometer.no_rotation": "无旋转", + "create.gui.contraptions.not_fast_enough": "显然 %1$s 没有足够的转速.", + "create.gui.contraptions.network_overstressed": "显然装置过载,减速高应力消耗的装置或者添加更多动力", + "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.sequenced_gearshift.title": "可编程齿轮箱", + "create.gui.sequenced_gearshift.instruction": "指令", + "create.gui.sequenced_gearshift.instruction.turn_angle": "旋转", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance": "驱动活塞", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距离", + "create.gui.sequenced_gearshift.instruction.wait": "等待", + "create.gui.sequenced_gearshift.instruction.wait.duration": "间隔", + "create.gui.sequenced_gearshift.instruction.end": "停止", + "create.gui.sequenced_gearshift.speed": "速度, 速度方向", + "create.gui.sequenced_gearshift.speed.forward": "一倍速, 正向", + "create.gui.sequenced_gearshift.speed.forward_fast": "两倍速, 正向", + "create.gui.sequenced_gearshift.speed.back": "一倍速, 反向", + "create.gui.sequenced_gearshift.speed.back_fast": "两倍速, 反向", + + "create.schematicAndQuill.dimensions": "蓝图尺寸: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "第一个位置.", + "create.schematicAndQuill.secondPos": "第二个位置.", + "create.schematicAndQuill.noTarget": "按住Ctrl选择空气方块.", + "create.schematicAndQuill.abort": "删除选择.", + "create.schematicAndQuill.prompt": "输入蓝图的名称:", + "create.schematicAndQuill.fallbackName": "我的蓝图", + "create.schematicAndQuill.saved": "另存为 %1$s", + + "create.schematic.invalid": "[!] 无效的项目", + "create.schematic.position": "位置", + "create.schematic.rotation": "旋转", + "create.schematic.rotation.none": "无", + "create.schematic.rotation.cw90": "顺时针90", + "create.schematic.rotation.cw180": "顺时针180", + "create.schematic.rotation.cw270": "顺时针270", + "create.schematic.mirror": "镜像", + "create.schematic.mirror.none": "无", + "create.schematic.mirror.frontBack": "前后", + "create.schematic.mirror.leftRight": "左右", + "create.schematic.tool.deploy": "部署", + "create.schematic.tool.move": "移动 XZ", + "create.schematic.tool.movey": "移动 Y", + "create.schematic.tool.rotate": "旋转", + "create.schematic.tool.print": "打印", + "create.schematic.tool.flip": "翻转", + "create.schematic.tool.deploy.description.0": "将结构移到某个位置.", + "create.schematic.tool.deploy.description.1": "在地面上单击鼠标右键以放置.", + "create.schematic.tool.deploy.description.2": "按住Ctrl以固定距离选择.", + "create.schematic.tool.deploy.description.3": "按住Ctrl鼠标滚动更改距离.", + "create.schematic.tool.move.description.0": "水平移动蓝图", + "create.schematic.tool.move.description.1": "选定蓝图,然后按住Ctrl鼠标滚动移动.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "垂直移动蓝图", + "create.schematic.tool.movey.description.1": "按住Ctrl鼠标滚动上下移动", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "围绕蓝图中心旋转蓝图.", + "create.schematic.tool.rotate.description.1": "按住Ctrl鼠标滚动旋转90度", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "立即将结构放置在世界上", + "create.schematic.tool.print.description.1": "右键单机确认当前位置.", + "create.schematic.tool.print.description.2": "该工具仅适用于创造模式.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "沿你选择的面翻转蓝图.", + "create.schematic.tool.flip.description.1": "指向蓝图,然后按住Ctrl鼠标滚动将其翻转.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "正在同步...", + "create.schematics.uploadTooLarge": "你的蓝图太大", + "create.schematics.maxAllowedSize": "允许的最大蓝图文件大小为:", + + "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.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.option.skipMissing.description": "如果缺失材料, 蓝图大炮将忽略当前缺失材料并且使用其他已有材料继续工作", + "create.gui.schematicannon.option.skipTileEntities.description": "蓝图将避免更换存储方块,如箱子.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "蓝图加农炮将不会替换工作范围内的任何固体方块.", + "create.gui.schematicannon.option.replaceWithSolid.description": "蓝图加农炮会使用所提供的固体方块来替换工作区域内的其他固体方块", + "create.gui.schematicannon.option.replaceWithAny.description": "蓝图加农炮会使用任何所提供的方块来替换工作区域内的固体方块", + "create.gui.schematicannon.option.replaceWithEmpty.description": "蓝图加农炮将清理和替换工作区域内所有原本的方块.", + + "create.schematicannon.status.idle": "闲置", + "create.schematicannon.status.ready": "准备", + "create.schematicannon.status.running": "运行", + "create.schematicannon.status.finished": "完成", + "create.schematicannon.status.paused": "已暂停", + "create.schematicannon.status.stopped": "停止", + "create.schematicannon.status.noGunpowder": "火药消耗完毕", + "create.schematicannon.status.targetNotLoaded": "方块未加载", + "create.schematicannon.status.targetOutsideRange": "定位目标太远", + "create.schematicannon.status.searching": "搜索", + "create.schematicannon.status.skipping": "跳过", + "create.schematicannon.status.missingBlock": "缺少方块:", + "create.schematicannon.status.placing": "建筑中", + "create.schematicannon.status.clearing": "清除方块中", + "create.schematicannon.status.schematicInvalid": "蓝图无效", + "create.schematicannon.status.schematicNotPlaced": "蓝图未部署", + "create.schematicannon.status.schematicExpired": "蓝图文件已过期", + + "create.gui.filter.blacklist": "黑名单", + "create.gui.filter.blacklist.description": "只通过不在黑名单中的物品,如果黑名单为空,所有物品都可以通过", + "create.gui.filter.whitelist": "白名单", + "create.gui.filter.whitelist.description": "只通过在白名单中的物品,如果白名单为空,所有物品都无法通过", + "create.gui.filter.respect_data": "匹配物品属性", + "create.gui.filter.respect_data.description": "只有物品的耐久、附魔等其他属性相同时才可以匹配", + "create.gui.filter.ignore_data": "忽视物品属性", + "create.gui.filter.ignore_data.description": "匹配时忽视物品的耐久、附魔等其他属性", + + "create.item_attributes.placeable": "可放置", + "create.item_attributes.consumable": "可食用", + "create.item_attributes.smeltable": "可被熔炉烧制", + "create.item_attributes.washable": "可被筛洗", + "create.item_attributes.smokable": "可被烟熏", + "create.item_attributes.blastable": "可被高炉冶炼", + "create.item_attributes.enchanted": "已被附魔", + "create.item_attributes.damaged": "已损坏", + "create.item_attributes.badly_damaged": "严重受损", + "create.item_attributes.not_stackable": "无法堆叠", + "create.item_attributes.equipable": "可装备", + "create.item_attributes.furnace_fuel": "是燃料", + "create.item_attributes.in_tag": "标签是%1$s", + "create.item_attributes.in_item_group": "属于 %1$s", + "create.item_attributes.added_by": "由%1$s添加", + + "create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性", + "create.gui.attribute_filter.selected_attributes": "已选择的属性:", + "create.gui.attribute_filter.whitelist_disjunctive": "任意匹配白名单 (任何)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "只要有其中一项属性符合,就可以通过", + "create.gui.attribute_filter.whitelist_conjunctive": "全匹配白名单 (所有)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "只有所有属性都匹配才可以通过", + "create.gui.attribute_filter.blacklist": "黑名单", + "create.gui.attribute_filter.blacklist.description": "只要没有上述属性,就可以通过", + "create.gui.attribute_filter.add_reference_item": "添加参考物品", + + "create.tooltip.holdKey": "按住 [%1$s]", + "create.tooltip.holdKeyOrKey": "按住 [%1$s] 或 [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "需求速度: %1$s", + "create.tooltip.speedRequirement.none": "无", + "create.tooltip.speedRequirement.medium": "适当的", + "create.tooltip.speedRequirement.high": "飞快的", + "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.low": "小", + "create.tooltip.capacityProvided.medium": "中", + "create.tooltip.capacityProvided.high": "大", + "create.tooltip.capacityProvided.asGenerator": "(作为产能器)", + "create.tooltip.generationSpeed": "产生 %1$s %2$s", + "create.tooltip.analogStrength": "调节强度: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "最少物品种类数", + + "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.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: 服务器每秒tick速被降低为 %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: 服务器现在每秒tick速被降低为 >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: 服务器现在不卡了, TPS正常 :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: 用 /killtps stop 来让服务器的TPS速度变回正常", + "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 来手动降低服务器TPS速度", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "蓝图大炮发射", + "create.subtitle.schematicannon_finish": "蓝图大炮完成任务", + "create.subtitle.slime_added": "粘液挤压", + "create.subtitle.mechanical_press_activation": "辊压机工作", + "create.subtitle.mechanical_press_item_break": "金属碰撞", + "create.subtitle.blockzapper_place": "放置方块", + "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.blockzapper_deny": "放置失败", + "create.subtitle.block_funnel_eat": "漏斗吞食", + + + "_": "->------------------------] 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.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip.summary": "完美地镜面复制工作区域内的方块放置与破坏", + "item.create.wand_of_symmetry.tooltip.condition1": "当在热键栏时", + "item.create.wand_of_symmetry.tooltip.behaviour1": "持续进行镜面复制", + "item.create.wand_of_symmetry.tooltip.control1": "当右键地面时", + "item.create.wand_of_symmetry.tooltip.action1": "_创建_或_移动_镜子", + "item.create.wand_of_symmetry.tooltip.control2": "当右键空气时", + "item.create.wand_of_symmetry.tooltip.action2": "_删除_ 镜子", + "item.create.wand_of_symmetry.tooltip.control3": "当潜行右键时", + "item.create.wand_of_symmetry.tooltip.action3": "打开_gui界面_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "新颖的小工具,可以远距离放置或更换方块.", + "item.create.handheld_blockzapper.tooltip.control1": "当左键方块时", + "item.create.handheld_blockzapper.tooltip.action1": "设定放置此方块.", + "item.create.handheld_blockzapper.tooltip.control2": "当右键方块时", + "item.create.handheld_blockzapper.tooltip.action2": "_放置_或_替换_ 目标方块.", + "item.create.handheld_blockzapper.tooltip.control3": "当潜行右键时", + "item.create.handheld_blockzapper.tooltip.action3": "打开_gui界面_", + + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "_创造_大陆和山脉的手持工具", + "item.create.handheld_worldshaper.tooltip.control1": "当左键方块时", + "item.create.handheld_worldshaper.tooltip.action1": "设定放置此方块", + "item.create.handheld_worldshaper.tooltip.control2": "当右键方块时", + "item.create.handheld_worldshaper.tooltip.action2": "_放置_或_替换_目标方块", + "item.create.handheld_worldshaper.tooltip.control3": "当潜行右键时", + "item.create.handheld_worldshaper.tooltip.action3": "打开工具的_gui界面_", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "适用于常见树木的快速肥料", + "item.create.tree_fertilizer.tooltip.condition1": "在树苗上使用时", + "item.create.tree_fertilizer.tooltip.behaviour1": "无论_生长时间_多少,直接长大", + + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "_树林毁灭者_,能够瞬间砍倒一棵树", + + "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_触碰距离_.", + "item.create.extendo_grip.tooltip.condition1": "放置于副手栏时", + "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的触碰距离,与_主手_的伸缩机械手携同使用,可进一步增加_触碰距离_.", + + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "将物品更精确地进行_筛选分类_, 可以同时_筛选_多个物品或者将已标记的_过滤器_放在另一个_过滤器_里_嵌套_使用.", + "item.create.filter.tooltip.condition1": "当处于_过滤器_槽中", + "item.create.filter.tooltip.behaviour1": "根据_过滤器_的配置,_控制_物品流经过滤器", + "item.create.filter.tooltip.condition2": "当右键时", + "item.create.filter.tooltip.behaviour2": "打开_配置面板_", + + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "比起普通过滤器, _属性过滤器_可以根据不同物品的_属性_来进行过滤", + "item.create.attribute_filter.tooltip.condition1": "当处于_过滤器_槽中", + "item.create.attribute_filter.tooltip.behaviour1": "根据_过滤器的_配置,_控制_物品流经过滤器", + "item.create.attribute_filter.tooltip.condition2": "当右键时", + "item.create.attribute_filter.tooltip.behaviour2": "打开_配置面板_", + + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip.summary": "可作为合成材料或在_蓝图桌_使用", + + "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip.summary": "可以放置在世界中的结构,根据需要放置全息图,并使用_蓝图加农炮_进行构建.", + "item.create.schematic.tooltip.condition1": "当全息图存在时", + "item.create.schematic.tooltip.behaviour1": "可以使用屏幕上的工具定位", + "item.create.schematic.tooltip.control1": "当潜行右键时", + "item.create.schematic.tooltip.action1": "打开一个用于输入_精确坐标_的界面.", + + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip.summary": "用于将世界中的结构保存到.nbt文件.", + "item.create.schematic_and_quill.tooltip.condition1": "第一步", + "item.create.schematic_and_quill.tooltip.behaviour1": "手持蓝图与右键旋转两个点", + "item.create.schematic_and_quill.tooltip.condition2": "第二步", + "item.create.schematic_and_quill.tooltip.behaviour2": "按住Ctrl鼠标滚轮选择选区大小,右键空白处保存.", + "item.create.schematic_and_quill.tooltip.control1": "右键", + "item.create.schematic_and_quill.tooltip.action1": "选取点/确认保存", + "item.create.schematic_and_quill.tooltip.control2": "按住Ctrl鼠标滚轮", + "item.create.schematic_and_quill.tooltip.action2": "在_空中_选择点滚动以调整距离。", + "item.create.schematic_and_quill.tooltip.control3": "当潜行右键时", + "item.create.schematic_and_quill.tooltip.action3": "_重置_并删除选区.", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "通过发射方块以在世界中重新构建已部署的_全息图_,使用相邻箱子中的物品及_火药_作为燃料.", + "block.create.schematicannon.tooltip.control1": "当右键时", + "block.create.schematicannon.tooltip.action1": "打开_gui界面_", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "将保存的蓝图图写入_空白蓝图_", + "block.create.schematic_table.tooltip.condition1": "放入空白蓝图时", + "block.create.schematic_table.tooltip.behaviour1": "从Schematics文件夹上传所选文件", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "将_旋转动能_进行直线传递.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": "将_旋转动能_进行直线传递,或者传递到邻近的_齿轮_上", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "大号齿轮传动结构,连接到_小号齿轮_时改变其_转速_.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "将_旋转动能_进行直线传递,其方块体积使其在穿过墙体时更加_美观_.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "十字传动旋转结构,同时将直线旋转方向_反转_.", + + "item.create.vertical_gearbox.tooltip": " VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "_竖直_版本的_十字传动_结构", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "用于动能控制_旋转方向_的开关.", + "block.create.gearshift.tooltip.condition1": "当提供红石信号时", + "block.create.gearshift.tooltip.behaviour1": "_更改_旋转方向.", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "传动开关装置.", + "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.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "将_旋转动能_进行直线传递,或者传递到临近的_连携齿轮箱_.当方块接收到信号时旋转速度将会改变.", + "block.create.adjustable_pulley.tooltip.condition1": "当提供不同红石信号强度时", + "block.create.adjustable_pulley.tooltip.behaviour1": "如果没有红石信号_不会加速_,最强的红石信号将会提升至_两倍速_", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "用_传送带_连接两个_传动杆_,连接的传动杆将具有完全相同的转速和方向.传送带可以_传输实体_和_物品_.", + "item.create.belt_connector.tooltip.control1": "当右键传动杆时", + "item.create.belt_connector.tooltip.action1": "选择传动杆作为传送带的传输点,选定的两个传动杆都必须相互_垂直_,_水平_或_对角平齐_.", + "item.create.belt_connector.tooltip.control2": "当潜行右键时", + "item.create.belt_connector.tooltip.action2": "_重置_传送带的第一个选定位置", + + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "一副特殊的眼镜,能够让你看见 _动能_ 的信息.", + "item.create.goggles.tooltip.condition1": "当装备时", + "item.create.goggles.tooltip.behaviour1": "将会展示单个动能元件的_速度_、_应力_等信息", + "item.create.goggles.tooltip.condition2": "当看向仪表时", + "item.create.goggles.tooltip.behaviour2": "将会展示仪表连接网络的_速度_、_应力_等信息.", + + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "一种有用的工具,能够调整_动能_的_方向_、_配置_等.", + "item.create.wrench.tooltip.control1": "当右键点击_动能元件_时", + "item.create.wrench.tooltip.action1": "以点击的面为轴心_旋转_点击的方块", + "item.create.wrench.tooltip.control2": "当潜行右键时", + "item.create.wrench.tooltip.action2": "将物品_取下_并移动到你的背包中.", + + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "可以配置的_无限动力_来源", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "从相邻的流水中获得动力", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "有多种用途,主要可以将_动力_和_风力_进行互相转换.", + "block.create.encased_fan.tooltip.condition1": "当被红石信号激活后", + "block.create.encased_fan.tooltip.behaviour1": "可将鼓风机下方的_热能_(火, 岩浆等)转化成_动能_, 需要将鼓风机向下摆放", + "block.create.encased_fan.tooltip.condition2": "当旋转时", + "block.create.encased_fan.tooltip.behaviour2": "根据旋转方向_推动_或者_吸引_实体,强度和速度取决于给予的动力.", + "block.create.encased_fan.tooltip.condition3": "当气流通过火,水,岩浆时", + "block.create.encased_fan.tooltip.behaviour3": "在_被吹出_的水,火,岩浆粒子中放置物品会获得相应产物(_建议配合jei查看_).", + + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "依附在鼓风机上,能够将鼓风机的风到_分散_各个方向.", + + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "一种简单的旋转能源,需要_人工转动_.", + "block.create.hand_crank.tooltip.condition1": "当使用时", + "block.create.hand_crank.tooltip.behaviour1": "向依附的结构提供动力,_潜行_时将会提供_反向_的旋转动力", + + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "精致的工艺品,能够记录时间", + "block.create.cuckoo_clock.tooltip.condition1": "当旋转时", + "block.create.cuckoo_clock.tooltip.behaviour1": "显示 _当前时间_ 并且一天会咕咕_两次_.中午咕咕一次, 黄昏可以睡觉的时候咕咕一次 ", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "让旋转动力给你带来一场刺激的旋转风车体验.", + + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "一个能_研磨物品_的动能装置, 可以被临近的_齿轮_供能, 或者可以在底部用传动杆供能, 成品必须被提取出石磨", + "block.create.millstone.tooltip.condition1": "当旋转运作时", + "block.create.millstone.tooltip.behaviour1": "开始根据 _研磨配方_ 来处理物品.", + "block.create.millstone.tooltip.condition2": "当右键时", + "block.create.millstone.tooltip.behaviour2": "手动取出研磨后的成品.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "一对能够粉碎一切的粉碎轮。向两个粉碎轮提供向内且相反的转速来工作", + "block.create.crushing_wheel.tooltip.condition1": "当两个粉碎轮一起运作时", + "block.create.crushing_wheel.tooltip.behaviour1": "粉碎物品并获得相应产物(建议配合jei查看)", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "一个强力的活塞式机器,用于压制其下方的物品.", + "block.create.mechanical_press.tooltip.condition1": "当提供红石信号时", + "block.create.mechanical_press.tooltip.behaviour1": "_压制_其下方的物品.", + "block.create.mechanical_press.tooltip.condition2": "在传送带上方时", + "block.create.mechanical_press.tooltip.behaviour2": "_自动压缩_经过传送带的物品.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "一种方便的_物品容器_,常常用于_辊压机_和_搅拌机_,可以被_红石比较器_检测", + + "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "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": "一种依靠_动能_的_自动_合成台。根据想要合成物品的_合成表_来摆放_相应数量_的机械制造机,并且用扳手调整物品在制造机里的_传动方向_以让他们合在一起后被输出", + "block.create.mechanical_crafter.tooltip.condition1": "当旋转时", + "block.create.mechanical_crafter.tooltip.behaviour1": "当机器中_所有_的物品槽有物品时,将会启动所有的制造机来工作.", + "block.create.mechanical_crafter.tooltip.condition2": "被红石激活时", + "block.create.mechanical_crafter.tooltip.behaviour2": "强制启动当前网格中所有给定的_材料_的_合成_", + "block.create.mechanical_crafter.tooltip.control1": "当在机器前方使用扳手时", + "block.create.mechanical_crafter.tooltip.action1": "将会改变物品移动的方向. 要合成一个物品,所有原料必须被_移动到一起_,并且在阵列的_外缘_被弹出机器", + "block.create.mechanical_crafter.tooltip.control2": "当侧方或者后方使用扳手时", + "block.create.mechanical_crafter.tooltip.action2": "连接相邻的制造机的物品栏,这样_相同_的物品就会自动进入所有相互连接的制造机", + + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "一种强力的_旋转动能_的来源,但是需要_正在工作_的_熔炉_(三种熔炉都可以)", + "block.create.furnace_engine.tooltip.condition1": "当连接正在燃烧的熔炉", + "block.create.furnace_engine.tooltip.behaviour1": "将会带动_相连_的_飞轮_(需要间隔一格),用高炉速度更快", + + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "一种大型的金属轮, 能将_熔炉引擎_提供的动能稳定化输出, 需要与_熔炉引擎_间隔一个方块", + "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.condition1": "当处于移动时", + "block.create.portable_storage_interface.tooltip.behaviour1": "与固定的_传输器_交互. 会根据传输器的方向进行输出或者输入物品。 移动结构在传输物品的时候会短暂地停下", + + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "一个可以变换所连接齿轮旋转速度的元件", + "block.create.rotation_speed_controller.tooltip.condition1": "当连接大齿轮时", + "block.create.rotation_speed_controller.tooltip.behaviour1": "将输入的旋转动能改变速度后,传递给连接的大齿轮,连接的大齿轮要放在上方.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "活塞的高级版本,使用_旋转动能_精确地移动其连接的方块,背面可放置活塞杆延长活塞范围,没有活塞杆将不会工作,使用_底盘_或者_粘液块_可以移动多行方块.", + "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": "当连接到动力活塞时", + "block.create.piston_extension_pole.tooltip.behaviour1": "活塞的移动范围将扩大", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "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.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "一种高级的机械轴承,可以根据当前游戏内时间旋转两个不同的指针", + "block.create.clockwork_bearing.tooltip.condition1": "当旋转时", + "block.create.clockwork_bearing.tooltip.behaviour1": "旋转第一个连接的结构作为时针,第二个连接的结构作为分针", + + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "一种可编程的组件,可以根据内部的指令改变旋转的_方向_,_速度_,以及_距离_。 此组件可以有效配合活塞和轴承等使用。最高可让其按_顺序_执行_5条指令_。条高速旋转时可能会变得不精确。", + "block.create.sequenced_gearshift.tooltip.condition1": "当给予红石信号时", + "block.create.sequenced_gearshift.tooltip.behaviour1": "在输入旋转动能的情况下,执行指令.", + "block.create.sequenced_gearshift.tooltip.condition2": "当右键时", + "block.create.sequenced_gearshift.tooltip.behaviour2": "将打开配置_配置界面_", + + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "将连接当前方块的结构连接在_矿车_上", + "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": "UNLOCALIZED: When placed above Detector Rail", + "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", + "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", + "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "移动绳索相连的结构. 使用_底盘_或者_粘液块_来移动多行方块", + "block.create.rope_pulley.tooltip.condition1": "当旋转时", + "block.create.rope_pulley.tooltip.behaviour1": "根据输入的转速的大小以及方向,移动链接的结构.", + + "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", + "block.create.linear_chassis.tooltip.summary": "一种可配置的_底盘_。这种底盘可以将多个方块连接起来组合成_大型结构_", + "block.create.linear_chassis.tooltip.condition1": "被移动时", + "block.create.linear_chassis.tooltip.behaviour1": "移动所有_并排_的_机壳底盘_。如果底盘上涂了_粘液球_,那么其范围内一条直线的方块都会被_黏附移动_(详情见Ctrl).", + "block.create.linear_chassis.tooltip.condition2": "当使用扳手时", + "block.create.linear_chassis.tooltip.behaviour2": "通过_鼠标滚轮_来配置连接的方块的范围.按住_Ctrl_时滚动滚轮可以同时配置相连的其他底盘.", + "block.create.linear_chassis.tooltip.control1": "当用粘液球右键时", + "block.create.linear_chassis.tooltip.action1": "变为_粘性机壳底盘_. 所有工作范围内与其相连的方块会与其_一同移动_", + + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "一种可配置的底盘。这种底盘可以将多个方块连接起来组合成_大型结构_", + "block.create.radial_chassis.tooltip.condition1": "当旋转时", + "block.create.radial_chassis.tooltip.behaviour1": "所有_竖排_的_旋转底盘_会互相粘连移动,并且每个涂了_粘液球_的底盘都会带动其工作半径内的方块(详情见Ctrl).", + "block.create.radial_chassis.tooltip.condition2": "当使用扳手时", + "block.create.radial_chassis.tooltip.behaviour2": "配置连接的方块的半径.按住_Ctrl_可以同时配置相连的其他底盘.", + "block.create.radial_chassis.tooltip.control1": "当用粘液球右键时", + "block.create.radial_chassis.tooltip.action1": "变为_粘性旋转底盘_.所有工作范围内与其相连的方块会与其_一同移动_.", + + "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", + "block.create.mechanical_drill.tooltip.summary": "用于_破坏方块_的装置,可以被_动力活塞_和_动力轴承_等带动", + "block.create.mechanical_drill.tooltip.condition1": "被供能时", + "block.create.mechanical_drill.tooltip.behaviour1": "_原地_破坏正前方的方块,且_伤害_在一定范围内生物及玩家.", + "block.create.mechanical_drill.tooltip.condition2": "当移动时", + "block.create.mechanical_drill.tooltip.behaviour2": "横向或纵向破坏其所_碰到_的方块.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", + "block.create.mechanical_harvester.tooltip.summary": "适用于中型作物自动化的收割机,可以被_动力活塞_和_动力轴承_等带动.", + "block.create.mechanical_harvester.tooltip.condition1": "当移动时", + "block.create.mechanical_harvester.tooltip.behaviour1": "收割机移动至成熟作物,收割作物并将作物变为初始生长状态.", + + "block.create.mechanical_plough.tooltip": "MECHANICAL mechanical_plough", + "block.create.mechanical_plough.tooltip.summary": "犁是一个非常有用的多功能方块, 它可以被 _动力活塞_ 和 _动力轴承_ 等带动", + "block.create.mechanical_plough.tooltip.condition1": "当移动时", + "block.create.mechanical_plough.tooltip.behaviour1": "可以打掉无碰撞体积的一些_附着方块_,比如火把和雪等. 可以在不伤害实体的情况下移动它们. 能像_锄头_一样翻土耕田.", + + "block.create.mechanical_saw.tooltip": "MECHANICAL mechanical_saw", + "block.create.mechanical_saw.tooltip.summary": "可以用于砍树,也可以用于切割方块,可以被_动力活塞_和_动力轴承_等带动", + "block.create.mechanical_saw.tooltip.condition1": "当向上放置时", + "block.create.mechanical_saw.tooltip.behaviour1": "可以切割各种物品(建议配合jei查看)", + "block.create.mechanical_saw.tooltip.condition2": "当方向在水平面时", + "block.create.mechanical_saw.tooltip.behaviour2": "可以砍倒面前的树木", + "block.create.mechanical_saw.tooltip.condition3": "当移动时", + "block.create.mechanical_saw.tooltip.behaviour3": "将会砍倒碰撞到的树木", + + "block.create.stockpile_switch.tooltip": "stockpile_switch", + "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.redstone_link.tooltip": "REDSTONE LINK", + "block.create.redstone_link.tooltip.summary": "无线红石信号终端,可以使用任何物品编辑终端频道. 虽然距离有限,但是也挺远的.", + "block.create.redstone_link.tooltip.condition1": "当启用时", + "block.create.redstone_link.tooltip.behaviour1": "接收相同频道提供的红石信号.", + "block.create.redstone_link.tooltip.control1": "当手持方块右键方块时", + "block.create.redstone_link.tooltip.action1": "手持任意物品为其设置频道,可以组合两个物品.", + "block.create.redstone_link.tooltip.control2": "当潜行右键时", + "block.create.redstone_link.tooltip.action2": "在终端模式和接收模式之间切换.", + + "block.create.nixie_tube.tooltip": "NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "一个花里胡哨的红石强度显示器,范围:0到15。", + "block.create.nixie_tube.tooltip.condition1": "被红石激活时", + "block.create.nixie_tube.tooltip.behaviour1": "直观的显示当前红石型号的强度", + + "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", + "block.create.redstone_contact.tooltip.summary": "一种用于高级红石装置的设备. 只能两两工作. 可以被_动力活塞_和_动力轴承_等带动", + "block.create.redstone_contact.tooltip.condition1": "当正对面放置也放置_相互朝向_的接触信号发生器时", + "block.create.redstone_contact.tooltip.behaviour1": "提供_红石信号_.", + "block.create.redstone_contact.tooltip.condition2": "当移动时", + "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.control1": "当右键方块时", + "block.create.adjustable_crate.tooltip.action1": "打开箱子", + + "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip.summary": "这个容器可以给临近的 _蓝图大炮_ 提供无限物品以及燃料 (创造专用物品)", + "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": "机械手可以最多伸长_两个方块_的距离", + "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.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.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "一个简单的电路元件,将通过的红石信号变为1tick.", + + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", + "block.create.adjustable_repeater.tooltip.summary": "高级中继器,最大可设置30分钟延迟", + + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "一种单次1tick的红石脉冲器,可以调节延时至30min", + + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "一种可以调节任意信号强度的推杆.", + + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "一种拉杆,在红石电路中可以用作t触发器.", + + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "一种拉杆,在红石电路中用作锁存器,从后方输入将会启用这个拉杆,从侧边输入将会重置这个拉杆.", + + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "测量并展示连接网络的旋转速度,支持使用红石比较器", + "block.create.speedometer.tooltip.condition1": "接入动力时", + "block.create.speedometer.tooltip.behaviour1": "将会用颜色展示速度的大小,绿-慢、蓝-中、紫-快.", + + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "测量并展示连接网络的应力值,支持红石比较器", + "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.super_glue.tooltip": "SUPER GLUE", + "item.create.super_glue.tooltip.summary": "让两个方块互相_粘黏_,他们会一直因此相爱到永远", + "item.create.super_glue.tooltip.condition1": "右键使用时", + "item.create.super_glue.tooltip.behaviour1": "有强力胶的方块的_那一面_会变得有粘性。和此面相邻的方块在被_动力活塞_或者_动力轴承_等方块驱动的时候会被一同带动", + "item.create.super_glue.tooltip.condition2": "在副手上时", + "item.create.super_glue.tooltip.behaviour2": "主手放置的方块会被_直接_黏在所放置的方块上", + + "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.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.randomWipDescription2": "使用后果自负", + "create.tooltip.randomWipDescription3": "(摇手指)这可不是你在找的物品, 走开吧", + "create.tooltip.randomWipDescription4": "自爆模式已启动,10,9,8...", + "create.tooltip.randomWipDescription5": "这玩意真的没用, 我骗你干嘛", + "create.tooltip.randomWipDescription6": "如果你使用这个东西, 那么本作者与它造成的任何后果没有责任.", + "create.tooltip.randomWipDescription7": "这玩意不是给你用的, 换个吧", + "create.tooltip.randomWipDescription8": "试试就逝世", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json new file mode 100644 index 000000000..da858b2fc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/andesite_casing", + "2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json new file mode 100644 index 000000000..67b96635e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/andesite_casing", + "2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json new file mode 100644 index 000000000..105a02ccb --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/andesite_casing", + "2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json new file mode 100644 index 000000000..1284e8489 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/andesite_casing", + "2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_chute_funnel_pull.json b/src/generated/resources/assets/create/models/block/andesite_chute_funnel_pull.json new file mode 100644 index 000000000..4561dbc7a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_chute_funnel_pull.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/andesite_casing", + "3": "create:block/andesite_funnel_pull", + "1_2": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_chute_funnel_push.json b/src/generated/resources/assets/create/models/block/andesite_chute_funnel_push.json new file mode 100644 index 000000000..5e9dde5b1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_chute_funnel_push.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/andesite_casing", + "3": "create:block/andesite_funnel_push", + "1_2": "create:block/andesite_funnel_back", + "4": "create:block/andesite_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel.json b/src/generated/resources/assets/create/models/block/andesite_funnel.json new file mode 100644 index 000000000..d16aeb312 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/block", + "textures": { + "2": "create:block/andesite_funnel_back", + "3": "create:block/andesite_funnel", + "4": "create:block/andesite_funnel_plating", + "particle": "create:block/andesite_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/cross.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/cross.json new file mode 100644 index 000000000..c36f22472 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/cross.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/cross", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/fullshade.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/fullshade.json new file mode 100644 index 000000000..ea791f982 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/fullshade.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/fullshade", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/halfshade.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/halfshade.json new file mode 100644 index 000000000..9729bac79 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/halfshade.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/halfshade", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/straight.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/straight.json new file mode 100644 index 000000000..6b6d059ef --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/straight.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/straight", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/t_left.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/t_left.json new file mode 100644 index 000000000..fabcf7ce3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/t_left.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/t_left", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/t_right.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/t_right.json new file mode 100644 index 000000000..b785de8e9 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/t_right.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/t_right", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_tunnel/window.json b/src/generated/resources/assets/create/models/block/andesite_tunnel/window.json new file mode 100644 index 000000000..bb22e06ca --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_tunnel/window.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/window", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json new file mode 100644 index 000000000..744a196ce --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json new file mode 100644 index 000000000..aa5aa7d49 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_pull_powered", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json new file mode 100644 index 000000000..6bdee09e6 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_pull_powered", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json new file mode 100644 index 000000000..8121dc133 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json new file mode 100644 index 000000000..a52556ff0 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json new file mode 100644 index 000000000..aa3f44366 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_push_powered", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json new file mode 100644 index 000000000..fc08d9de8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_push_powered", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json new file mode 100644 index 000000000..9dcab1608 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "create:block/brass_casing", + "2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull.json b/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull.json new file mode 100644 index 000000000..f5621e7c1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/brass_casing", + "3": "create:block/brass_funnel_pull", + "1_2": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull_powered.json new file mode 100644 index 000000000..4905bfe91 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull_powered.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/brass_casing", + "3": "create:block/brass_funnel_pull_powered", + "1_2": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_chute_funnel_push.json b/src/generated/resources/assets/create/models/block/brass_chute_funnel_push.json new file mode 100644 index 000000000..c7fa3fa20 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_chute_funnel_push.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/brass_casing", + "3": "create:block/brass_funnel_push", + "1_2": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_chute_funnel_push_powered.json b/src/generated/resources/assets/create/models/block/brass_chute_funnel_push_powered.json new file mode 100644 index 000000000..549934816 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_chute_funnel_push_powered.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/chute_funnel/block", + "textures": { + "particle": "create:block/brass_casing", + "3": "create:block/brass_funnel_push_powered", + "1_2": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating" + } +} \ 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 new file mode 100644 index 000000000..959b75b9a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/block", + "textures": { + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_casing" + } +} \ 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 new file mode 100644 index 000000000..d1e5a5f36 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_powered.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/block", + "textures": { + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel_powered", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/cross.json b/src/generated/resources/assets/create/models/block/brass_tunnel/cross.json new file mode 100644 index 000000000..e69d8638e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/cross.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/cross", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/fullshade.json b/src/generated/resources/assets/create/models/block/brass_tunnel/fullshade.json new file mode 100644 index 000000000..62ebfc72e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/fullshade.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/fullshade", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/halfshade.json b/src/generated/resources/assets/create/models/block/brass_tunnel/halfshade.json new file mode 100644 index 000000000..73f30d68c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/halfshade.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/halfshade", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/straight.json b/src/generated/resources/assets/create/models/block/brass_tunnel/straight.json new file mode 100644 index 000000000..c9453afcf --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/straight.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/straight", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/t_left.json b/src/generated/resources/assets/create/models/block/brass_tunnel/t_left.json new file mode 100644 index 000000000..6aaa5a249 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/t_left.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/t_left", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/t_right.json b/src/generated/resources/assets/create/models/block/brass_tunnel/t_right.json new file mode 100644 index 000000000..3747c79b2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/t_right.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/t_right", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_tunnel/window.json b/src/generated/resources/assets/create/models/block/brass_tunnel/window.json new file mode 100644 index 000000000..de9a58ab9 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_tunnel/window.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/window", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ 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 new file mode 100644 index 000000000..b3601a41f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/andesite_funnel.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/item", + "textures": { + "2": "create:block/andesite_funnel_back", + "3": "create:block/andesite_funnel", + "4": "create:block/andesite_funnel_plating", + "particle": "create:block/andesite_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_tunnel.json b/src/generated/resources/assets/create/models/item/andesite_tunnel.json new file mode 100644 index 000000000..36f34ac32 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/andesite_tunnel.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/item", + "textures": { + "0": "create:block/andesite_tunnel", + "1": "create:block/andesite_tunnel_top", + "particle": "block/polished_andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/belt_tunnel.json b/src/generated/resources/assets/create/models/item/belt_tunnel.json deleted file mode 100644 index e47d5d8df..000000000 --- a/src/generated/resources/assets/create/models/item/belt_tunnel.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/belt_tunnel/item" -} \ 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 new file mode 100644 index 000000000..3e7642b35 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brass_funnel.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/item", + "textures": { + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_tunnel.json b/src/generated/resources/assets/create/models/item/brass_tunnel.json new file mode 100644 index 000000000..567f8dd77 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brass_tunnel.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/belt_tunnel/item", + "textures": { + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/chute.json b/src/generated/resources/assets/create/models/item/chute.json new file mode 100644 index 000000000..b894cc392 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/chute.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/chute/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/depot.json b/src/generated/resources/assets/create/models/item/depot.json new file mode 100644 index 000000000..6efbe20e3 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/depot.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/depot/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/funnel.json b/src/generated/resources/assets/create/models/item/funnel.json deleted file mode 100644 index 2092f1ffc..000000000 --- a/src/generated/resources/assets/create/models/item/funnel.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/funnel/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/packager.json b/src/generated/resources/assets/create/models/item/packager.json new file mode 100644 index 000000000..18467506e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/packager.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/packager/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/mechanical_arm.json b/src/generated/resources/data/create/advancements/mechanical_arm.json new file mode 100644 index 000000000..81ca30467 --- /dev/null +++ b/src/generated/resources/data/create/advancements/mechanical_arm.json @@ -0,0 +1,46 @@ +{ + "parent": "create:brass_casing", + "display": { + "icon": { + "item": "create:mechanical_arm" + }, + "title": { + "translate": "advancement.create.mechanical_arm" + }, + "description": { + "translate": "advancement.create.mechanical_arm.desc" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "0": { + "trigger": "minecraft:placed_block", + "conditions": { + "block": "create:mechanical_arm" + } + }, + "1": { + "trigger": "create:kinetic_block", + "conditions": { + "block": "create:mechanical_arm" + } + }, + "2": { + "trigger": "create:mechanical_arm" + } + }, + "requirements": [ + [ + "0" + ], + [ + "1" + ], + [ + "2" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/musical_arm.json b/src/generated/resources/data/create/advancements/musical_arm.json new file mode 100644 index 000000000..05b68bce2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/musical_arm.json @@ -0,0 +1,46 @@ +{ + "parent": "create:mechanical_arm", + "display": { + "icon": { + "item": "minecraft:music_disc_13" + }, + "title": { + "translate": "advancement.create.musical_arm" + }, + "description": { + "translate": "advancement.create.musical_arm.desc" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "0": { + "trigger": "minecraft:placed_block", + "conditions": { + "block": "create:mechanical_arm" + } + }, + "1": { + "trigger": "create:kinetic_block", + "conditions": { + "block": "create:mechanical_arm" + } + }, + "2": { + "trigger": "create:musical_arm" + } + }, + "requirements": [ + [ + "0" + ], + [ + "1" + ], + [ + "2" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_belt_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_belt_funnel.json new file mode 100644 index 000000000..c6403dc5a --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_belt_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:andesite_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json new file mode 100644 index 000000000..c6403dc5a --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:andesite_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_funnel.json new file mode 100644 index 000000000..c6403dc5a --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:andesite_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_tunnel.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_tunnel.json new file mode 100644 index 000000000..64e2b05ab --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_tunnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:andesite_tunnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_belt_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/brass_belt_funnel.json new file mode 100644 index 000000000..c23027b20 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_belt_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_chute_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/brass_chute_funnel.json new file mode 100644 index 000000000..c23027b20 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_chute_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/brass_funnel.json new file mode 100644 index 000000000..c23027b20 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_funnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_tunnel.json b/src/generated/resources/data/create/loot_tables/blocks/brass_tunnel.json new file mode 100644 index 000000000..c627a6553 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_tunnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_tunnel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/funnel.json b/src/generated/resources/data/create/loot_tables/blocks/chute.json similarity index 88% rename from src/generated/resources/data/create/loot_tables/blocks/funnel.json rename to src/generated/resources/data/create/loot_tables/blocks/chute.json index 34ac7539d..aa1414e12 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/funnel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/chute.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:funnel" + "name": "create:chute" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/vertical_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/depot.json similarity index 88% rename from src/generated/resources/data/create/loot_tables/blocks/vertical_funnel.json rename to src/generated/resources/data/create/loot_tables/blocks/depot.json index 34ac7539d..0f2400aed 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/vertical_funnel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/depot.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:funnel" + "name": "create:depot" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/mechanical_piston_head.json b/src/generated/resources/data/create/loot_tables/blocks/mechanical_piston_head.json index 78793172c..7f5453a57 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/mechanical_piston_head.json +++ b/src/generated/resources/data/create/loot_tables/blocks/mechanical_piston_head.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "minecraft:air" + "name": "create:piston_extension_pole" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/belt_tunnel.json b/src/generated/resources/data/create/loot_tables/blocks/packager.json similarity index 87% rename from src/generated/resources/data/create/loot_tables/blocks/belt_tunnel.json rename to src/generated/resources/data/create/loot_tables/blocks/packager.json index 727739640..f3daac615 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/belt_tunnel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/packager.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:belt_tunnel" + "name": "create:packager" } ], "conditions": [ diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json new file mode 100644 index 000000000..c2e37b343 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -0,0 +1,15 @@ +{ + "replace": false, + "values": [ + "create:nozzle", + "create:hand_crank", + "create:rope", + "create:pulley_magnet", + "create:furnace_engine", + "create:redstone_link", + "create:extractor", + "create:vertical_extractor", + "create:linked_extractor", + "create:vertical_linked_extractor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/create_ingots.json b/src/generated/resources/data/create/tags/items/create_ingots.json new file mode 100644 index 000000000..c407a2e9a --- /dev/null +++ b/src/generated/resources/data/create/tags/items/create_ingots.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "create:copper_ingot", + "create:zinc_ingot", + "create:brass_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/beacon_payment.json b/src/generated/resources/data/forge/tags/items/beacon_payment.json new file mode 100644 index 000000000..ad8bdef78 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/beacon_payment.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#create:create_ingots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/cobblestone.json b/src/generated/resources/data/forge/tags/items/cobblestone.json new file mode 100644 index 000000000..4a5c2c1fb --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/cobblestone.json @@ -0,0 +1,14 @@ +{ + "replace": false, + "values": [ + "create:granite_cobblestone", + "create:diorite_cobblestone", + "create:andesite_cobblestone", + "create:limestone_cobblestone", + "create:weathered_limestone_cobblestone", + "create:dolomite_cobblestone", + "create:gabbro_cobblestone", + "create:scoria_cobblestone", + "create:dark_scoria_cobblestone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots.json b/src/generated/resources/data/forge/tags/items/ingots.json new file mode 100644 index 000000000..ad8bdef78 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#create:create_ingots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/nuggets.json b/src/generated/resources/data/forge/tags/items/nuggets.json new file mode 100644 index 000000000..6eb0a5036 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/nuggets.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "create:copper_nugget", + "create:zinc_nugget", + "create:brass_nugget" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/plates.json b/src/generated/resources/data/forge/tags/items/plates.json new file mode 100644 index 000000000..c294488df --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/plates.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "create:copper_sheet", + "create:brass_sheet", + "create:iron_sheet", + "create:golden_sheet" + ] +} \ 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 5d5ee020a..b2ccfbad5 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -29,7 +29,7 @@ public class AllBlockPartials { private static List all = new ArrayList<>(); public static final AllBlockPartials - SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"), + SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"), SCHEMATICANNON_PIPE = get("schematicannon/pipe"), SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"), @@ -58,8 +58,8 @@ public class AllBlockPartials { 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"), BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), - BELT_TUNNEL_INDICATOR = get("belt_tunnel/indicator"), FLEXPEATER_INDICATOR = get("diodes/indicator"), FLYWHEEL = get("flywheel/wheel"), FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), @@ -77,6 +77,7 @@ public class AllBlockPartials { ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"), MILLSTONE_COG = get("millstone/inner"), + PACKAGER_SEALER = get("packager/sealer"), SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), @@ -90,6 +91,11 @@ public class AllBlockPartials { ARM_CLAW_BASE = get("mechanical_arm/claw_base"), ARM_CLAW_GRIP = get("mechanical_arm/claw_grip"), + FLAG_SHORT_IN = get("mechanical_arm/flag/short_in"), + FLAG_SHORT_OUT = get("mechanical_arm/flag/short_out"), + FLAG_LONG_IN = get("mechanical_arm/flag/long_in"), + FLAG_LONG_OUT = get("mechanical_arm/flag/long_out"), + MECHANICAL_PUMP_ARROW = get("mechanical_pump/arrow"), MECHANICAL_PUMP_COG = get("mechanical_pump/cog"), FLUID_PIPE_CASING = get("fluid_pipe/casing"); diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index f6e4d1dc2..2d3398445 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -8,6 +8,7 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.base.CasingBlock; import com.simibubi.create.content.contraptions.components.actors.DrillBlock; @@ -62,6 +63,7 @@ import com.simibubi.create.content.contraptions.relays.advanced.sequencer.Sequen 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.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; @@ -76,6 +78,12 @@ import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock; +import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelCTBehaviour; +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.depot.DepotBlock; import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterGenerator; @@ -88,11 +96,19 @@ import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator; import com.simibubi.create.content.logistics.block.extractor.ExtractorBlock; import com.simibubi.create.content.logistics.block.extractor.LinkedExtractorBlock; import com.simibubi.create.content.logistics.block.extractor.VerticalExtractorGenerator; -import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.VerticalFunnelGenerator; +import com.simibubi.create.content.logistics.block.funnel.AndesiteBeltFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.AndesiteChuteFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock; +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.BrassChuteFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.ChuteFunnelGenerator; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; +import com.simibubi.create.content.logistics.block.packager.PackagerBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator; @@ -103,6 +119,7 @@ import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock import com.simibubi.create.content.logistics.block.transposer.LinkedTransposerBlock; import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; import com.simibubi.create.content.logistics.block.transposer.VerticalTransposerGenerator; +import com.simibubi.create.content.palettes.MetalBlock; import com.simibubi.create.content.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock; import com.simibubi.create.foundation.config.StressConfigDefaults; @@ -125,6 +142,7 @@ import net.minecraft.item.DyeColor; import net.minecraft.state.properties.PistonType; import net.minecraft.tags.BlockTags; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.common.ToolType; @@ -255,9 +273,11 @@ public class AllBlocks { public static final BlockEntry BELT = REGISTRATE.block("belt", BeltBlock::new) .initialProperties(SharedProperties.beltMaterial, MaterialColor.GRAY) .properties(p -> p.sound(SoundType.CLOTH)) + .properties(p -> p.hardnessAndResistance(0.8F)) + .blockstate(new BeltGenerator()::generate) .transform(StressConfigDefaults.setImpact(1.0)) .onRegister(CreateRegistrate.blockColors(() -> BeltColor::new)) - .blockstate(new BeltGenerator()::generate) + .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) .register(); public static final BlockEntry CREATIVE_MOTOR = @@ -290,6 +310,7 @@ public class AllBlocks { public static final BlockEntry NOZZLE = REGISTRATE.block("nozzle", NozzleBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.BRITTLE.tag) .blockstate(BlockStateGen.directionalBlockProvider(true)) .addLayer(() -> RenderType::getCutoutMipped) .item() @@ -307,6 +328,7 @@ public class AllBlocks { .initialProperties(SharedProperties::wooden) .blockstate(BlockStateGen.directionalBlockProvider(true)) .transform(StressConfigDefaults.setCapacity(32.0)) + .tag(AllBlockTags.BRITTLE.tag) .item() .transform(customItemModel()) .register(); @@ -377,6 +399,21 @@ public class AllBlocks { .simpleItem() .register(); + public static final BlockEntry DEPOT = REGISTRATE.block("depot", DepotBlock::new) + .initialProperties(SharedProperties::stone) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item() + .transform(customItemModel("_", "block")) + .register(); + + public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) + .initialProperties(SharedProperties::softMetal) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate(new ChuteGenerator()::generate) + .item(ChuteItem::new) + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry SPEEDOMETER = REGISTRATE.block("speedometer", GaugeBlock::speed) .initialProperties(SharedProperties::wooden) .transform(StressConfigDefaults.setNoImpact()) @@ -405,7 +442,7 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PUMP = REGISTRATE.block("mechanical_pump", PumpBlock::new) .initialProperties(SharedProperties::softMetal) - .blockstate(BlockStateGen.directionalBlockProvider(true)) + .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(true)) .transform(StressConfigDefaults.setImpact(4.0)) .item() .transform(customItemModel()) @@ -432,21 +469,22 @@ public class AllBlocks { .transform(BuilderTransformers.mechanicalPiston(PistonType.STICKY)) .register(); - public static final BlockEntry MECHANICAL_PISTON_HEAD = - REGISTRATE.block("mechanical_piston_head", MechanicalPistonHeadBlock::new) - .initialProperties(() -> Blocks.PISTON_HEAD) - .blockstate((c, p) -> p.directionalBlock(c.get(), state -> p.models() - .getExistingFile(p.modLoc("block/mechanical_piston/" + state.get(MechanicalPistonHeadBlock.TYPE) - .getName() + "/head")))) - .register(); - public static final BlockEntry PISTON_EXTENSION_POLE = REGISTRATE.block("piston_extension_pole", PistonExtensionPoleBlock::new) .initialProperties(() -> Blocks.PISTON_HEAD) - .blockstate(BlockStateGen.directionalBlockProvider(false)) + .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(false)) .simpleItem() .register(); + public static final BlockEntry MECHANICAL_PISTON_HEAD = + REGISTRATE.block("mechanical_piston_head", MechanicalPistonHeadBlock::new) + .initialProperties(() -> Blocks.PISTON_HEAD) + .loot((p, b) -> p.registerDropping(b, PISTON_EXTENSION_POLE.get())) + .blockstate((c, p) -> BlockStateGen.directionalBlockIgnoresWaterlogged(c, p, state -> p.models() + .getExistingFile(p.modLoc("block/mechanical_piston/" + state.get(MechanicalPistonHeadBlock.TYPE) + .getName() + "/head")))) + .register(); + public static final BlockEntry MECHANICAL_BEARING = REGISTRATE.block("mechanical_bearing", MechanicalBearingBlock::new) .transform(BuilderTransformers.bearing("mechanical", "gearbox")) @@ -470,6 +508,7 @@ public class AllBlocks { public static final BlockEntry ROPE = REGISTRATE.block("rope", PulleyBlock.RopeBlock::new) .initialProperties(SharedProperties.beltMaterial, MaterialColor.BROWN) + .tag(AllBlockTags.BRITTLE.tag) .properties(p -> p.sound(SoundType.CLOTH)) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .getExistingFile(p.modLoc("block/rope_pulley/" + c.getName())))) @@ -478,6 +517,7 @@ public class AllBlocks { public static final BlockEntry PULLEY_MAGNET = REGISTRATE.block("pulley_magnet", PulleyBlock.MagnetBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.BRITTLE.tag) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .getExistingFile(p.modLoc("block/rope_pulley/" + c.getName())))) .register(); @@ -654,6 +694,7 @@ public class AllBlocks { public static final BlockEntry FURNACE_ENGINE = REGISTRATE.block("furnace_engine", FurnaceEngineBlock::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.BRITTLE.tag) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(StressConfigDefaults.setCapacity(1024.0)) .item() @@ -675,6 +716,69 @@ public class AllBlocks { REGISTRATE.startSection(AllSections.LOGISTICS); } + public static final BlockEntry MECHANICAL_ARM = REGISTRATE.block("mechanical_arm", ArmBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((c, p) -> p.getVariantBuilder(c.get()) + .forAllStates(s -> ConfiguredModel.builder() + .modelFile(AssetLookup.partialBaseModel(c, p)) + .rotationX(s.get(ArmBlock.CEILING) ? 180 : 0) + .build())) + .transform(StressConfigDefaults.setImpact(8.0)) + .item(ArmItem::new) + .transform(customItemModel()) + .register(); + + public static final BlockEntry ANDESITE_FUNNEL = + REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) + .initialProperties(SharedProperties::stone) + .transform(BuilderTransformers.funnel("andesite", Create.asResource("block/andesite_casing"))) + .register(); + + public static final BlockEntry ANDESITE_BELT_FUNNEL = + REGISTRATE.block("andesite_belt_funnel", AndesiteBeltFunnelBlock::new) + .initialProperties(SharedProperties::stone) + .blockstate(new BeltFunnelGenerator("andesite")::generate) + .loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get())) + .register(); + + public static final BlockEntry ANDESITE_CHUTE_FUNNEL = + REGISTRATE.block("andesite_chute_funnel", AndesiteChuteFunnelBlock::new) + .initialProperties(SharedProperties::stone) + .blockstate(new ChuteFunnelGenerator("andesite")::generate) + .loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get())) + .register(); + + public static final BlockEntry BRASS_FUNNEL = + REGISTRATE.block("brass_funnel", BrassFunnelBlock::new) + .initialProperties(SharedProperties::softMetal) + .transform(BuilderTransformers.funnel("brass", Create.asResource("block/brass_casing"))) + .register(); + + public static final BlockEntry BRASS_BELT_FUNNEL = + REGISTRATE.block("brass_belt_funnel", BrassBeltFunnelBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate(new BeltFunnelGenerator("brass")::generate) + .loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get())) + .register(); + + public static final BlockEntry BRASS_CHUTE_FUNNEL = + REGISTRATE.block("brass_chute_funnel", BrassChuteFunnelBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate(new ChuteFunnelGenerator("brass")::generate) + .loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get())) + .register(); + + public static final BlockEntry ANDESITE_TUNNEL = + REGISTRATE.block("andesite_tunnel", BeltTunnelBlock::new) + .transform(BuilderTransformers.beltTunnel("andesite", new ResourceLocation("block/polished_andesite"))) + .register(); + + public static final BlockEntry BRASS_TUNNEL = + REGISTRATE.block("brass_tunnel", BrassTunnelBlock::new) + .transform(BuilderTransformers.beltTunnel("brass", Create.asResource("block/brass_block"))) + .onRegister(connectedTextures(new BrassTunnelCTBehaviour())) + .register(); + public static final BlockEntry REDSTONE_CONTACT = REGISTRATE.block("redstone_contact", RedstoneContactBlock::new) .initialProperties(SharedProperties::stone) @@ -686,6 +790,7 @@ public class AllBlocks { public static final BlockEntry REDSTONE_LINK = REGISTRATE.block("redstone_link", RedstoneLinkBlock::new) .initialProperties(SharedProperties::wooden) + .tag(AllBlockTags.BRITTLE.tag) .blockstate(new RedstoneLinkGenerator()::generate) .addLayer(() -> RenderType::getCutoutMipped) .item() @@ -727,30 +832,22 @@ public class AllBlocks { .transform(customItemModel()) .register(); - public static final BlockEntry BELT_TUNNEL = REGISTRATE.block("belt_tunnel", BeltTunnelBlock::new) - .initialProperties(SharedProperties::stone) - .addLayer(() -> RenderType::getCutoutMipped) - .blockstate((c, p) -> p.getVariantBuilder(c.get()) - .forAllStates(state -> ConfiguredModel.builder() - .modelFile(p.models() - .getExistingFile(p.modLoc("block/belt_tunnel/" + state.get(BeltTunnelBlock.SHAPE) - .getName()))) - .rotationY(state.get(BeltTunnelBlock.HORIZONTAL_AXIS) == Axis.X ? 0 : 90) - .build())) - .item() - .transform(customItemModel()) - .register(); - - public static final BlockEntry MECHANICAL_ARM = REGISTRATE.block("mechanical_arm", ArmBlock::new) + public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) .initialProperties(SharedProperties::softMetal) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .transform(StressConfigDefaults.setImpact(8.0)) + .transform(StressConfigDefaults.setImpact(4.0)) + .properties(p -> p.nonOpaque()) + .blockstate((c, p) -> p.getVariantBuilder(c.get()) + .forAllStates(s -> ConfiguredModel.builder() + .modelFile(AssetLookup.partialBaseModel(c, p)) + .rotationY(s.get(PackagerBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0) + .build())) .item() .transform(customItemModel()) .register(); public static final BlockEntry EXTRACTOR = REGISTRATE.block("extractor", ExtractorBlock::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.BRITTLE.tag) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, c.getName() + "/horizontal"))) .item() .transform(customItemModel("_", "horizontal")) @@ -759,12 +856,14 @@ public class AllBlocks { public static final BlockEntry VERTICAL_EXTRACTOR = REGISTRATE.block("vertical_extractor", ExtractorBlock.Vertical::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.BRITTLE.tag) .blockstate(new VerticalExtractorGenerator(false)::generate) .loot((p, b) -> p.registerDropping(b, EXTRACTOR.get())) .register(); public static final BlockEntry LINKED_EXTRACTOR = REGISTRATE .block("linked_extractor", LinkedExtractorBlock::new) + .tag(AllBlockTags.BRITTLE.tag) .initialProperties(SharedProperties::softMetal) .addLayer(() -> RenderType::getCutoutMipped) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, "extractor/horizontal_linked"))) @@ -775,26 +874,12 @@ public class AllBlocks { public static final BlockEntry VERTICAL_LINKED_EXTRACTOR = REGISTRATE.block("vertical_linked_extractor", LinkedExtractorBlock.Vertical::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.BRITTLE.tag) .blockstate(new VerticalExtractorGenerator(true)::generate) .loot((p, b) -> p.registerDropping(b, LINKED_EXTRACTOR.get())) .addLayer(() -> RenderType::getCutoutMipped) .register(); - public static final BlockEntry FUNNEL = REGISTRATE.block("funnel", FunnelBlock::new) - .initialProperties(SharedProperties::softMetal) - .blockstate((c, p) -> p.horizontalBlock(c.get(), state -> p.models() - .getExistingFile(p.modLoc("block/funnel/horizontal" + (state.get(FunnelBlock.BELT) ? "_belt" : ""))))) - .item() - .transform(customItemModel()) - .register(); - - public static final BlockEntry VERTICAL_FUNNEL = - REGISTRATE.block("vertical_funnel", FunnelBlock.Vertical::new) - .initialProperties(SharedProperties::softMetal) - .blockstate(new VerticalFunnelGenerator()::generate) - .loot((p, b) -> p.registerDropping(b, FUNNEL.get())) - .register(); - public static final BlockEntry TRANSPOSER = REGISTRATE.block("transposer", TransposerBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, c.getName() + "/block"), 180)) @@ -903,7 +988,7 @@ public class AllBlocks { .register(); public static final BlockEntry COPPER_BLOCK = - REGISTRATE.block("copper_block", p -> new OxidizingBlock(p, 1 / 32f)) + REGISTRATE.block("copper_block", p -> new OxidizingBlock(p, 1 / 32f, true)) .initialProperties(() -> Blocks.IRON_BLOCK) .transform(tagBlockAndItem("storage_blocks/copper")) .transform(oxidizedItemModel()) @@ -919,19 +1004,20 @@ public class AllBlocks { .transform(oxidizedBlockstate()) .register(); - public static final BlockEntry ZINC_BLOCK = REGISTRATE.block("zinc_block", Block::new) + public static final BlockEntry ZINC_BLOCK = REGISTRATE.block("zinc_block", p -> new MetalBlock(p, true)) .initialProperties(() -> Blocks.IRON_BLOCK) .transform(tagBlockAndItem("storage_blocks/zinc")) .build() .recipe((ctx, prov) -> prov.square(DataIngredient.tag(forgeItemTag("ingots/zinc")), ctx, false)) .register(); - public static final BlockEntry BRASS_BLOCK = REGISTRATE.block("brass_block", Block::new) - .initialProperties(() -> Blocks.IRON_BLOCK) - .transform(tagBlockAndItem("storage_blocks/brass")) - .build() - .recipe((ctx, prov) -> prov.square(DataIngredient.tag(forgeItemTag("ingots/brass")), ctx, false)) - .register(); + public static final BlockEntry BRASS_BLOCK = + REGISTRATE.block("brass_block", p -> new MetalBlock(p, true)) + .initialProperties(() -> Blocks.IRON_BLOCK) + .transform(tagBlockAndItem("storage_blocks/brass")) + .build() + .recipe((ctx, prov) -> prov.square(DataIngredient.tag(forgeItemTag("ingots/brass")), ctx, false)) + .register(); // Load this class diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 4e8a5507a..33482516b 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,13 +1,16 @@ package com.simibubi.create; import static com.simibubi.create.AllTags.forgeItemTag; +import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS; +import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES; +import static com.simibubi.create.AllTags.AllItemTags.NUGGETS; +import static com.simibubi.create.AllTags.AllItemTags.PLATES; import static com.simibubi.create.content.AllSections.CURIOSITIES; import static com.simibubi.create.content.AllSections.KINETICS; import static com.simibubi.create.content.AllSections.LOGISTICS; import static com.simibubi.create.content.AllSections.MATERIALS; import static com.simibubi.create.content.AllSections.SCHEMATICS; -import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MinecartContraptionItem; import com.simibubi.create.content.contraptions.goggles.GogglesItem; @@ -55,26 +58,26 @@ public class AllItems { } public static final ItemEntry COPPER_NUGGET = - taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper")), - ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc")), - BRASS_NUGGET = taggedIngredient("brass_nugget", forgeItemTag("nuggets/brass")), + taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper"), NUGGETS.tag), + ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc"), NUGGETS.tag), + BRASS_NUGGET = taggedIngredient("brass_nugget", forgeItemTag("nuggets/brass"), NUGGETS.tag), - COPPER_SHEET = taggedIngredient("copper_sheet", forgeItemTag("plates/copper")), - BRASS_SHEET = taggedIngredient("brass_sheet", forgeItemTag("plates/brass")), - IRON_SHEET = taggedIngredient("iron_sheet", forgeItemTag("plates/iron")), - GOLDEN_SHEET = taggedIngredient("golden_sheet", forgeItemTag("plates/gold")), + COPPER_SHEET = taggedIngredient("copper_sheet", forgeItemTag("plates/copper"), PLATES.tag), + BRASS_SHEET = taggedIngredient("brass_sheet", forgeItemTag("plates/brass"), PLATES.tag), + IRON_SHEET = taggedIngredient("iron_sheet", forgeItemTag("plates/iron"), PLATES.tag), + GOLDEN_SHEET = taggedIngredient("golden_sheet", forgeItemTag("plates/gold"), PLATES.tag), LAPIS_SHEET = ingredient("lapis_sheet"), - CRUSHED_IRON = taggedIngredient("crushed_iron_ore", AllItemTags.CRUSHED_ORES.tag), - CRUSHED_GOLD = taggedIngredient("crushed_gold_ore", AllItemTags.CRUSHED_ORES.tag), - CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", AllItemTags.CRUSHED_ORES.tag), - CRUSHED_ZINC = taggedIngredient("crushed_zinc_ore", AllItemTags.CRUSHED_ORES.tag), - CRUSHED_BRASS = taggedIngredient("crushed_brass", AllItemTags.CRUSHED_ORES.tag), + CRUSHED_IRON = taggedIngredient("crushed_iron_ore", CRUSHED_ORES.tag), + CRUSHED_GOLD = taggedIngredient("crushed_gold_ore", CRUSHED_ORES.tag), + CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", CRUSHED_ORES.tag), + CRUSHED_ZINC = taggedIngredient("crushed_zinc_ore", CRUSHED_ORES.tag), + CRUSHED_BRASS = taggedIngredient("crushed_brass", CRUSHED_ORES.tag), ANDESITE_ALLOY = ingredient("andesite_alloy"), - COPPER_INGOT = taggedIngredient("copper_ingot", forgeItemTag("ingots/copper")), - ZINC_INGOT = taggedIngredient("zinc_ingot", forgeItemTag("ingots/zinc")), - BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass")), + COPPER_INGOT = taggedIngredient("copper_ingot", forgeItemTag("ingots/copper"), CREATE_INGOTS.tag), + ZINC_INGOT = taggedIngredient("zinc_ingot", forgeItemTag("ingots/zinc"), CREATE_INGOTS.tag), + BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass"), CREATE_INGOTS.tag), WHEAT_FLOUR = ingredient("wheat_flour"), DOUGH = ingredient("dough"), POWDERED_OBSIDIAN = ingredient("powdered_obsidian"), ROSE_QUARTZ = ingredient("rose_quartz"), @@ -226,9 +229,10 @@ public class AllItems { .register(); } - private static ItemEntry taggedIngredient(String name, Tag tag) { + @SafeVarargs + private static ItemEntry taggedIngredient(String name, Tag... tags) { return REGISTRATE.item(name, Item::new) - .tag(tag) + .tag(tags) .register(); } diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index bcf46e91d..8e43223a2 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -28,8 +28,6 @@ public class AllShapes { CASING_11PX = shape(0, 0, 0, 16, 11, 16).forDirectional(), MOTOR_BLOCK = shape(3, 0, 3, 13, 14, 13).forDirectional(), FOUR_VOXEL_POLE = shape(6, 0, 6, 10, 16, 10).forAxis(), SIX_VOXEL_POLE = shape(5, 0, 5, 11, 16, 11).forAxis(), - BELT_FUNNEL = shape(3, -4, 11, 13, 8, 17).forHorizontal(SOUTH), - FUNNEL = shape(1, 1, 13, 15, 15, 17).forDirectional(SOUTH), EXTRACTOR = shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH) .withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)), TRANSPOSER = shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16) @@ -65,6 +63,24 @@ 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(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14) + .add(1, 6, 1, 15, 10, 15) + .add(0, 10, 0, 16, 16, 16) + .forDirectional(UP), + FUNNEL_COLLISION = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14) + .add(1, 6, 1, 15, 10, 15) + .add(0, 10, 0, 16, 13, 16) + .forDirectional(UP), + CHUTE_FUNNEL = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14) + .add(0, 8, 0, 16, 14, 16) + .add(1, 5, 1, 15, 18, 15) + .forDirectional(UP), + BELT_FUNNEL_RETRACTED = shape(3, -5, 14, 13, 13, 19).add(0, -5, 8, 16, 16, 14) + .forHorizontal(NORTH), + BELT_FUNNEL_EXTENDED = shape(3, -4, 6, 13, 13, 17).add(2, -4, 10, 14, 14, 14) + .add(1, -4, 6, 15, 15, 10) + .add(0, -5, 0, 16, 16, 6) + .forHorizontal(NORTH), PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) .add(3, 12, 3, 13, 16, 13) .forDirectional(Direction.UP) @@ -120,12 +136,18 @@ public class AllShapes { .build(), MECHANICAL_ARM = shape(2, 0, 2, 14, 10, 14).add(3, 0, 3, 13, 14, 13) .build(), + MECHANICAL_ARM_CEILING = shape(2, 6, 2, 14, 16, 14).add(3, 2, 3, 13, 16, 13) + .build(), + CHUTE = shape(1, 8, 1, 15, 16, 15).add(2, 0, 2, 14, 8, 14) + .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) .build(), TANK_TOP_BOTTOM = shape(TANK_BOTTOM_LID).add(TANK_TOP_LID) .add(TANK) + .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 d9f4f15ba..beeb4fa4e 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -47,10 +47,12 @@ public class AllSpriteShifts { CHASSIS_STICKY = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end_sticky"); public static final CTSpriteShiftEntry + BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"), FLUID_TANK = getCT(CTType.OMNIDIRECTIONAL, "fluid_tank"); public static final SpriteShiftEntry BELT = SpriteShifter.get("block/belt", "block/belt_animated"), + ANDESIDE_BELT_CASING = SpriteShifter.get("block/brass_casing_belt", "block/andesite_casing_belt"), CRAFTER_THINGIES = SpriteShifter.get("block/crafter_thingies", "block/crafter_thingies"); static { diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index e85354df0..72a957c20 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -1,8 +1,13 @@ package com.simibubi.create; +import static com.simibubi.create.AllTags.NameSpace.FORGE; +import static com.simibubi.create.AllTags.NameSpace.MOD; + +import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; +import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.util.nullness.NonNullFunction; import net.minecraft.block.Block; @@ -16,7 +21,10 @@ import net.minecraft.tags.Tag; import net.minecraft.tags.TagCollection; import net.minecraft.util.ResourceLocation; + public class AllTags { + private static final CreateRegistrate REGISTRATE = Create.registrate() + .itemGroup(() -> Create.baseCreativeTab); public static NonNullFunction, ItemBuilder>> tagBlockAndItem( String tagName) { @@ -24,7 +32,7 @@ public class AllTags { .item() .tag(forgeItemTag(tagName)); } - + public static Tag forgeBlockTag(String name) { return forgeTag(BlockTags.getCollection(), name); } @@ -32,7 +40,7 @@ public class AllTags { public static Tag forgeItemTag(String name) { return forgeTag(ItemTags.getCollection(), name); } - + public static Tag forgeTag(TagCollection collection, String name) { return tag(collection, "forge", name); } @@ -41,26 +49,49 @@ public class AllTags { return collection.getOrCreate(new ResourceLocation(domain, name)); } + public static enum NameSpace { + + MOD(Create.ID), FORGE("forge"), MC("minecraft") + + ; + String id; + + private NameSpace(String id) { + this.id = id; + } + } + public static enum AllItemTags { - CRUSHED_ORES; + CRUSHED_ORES(MOD), CREATE_INGOTS(MOD), BEACON_PAYMENT(FORGE), INGOTS(FORGE), NUGGETS(FORGE), PLATES(FORGE), COBBLESTONE(FORGE) + + ; + public Tag tag; - private AllItemTags() { - this(""); + private AllItemTags(NameSpace namespace) { + this(namespace, ""); } - private AllItemTags(String path) { + private AllItemTags(NameSpace namespace, String path) { tag = new ItemTags.Wrapper( - new ResourceLocation(Create.ID, (path.isEmpty() ? "" : path + "/") + Lang.asId(name()))); + new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name()))); } public boolean matches(ItemStack stack) { return tag.contains(stack.getItem()); } + + public void includeIn(AllItemTags parent) { + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getBuilder(parent.tag) + .add(tag)); + } } public static enum AllBlockTags { - WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE,; + WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE + + ; + public Tag tag; private AllBlockTags() { @@ -77,4 +108,8 @@ public class AllTags { } } + public static void register() { + AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.BEACON_PAYMENT); + AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.INGOTS); + } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 1557f2432..5e67ace79 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -72,16 +72,24 @@ import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverRe import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelRenderer; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +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.depot.DepotRenderer; +import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity; import com.simibubi.create.content.logistics.block.extractor.ExtractorTileEntity; import com.simibubi.create.content.logistics.block.extractor.LinkedExtractorTileEntity; +import com.simibubi.create.content.logistics.block.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateTileEntity; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; +import com.simibubi.create.content.logistics.block.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.block.packager.PackagerTileEntity; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; @@ -148,8 +156,12 @@ public class AllTileEntities { register("fluid_tank", FluidTankTileEntity::new, AllBlocks.FLUID_TANK); public static final TileEntityEntry BELT = register("belt", BeltTileEntity::new, AllBlocks.BELT); - public static final TileEntityEntry BELT_TUNNEL = - register("belt_tunnel", BeltTunnelTileEntity::new, AllBlocks.BELT_TUNNEL); + public static final TileEntityEntry CHUTE = + register("chute", ChuteTileEntity::new, AllBlocks.CHUTE); + public static final TileEntityEntry ANDESITE_TUNNEL = + register("andesite_tunnel", BeltTunnelTileEntity::new, AllBlocks.ANDESITE_TUNNEL); + public static final TileEntityEntry BRASS_TUNNEL = + register("brass_tunnel", BrassTunnelTileEntity::new, AllBlocks.BRASS_TUNNEL); public static final TileEntityEntry MECHANICAL_ARM = register("mechanical_arm", ArmTileEntity::new, AllBlocks.MECHANICAL_ARM); public static final TileEntityEntry MECHANICAL_PISTON = register("mechanical_piston", @@ -215,6 +227,15 @@ public class AllTileEntities { register("adjustable_crate", AdjustableCrateTileEntity::new, AllBlocks.ADJUSTABLE_CRATE); public static final TileEntityEntry CREATIVE_CRATE = register("creative_crate", CreativeCrateTileEntity::new, AllBlocks.CREATIVE_CRATE); + + public static final TileEntityEntry DEPOT = + register("depot", DepotTileEntity::new, AllBlocks.DEPOT); + public static final TileEntityEntry FUNNEL = register("funnel", FunnelTileEntity::new, + AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.BRASS_CHUTE_FUNNEL, AllBlocks.ANDESITE_FUNNEL, + AllBlocks.ANDESITE_BELT_FUNNEL, AllBlocks.ANDESITE_CHUTE_FUNNEL); + public static final TileEntityEntry PACKAGER = + register("packager", PackagerTileEntity::new, AllBlocks.PACKAGER); + public static final TileEntityEntry EXTRACTOR = register("extractor", ExtractorTileEntity::new, AllBlocks.EXTRACTOR, AllBlocks.VERTICAL_EXTRACTOR); public static final TileEntityEntry LINKED_EXTRACTOR = register("linked_extractor", @@ -223,8 +244,6 @@ public class AllTileEntities { register("transposer", TransposerTileEntity::new, AllBlocks.TRANSPOSER, AllBlocks.VERTICAL_TRANSPOSER); public static final TileEntityEntry LINKED_TRANSPOSER = register("linked_transposer", LinkedTransposerTileEntity::new, AllBlocks.LINKED_TRANSPOSER, AllBlocks.VERTICAL_LINKED_TRANSPOSER); - public static final TileEntityEntry FUNNEL = - register("funnel", FunnelTileEntity::new, AllBlocks.FUNNEL, AllBlocks.VERTICAL_FUNNEL); public static final TileEntityEntry BELT_OBSERVER = register("belt_observer", BeltObserverTileEntity::new, AllBlocks.BELT_OBSERVER); public static final TileEntityEntry ADJUSTABLE_REPEATER = @@ -263,7 +282,7 @@ public class AllTileEntities { bind(HAND_CRANK, HandCrankRenderer::new); bind(CUCKOO_CLOCK, CuckooClockRenderer::new); bind(ANALOG_LEVER, AnalogLeverRenderer::new); - + bind(MECHANICAL_PUMP, PumpRenderer::new); bind(FLUID_TANK, FluidTankRenderer::new); @@ -285,6 +304,9 @@ public class AllTileEntities { bind(FLYWHEEL, FlywheelRenderer::new); bind(FURNACE_ENGINE, EngineRenderer::new); bind(ROTATION_SPEED_CONTROLLER, SpeedControllerRenderer::new); + bind(PACKAGER, PackagerRenderer::new); + bind(DEPOT, DepotRenderer::new); + bind(CHUTE, ChuteRenderer::new); bind(CREATIVE_CRATE, SmartTileEntityRenderer::new); bind(REDSTONE_LINK, SmartTileEntityRenderer::new); @@ -293,8 +315,9 @@ public class AllTileEntities { bind(LINKED_EXTRACTOR, SmartTileEntityRenderer::new); bind(TRANSPOSER, SmartTileEntityRenderer::new); bind(LINKED_TRANSPOSER, SmartTileEntityRenderer::new); - bind(FUNNEL, SmartTileEntityRenderer::new); - bind(BELT_TUNNEL, BeltTunnelRenderer::new); + bind(FUNNEL, FunnelRenderer::new); + bind(ANDESITE_TUNNEL, BeltTunnelRenderer::new); + bind(BRASS_TUNNEL, BeltTunnelRenderer::new); bind(MECHANICAL_ARM, ArmRenderer::new); bind(BELT_OBSERVER, BeltObserverRenderer::new); bind(ADJUSTABLE_REPEATER, AdjustableRepeaterRenderer::new); diff --git a/src/main/java/com/simibubi/create/ClientEvents.java b/src/main/java/com/simibubi/create/ClientEvents.java index 1ad2cd5b8..c38981966 100644 --- a/src/main/java/com/simibubi/create/ClientEvents.java +++ b/src/main/java/com/simibubi/create/ClientEvents.java @@ -110,7 +110,6 @@ public class ClientEvents { return; double delta = event.getScrollDelta(); - // CollisionDebugger.onScroll(delta); boolean cancelled = CreateClient.schematicHandler.mouseScrolled(delta) || CreateClient.schematicAndQuillHandler.mouseScrolled(delta) || FilteringHandler.onScroll(delta) diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index d049b61c4..0033adc32 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -57,6 +57,7 @@ public class Create { AllBlocks.register(); AllItems.register(); + AllTags.register(); AllPaletteBlocks.register(); AllEntityTypes.register(); AllTileEntities.register(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 96361fccf..3cfd33723 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; @@ -110,6 +111,7 @@ public class CreateClient { ZapperRenderHandler.tick(); ExtendoGripRenderHandler.tick(); // CollisionDebugger.tick(); + ArmInteractionPointHandler.tick(); outliner.tickOutlines(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java index 605184e99..dd623508c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java @@ -27,14 +27,17 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc } protected Direction getFacingForPlacement(BlockItemUseContext context) { - Direction facing = context.getNearestLookingDirection().getOpposite(); - if (context.getPlayer().isSneaking()) + Direction facing = context.getNearestLookingDirection() + .getOpposite(); + if (context.getPlayer() != null && context.getPlayer() + .isSneaking()) facing = facing.getOpposite(); return facing; } protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) { - return context.getPlacementHorizontalFacing().getAxis() == Axis.X; + return context.getPlacementHorizontalFacing() + .getAxis() == Axis.X; } @Override @@ -44,30 +47,37 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc World world = context.getWorld(); boolean alongFirst = false; - if (facing.getAxis().isHorizontal()) { + if (facing.getAxis() + .isHorizontal()) { alongFirst = facing.getAxis() == Axis.Z; - Block blockAbove = world.getBlockState(pos.offset(Direction.UP)).getBlock(); + Block blockAbove = world.getBlockState(pos.offset(Direction.UP)) + .getBlock(); boolean shaftAbove = blockAbove instanceof IRotate && ((IRotate) blockAbove).hasShaftTowards(world, - pos.up(), world.getBlockState(pos.up()), Direction.DOWN); - Block blockBelow = world.getBlockState(pos.offset(Direction.DOWN)).getBlock(); + pos.up(), world.getBlockState(pos.up()), Direction.DOWN); + Block blockBelow = world.getBlockState(pos.offset(Direction.DOWN)) + .getBlock(); boolean shaftBelow = blockBelow instanceof IRotate && ((IRotate) blockBelow).hasShaftTowards(world, - pos.down(), world.getBlockState(pos.down()), Direction.UP); + pos.down(), world.getBlockState(pos.down()), Direction.UP); if (shaftAbove || shaftBelow) alongFirst = facing.getAxis() == Axis.X; } - if (facing.getAxis().isVertical()) { + if (facing.getAxis() + .isVertical()) { alongFirst = getAxisAlignmentForPlacement(context); Direction prefferedSide = null; for (Direction side : Direction.values()) { - if (side.getAxis().isVertical()) + if (side.getAxis() + .isVertical()) continue; - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); + BlockState blockState = context.getWorld() + .getBlockState(context.getPos() + .offset(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), - context.getPos().offset(side), blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() + .offset(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; break; @@ -81,12 +91,15 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc } } - return this.getDefaultState().with(FACING, facing).with(AXIS_ALONG_FIRST_COORDINATE, alongFirst); + return this.getDefaultState() + .with(FACING, facing) + .with(AXIS_ALONG_FIRST_COORDINATE, alongFirst); } @Override public Axis getRotationAxis(BlockState state) { - Axis pistonAxis = state.get(FACING).getAxis(); + Axis pistonAxis = state.get(FACING) + .getAxis(); boolean alongFirst = state.get(AXIS_ALONG_FIRST_COORDINATE); if (pistonAxis == Axis.X) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java index 28b281500..a2bc9e6f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java @@ -27,10 +27,12 @@ public abstract class DirectionalKineticBlock extends KineticBlock { public Direction getPreferredFacing(BlockItemUseContext context) { Direction prefferedSide = null; for (Direction side : Direction.values()) { - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); + BlockState blockState = context.getWorld() + .getBlockState(context.getPos() + .offset(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side), - blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() + .offset(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; break; @@ -45,10 +47,11 @@ public abstract class DirectionalKineticBlock extends KineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredFacing(context); - if (preferred == null || context.getPlayer().isSneaking()) { + if (preferred == null || (context.getPlayer() != null && context.getPlayer() + .isSneaking())) { Direction nearestLookingDirection = context.getNearestLookingDirection(); - return getDefaultState().with(FACING, - context.getPlayer().isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite()); + return getDefaultState().with(FACING, context.getPlayer() != null && context.getPlayer() + .isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite()); } return getDefaultState().with(FACING, preferred.getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java index b4f661d1f..dda1b90f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java @@ -16,7 +16,8 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { public RotatedPillarKineticBlock(Properties properties) { super(properties); - this.setDefaultState(this.getDefaultState().with(AXIS, Direction.Axis.Y)); + this.setDefaultState(this.getDefaultState() + .with(AXIS, Direction.Axis.Y)); } @Override @@ -40,10 +41,12 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { public static Axis getPreferredAxis(BlockItemUseContext context) { Axis prefferedAxis = null; for (Direction side : Direction.values()) { - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); + BlockState blockState = context.getWorld() + .getBlockState(context.getPos() + .offset(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side), - blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() + .offset(side), blockState, side.getOpposite())) if (prefferedAxis != null && prefferedAxis != side.getAxis()) { prefferedAxis = null; break; @@ -63,10 +66,15 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Axis preferredAxis = getPreferredAxis(context); - if (preferredAxis != null && !context.getPlayer().isSneaking()) - return this.getDefaultState().with(AXIS, preferredAxis); - return this.getDefaultState().with(AXIS, context.getPlayer().isSneaking() ? context.getFace().getAxis() - : context.getNearestLookingDirection().getAxis()); + if (preferredAxis != null && (context.getPlayer() == null || !context.getPlayer() + .isSneaking())) + return this.getDefaultState() + .with(AXIS, preferredAxis); + return this.getDefaultState() + .with(AXIS, preferredAxis != null && context.getPlayer() + .isSneaking() ? context.getFace() + .getAxis() + : context.getNearestLookingDirection() + .getAxis()); } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index e440cb32d..b99b6d784 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -76,7 +76,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); // Figure - if (clock.animationType != null) { + if (clock.animationType != Animation.NONE) { offset = -(angle / 135) * 1 / 2f + 10 / 16f; SuperByteBuffer figure = (clock.animationType == Animation.PIG ? AllBlockPartials.CUCKOO_PIG : AllBlockPartials.CUCKOO_CREEPER) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index e2cd4fb51..e67a32739 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -32,17 +32,18 @@ public class CuckooClockTileEntity extends KineticTileEntity { private boolean sendAnimationUpdate; enum Animation { - PIG, CREEPER, SURPRISE; + PIG, CREEPER, SURPRISE, NONE; } public CuckooClockTileEntity(TileEntityType type) { super(type); + animationType = Animation.NONE; } @Override public CompoundNBT writeToClient(CompoundNBT compound) { if (sendAnimationUpdate) - compound.putString("Animation", animationType == null ? "none" : NBTHelper.writeEnum(animationType)); + NBTHelper.writeEnum(compound, "Animation", animationType); sendAnimationUpdate = false; return super.writeToClient(compound); } @@ -50,11 +51,7 @@ public class CuckooClockTileEntity extends KineticTileEntity { @Override public void readClientUpdate(CompoundNBT tag) { if (tag.contains("Animation")) { - String string = tag.getString("Animation"); - if ("none".equals(string)) - animationType = null; - else - animationType = NBTHelper.readEnum(string, Animation.class); + animationType = NBTHelper.readEnum(tag, "Animation", Animation.class); animationProgress.lastValue = 0; animationProgress.value = 0; } @@ -72,7 +69,7 @@ public class CuckooClockTileEntity extends KineticTileEntity { int minutes = (dayTime % 1000) * 60 / 1000; if (!world.isRemote) { - if (animationType == null) { + if (animationType == Animation.NONE) { if (hours == 12 && minutes < 5) startAnimation(Animation.PIG); if (hours == 18 && minutes < 36 && minutes > 31) @@ -81,13 +78,13 @@ public class CuckooClockTileEntity extends KineticTileEntity { float value = animationProgress.value; animationProgress.set(value + 1); if (value > 100) - animationType = null; + animationType = Animation.NONE; if (animationType == Animation.SURPRISE && animationProgress.value == 50) { Vec3d center = VecHelper.getCenterOf(pos); world.destroyBlock(pos, false); world.createExplosion(null, CUCKOO_SURPRISE, center.x, center.y, center.z, 3, false, - Explosion.Mode.BREAK); + Explosion.Mode.BREAK); } } @@ -96,7 +93,7 @@ public class CuckooClockTileEntity extends KineticTileEntity { if (world.isRemote) { moveHands(hours, minutes); - if (animationType == null) { + if (animationType == Animation.NONE) { if (AnimationTickHolder.ticks % 32 == 0) playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 2f); else if (AnimationTickHolder.ticks % 16 == 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java index e19d27f0b..4d34fd6a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -76,8 +76,8 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT BlockState blockState = context.getWorld() .getBlockState(placedOnPos); - if ((blockState.getBlock() != this) || context.getPlayer() - .isSneaking()) { + if ((blockState.getBlock() != this) || (context.getPlayer() != null && context.getPlayer() + .isSneaking())) { BlockState stateForPlacement = super.getStateForPlacement(context); Direction direction = stateForPlacement.get(HORIZONTAL_FACING); if (direction != face) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 93d44a928..8bace4b11 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -5,6 +5,7 @@ import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlo import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Map.Entry; import org.apache.commons.lang3.tuple.Pair; @@ -13,8 +14,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments; @@ -27,7 +28,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; -import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -91,9 +91,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { setLazyTickRate(20); phase = Phase.IDLE; groupedItemsBeforeCraft = new GroupedItems(); - + // Does not get serialized due to active checking in tick - wasPoweredBefore = true; + wasPoweredBefore = true; } @Override @@ -337,13 +337,13 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } protected boolean isTargetingBelt() { + DirectBeltInputBehaviour behaviour = getTargetingBelt(); + return behaviour != null && behaviour.canInsertFromSide(getTargetFacing()); + } + + protected DirectBeltInputBehaviour getTargetingBelt() { BlockPos targetPos = pos.offset(getTargetFacing()); - if (!AllBlocks.BELT.has(world.getBlockState(targetPos))) - return false; - TileEntity te = world.getTileEntity(targetPos); - if (!(te instanceof BeltTileEntity)) - return false; - return ((KineticTileEntity) te).getSpeed() != 0; + return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE); } public void tryInsert() { @@ -355,22 +355,21 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { boolean chagedPhase = phase != Phase.INSERTING; final List> inserted = new LinkedList<>(); - groupedItems.grid.forEach((pair, stack) -> { - if (isTargetingBelt()) { - Direction facing = getTargetFacing(); - BlockPos targetPos = pos.offset(facing); - BeltTileEntity te = (BeltTileEntity) world.getTileEntity(targetPos); - if (te.tryInsertingFromSide(facing, stack, false)) - inserted.add(pair); - return; - } + DirectBeltInputBehaviour behaviour = getTargetingBelt(); + for (Entry, ItemStack> entry : groupedItems.grid.entrySet()) { + Pair pair = entry.getKey(); + ItemStack stack = entry.getValue(); + Direction facing = getTargetFacing(); - ItemStack remainder = inserting.insert(stack.copy(), false); - if (!remainder.isEmpty()) + ItemStack remainder = behaviour == null ? inserting.insert(stack.copy(), false) + : behaviour.handleInsertion(stack, facing, false); + if (!remainder.isEmpty()) { stack.setCount(remainder.getCount()); - else - inserted.add(pair); - }); + continue; + } + + inserted.add(pair); + } inserted.forEach(groupedItems.grid::remove); if (groupedItems.grid.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index d375ccca9..da13c072d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -33,7 +33,7 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this)); + } + @Override public void tick() { + super.tick(); if (isFrozen()) return; if (searchForEntity) { searchForEntity = false; List search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()), - e -> entityUUID.equals(e.getUniqueID())); + e -> entityUUID.equals(e.getUniqueID())); if (search.isEmpty()) clear(); else @@ -84,9 +91,9 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen if (!hasEntity()) { - float processingSpeed = MathHelper.clamp( - (speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0).getCount()) : 1), - .25f, 20); + float processingSpeed = + MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0) + .getCount()) : 1), .25f, 20); inventory.remainingTime -= processingSpeed; spawnParticles(inventory.getStackInSlot(0)); @@ -107,7 +114,8 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen continue; ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); entityIn.setMotion(Vec3d.ZERO); - entityIn.getPersistentData().put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos)); + entityIn.getPersistentData() + .put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos)); world.addEntity(entityIn); } inventory.clear(); @@ -118,8 +126,8 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen return; } - if (!processingEntity.isAlive() - || !processingEntity.getBoundingBox().intersects(new AxisAlignedBB(pos).grow(.5f))) { + if (!processingEntity.isAlive() || !processingEntity.getBoundingBox() + .intersects(new AxisAlignedBB(pos).grow(.5f))) { clear(); return; } @@ -136,7 +144,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen if (!(processingEntity instanceof ItemEntity)) { processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource, - AllConfigs.SERVER.kinetics.crushingDamage.get()); + AllConfigs.SERVER.kinetics.crushingDamage.get()); if (!processingEntity.isAlive()) { processingEntity.setPosition(outPos.x, outPos.y - .75f, outPos.z); } @@ -147,7 +155,8 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen itemEntity.setPickupDelay(20); if (processingEntity.getY() < pos.getY() + .25f) { inventory.clear(); - inventory.setStackInSlot(0, itemEntity.getItem().copy()); + inventory.setStackInSlot(0, itemEntity.getItem() + .copy()); itemInserted(inventory.getStackInSlot(0)); itemEntity.remove(); world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); @@ -161,15 +170,15 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen IParticleData particleData = null; if (stack.getItem() instanceof BlockItem) - particleData = - new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock().getDefaultState()); + particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() + .getDefaultState()); else particleData = new ItemParticleData(ParticleTypes.ITEM, stack); Random r = world.rand; for (int i = 0; i < 4; i++) world.addParticle(particleData, pos.getX() + r.nextFloat(), pos.getY() + r.nextFloat(), - pos.getZ() + r.nextFloat(), 0, 0, 0); + pos.getZ() + r.nextFloat(), 0, 0, 0); } private void applyRecipe() { @@ -177,10 +186,12 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen List list = new ArrayList<>(); if (recipe.isPresent()) { - int rolls = inventory.getStackInSlot(0).getCount(); + int rolls = inventory.getStackInSlot(0) + .getCount(); inventory.clear(); for (int roll = 0; roll < rolls; roll++) { - List rolledResults = recipe.get().rollResults(); + List rolledResults = recipe.get() + .rollResults(); for (int i = 0; i < rolledResults.size(); i++) { ItemStack stack = rolledResults.get(i); ItemHelper.addToList(stack, list); @@ -195,10 +206,11 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen } public Optional> findRecipe() { - Optional> crushingRecipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.CRUSHING.getType(), wrapper, world); + Optional> crushingRecipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.CRUSHING.getType(), wrapper, world); if (!crushingRecipe.isPresent()) - crushingRecipe = world.getRecipeManager().getRecipe(AllRecipeTypes.MILLING.getType(), wrapper, world); + crushingRecipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.MILLING.getType(), wrapper, world); return crushingRecipe; } @@ -231,7 +243,8 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen private void itemInserted(ItemStack stack) { Optional> recipe = findRecipe(); - inventory.remainingTime = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100; + inventory.remainingTime = recipe.isPresent() ? recipe.get() + .getProcessingDuration() : 100; inventory.appliedRecipe = false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index 7f315c3bb..11a175391 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -162,7 +162,7 @@ public class DeployerMovementBehaviour extends MovementBehaviour { } private Mode getMode(MovementContext context) { - return NBTHelper.readEnum(context.tileData.getString("Mode"), Mode.class); + return NBTHelper.readEnum(context.tileData, "Mode", Mode.class); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index c9cf85bec..8482b8529 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -160,7 +160,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); BlockState blockState = context.state; BlockPos pos = BlockPos.ZERO; - Mode mode = NBTHelper.readEnum(context.tileData.getString("Mode"), Mode.class); + Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); World world = context.world; AllBlockPartials handPose = mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 05a1002f5..825b15add 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -333,8 +333,8 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void read(CompoundNBT compound) { - state = NBTHelper.readEnum(compound.getString("State"), State.class); - mode = NBTHelper.readEnum(compound.getString("Mode"), Mode.class); + state = NBTHelper.readEnum(compound, "State", State.class); + mode = NBTHelper.readEnum(compound, "Mode", Mode.class); timer = compound.getInt("Timer"); deferredInventoryList = compound.getList("Inventory", NBT.TAG_COMPOUND); overflowItems = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND)); @@ -345,8 +345,8 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public CompoundNBT write(CompoundNBT compound) { - compound.putString("Mode", NBTHelper.writeEnum(mode)); - compound.putString("State", NBTHelper.writeEnum(state)); + NBTHelper.writeEnum(compound, "Mode", mode); + NBTHelper.writeEnum(compound, "State", state); compound.putInt("Timer", timer); if (player != null) { compound.put("HeldItem", player.getHeldItemMainhand().serializeNBT()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 4d159e624..d9bf3a889 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -7,11 +7,12 @@ import java.util.List; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.content.contraptions.particle.AirFlowParticleData; -import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing.Type; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -21,9 +22,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.monster.EndermanEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; import net.minecraft.util.SoundCategory; @@ -42,10 +41,10 @@ import net.minecraftforge.common.Tags; public class AirCurrent { - private static DamageSource damageSourceFire = - new DamageSource("create.fan_fire").setDifficultyScaled().setFireDamage(); - private static DamageSource damageSourceLava = - new DamageSource("create.fan_lava").setDifficultyScaled().setFireDamage(); + private static DamageSource damageSourceFire = new DamageSource("create.fan_fire").setDifficultyScaled() + .setFireDamage(); + private static DamageSource damageSourceLava = new DamageSource("create.fan_lava").setDifficultyScaled() + .setFireDamage(); public final EncasedFanTileEntity source; public AxisAlignedBB bounds = new AxisAlignedBB(0, 0, 0, 0, 0, 0); @@ -54,7 +53,8 @@ public class AirCurrent { public boolean pushing; public float maxDistance; - protected List> affectedBelts = new ArrayList<>(); + protected List> affectedItemHandlers = + new ArrayList<>(); protected List caughtEntities = new ArrayList<>(); public AirCurrent(EncasedFanTileEntity source) { @@ -66,14 +66,16 @@ public class AirCurrent { Direction facing = direction; if (world.isRemote) { float offset = pushing ? 0.5f : maxDistance + .5f; - Vec3d pos = VecHelper.getCenterOf(source.getPos()).add(new Vec3d(facing.getDirectionVec()).scale(offset)); + Vec3d pos = VecHelper.getCenterOf(source.getPos()) + .add(new Vec3d(facing.getDirectionVec()).scale(offset)); if (world.rand.nextFloat() < AllConfigs.CLIENT.fanParticleDensity.get()) world.addParticle(new AirFlowParticleData(source.getPos()), pos.x, pos.y, pos.z, 0, 0, 0); } for (Iterator iterator = caughtEntities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); - if (!entity.getBoundingBox().intersects(bounds)) { + if (!entity.getBoundingBox() + .intersects(bounds)) { iterator.remove(); continue; } @@ -83,7 +85,8 @@ public class AirCurrent { float sneakModifier = entity.isSneaking() ? 4096f : 512f; float speed = Math.abs(source.getSpeed()); - double entityDistance = entity.getPositionVec().distanceTo(center); + double entityDistance = entity.getPositionVec() + .distanceTo(center); float acceleration = (float) (speed / sneakModifier / (entityDistance / maxDistance)); Vec3d previousMotion = entity.getMotion(); float maxAcceleration = 5; @@ -127,15 +130,16 @@ public class AirCurrent { } break; case SPLASHING: - if (entity instanceof EndermanEntity || entity.getType() == EntityType.SNOW_GOLEM || entity.getType() == EntityType.BLAZE) { + if (entity instanceof EndermanEntity || entity.getType() == EntityType.SNOW_GOLEM + || entity.getType() == EntityType.BLAZE) { entity.attackEntityFrom(DamageSource.DROWN, 2); } if (!entity.isBurning()) break; entity.extinguish(); world.playSound(null, entity.getPosition(), SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, - SoundCategory.NEUTRAL, 0.7F, - 1.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.4F); + SoundCategory.NEUTRAL, 0.7F, + 1.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.4F); break; default: break; @@ -145,7 +149,7 @@ public class AirCurrent { } - tickBelts(); + tickAffectedHandlers(); } public void rebuild() { @@ -158,7 +162,8 @@ public class AirCurrent { World world = source.getWorld(); BlockPos start = source.getPos(); - direction = source.getBlockState().get(BlockStateProperties.FACING); + direction = source.getBlockState() + .get(BlockStateProperties.FACING); pushing = source.getAirFlowDirection() == direction; Vec3d directionVec = new Vec3d(direction.getDirectionVec()); Vec3d planeVec = VecHelper.planeByNormal(directionVec); @@ -166,9 +171,9 @@ public class AirCurrent { // 4 Rays test for holes in the shapes blocking the flow float offsetDistance = .25f; Vec3d[] offsets = new Vec3d[] { planeVec.mul(offsetDistance, offsetDistance, offsetDistance), - planeVec.mul(-offsetDistance, -offsetDistance, offsetDistance), - planeVec.mul(offsetDistance, -offsetDistance, -offsetDistance), - planeVec.mul(-offsetDistance, offsetDistance, -offsetDistance), }; + planeVec.mul(-offsetDistance, -offsetDistance, offsetDistance), + planeVec.mul(offsetDistance, -offsetDistance, -offsetDistance), + planeVec.mul(-offsetDistance, offsetDistance, -offsetDistance), }; maxDistance = source.getMaxDistance(); float limitedDistance = 0; @@ -190,15 +195,17 @@ public class AirCurrent { } for (Vec3d offset : offsets) { - Vec3d rayStart = - VecHelper.getCenterOf(currentPos).subtract(directionVec.scale(.5f + 1 / 32f)).add(offset); + Vec3d rayStart = VecHelper.getCenterOf(currentPos) + .subtract(directionVec.scale(.5f + 1 / 32f)) + .add(offset); Vec3d rayEnd = rayStart.add(directionVec.scale(1 + 1 / 32f)); BlockRayTraceResult blockraytraceresult = world.rayTraceBlocks(rayStart, rayEnd, currentPos, voxelshape, state); if (blockraytraceresult == null) continue Outer; - double distance = i - 1 + blockraytraceresult.getHitVec().distanceTo(rayStart); + double distance = i - 1 + blockraytraceresult.getHitVec() + .distanceTo(rayStart); if (limitedDistance < distance) limitedDistance = (float) distance; } @@ -244,68 +251,58 @@ public class AirCurrent { if (factor > 0) bounds = new AxisAlignedBB(start.offset(direction)).expand(scale); else { - bounds = new AxisAlignedBB(start.offset(direction)).contract(scale.x, scale.y, scale.z).offset(scale); + bounds = new AxisAlignedBB(start.offset(direction)).contract(scale.x, scale.y, scale.z) + .offset(scale); } } - findAffectedBelts(); + findAffectedHandlers(); } public void findEntities() { caughtEntities.clear(); - caughtEntities = source.getWorld().getEntitiesWithinAABBExcludingEntity(null, bounds); + caughtEntities = source.getWorld() + .getEntitiesWithinAABBExcludingEntity(null, bounds); } - public void findAffectedBelts() { + public void findAffectedHandlers() { World world = source.getWorld(); BlockPos start = source.getPos(); - affectedBelts.clear(); + affectedItemHandlers.clear(); for (int i = 0; i < maxDistance + 1; i++) { Type type = getSegmentAt(i); if (type == null) continue; - BlockPos pos = start.offset(direction, i); - TileEntity te = world.getTileEntity(pos); - if (te != null && (te instanceof BeltTileEntity)) - affectedBelts.add(Pair.of((BeltTileEntity) te, type)); - if (direction.getAxis().isVertical()) - continue; - pos = pos.down(); - te = world.getTileEntity(pos); - if (te == null || !(te instanceof BeltTileEntity)) - continue; - affectedBelts.add(Pair.of((BeltTileEntity) te, type)); + for (int offset : Iterate.zeroAndOne) { + BlockPos pos = start.offset(direction, i) + .down(offset); + TransportedItemStackHandlerBehaviour behaviour = + TileEntityBehaviour.get(world, pos, TransportedItemStackHandlerBehaviour.TYPE); + if (behaviour != null) + affectedItemHandlers.add(Pair.of(behaviour, type)); + if (direction.getAxis() + .isVertical()) + break; + } } } - public void tickBelts() { - for (Pair pair : affectedBelts) { - BeltTileEntity belt = pair.getKey(); - World world = belt.getWorld(); + public void tickAffectedHandlers() { + for (Pair pair : affectedItemHandlers) { + TransportedItemStackHandlerBehaviour handler = pair.getKey(); + World world = handler.getWorld(); InWorldProcessing.Type processingType = pair.getRight(); - BeltTileEntity controller = belt.getControllerTE(); - if (controller == null) - continue; - - controller.getInventory().forEachWithin(belt.index + .5f, .51f, (transported) -> { - InWorldProcessing.spawnParticlesForProcessing(world, - BeltHelper.getVectorForOffset(controller, transported.beltPosition), processingType); + handler.handleProcessingOnAllItems((transported) -> { + InWorldProcessing.spawnParticlesForProcessing(world, handler.getWorldPositionOf(transported), + processingType); if (world.isRemote) return null; - return InWorldProcessing.applyProcessing(transported, belt, processingType); + return InWorldProcessing.applyProcessing(transported, world, processingType); }); } } - public void writeToNBT(CompoundNBT nbt) { - - } - - public void readFromNBT(CompoundNBT nbt) { - - } - private static boolean shouldAlwaysPass(BlockState state) { if (state.isIn(Tags.Blocks.FENCES)) return true; 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 792feb485..3f912e71e 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 @@ -1,5 +1,6 @@ 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.foundation.block.ITE; @@ -34,19 +35,38 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE behaviours) { super.addBehaviours(behaviours); - CenteredSideValueBoxTransform slot = - new CenteredSideValueBoxTransform((state, direction) -> direction.getAxis().isHorizontal()) { + CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform((state, direction) -> direction.getAxis() + .isHorizontal()) { - @Override - protected Vec3d getSouthLocation() { - return super.getSouthLocation().add(0, 4 / 16f, 0); - } + @Override + protected Vec3d getSouthLocation() { + return super.getSouthLocation().add(0, 4 / 16f, 0); + } - }; + }; minIngredients = new ScrollValueBehaviour(Lang.translate("mechanical_mixer.min_ingredients"), this, slot); minIngredients.between(1, 9); minIngredients.withCallback(i -> basinChecker.scheduleUpdate()); @@ -74,7 +75,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { offset = num - .5f; } else if (runningTicks <= 20) { offset = 1; - } else if (runningTicks > 20) { + } else { localTick = 40 - runningTicks; float num = (localTick - partialTicks) / 20f; num = ((2 - MathHelper.cos((float) (num * Math.PI))) / 2); @@ -93,9 +94,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (runningTicks <= 20) { return speed * 2; } - if (runningTicks > 20) { - return speed; - } + return speed; } return speed / 2; } @@ -119,10 +118,17 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { return super.write(compound); } + @Override + public void lazyTick() { + super.lazyTick(); + if (world.isRemote && running && !basinItemInv.isPresent()) + updateBasin(); + } + @Override public void tick() { super.tick(); - + if (runningTicks >= 40) { running = false; runningTicks = 0; @@ -130,7 +136,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } float speed = Math.abs(getSpeed()); - if (running) { + if (running && world != null) { if (world.isRemote && runningTicks == 20) renderParticles(); @@ -155,52 +161,55 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } public void renderParticles() { - IItemHandler itemHandler = basinInv.orElse(null); - if (itemHandler != null) { - BasinInventory inv = (BasinInventory) itemHandler; + IItemHandler itemHandler = basinItemInv.orElse(null); + BasinInventory inv = (BasinInventory) itemHandler; + if (inv == null) + return; - for (int slot = 0; slot < inv.getInputHandler().getSlots(); slot++) { - ItemStack stackInSlot = itemHandler.getStackInSlot(slot); - if (stackInSlot.isEmpty()) - continue; + for (int slot = 0; slot < inv.getInputHandler() + .getSlots(); slot++) { + ItemStack stackInSlot = itemHandler.getStackInSlot(slot); + if (stackInSlot.isEmpty()) + continue; - ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); - float angle = world.rand.nextFloat() * 360; - Vec3d offset = new Vec3d(0, 0, 0.25f); - offset = VecHelper.rotate(offset, angle, Axis.Y); - Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y).add(0, .25f, 0); + ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); + float angle = world.rand.nextFloat() * 360; + Vec3d offset = new Vec3d(0, 0, 0.25f); + offset = VecHelper.rotate(offset, angle, Axis.Y); + Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y) + .add(0, .25f, 0); - Vec3d center = offset.add(VecHelper.getCenterOf(pos)); - target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); - world.addParticle(data, center.x, center.y - 2, center.z, target.x, target.y, target.z); - } + Vec3d center = offset.add(VecHelper.getCenterOf(pos)); + target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); + world.addParticle(data, center.x, center.y - 2, center.z, target.x, target.y, target.z); } } @Override protected boolean matchStaticFilters(IRecipe r) { return (r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS || r.getType() == AllRecipeTypes.MIXING.type) - && !MechanicalPressTileEntity.canCompress(r.getIngredients()); + && !MechanicalPressTileEntity.canCompress(r.getIngredients()); } @Override protected boolean matchBasinRecipe(IRecipe recipe) { if (recipe == null) return false; - if (recipe.getIngredients().size() < minIngredients.getValue()) + if (recipe.getIngredients() + .size() < minIngredients.getValue()) return false; NonNullList ingredients = recipe.getIngredients(); if (!ingredients.stream() - .allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1))) + .allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1))) return false; List remaining = new ArrayList<>(); - inputs.forEach(stack -> remaining.add(stack.copy())); + inputs.forEachItemStack(stack -> remaining.add(stack.copy())); // sort by leniency List sortedIngredients = new LinkedList<>(ingredients); - sortedIngredients.sort((i1, i2) -> i1.getMatchingStacks().length - i2.getMatchingStacks().length); + sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length)); Ingredients: for (Ingredient ingredient : sortedIngredients) { for (ItemStack stack : remaining) { if (stack.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java index 4d43aca95..f150e692a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java @@ -34,7 +34,8 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredFacing(context); - if (context.getPlayer().isSneaking() || preferred == null) + if ((context.getPlayer() != null && context.getPlayer() + .isSneaking()) || preferred == null) return super.getStateForPlacement(context); return getDefaultState().with(FACING, preferred); } @@ -48,7 +49,8 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING).getAxis(); + return state.get(FACING) + .getAxis(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java new file mode 100644 index 000000000..2c86155b3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java @@ -0,0 +1,59 @@ +package com.simibubi.create.content.contraptions.components.press; + +import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.HOLD; +import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.PASS; + +import java.util.List; +import java.util.Optional; + +import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; + +import net.minecraft.item.ItemStack; + +public class BeltPressingCallbacks { + + static ProcessingResult onItemReceived(TransportedItemStack transported, + TransportedItemStackHandlerBehaviour handler, MechanicalPressTileEntity press) { + if (press.getSpeed() == 0 || press.running) + return PASS; + if (!press.getRecipe(transported.stack) + .isPresent()) + return PASS; + + press.start(Mode.BELT); + return HOLD; + } + + static ProcessingResult whenItemHeld(TransportedItemStack transported, TransportedItemStackHandlerBehaviour handler, + MechanicalPressTileEntity pressTe) { + + if (pressTe.getSpeed() == 0) + return PASS; + if (!pressTe.running) + return PASS; + if (pressTe.runningTicks != 30) + return HOLD; + + Optional recipe = pressTe.getRecipe(transported.stack); + pressTe.pressedItems.clear(); + pressTe.pressedItems.add(transported.stack); + + if (!recipe.isPresent()) + return PASS; + + ItemStack out = recipe.get() + .getRecipeOutput() + .copy(); + List multipliedOutput = ItemHelper.multipliedOutput(transported.stack, out); + if (multipliedOutput.isEmpty()) + transported.stack = ItemStack.EMPTY; + transported.stack = multipliedOutput.get(0); + pressTe.sendData(); + return HOLD; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java index dfba5cc3b..d5cc08418 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java @@ -1,28 +1,16 @@ package com.simibubi.create.content.contraptions.components.press; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.item.ItemHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -30,12 +18,11 @@ import net.minecraft.util.math.BlockPos; 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 class MechanicalPressBlock extends HorizontalKineticBlock - implements ITE, IBeltAttachment { + implements ITE { public MechanicalPressBlock(Properties properties) { super(properties); @@ -93,95 +80,6 @@ public class MechanicalPressBlock extends HorizontalKineticBlock return face.getAxis() == state.get(HORIZONTAL_FACING).getAxis(); } - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - onAttachmentPlaced(worldIn, pos, state); - } - - @Override - public List getPotentialAttachmentPositions(IWorld world, BlockPos pos, BlockState beltState) { - return Arrays.asList(pos.up(2)); - } - - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - onAttachmentRemoved(worldIn, pos, state); - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - worldIn.removeTileEntity(pos); - } - } - - @Override - public BlockPos getBeltPositionForAttachment(IWorld world, BlockPos pos, BlockState state) { - return pos.down(2); - } - - @Override - public boolean isAttachedCorrectly(IWorld world, BlockPos attachmentPos, BlockPos beltPos, - BlockState attachmentState, BlockState beltState) { - return AllBlocks.BELT.has(beltState) && beltState.get(BeltBlock.SLOPE) == Slope.HORIZONTAL; - } - - @Override - public boolean startProcessingItem(BeltTileEntity belt, TransportedItemStack transported, - BeltAttachmentState state) { - try { - MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos); - if (pressTe.getSpeed() == 0) - return false; - if (pressTe.running) - return false; - if (!pressTe.getRecipe(transported.stack).isPresent()) - return false; - - state.processingDuration = 1; - pressTe.start(Mode.BELT); - return true; - - } catch (TileEntityException e) {} - return false; - } - - @Override - public boolean processItem(BeltTileEntity belt, TransportedItemStack transportedStack, BeltAttachmentState state) { - try { - MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos); - - // Not powered - if (pressTe.getSpeed() == 0) - return false; - - // Running - if (!pressTe.running) - return false; - if (pressTe.runningTicks != 30) - return true; - - Optional recipe = pressTe.getRecipe(transportedStack.stack); - - pressTe.pressedItems.clear(); - pressTe.pressedItems.add(transportedStack.stack); - - if (!recipe.isPresent()) - return false; - - ItemStack out = recipe.get().getRecipeOutput().copy(); - List multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out); - if (multipliedOutput.isEmpty()) - transportedStack.stack = ItemStack.EMPTY; - transportedStack.stack = multipliedOutput.get(0); - - BeltTileEntity controllerTE = belt.getControllerTE(); - if (controllerTE != null) - controllerTE.sendData(); - pressTe.sendData(); - return true; - - } catch (TileEntityException e) {} - - return false; - } - @Override public Class getTileEntityClass() { return MechanicalPressTileEntity.class; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index f74f9e725..e35e23ae7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -11,6 +11,8 @@ import com.simibubi.create.content.contraptions.processing.BasinTileEntity.Basin import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.entity.Entity; @@ -37,7 +39,7 @@ import net.minecraftforge.items.wrapper.RecipeWrapper; public class MechanicalPressTileEntity extends BasinOperatingTileEntity { - private static Object compressingRecipesKey = new Object(); + private static final Object compressingRecipesKey = new Object(); public List pressedItems = new ArrayList<>(); public static class PressingInv extends RecipeWrapper { @@ -53,12 +55,14 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { float headOffset; - private Mode(float headOffset) { + Mode(float headOffset) { this.headOffset = headOffset; } } - private static PressingInv pressingInv = new PressingInv(); + private static final PressingInv pressingInv = new PressingInv(); + public BeltProcessingBehaviour processingBehaviour; + public int runningTicks; public boolean running; public Mode mode; @@ -69,6 +73,15 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { mode = Mode.WORLD; } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + processingBehaviour = + new BeltProcessingBehaviour(this).whenItemEnters((s, i) -> BeltPressingCallbacks.onItemReceived(s, i, this)) + .whileItemHeld((s, i) -> BeltPressingCallbacks.whenItemHeld(s, i, this)); + behaviours.add(processingBehaviour); + } + @Override public void read(CompoundNBT compound) { running = compound.getBoolean("Running"); @@ -105,7 +118,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { @Override public AxisAlignedBB getRenderBoundingBox() { - return new AxisAlignedBB(pos).expand(0, -1.5, 0).expand(0, 1, 0); + return new AxisAlignedBB(pos).expand(0, -1.5, 0) + .expand(0, 1, 0); } public float getRenderedHeadOffset(float partialTicks) { @@ -114,10 +128,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { float num = (runningTicks - 1 + partialTicks) / 30f; return MathHelper.clamp(num * num * num, 0, mode.headOffset); } - if (runningTicks >= 40) { - return MathHelper.clamp(((60 - runningTicks) + 1 - partialTicks) / 20f * mode.headOffset, 0, - mode.headOffset); - } + return MathHelper.clamp(((60 - runningTicks) + 1 - partialTicks) / 20f * mode.headOffset, 0, + mode.headOffset); } return 0; } @@ -134,10 +146,6 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { return mode == Mode.WORLD; } - public boolean onBelt() { - return mode == Mode.BELT; - } - public boolean onBasin() { return mode == Mode.BASIN; } @@ -146,7 +154,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public void tick() { super.tick(); - if (!running) + if (!running || world == null) return; if (runningTicks == 30) { @@ -176,11 +184,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (!world.isRemote) { pressedItems.clear(); applyBasinRecipe(); - IItemHandler orElse = basinInv.orElse(null); - if (basinInv.isPresent() && orElse instanceof BasinInventory) { + IItemHandler orElse = basinItemInv.orElse(null); + if (basinItemInv.isPresent() && orElse instanceof BasinInventory) { BasinInventory inv = (BasinInventory) orElse; - for (int slot = 0; slot < inv.getInputHandler().getSlots(); slot++) { + for (int slot = 0; slot < inv.getInputHandler() + .getSlots(); slot++) { ItemStack stackInSlot = inv.getStackInSlot(slot); if (stackInSlot.isEmpty()) continue; @@ -194,9 +203,9 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (!world.isRemote) { world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ITEM_BREAK.get(), SoundCategory.BLOCKS, - .5f, 1f); + .5f, 1f); world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.get(), SoundCategory.BLOCKS, - .125f, 1f); + .125f, 1f); } } @@ -229,47 +238,48 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { pressedItems.forEach(stack -> makeCompactingParticleEffect(VecHelper.getCenterOf(pos.down(2)), stack)); } if (mode == Mode.BELT) { - pressedItems.forEach( - stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(2)).add(0, 8 / 16f, 0), stack)); + pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(2)) + .add(0, 8 / 16f, 0), stack)); } if (mode == Mode.WORLD) { - pressedItems.forEach( - stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(1)).add(0, -1 / 4f, 0), stack)); + pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(1)) + .add(0, -1 / 4f, 0), stack)); } pressedItems.clear(); } public void makePressingParticleEffect(Vec3d pos, ItemStack stack) { - if (world.isRemote) { + if (world != null && world.isRemote) { for (int i = 0; i < 20; i++) { - Vec3d motion = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, .125f).mul(1, 0, 1); + Vec3d motion = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, .125f) + .mul(1, 0, 1); world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y - .25f, pos.z, motion.x, - motion.y + .125f, motion.z); + motion.y + .125f, motion.z); } } } public void makeCompactingParticleEffect(Vec3d pos, ItemStack stack) { - if (world.isRemote) { + if (world != null && world.isRemote) { for (int i = 0; i < 20; i++) { - Vec3d motion = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, .175f).mul(1, 0, 1); + Vec3d motion = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, .175f) + .mul(1, 0, 1); world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y, pos.z, motion.x, - motion.y + .25f, motion.z); + motion.y + .25f, motion.z); } } } public Optional getRecipe(ItemStack item) { pressingInv.setInventorySlotContents(0, item); - Optional recipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.PRESSING.getType(), pressingInv, world); - return recipe; + return world.getRecipeManager() + .getRecipe(AllRecipeTypes.PRESSING.getType(), pressingInv, world); } public static boolean canCompress(NonNullList ingredients) { - return (ingredients.size() == 4 || ingredients.size() == 9) - && ItemHelper.condenseIngredients(ingredients).size() == 1; + return (ingredients.size() == 4 || ingredients.size() == 9) && ItemHelper.condenseIngredients(ingredients) + .size() == 1; } @Override @@ -283,11 +293,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { return false; NonNullList ingredients = recipe.getIngredients(); - if (!ingredients.stream().allMatch(Ingredient::isSimple)) + if (!ingredients.stream() + .allMatch(Ingredient::isSimple)) return false; List remaining = new ArrayList<>(); - inputs.forEach(stack -> remaining.add(stack.copy())); + inputs.forEachItemStack(stack -> remaining.add(stack.copy())); Ingredients: for (Ingredient ingredient : ingredients) { for (ItemStack stack : remaining) { 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 705fb5c6c..a8e1197ad 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 @@ -61,18 +61,25 @@ public class SawRenderer extends SafeTileEntityRenderer { if (te.getSpeed() < 0 ^ alongZ) offset = 1 - offset; - ItemStack stack = te.inventory.getStackInSlot(0); - ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); - IBakedModel modelWithOverrides = itemRenderer.getItemModelWithOverrides(stack, te.getWorld(), null); - boolean blockItem = modelWithOverrides.isGui3d(); - - ms.translate(alongZ ? offset : .5, blockItem ? .925f : 13f / 16f, alongZ ? .5 : offset); - - ms.scale(.5f, .5f, .5f); - if (alongZ) - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90)); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); - itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, light, overlay, ms, buffer); + for (int i = 0; i < te.inventory.getSlots(); i++) { + ItemStack stack = te.inventory.getStackInSlot(i); + if (stack.isEmpty()) + continue; + + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + IBakedModel modelWithOverrides = itemRenderer.getItemModelWithOverrides(stack, te.getWorld(), null); + boolean blockItem = modelWithOverrides.isGui3d(); + + ms.translate(alongZ ? offset : .5, blockItem ? .925f : 13f / 16f, alongZ ? .5 : offset); + + ms.scale(.5f, .5f, .5f); + if (alongZ) + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90)); + ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); + itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, light, overlay, ms, buffer); + break; + } + ms.pop(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 07539ab22..9fd313749 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -8,13 +8,12 @@ import java.util.List; import java.util.Random; import java.util.stream.Collectors; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity; import com.simibubi.create.content.contraptions.processing.ProcessingInventory; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.item.ItemHelper; 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.TreeCutter; @@ -44,7 +43,6 @@ import net.minecraft.particles.IParticleData; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tags.BlockTags; -import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -78,6 +76,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { super.addBehaviours(behaviours); filtering = new FilteringBehaviour(this, new SawFilterSlot()); behaviours.add(filtering); + behaviours.add(new DirectBeltInputBehaviour(this)); } @Override @@ -142,81 +141,51 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { Vec3d itemMovement = getItemMovementVec(); Direction itemMovementFacing = Direction.getFacingFromVector(itemMovement.x, itemMovement.y, itemMovement.z); - Vec3d outPos = VecHelper.getCenterOf(pos).add(itemMovement.scale(.5f).add(0, .5, 0)); - Vec3d outMotion = itemMovement.scale(.0625).add(0, .125, 0); + if (inventory.remainingTime > 0) + return; + inventory.remainingTime = 0; - if (inventory.remainingTime <= 0) { - - // Try moving items onto the belt - BlockPos nextPos = pos.add(itemMovement.x, itemMovement.y, itemMovement.z); - if (AllBlocks.BELT.has(world.getBlockState(nextPos))) { - TileEntity te = world.getTileEntity(nextPos); - if (te != null && te instanceof BeltTileEntity) { - for (int slot = 0; slot < inventory.getSlots(); slot++) { - ItemStack stack = inventory.getStackInSlot(slot); - if (stack.isEmpty()) - continue; - - if (((BeltTileEntity) te).tryInsertingFromSide(itemMovementFacing, stack, false)) - inventory.setStackInSlot(slot, ItemStack.EMPTY); - else { - inventory.remainingTime = 0; - return; - } - } - inventory.clear(); - inventory.remainingTime = -1; - sendData(); - } - } - - // Try moving items onto next saw - if (AllBlocks.MECHANICAL_SAW.has(world.getBlockState(nextPos))) { - TileEntity te = world.getTileEntity(nextPos); - if (te != null && te instanceof SawTileEntity) { - SawTileEntity sawTileEntity = (SawTileEntity) te; - Vec3d otherMovement = sawTileEntity.getItemMovementVec(); - if (Direction.getFacingFromVector(otherMovement.x, otherMovement.y, - otherMovement.z) != itemMovementFacing.getOpposite()) { - for (int slot = 0; slot < inventory.getSlots(); slot++) { - ItemStack stack = inventory.getStackInSlot(slot); - if (stack.isEmpty()) - continue; - - ProcessingInventory sawInv = sawTileEntity.inventory; - if (sawInv.isEmpty()) { - sawInv.insertItem(0, stack, false); - inventory.setStackInSlot(slot, ItemStack.EMPTY); - - } else { - inventory.remainingTime = 0; - return; - } - } - inventory.clear(); - inventory.remainingTime = -1; - sendData(); - } - } - } - - // Eject Items + BlockPos nextPos = pos.add(itemMovement.x, itemMovement.y, itemMovement.z); + DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); + if (behaviour != null) { + boolean changed = false; + if (!behaviour.canInsertFromSide(itemMovementFacing)) + return; for (int slot = 0; slot < inventory.getSlots(); slot++) { ItemStack stack = inventory.getStackInSlot(slot); if (stack.isEmpty()) continue; - ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); - entityIn.setMotion(outMotion); - world.addEntity(entityIn); + ItemStack remainder = behaviour.handleInsertion(stack, itemMovementFacing, false); + if (remainder.equals(stack, false)) + continue; + inventory.setStackInSlot(slot, remainder); + changed = true; + } + if (changed) { + markDirty(); + sendData(); } - inventory.clear(); - world.updateComparatorOutputLevel(pos, getBlockState().getBlock()); - inventory.remainingTime = -1; - sendData(); return; } - return; + // Eject Items + Vec3d outPos = VecHelper.getCenterOf(pos) + .add(itemMovement.scale(.5f) + .add(0, .5, 0)); + Vec3d outMotion = itemMovement.scale(.0625) + .add(0, .125, 0); + for (int slot = 0; slot < inventory.getSlots(); slot++) { + ItemStack stack = inventory.getStackInSlot(slot); + if (stack.isEmpty()) + continue; + ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); + entityIn.setMotion(outMotion); + world.addEntity(entityIn); + } + inventory.clear(); + world.updateComparatorOutputLevel(pos, getBlockState().getBlock()); + inventory.remainingTime = -1; + sendData(); } @Override @@ -240,8 +209,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { IParticleData particleData = null; float speed = 1; if (stack.getItem() instanceof BlockItem) - particleData = - new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock().getDefaultState()); + particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() + .getDefaultState()); else { particleData = new ItemParticleData(ParticleTypes.ITEM, stack); speed = .125f; @@ -253,7 +222,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { float offset = inventory.recipeDuration != 0 ? (float) (inventory.remainingTime) / inventory.recipeDuration : 0; offset -= .5f; world.addParticle(particleData, pos.getX() + -vec.x * offset, pos.getY() + .45f, pos.getZ() + -vec.z * offset, - -vec.x * speed, r.nextFloat() * speed, -vec.z * speed); + -vec.x * speed, r.nextFloat() * speed, -vec.z * speed); } public Vec3d getItemMovementVec() { @@ -271,7 +240,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { IRecipe recipe = recipes.get(recipeIndex); - int rolls = inventory.getStackInSlot(0).getCount(); + int rolls = inventory.getStackInSlot(0) + .getCount(); inventory.clear(); List list = new ArrayList<>(); @@ -280,7 +250,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { if (recipe instanceof CuttingRecipe) results = ((CuttingRecipe) recipe).rollResults(); else if (recipe instanceof StonecuttingRecipe) - results.add(recipe.getRecipeOutput().copy()); + results.add(recipe.getRecipeOutput() + .copy()); for (int i = 0; i < results.size(); i++) { ItemStack stack = results.get(i); @@ -294,10 +265,11 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { private List> getRecipes() { List> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, - RecipeConditions.isOfType(IRecipeType.STONECUTTING, AllRecipeTypes.CUTTING.getType())); - return startedSearch.stream().filter(RecipeConditions.outputMatchesFilter(filtering)) - .filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0))) - .collect(Collectors.toList()); + RecipeConditions.isOfType(IRecipeType.STONECUTTING, AllRecipeTypes.CUTTING.getType())); + return startedSearch.stream() + .filter(RecipeConditions.outputMatchesFilter(filtering)) + .filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0))) + .collect(Collectors.toList()); } public void insertItem(ItemEntity entity) { @@ -309,7 +281,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return; inventory.clear(); - inventory.insertItem(0, entity.getItem().copy(), false); + inventory.insertItem(0, entity.getItem() + .copy(), false); entity.remove(); } @@ -357,7 +330,9 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override protected boolean shouldRun() { - return getBlockState().get(SawBlock.FACING).getAxis().isHorizontal(); + return getBlockState().get(SawBlock.FACING) + .getAxis() + .isHorizontal(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index 0c045e624..e5944e514 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.contraptions.components.actors.AttachedActorBlock; import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; @@ -15,12 +16,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.MagnetBlock; -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.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.content.logistics.block.extractor.ExtractorBlock; -import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; @@ -29,7 +27,6 @@ import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.BellBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.block.CarpetBlock; import net.minecraft.block.DoorBlock; import net.minecraft.block.FenceGateBlock; @@ -73,7 +70,7 @@ public class BlockMovementTraits { return true; if (blockState.getBlockHardness(world, pos) == -1) return false; - if (block == Blocks.OBSIDIAN) + if (AllBlockTags.NON_MOVABLE.tag.contains(block)) return false; // Move controllers only when they aren't moving @@ -99,8 +96,6 @@ public class BlockMovementTraits { return true; if (block instanceof ExtractorBlock) return true; - if (block instanceof FunnelBlock) - return true; return blockState.getPushReaction() != PushReaction.BLOCK; } @@ -112,22 +107,13 @@ public class BlockMovementTraits { Block block = state.getBlock(); if (state.has(BlockStateProperties.HANGING)) return true; - if (block instanceof HandCrankBlock) - return true; + if (block instanceof LadderBlock) return true; - if (block instanceof ExtractorBlock) - return true; - if (block instanceof FunnelBlock) - return true; if (block instanceof TorchBlock) return true; - if (block instanceof FlowerPotBlock) - return true; if (block instanceof AbstractPressurePlateBlock) return true; - if (block instanceof DoorBlock) - return true; if (block instanceof HorizontalFaceBlock) return true; if (block instanceof AbstractRailBlock) @@ -136,21 +122,9 @@ public class BlockMovementTraits { return true; if (block instanceof RedstoneWireBlock) return true; - if (block instanceof RedstoneLinkBlock) - return true; - if (block instanceof RopeBlock) - return true; - if (block instanceof NozzleBlock) - return true; - if (block instanceof MagnetBlock) - return true; - if (block instanceof EngineBlock) - return true; if (block instanceof CarpetBlock) return true; - if (block instanceof BellBlock) - return true; - return false; + return AllBlockTags.BRITTLE.tag.contains(block); } /** diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/CancelPlayerFallPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/CancelPlayerFallPacket.java index 71cac0863..f26e99bff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/CancelPlayerFallPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/CancelPlayerFallPacket.java @@ -24,6 +24,8 @@ public class CancelPlayerFallPacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity sender = context.get().getSender(); + if (sender == null) + return; sender.handleFallDamage(sender.fallDistance, 1.0F); sender.fallDistance = 0; sender.onGround = true; 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 a34df62e1..f89f05aa0 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 @@ -1,25 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BiPredicate; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - -import org.apache.commons.lang3.tuple.MutablePair; -import org.apache.commons.lang3.tuple.Pair; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.saw.SawBlock; @@ -42,20 +22,15 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; - -import net.minecraft.block.AbstractButtonBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.DoorBlock; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.block.SlimeBlock; +import net.minecraft.block.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.NBTUtil; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.ChestType; import net.minecraft.state.properties.DoubleBlockHalf; import net.minecraft.tileentity.TileEntity; @@ -72,651 +47,666 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraftforge.common.util.Constants.BlockFlags; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nullable; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; + +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; public abstract class Contraption { - public Map blocks; - public Map storage; - public List> actors; - public CombinedInvWrapper inventory; - public List customRenderTEs; - public Set> superglue; + public Map blocks; + public Map storage; + public List> actors; + public CombinedInvWrapper inventory; + public List customRenderTEs; + public Set> superglue; - public AxisAlignedBB bounds; - public boolean stalled; + public AxisAlignedBB bounds; + public boolean stalled; - protected Set cachedColliders; - protected Direction cachedColliderDirection; - protected BlockPos anchor; + protected Set cachedColliders; + protected Direction cachedColliderDirection; + protected BlockPos anchor; + protected List glueToRemove; + List renderOrder; - List renderOrder; - protected List glueToRemove; + public Contraption() { + blocks = new HashMap<>(); + storage = new HashMap<>(); + actors = new ArrayList<>(); + superglue = new HashSet<>(); + renderOrder = new ArrayList<>(); + customRenderTEs = new ArrayList<>(); + glueToRemove = new ArrayList<>(); + } - public Contraption() { - blocks = new HashMap<>(); - storage = new HashMap<>(); - actors = new ArrayList<>(); - superglue = new HashSet<>(); - renderOrder = new ArrayList<>(); - customRenderTEs = new ArrayList<>(); - glueToRemove = new ArrayList<>(); + protected static boolean isChassis(BlockState state) { + return state.getBlock() instanceof AbstractChassisBlock; + } + + public static CompoundNBT getTileEntityNBT(World world, BlockPos pos) { + TileEntity tileentity = world.getTileEntity(pos); + CompoundNBT compoundnbt = null; + if (tileentity != null) { + compoundnbt = tileentity.write(new CompoundNBT()); + compoundnbt.remove("x"); + compoundnbt.remove("y"); + compoundnbt.remove("z"); + } + return compoundnbt; + } + + public static Contraption fromNBT(World world, CompoundNBT nbt) { + String type = nbt.getString("Type"); + Contraption contraption = AllContraptionTypes.fromType(type); + contraption.readNBT(world, nbt); + return contraption; + } + + public static boolean isFrozen() { + return AllConfigs.SERVER.control.freezeContraptions.get(); + } + + protected static MovementBehaviour getMovement(BlockState state) { + Block block = state.getBlock(); + if (!(block instanceof IPortableBlock)) + return null; + return ((IPortableBlock) block).getMovementBehaviour(); + } + + public Set getColliders(World world, Direction movementDirection) { + if (blocks == null) + return null; + if (cachedColliders == null || cachedColliderDirection != movementDirection) { + cachedColliders = new HashSet<>(); + cachedColliderDirection = movementDirection; + + for (BlockInfo info : blocks.values()) { + BlockPos offsetPos = info.pos.offset(movementDirection); + if (info.state.getCollisionShape(world, offsetPos) + .isEmpty()) + continue; + if (blocks.containsKey(offsetPos) && !blocks.get(offsetPos).state.getCollisionShape(world, offsetPos) + .isEmpty()) + continue; + cachedColliders.add(info.pos); + } + + } + return cachedColliders; + } + + public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) { + List frontier = new ArrayList<>(); + Set visited = new HashSet<>(); + anchor = pos; + + if (bounds == null) + bounds = new AxisAlignedBB(BlockPos.ZERO); + + if (!BlockMovementTraits.isBrittle(world.getBlockState(pos))) + frontier.add(pos); + if (!addToInitialFrontier(world, pos, forcedDirection, frontier)) + return false; + for (int limit = 100000; limit > 0; limit--) { + if (frontier.isEmpty()) + return true; + if (!moveBlock(world, frontier.remove(0), forcedDirection, frontier, visited)) + return false; + } + return false; + } + + public void gatherStoredItems() { + List list = storage.values() + .stream() + .map(MountedStorage::getItemHandler) + .collect(Collectors.toList()); + inventory = new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); + } + + protected boolean addToInitialFrontier(World world, BlockPos pos, Direction forcedDirection, + List frontier) { + return true; + } + + protected boolean moveBlock(World world, BlockPos pos, Direction forcedDirection, List frontier, + Set visited) { + visited.add(pos); + frontier.remove(pos); + + if (!world.isBlockPresent(pos)) + return false; + if (isAnchoringBlockAt(pos)) + return true; + if (!BlockMovementTraits.movementNecessary(world, pos)) + return true; + if (!BlockMovementTraits.movementAllowed(world, pos)) + return false; + BlockState state = world.getBlockState(pos); + if (isChassis(state) && !moveChassis(world, pos, forcedDirection, frontier, visited)) + return false; + + if (AllBlocks.ADJUSTABLE_CRATE.has(state)) + AdjustableCrateBlock.splitCrate(world, pos); + if (AllBlocks.BELT.has(state)) { + BlockPos nextPos = BeltBlock.nextSegmentPosition(state, pos, true); + BlockPos prevPos = BeltBlock.nextSegmentPosition(state, pos, false); + if (nextPos != null && !visited.contains(nextPos)) + frontier.add(nextPos); + if (prevPos != null && !visited.contains(prevPos)) + frontier.add(prevPos); + } + + // Pulleys drag their rope and their attached structure + if (state.getBlock() instanceof PulleyBlock) { + int limit = AllConfigs.SERVER.kinetics.maxRopeLength.get(); + BlockPos ropePos = pos; + while (limit-- >= 0) { + ropePos = ropePos.down(); + if (!world.isBlockPresent(ropePos)) + break; + BlockState ropeState = world.getBlockState(ropePos); + Block block = ropeState.getBlock(); + if (!(block instanceof RopeBlock) && !(block instanceof MagnetBlock)) { + if (!visited.contains(ropePos)) + frontier.add(ropePos); + break; + } + add(ropePos, capture(world, ropePos)); + } + } + + // Pistons drag their attaches poles and extension + if (state.getBlock() instanceof MechanicalPistonBlock) { + int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get(); + Direction direction = state.get(MechanicalPistonBlock.FACING); + if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { + BlockPos searchPos = pos; + while (limit-- >= 0) { + searchPos = searchPos.offset(direction); + BlockState blockState = world.getBlockState(searchPos); + if (isExtensionPole(blockState)) { + if (blockState.get(PistonExtensionPoleBlock.FACING) + .getAxis() != direction.getAxis()) + break; + if (!visited.contains(searchPos)) + frontier.add(searchPos); + continue; + } + if (isPistonHead(blockState)) + if (!visited.contains(searchPos)) + frontier.add(searchPos); + break; + } + if (limit <= -1) + return false; + } + + BlockPos searchPos = pos; + while (limit-- >= 0) { + searchPos = searchPos.offset(direction.getOpposite()); + BlockState blockState = world.getBlockState(searchPos); + if (isExtensionPole(blockState)) { + if (blockState.get(PistonExtensionPoleBlock.FACING) + .getAxis() != direction.getAxis()) + break; + if (!visited.contains(searchPos)) + frontier.add(searchPos); + continue; + } + break; + } + + if (limit <= -1) + return false; + } + + // Doors try to stay whole + if (state.getBlock() instanceof DoorBlock) { + BlockPos otherPartPos = pos.up(state.get(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? 1 : -1); + if (!visited.contains(otherPartPos)) + frontier.add(otherPartPos); + } + + Map superglue = SuperGlueHandler.gatherGlue(world, pos); + + // Slime blocks drag adjacent blocks if possible + boolean isSlimeBlock = state.getBlock() instanceof SlimeBlock; + for (Direction offset : Direction.values()) { + BlockPos offsetPos = pos.offset(offset); + BlockState blockState = world.getBlockState(offsetPos); + if (isAnchoringBlockAt(offsetPos)) + continue; + if (!BlockMovementTraits.movementAllowed(world, offsetPos)) { + if (offset == forcedDirection && isSlimeBlock) + return false; + continue; + } + + boolean wasVisited = visited.contains(offsetPos); + boolean faceHasGlue = superglue.containsKey(offset); + boolean blockAttachedTowardsFace = + BlockMovementTraits.isBlockAttachedTowards(blockState, offset.getOpposite()); + boolean brittle = BlockMovementTraits.isBrittle(blockState); + + if (!wasVisited && ((isSlimeBlock && !brittle) || blockAttachedTowardsFace || faceHasGlue)) + frontier.add(offsetPos); + + if (faceHasGlue) + addGlue(superglue.get(offset)); + } + + add(pos, capture(world, pos)); + return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get(); } - public Set getColliders(World world, Direction movementDirection) { - if (blocks == null) - return null; - if (cachedColliders == null || cachedColliderDirection != movementDirection) { - cachedColliders = new HashSet<>(); - cachedColliderDirection = movementDirection; - - for (BlockInfo info : blocks.values()) { - BlockPos offsetPos = info.pos.offset(movementDirection); - if (info.state.getCollisionShape(world, offsetPos) - .isEmpty()) - continue; - if (blocks.containsKey(offsetPos) && !blocks.get(offsetPos).state.getCollisionShape(world, offsetPos) - .isEmpty()) - continue; - cachedColliders.add(info.pos); - } - - } - return cachedColliders; - } - - public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) { - List frontier = new ArrayList<>(); - Set visited = new HashSet<>(); - anchor = pos; - - if (bounds == null) - bounds = new AxisAlignedBB(BlockPos.ZERO); - - if (!BlockMovementTraits.isBrittle(world.getBlockState(pos))) - frontier.add(pos); - if (!addToInitialFrontier(world, pos, forcedDirection, frontier)) - return false; - for (int limit = 100000; limit > 0; limit--) { - if (frontier.isEmpty()) - return true; - if (!moveBlock(world, frontier.remove(0), forcedDirection, frontier, visited)) - return false; - } - return false; - } - - public void gatherStoredItems() { - List list = storage.values() - .stream() - .map(MountedStorage::getItemHandler) - .collect(Collectors.toList()); - inventory = new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); - } - - protected boolean addToInitialFrontier(World world, BlockPos pos, Direction forcedDirection, - List frontier) { - return true; - } - - protected boolean moveBlock(World world, BlockPos pos, Direction forcedDirection, List frontier, - Set visited) { - visited.add(pos); - frontier.remove(pos); - - if (!world.isBlockPresent(pos)) - return false; - if (isAnchoringBlockAt(pos)) - return true; - if (!BlockMovementTraits.movementNecessary(world, pos)) - return true; - if (!BlockMovementTraits.movementAllowed(world, pos)) - return false; - BlockState state = world.getBlockState(pos); - if (isChassis(state) && !moveChassis(world, pos, forcedDirection, frontier, visited)) - return false; - - if (AllBlocks.ADJUSTABLE_CRATE.has(state)) - AdjustableCrateBlock.splitCrate(world, pos); - if (AllBlocks.BELT.has(state)) { - BlockPos nextPos = BeltBlock.nextSegmentPosition(state, pos, true); - BlockPos prevPos = BeltBlock.nextSegmentPosition(state, pos, false); - if (nextPos != null && !visited.contains(nextPos)) - frontier.add(nextPos); - if (prevPos != null && !visited.contains(prevPos)) - frontier.add(prevPos); - } - - // Pulleys drag their rope and their attached structure - if (state.getBlock() instanceof PulleyBlock) { - int limit = AllConfigs.SERVER.kinetics.maxRopeLength.get(); - BlockPos ropePos = pos; - while (limit-- >= 0) { - ropePos = ropePos.down(); - if (!world.isBlockPresent(ropePos)) - break; - BlockState ropeState = world.getBlockState(ropePos); - Block block = ropeState.getBlock(); - if (!(block instanceof RopeBlock) && !(block instanceof MagnetBlock)) { - if (!visited.contains(ropePos)) - frontier.add(ropePos); - break; - } - add(ropePos, capture(world, ropePos)); - } - } - - // Pistons drag their attaches poles and extension - if (state.getBlock() instanceof MechanicalPistonBlock) { - int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get(); - Direction direction = state.get(MechanicalPistonBlock.FACING); - if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { - BlockPos searchPos = pos; - while (limit-- >= 0) { - searchPos = searchPos.offset(direction); - BlockState blockState = world.getBlockState(searchPos); - if (isExtensionPole(blockState)) { - if (blockState.get(PistonExtensionPoleBlock.FACING) - .getAxis() != direction.getAxis()) - break; - if (!visited.contains(searchPos)) - frontier.add(searchPos); - continue; - } - if (isPistonHead(blockState)) - if (!visited.contains(searchPos)) - frontier.add(searchPos); - break; - } - if (limit <= -1) - return false; - } - - BlockPos searchPos = pos; - while (limit-- >= 0) { - searchPos = searchPos.offset(direction.getOpposite()); - BlockState blockState = world.getBlockState(searchPos); - if (isExtensionPole(blockState)) { - if (blockState.get(PistonExtensionPoleBlock.FACING) - .getAxis() != direction.getAxis()) - break; - if (!visited.contains(searchPos)) - frontier.add(searchPos); - continue; - } - break; - } - - if (limit <= -1) - return false; - } - - // Doors try to stay whole - if (state.getBlock() instanceof DoorBlock) { - BlockPos otherPartPos = pos.up(state.get(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? 1 : -1); - if (!visited.contains(otherPartPos)) - frontier.add(otherPartPos); - } - - Map superglue = SuperGlueHandler.gatherGlue(world, pos); - - // Slime blocks drag adjacent blocks if possible - boolean isSlimeBlock = state.getBlock() instanceof SlimeBlock; - for (Direction offset : Direction.values()) { - BlockPos offsetPos = pos.offset(offset); - BlockState blockState = world.getBlockState(offsetPos); - if (isAnchoringBlockAt(offsetPos)) - continue; - if (!BlockMovementTraits.movementAllowed(world, offsetPos)) { - if (offset == forcedDirection && isSlimeBlock) - return false; - continue; - } - - boolean wasVisited = visited.contains(offsetPos); - boolean faceHasGlue = superglue.containsKey(offset); - boolean blockAttachedTowardsFace = - BlockMovementTraits.isBlockAttachedTowards(blockState, offset.getOpposite()); - boolean brittle = BlockMovementTraits.isBrittle(blockState); - - if (!wasVisited && ((isSlimeBlock && !brittle) || blockAttachedTowardsFace || faceHasGlue)) - frontier.add(offsetPos); - - if (faceHasGlue) - addGlue(superglue.get(offset)); - } - - add(pos, capture(world, pos)); - if (blocks.size() > AllConfigs.SERVER.kinetics.maxBlocksMoved.get()) - return false; - - return true; - } - - protected boolean isAnchoringBlockAt(BlockPos pos) { - return pos.equals(anchor); - } - - protected static boolean isChassis(BlockState state) { - return state.getBlock() instanceof AbstractChassisBlock; - } - - private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, List frontier, - Set visited) { - TileEntity te = world.getTileEntity(pos); - if (!(te instanceof ChassisTileEntity)) - return false; - ChassisTileEntity chassis = (ChassisTileEntity) te; - chassis.addAttachedChasses(frontier, visited); - List includedBlockPositions = chassis.getIncludedBlockPositions(movementDirection, false); - if (includedBlockPositions == null) - return false; - for (BlockPos blockPos : includedBlockPositions) - if (!visited.contains(blockPos)) - frontier.add(blockPos); - return true; - } - - protected Pair capture(World world, BlockPos pos) { - BlockState blockstate = world.getBlockState(pos); - if (AllBlocks.MECHANICAL_SAW.has(blockstate)) - blockstate = blockstate.with(SawBlock.RUNNING, true); - if (blockstate.getBlock() instanceof ChestBlock) - blockstate = blockstate.with(ChestBlock.TYPE, ChestType.SINGLE); - if (AllBlocks.ADJUSTABLE_CRATE.has(blockstate)) - blockstate = blockstate.with(AdjustableCrateBlock.DOUBLE, false); - if (AllBlocks.REDSTONE_CONTACT.has(blockstate)) - blockstate = blockstate.with(RedstoneContactBlock.POWERED, true); - if (blockstate.getBlock() instanceof AbstractButtonBlock) { - blockstate = blockstate.with(AbstractButtonBlock.POWERED, false); - world.getPendingBlockTicks() - .scheduleTick(pos, blockstate.getBlock(), -1); - } - if (blockstate.getBlock() instanceof PressurePlateBlock) { - blockstate = blockstate.with(PressurePlateBlock.POWERED, false); - world.getPendingBlockTicks() - .scheduleTick(pos, blockstate.getBlock(), -1); - } - CompoundNBT compoundnbt = getTileEntityNBT(world, pos); - TileEntity tileentity = world.getTileEntity(pos); - return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity); - } - - public static CompoundNBT getTileEntityNBT(World world, BlockPos pos) { - TileEntity tileentity = world.getTileEntity(pos); - CompoundNBT compoundnbt = null; - if (tileentity != null) { - compoundnbt = tileentity.write(new CompoundNBT()); - compoundnbt.remove("x"); - compoundnbt.remove("y"); - compoundnbt.remove("z"); - } - return compoundnbt; - } - - public void addGlue(SuperGlueEntity entity) { - BlockPos pos = entity.getHangingPosition(); - Direction direction = entity.getFacingDirection(); - BlockPos localPos = pos.subtract(anchor); - this.superglue.add(Pair.of(localPos, direction)); - glueToRemove.add(entity); - } - - public void add(BlockPos pos, Pair pair) { - BlockInfo captured = pair.getKey(); - BlockPos localPos = pos.subtract(anchor); - BlockInfo blockInfo = new BlockInfo(localPos, captured.state, captured.nbt); - - if (blocks.put(localPos, blockInfo) != null) - return; - bounds = bounds.union(new AxisAlignedBB(localPos)); - - TileEntity te = pair.getValue(); - if (te != null && MountedStorage.canUseAsStorage(te)) - storage.put(localPos, new MountedStorage(te)); - if (captured.state.getBlock() instanceof IPortableBlock) - getActors().add(MutablePair.of(blockInfo, null)); - } - - public static Contraption fromNBT(World world, CompoundNBT nbt) { - String type = nbt.getString("Type"); - Contraption contraption = AllContraptionTypes.fromType(type); - contraption.readNBT(world, nbt); - return contraption; - } - - public void readNBT(World world, CompoundNBT nbt) { - blocks.clear(); - renderOrder.clear(); - customRenderTEs.clear(); - - nbt.getList("Blocks", 10) - .forEach(c -> { - CompoundNBT comp = (CompoundNBT) c; - BlockInfo info = new BlockInfo(NBTUtil.readBlockPos(comp.getCompound("Pos")), - NBTUtil.readBlockState(comp.getCompound("Block")), - comp.contains("Data") ? comp.getCompound("Data") : null); - blocks.put(info.pos, info); - - if (world.isRemote) { - Block block = info.state.getBlock(); - if (RenderTypeLookup.canRenderInLayer(info.state, RenderType.getTranslucent())) - renderOrder.add(info.pos); - else - renderOrder.add(0, info.pos); - CompoundNBT tag = info.nbt; - if (tag == null || block instanceof IPortableBlock) - return; - - tag.putInt("x", info.pos.getX()); - tag.putInt("y", info.pos.getY()); - tag.putInt("z", info.pos.getZ()); - - TileEntity te = TileEntity.create(tag); - te.setLocation(new WrappedWorld(world) { - - @Override - public BlockState getBlockState(BlockPos pos) { - if (!pos.equals(te.getPos())) - return Blocks.AIR.getDefaultState(); - return info.state; - } - - }, te.getPos()); - if (te instanceof KineticTileEntity) - ((KineticTileEntity) te).setSpeed(0); - te.getBlockState(); - customRenderTEs.add(te); - } - }); - - actors.clear(); - nbt.getList("Actors", 10) - .forEach(c -> { - CompoundNBT comp = (CompoundNBT) c; - BlockInfo info = blocks.get(NBTUtil.readBlockPos(comp.getCompound("Pos"))); - MovementContext context = MovementContext.readNBT(world, info, comp); - context.contraption = this; - getActors().add(MutablePair.of(info, context)); - }); - - superglue.clear(); - nbt.getList("Superglue", 10) - .forEach(c -> { - CompoundNBT comp = (CompoundNBT) c; - superglue.add(Pair.of(NBTUtil.readBlockPos(comp.getCompound("Pos")), - Direction.byIndex(comp.getByte("Direction")))); - }); - - storage.clear(); - nbt.getList("Storage", 10) - .forEach(c -> { - CompoundNBT comp = (CompoundNBT) c; - storage.put(NBTUtil.readBlockPos(comp.getCompound("Pos")), - new MountedStorage(comp.getCompound("Data"))); - }); - List list = storage.values() - .stream() - .map(MountedStorage::getItemHandler) - .collect(Collectors.toList()); - inventory = new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); - - if (nbt.contains("BoundsFront")) - bounds = NBTHelper.readAABB(nbt.getList("BoundsFront", 5)); - - stalled = nbt.getBoolean("Stalled"); - anchor = NBTUtil.readBlockPos(nbt.getCompound("Anchor")); - } - - public CompoundNBT writeNBT() { - CompoundNBT nbt = new CompoundNBT(); - nbt.putString("Type", getType().id); - ListNBT blocksNBT = new ListNBT(); - for (BlockInfo block : this.blocks.values()) { - CompoundNBT c = new CompoundNBT(); - c.put("Block", NBTUtil.writeBlockState(block.state)); - c.put("Pos", NBTUtil.writeBlockPos(block.pos)); - if (block.nbt != null) - c.put("Data", block.nbt); - blocksNBT.add(c); - } - - ListNBT actorsNBT = new ListNBT(); - for (MutablePair actor : getActors()) { - CompoundNBT compound = new CompoundNBT(); - compound.put("Pos", NBTUtil.writeBlockPos(actor.left.pos)); - getMovement(actor.left.state).writeExtraData(actor.right); - actor.right.writeToNBT(compound); - actorsNBT.add(compound); - } - - ListNBT superglueNBT = new ListNBT(); - for (Pair glueEntry : superglue) { - CompoundNBT c = new CompoundNBT(); - c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); - c.putByte("Direction", (byte) glueEntry.getValue() - .getIndex()); - superglueNBT.add(c); - } - - ListNBT storageNBT = new ListNBT(); - for (BlockPos pos : storage.keySet()) { - CompoundNBT c = new CompoundNBT(); - MountedStorage mountedStorage = storage.get(pos); - if (!mountedStorage.isWorking()) - continue; - c.put("Pos", NBTUtil.writeBlockPos(pos)); - c.put("Data", mountedStorage.serialize()); - storageNBT.add(c); - } - - nbt.put("Blocks", blocksNBT); - nbt.put("Actors", actorsNBT); - nbt.put("Superglue", superglueNBT); - nbt.put("Storage", storageNBT); - nbt.put("Anchor", NBTUtil.writeBlockPos(anchor)); - nbt.putBoolean("Stalled", stalled); - - if (bounds != null) { - ListNBT bb = NBTHelper.writeAABB(bounds); - nbt.put("BoundsFront", bb); - } - - return nbt; - } - - public static boolean isFrozen() { - return AllConfigs.SERVER.control.freezeContraptions.get(); - } - - public void removeBlocksFromWorld(IWorld world, BlockPos offset) { - removeBlocksFromWorld(world, offset, (pos, state) -> false); - } - - public void removeBlocksFromWorld(IWorld world, BlockPos offset, BiPredicate customRemoval) { - storage.values() - .forEach(MountedStorage::empty); - glueToRemove.forEach(SuperGlueEntity::remove); - - for (boolean brittles : Iterate.trueAndFalse) { - for (Iterator iterator = blocks.values() - .iterator(); iterator.hasNext();) { - BlockInfo block = iterator.next(); - if (brittles != BlockMovementTraits.isBrittle(block.state)) - continue; - - BlockPos add = block.pos.add(anchor) - .add(offset); - if (customRemoval.test(add, block.state)) - continue; - Block blockIn = world.getBlockState(add) - .getBlock(); - if (block.state.getBlock() != blockIn) - iterator.remove(); - world.getWorld() - .removeTileEntity(add); - int flags = 67; - if (blockIn instanceof DoorBlock) - flags = flags | 32 | 16; - world.setBlockState(add, Blocks.AIR.getDefaultState(), flags); - } - } - } - - public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation) { - addBlocksToWorld(world, offset, rotation, (pos, state) -> false); - } - - public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation, - BiPredicate customPlacement) { - stop(world); - - StructureTransform transform = new StructureTransform(offset, rotation); - - for (boolean nonBrittles : Iterate.trueAndFalse) { - for (BlockInfo block : blocks.values()) { - if (nonBrittles == BlockMovementTraits.isBrittle(block.state)) - continue; - - BlockPos targetPos = transform.apply(block.pos); - BlockState state = transform.apply(block.state); - - if (customPlacement.test(targetPos, state)) - continue; - - if (nonBrittles) - for (Direction face : Direction.values()) - state = state.updatePostPlacement(face, world.getBlockState(targetPos.offset(face)), world, - targetPos, targetPos.offset(face)); - - if (AllBlocks.MECHANICAL_SAW.has(state)) - state = state.with(SawBlock.RUNNING, false); - - BlockState blockState = world.getBlockState(targetPos); - if (blockState.getBlockHardness(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos) - .isEmpty() - && !blockState.getCollisionShape(world, targetPos) - .isEmpty())) { - if (targetPos.getY() == 0) - targetPos = targetPos.up(); - world.playEvent(2001, targetPos, Block.getStateId(state)); - Block.spawnDrops(state, world, targetPos, null); - continue; - } - - world.destroyBlock(targetPos, true); - world.setBlockState(targetPos, state, 3 | BlockFlags.IS_MOVING); - - boolean verticalRotation = transform.rotationAxis == null || transform.rotationAxis.isHorizontal(); - verticalRotation = verticalRotation && transform.rotation != Rotation.NONE; - if (verticalRotation) { - if (state.getBlock() instanceof RopeBlock || state.getBlock() instanceof MagnetBlock) - world.destroyBlock(targetPos, true); - } - - TileEntity tileEntity = world.getTileEntity(targetPos); - CompoundNBT tag = block.nbt; - if (tileEntity != null && tag != null) { - tag.putInt("x", targetPos.getX()); - tag.putInt("y", targetPos.getY()); - tag.putInt("z", targetPos.getZ()); - - if (verticalRotation && tileEntity instanceof PulleyTileEntity) { - tag.remove("Offset"); - tag.remove("InitialOffset"); - } - - tileEntity.read(tag); - - if (storage.containsKey(block.pos)) { - MountedStorage mountedStorage = storage.get(block.pos); - if (mountedStorage.isWorking()) - mountedStorage.fill(tileEntity); - } - } - } - } - - for (Pair pair : superglue) { - BlockPos targetPos = transform.apply(pair.getKey()); - Direction targetFacing = transform.transformFacing(pair.getValue()); - - SuperGlueEntity entity = new SuperGlueEntity(world, targetPos, targetFacing); - if (entity.onValidSurface()) { - if (!world.isRemote) - world.addEntity(entity); - } - - } - - } - - public void initActors(World world) { - for (MutablePair pair : actors) { - MovementContext context = new MovementContext(world, pair.left); - context.contraption = this; - getMovement(pair.left.state).startMoving(context); - pair.setRight(context); - } - } - - public AxisAlignedBB getBoundingBox() { - return bounds; - } - - public List> getActors() { - return actors; - } - - public BlockPos getAnchor() { - return anchor; - } - - public void stop(World world) { - foreachActor(world, (behaviour, ctx) -> { - behaviour.stopMoving(ctx); - ctx.position = null; - ctx.motion = Vec3d.ZERO; - ctx.relativeMotion = Vec3d.ZERO; - ctx.rotation = Vec3d.ZERO; - }); - } - - public void foreachActor(World world, BiConsumer callBack) { - for (MutablePair pair : actors) - callBack.accept(getMovement(pair.getLeft().state), pair.getRight()); - } - - protected static MovementBehaviour getMovement(BlockState state) { - Block block = state.getBlock(); - if (!(block instanceof IPortableBlock)) - return null; - return ((IPortableBlock) block).getMovementBehaviour(); - } - - public void expandBoundsAroundAxis(Axis axis) { - AxisAlignedBB bb = bounds; - double maxXDiff = Math.max(bb.maxX - 1, -bb.minX); - double maxYDiff = Math.max(bb.maxY - 1, -bb.minY); - double maxZDiff = Math.max(bb.maxZ - 1, -bb.minZ); - double maxDiff = 0; - - if (axis == Axis.X) - maxDiff = Math.max(maxZDiff, maxYDiff); - if (axis == Axis.Y) - maxDiff = Math.max(maxZDiff, maxXDiff); - if (axis == Axis.Z) - maxDiff = Math.max(maxXDiff, maxYDiff); - - Vec3d vec = new Vec3d(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) - .getDirectionVec()); - Vec3d planeByNormal = VecHelper.planeByNormal(vec); - Vec3d min = vec.mul(bb.minX, bb.minY, bb.minZ) - .add(planeByNormal.scale(-maxDiff)); - Vec3d max = vec.mul(bb.maxX, bb.maxY, bb.maxZ) - .add(planeByNormal.scale(maxDiff + 1)); - bounds = new AxisAlignedBB(min, max); - } - - protected abstract AllContraptionTypes getType(); + protected boolean isAnchoringBlockAt(BlockPos pos) { + return pos.equals(anchor); + } + + private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, List frontier, + Set visited) { + TileEntity te = world.getTileEntity(pos); + if (!(te instanceof ChassisTileEntity)) + return false; + ChassisTileEntity chassis = (ChassisTileEntity) te; + chassis.addAttachedChasses(frontier, visited); + List includedBlockPositions = chassis.getIncludedBlockPositions(movementDirection, false); + if (includedBlockPositions == null) + return false; + for (BlockPos blockPos : includedBlockPositions) + if (!visited.contains(blockPos)) + frontier.add(blockPos); + return true; + } + + protected Pair capture(World world, BlockPos pos) { + BlockState blockstate = world.getBlockState(pos); + if (AllBlocks.MECHANICAL_SAW.has(blockstate)) + blockstate = blockstate.with(SawBlock.RUNNING, true); + if (blockstate.getBlock() instanceof ChestBlock) + blockstate = blockstate.with(ChestBlock.TYPE, ChestType.SINGLE); + if (AllBlocks.ADJUSTABLE_CRATE.has(blockstate)) + blockstate = blockstate.with(AdjustableCrateBlock.DOUBLE, false); + if (AllBlocks.REDSTONE_CONTACT.has(blockstate)) + blockstate = blockstate.with(RedstoneContactBlock.POWERED, true); + if (blockstate.getBlock() instanceof AbstractButtonBlock) { + blockstate = blockstate.with(AbstractButtonBlock.POWERED, false); + world.getPendingBlockTicks() + .scheduleTick(pos, blockstate.getBlock(), -1); + } + if (blockstate.getBlock() instanceof PressurePlateBlock) { + blockstate = blockstate.with(PressurePlateBlock.POWERED, false); + world.getPendingBlockTicks() + .scheduleTick(pos, blockstate.getBlock(), -1); + } + CompoundNBT compoundnbt = getTileEntityNBT(world, pos); + TileEntity tileentity = world.getTileEntity(pos); + return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity); + } + + public void addGlue(SuperGlueEntity entity) { + BlockPos pos = entity.getHangingPosition(); + Direction direction = entity.getFacingDirection(); + BlockPos localPos = pos.subtract(anchor); + this.superglue.add(Pair.of(localPos, direction)); + glueToRemove.add(entity); + } + + public void add(BlockPos pos, Pair pair) { + BlockInfo captured = pair.getKey(); + BlockPos localPos = pos.subtract(anchor); + BlockInfo blockInfo = new BlockInfo(localPos, captured.state, captured.nbt); + + if (blocks.put(localPos, blockInfo) != null) + return; + bounds = bounds.union(new AxisAlignedBB(localPos)); + + TileEntity te = pair.getValue(); + if (te != null && MountedStorage.canUseAsStorage(te)) + storage.put(localPos, new MountedStorage(te)); + if (captured.state.getBlock() instanceof IPortableBlock) + getActors().add(MutablePair.of(blockInfo, null)); + } + + public void readNBT(World world, CompoundNBT nbt) { + blocks.clear(); + renderOrder.clear(); + customRenderTEs.clear(); + + nbt.getList("Blocks", 10) + .forEach(c -> { + CompoundNBT comp = (CompoundNBT) c; + BlockInfo info = new BlockInfo(NBTUtil.readBlockPos(comp.getCompound("Pos")), + NBTUtil.readBlockState(comp.getCompound("Block")), + comp.contains("Data") ? comp.getCompound("Data") : null); + blocks.put(info.pos, info); + + if (world.isRemote) { + Block block = info.state.getBlock(); + if (RenderTypeLookup.canRenderInLayer(info.state, RenderType.getTranslucent())) + renderOrder.add(info.pos); + else + renderOrder.add(0, info.pos); + CompoundNBT tag = info.nbt; + if (tag == null || block instanceof IPortableBlock) + return; + + tag.putInt("x", info.pos.getX()); + tag.putInt("y", info.pos.getY()); + tag.putInt("z", info.pos.getZ()); + + TileEntity te = TileEntity.create(tag); + te.setLocation(new WrappedWorld(world) { + + @Override + public BlockState getBlockState(BlockPos pos) { + if (!pos.equals(te.getPos())) + return Blocks.AIR.getDefaultState(); + return info.state; + } + + }, te.getPos()); + if (te instanceof KineticTileEntity) + ((KineticTileEntity) te).setSpeed(0); + te.getBlockState(); + customRenderTEs.add(te); + } + }); + + actors.clear(); + nbt.getList("Actors", 10) + .forEach(c -> { + CompoundNBT comp = (CompoundNBT) c; + BlockInfo info = blocks.get(NBTUtil.readBlockPos(comp.getCompound("Pos"))); + MovementContext context = MovementContext.readNBT(world, info, comp); + context.contraption = this; + getActors().add(MutablePair.of(info, context)); + }); + + superglue.clear(); + nbt.getList("Superglue", 10) + .forEach(c -> { + CompoundNBT comp = (CompoundNBT) c; + superglue.add(Pair.of(NBTUtil.readBlockPos(comp.getCompound("Pos")), + Direction.byIndex(comp.getByte("Direction")))); + }); + + storage.clear(); + nbt.getList("Storage", 10) + .forEach(c -> { + CompoundNBT comp = (CompoundNBT) c; + storage.put(NBTUtil.readBlockPos(comp.getCompound("Pos")), + new MountedStorage(comp.getCompound("Data"))); + }); + List list = storage.values() + .stream() + .map(MountedStorage::getItemHandler) + .collect(Collectors.toList()); + inventory = new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); + + if (nbt.contains("BoundsFront")) + bounds = NBTHelper.readAABB(nbt.getList("BoundsFront", 5)); + + stalled = nbt.getBoolean("Stalled"); + anchor = NBTUtil.readBlockPos(nbt.getCompound("Anchor")); + } + + public CompoundNBT writeNBT() { + CompoundNBT nbt = new CompoundNBT(); + nbt.putString("Type", getType().id); + ListNBT blocksNBT = new ListNBT(); + for (BlockInfo block : this.blocks.values()) { + CompoundNBT c = new CompoundNBT(); + c.put("Block", NBTUtil.writeBlockState(block.state)); + c.put("Pos", NBTUtil.writeBlockPos(block.pos)); + if (block.nbt != null) + c.put("Data", block.nbt); + blocksNBT.add(c); + } + + ListNBT actorsNBT = new ListNBT(); + for (MutablePair actor : getActors()) { + CompoundNBT compound = new CompoundNBT(); + compound.put("Pos", NBTUtil.writeBlockPos(actor.left.pos)); + getMovement(actor.left.state).writeExtraData(actor.right); + actor.right.writeToNBT(compound); + actorsNBT.add(compound); + } + + ListNBT superglueNBT = new ListNBT(); + for (Pair glueEntry : superglue) { + CompoundNBT c = new CompoundNBT(); + c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); + c.putByte("Direction", (byte) glueEntry.getValue() + .getIndex()); + superglueNBT.add(c); + } + + ListNBT storageNBT = new ListNBT(); + for (BlockPos pos : storage.keySet()) { + CompoundNBT c = new CompoundNBT(); + MountedStorage mountedStorage = storage.get(pos); + if (!mountedStorage.isWorking()) + continue; + c.put("Pos", NBTUtil.writeBlockPos(pos)); + c.put("Data", mountedStorage.serialize()); + storageNBT.add(c); + } + + nbt.put("Blocks", blocksNBT); + nbt.put("Actors", actorsNBT); + nbt.put("Superglue", superglueNBT); + nbt.put("Storage", storageNBT); + nbt.put("Anchor", NBTUtil.writeBlockPos(anchor)); + nbt.putBoolean("Stalled", stalled); + + if (bounds != null) { + ListNBT bb = NBTHelper.writeAABB(bounds); + nbt.put("BoundsFront", bb); + } + + return nbt; + } + + public void removeBlocksFromWorld(IWorld world, BlockPos offset) { + removeBlocksFromWorld(world, offset, (pos, state) -> false); + } + + public void removeBlocksFromWorld(IWorld world, BlockPos offset, BiPredicate customRemoval) { + storage.values() + .forEach(MountedStorage::empty); + glueToRemove.forEach(SuperGlueEntity::remove); + + for (boolean brittles : Iterate.trueAndFalse) { + for (Iterator iterator = blocks.values() + .iterator(); iterator.hasNext(); ) { + BlockInfo block = iterator.next(); + if (brittles != BlockMovementTraits.isBrittle(block.state)) + continue; + + BlockPos add = block.pos.add(anchor) + .add(offset); + if (customRemoval.test(add, block.state)) + continue; + BlockState oldState = world.getBlockState(add); + Block blockIn = oldState.getBlock(); + if (block.state.getBlock() != blockIn) + iterator.remove(); + world.getWorld() + .removeTileEntity(add); + int flags = 67; + if (blockIn instanceof DoorBlock) + flags = flags | 32 | 16; + if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED).booleanValue()) { + world.setBlockState(add, Blocks.WATER.getDefaultState(), flags); + continue; + } + world.setBlockState(add, Blocks.AIR.getDefaultState(), flags); + } + } + } + + public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation) { + addBlocksToWorld(world, offset, rotation, (pos, state) -> false); + } + + public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation, + BiPredicate customPlacement) { + stop(world); + StructureTransform transform = new StructureTransform(offset, rotation); + + for (boolean nonBrittles : Iterate.trueAndFalse) { + for (BlockInfo block : blocks.values()) { + if (nonBrittles == BlockMovementTraits.isBrittle(block.state)) + continue; + + BlockPos targetPos = transform.apply(block.pos); + + BlockState state = transform.apply(block.state); + + if (customPlacement.test(targetPos, state)) + continue; + + if (nonBrittles) + for (Direction face : Direction.values()) + state = state.updatePostPlacement(face, world.getBlockState(targetPos.offset(face)), world, + targetPos, targetPos.offset(face)); + + if (AllBlocks.MECHANICAL_SAW.has(state)) + state = state.with(SawBlock.RUNNING, false); + + BlockState blockState = world.getBlockState(targetPos); + if (blockState.getBlockHardness(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos) + .isEmpty() + && !blockState.getCollisionShape(world, targetPos) + .isEmpty())) { + if (targetPos.getY() == 0) + targetPos = targetPos.up(); + world.playEvent(2001, targetPos, Block.getStateId(state)); + Block.spawnDrops(state, world, targetPos, null); + continue; + } + if (state.getBlock() instanceof IWaterLoggable && state.has(BlockStateProperties.WATERLOGGED)) { + IFluidState ifluidstate = world.getFluidState(targetPos); + state = state.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } + + world.destroyBlock(targetPos, true); + world.setBlockState(targetPos, state, 3 | BlockFlags.IS_MOVING); + + boolean verticalRotation = transform.rotationAxis == null || transform.rotationAxis.isHorizontal(); + verticalRotation = verticalRotation && transform.rotation != Rotation.NONE; + if (verticalRotation) { + if (state.getBlock() instanceof RopeBlock || state.getBlock() instanceof MagnetBlock) + world.destroyBlock(targetPos, true); + } + + TileEntity tileEntity = world.getTileEntity(targetPos); + CompoundNBT tag = block.nbt; + if (tileEntity != null && tag != null) { + tag.putInt("x", targetPos.getX()); + tag.putInt("y", targetPos.getY()); + tag.putInt("z", targetPos.getZ()); + + if (verticalRotation && tileEntity instanceof PulleyTileEntity) { + tag.remove("Offset"); + tag.remove("InitialOffset"); + } + + tileEntity.read(tag); + + if (storage.containsKey(block.pos)) { + MountedStorage mountedStorage = storage.get(block.pos); + if (mountedStorage.isWorking()) + mountedStorage.fill(tileEntity); + } + } + } + } + + for (Pair pair : superglue) { + BlockPos targetPos = transform.apply(pair.getKey()); + Direction targetFacing = transform.transformFacing(pair.getValue()); + + SuperGlueEntity entity = new SuperGlueEntity(world, targetPos, targetFacing); + if (entity.onValidSurface()) { + if (!world.isRemote) + world.addEntity(entity); + } + + } + + } + + public void initActors(World world) { + for (MutablePair pair : actors) { + MovementContext context = new MovementContext(world, pair.left); + context.contraption = this; + getMovement(pair.left.state).startMoving(context); + pair.setRight(context); + } + } + + public AxisAlignedBB getBoundingBox() { + return bounds; + } + + public List> getActors() { + return actors; + } + + public BlockPos getAnchor() { + return anchor; + } + + public void stop(World world) { + foreachActor(world, (behaviour, ctx) -> { + behaviour.stopMoving(ctx); + ctx.position = null; + ctx.motion = Vec3d.ZERO; + ctx.relativeMotion = Vec3d.ZERO; + ctx.rotation = Vec3d.ZERO; + }); + } + + public void foreachActor(World world, BiConsumer callBack) { + for (MutablePair pair : actors) + callBack.accept(getMovement(pair.getLeft().state), pair.getRight()); + } + + public void expandBoundsAroundAxis(Axis axis) { + AxisAlignedBB bb = bounds; + double maxXDiff = Math.max(bb.maxX - 1, -bb.minX); + double maxYDiff = Math.max(bb.maxY - 1, -bb.minY); + double maxZDiff = Math.max(bb.maxZ - 1, -bb.minZ); + double maxDiff = 0; + + if (axis == Axis.X) + maxDiff = Math.max(maxZDiff, maxYDiff); + if (axis == Axis.Y) + maxDiff = Math.max(maxZDiff, maxXDiff); + if (axis == Axis.Z) + maxDiff = Math.max(maxXDiff, maxYDiff); + + Vec3d vec = new Vec3d(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) + .getDirectionVec()); + Vec3d planeByNormal = VecHelper.planeByNormal(vec); + Vec3d min = vec.mul(bb.minX, bb.minY, bb.minZ) + .add(planeByNormal.scale(-maxDiff)); + Vec3d max = vec.mul(bb.maxX, bb.maxY, bb.maxZ) + .add(planeByNormal.scale(maxDiff + 1)); + bounds = new AxisAlignedBB(min, max); + } + + protected abstract AllContraptionTypes getType(); } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java index 874833491..b8892c6cd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java @@ -26,7 +26,7 @@ public class DirectionalExtenderScrollOptionSlot extends CenteredSideValueBoxTra @Override protected void rotate(BlockState state, MatrixStack ms) { - if (!direction.getAxis().isHorizontal()) + if (!getSide().getAxis().isHorizontal()) MatrixStacker.of(ms).rotateY(AngleHelper.horizontalAngle(state.get(BlockStateProperties.FACING)) - 90); super.rotate(state, ms); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java index 2f8e8311f..a152542f7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java @@ -9,7 +9,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import com.simibubi.create.foundation.utility.DirectionHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -89,7 +89,8 @@ public class StructureTransform { if (state.get(BlockStateProperties.BELL_ATTACHMENT) == BellAttachment.DOUBLE_WALL) { state = state.with(BlockStateProperties.BELL_ATTACHMENT, BellAttachment.SINGLE_WALL); } - return state.with(HorizontalFaceBlock.HORIZONTAL_FACING, rotation.rotate(state.get(HorizontalFaceBlock.HORIZONTAL_FACING))); + return state.with(HorizontalFaceBlock.HORIZONTAL_FACING, + rotation.rotate(state.get(HorizontalFaceBlock.HORIZONTAL_FACING))); } return state.rotate(rotation); } @@ -111,12 +112,12 @@ public class StructureTransform { boolean b = state.get(FACE) == AttachFace.CEILING; state = state.with(HORIZONTAL_FACING, b ? forcedAxis : forcedAxis.getOpposite()); - + if (stateFace != AttachFace.WALL) { state = state.with(FACE, AttachFace.WALL); continue; } - + if (stateFacing.getAxisDirection() == AxisDirection.POSITIVE) { state = state.with(FACE, AttachFace.FLOOR); continue; @@ -127,62 +128,14 @@ public class StructureTransform { return state; } + boolean halfTurn = rotation == Rotation.CLOCKWISE_180; if (block instanceof StairsBlock) { - if (state.get(StairsBlock.FACING).getAxis() != rotationAxis) { - for (int i = 0; i < rotation.ordinal(); i++) { - Direction direction = state.get(StairsBlock.FACING); - Half half = state.get(StairsBlock.HALF); - if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ half == Half.BOTTOM - ^ direction.getAxis() == Axis.Z) - state = state.cycle(StairsBlock.HALF); - else - state = state.with(StairsBlock.FACING, direction.getOpposite()); - } - } else { - if (rotation == Rotation.CLOCKWISE_180) { - state = state.cycle(StairsBlock.HALF); - } - } + state = transformStairs(state, halfTurn); return state; } if (AllBlocks.BELT.has(state)) { - if (state.get(BeltBlock.HORIZONTAL_FACING).getAxis() != rotationAxis) { - for (int i = 0; i < rotation.ordinal(); i++) { - Slope slope = state.get(BeltBlock.SLOPE); - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); - - // Rotate diagonal - if (slope != Slope.HORIZONTAL && slope != Slope.VERTICAL) { - if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ slope == Slope.DOWNWARD - ^ direction.getAxis() == Axis.Z) { - state = state.with(BeltBlock.SLOPE, slope == Slope.UPWARD ? Slope.DOWNWARD : Slope.UPWARD); - } else { - state = state.with(BeltBlock.HORIZONTAL_FACING, direction.getOpposite()); - } - - // Rotate horizontal/vertical - } else { - if (slope == Slope.HORIZONTAL ^ direction.getAxis() == Axis.Z) { - state = state.with(BeltBlock.HORIZONTAL_FACING, direction.getOpposite()); - } - state = - state.with(BeltBlock.SLOPE, slope == Slope.HORIZONTAL ? Slope.VERTICAL : Slope.HORIZONTAL); - } - } - } else { - if (rotation == Rotation.CLOCKWISE_180) { - Slope slope = state.get(BeltBlock.SLOPE); - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); - if (slope == Slope.UPWARD || slope == Slope.DOWNWARD) { - state = state - .with(BeltBlock.SLOPE, slope == Slope.UPWARD ? Slope.DOWNWARD - : slope == Slope.DOWNWARD ? Slope.UPWARD : slope); - } else if (slope == Slope.VERTICAL) { - state = state.with(BeltBlock.HORIZONTAL_FACING, direction.getOpposite()); - } - } - } + state = transformBelt(state, halfTurn); return state; } @@ -197,7 +150,7 @@ public class StructureTransform { } else if (state.has(AXIS)) { state = state.with(AXIS, transformAxis(state.get(AXIS))); - } else if (rotation == Rotation.CLOCKWISE_180) { + } else if (halfTurn) { if (state.has(FACING)) { Direction stateFacing = state.get(FACING); @@ -213,14 +166,111 @@ public class StructureTransform { state = state.rotate(rotation); if (state.has(SlabBlock.TYPE) && state.get(SlabBlock.TYPE) != SlabType.DOUBLE) - state = state - .with(SlabBlock.TYPE, - state.get(SlabBlock.TYPE) == SlabType.BOTTOM ? SlabType.TOP : SlabType.BOTTOM); + state = state.with(SlabBlock.TYPE, + state.get(SlabBlock.TYPE) == SlabType.BOTTOM ? SlabType.TOP : SlabType.BOTTOM); } return state; } + protected BlockState transformStairs(BlockState state, boolean halfTurn) { + if (state.get(StairsBlock.FACING) + .getAxis() != rotationAxis) { + for (int i = 0; i < rotation.ordinal(); i++) { + Direction direction = state.get(StairsBlock.FACING); + Half half = state.get(StairsBlock.HALF); + if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ half == Half.BOTTOM + ^ direction.getAxis() == Axis.Z) + state = state.cycle(StairsBlock.HALF); + else + state = state.with(StairsBlock.FACING, direction.getOpposite()); + } + } else { + if (halfTurn) { + state = state.cycle(StairsBlock.HALF); + } + } + return state; + } + + protected BlockState transformBelt(BlockState state, boolean halfTurn) { + Direction initialDirection = state.get(BeltBlock.HORIZONTAL_FACING); + boolean diagonal = state.get(BeltBlock.SLOPE) == BeltSlope.DOWNWARD || state.get(BeltBlock.SLOPE) == BeltSlope.UPWARD; + + if (!diagonal) { + for (int i = 0; i < rotation.ordinal(); i++) { + Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); + BeltSlope slope = state.get(BeltBlock.SLOPE); + boolean vertical = slope == BeltSlope.VERTICAL; + boolean horizontal = slope == BeltSlope.HORIZONTAL; + boolean sideways = slope == BeltSlope.SIDEWAYS; + + Direction newDirection = direction.getOpposite(); + BeltSlope newSlope = BeltSlope.VERTICAL; + + if (vertical) { + if (direction.getAxis() == rotationAxis) { + newDirection = direction.rotateYCCW(); + newSlope = BeltSlope.SIDEWAYS; + } else { + newSlope = BeltSlope.HORIZONTAL; + newDirection = direction; + if (direction.getAxis() == Axis.Z) + newDirection = direction.getOpposite(); + } + } + + if (sideways) { + newDirection = direction; + if (direction.getAxis() == rotationAxis) + newSlope = BeltSlope.HORIZONTAL; + else + newDirection = direction.rotateYCCW(); + } + + if (horizontal) { + newDirection = direction; + if (direction.getAxis() == rotationAxis) + newSlope = BeltSlope.SIDEWAYS; + } + + state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); + state = state.with(BeltBlock.SLOPE, newSlope); + } + + } else if (initialDirection.getAxis() != rotationAxis) { + for (int i = 0; i < rotation.ordinal(); i++) { + Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); + Direction newDirection = direction.getOpposite(); + BeltSlope slope = state.get(BeltBlock.SLOPE); + boolean upward = slope == BeltSlope.UPWARD; + boolean downward = slope == BeltSlope.DOWNWARD; + + // Rotate diagonal + if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ downward + ^ direction.getAxis() == Axis.Z) { + state = state.with(BeltBlock.SLOPE, upward ? BeltSlope.DOWNWARD : BeltSlope.UPWARD); + } else { + state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); + } + } + + } else if (halfTurn) { + Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); + Direction newDirection = direction.getOpposite(); + BeltSlope slope = state.get(BeltBlock.SLOPE); + boolean vertical = slope == BeltSlope.VERTICAL; + + if (diagonal) { + state = state.with(BeltBlock.SLOPE, + slope == BeltSlope.UPWARD ? BeltSlope.DOWNWARD : slope == BeltSlope.DOWNWARD ? BeltSlope.UPWARD : slope); + } else if (vertical) { + state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); + } + } + return state; + } + public Axis transformAxis(Axis axisIn) { Direction facing = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axisIn); facing = transformFacing(facing); 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 833a51d42..97abf1372 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 @@ -98,14 +98,14 @@ public class ClockworkContraption extends Contraption { CompoundNBT tag = super.writeNBT(); tag.putInt("facing", facing.getIndex()); tag.putInt("offset", offset); - tag.putString("HandType", NBTHelper.writeEnum(handType)); + NBTHelper.writeEnum(tag, "HandType", handType); return tag; } @Override public void readNBT(World world, CompoundNBT tag) { facing = Direction.byIndex(tag.getInt("Facing")); - handType = NBTHelper.readEnum(tag.getString("HandType"), HandType.class); + handType = NBTHelper.readEnum(tag, "HandType", HandType.class); offset = tag.getInt("offset"); super.readNBT(world, tag); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java index a5ba30186..30c6f95db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java @@ -40,13 +40,14 @@ public class LinearChassisBlock extends AbstractChassisBlock { .getOpposite()); BlockState blockState = context.getWorld() .getBlockState(placedOnPos); - if (isChassis(blockState) && !context.getPlayer() - .isSneaking()) - return getDefaultState().with(AXIS, blockState.get(AXIS)); - if (!context.getPlayer() - .isSneaking()) + + if (context.getPlayer() == null || !context.getPlayer() + .isSneaking()) { + if (isChassis(blockState)) + return getDefaultState().with(AXIS, blockState.get(AXIS)); return getDefaultState().with(AXIS, context.getNearestLookingDirection() .getAxis()); + } return super.getStateForPlacement(context); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java index 4d5edc4e2..515aa8867 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java @@ -49,7 +49,7 @@ public class SuperGlueItem extends Item { PlayerEntity playerentity = context.getPlayer(); ItemStack itemstack = context.getItem(); - if (playerentity != null && !this.canPlace(playerentity, direction, itemstack, blockpos1)) + if (playerentity == null || !this.canPlace(playerentity, direction, itemstack, blockpos1)) return ActionResultType.FAIL; World world = context.getWorld(); @@ -82,7 +82,8 @@ public class SuperGlueItem extends Item { public static void spawnParticles(World world, BlockPos pos, Direction direction, boolean fullBlock) { Vec3d vec = new Vec3d(direction.getDirectionVec()); Vec3d plane = VecHelper.planeByNormal(vec); - Vec3d facePos = VecHelper.getCenterOf(pos).add(vec.scale(.5f)); + Vec3d facePos = VecHelper.getCenterOf(pos) + .add(vec.scale(.5f)); float distance = fullBlock ? 1f : .25f + .25f * (world.rand.nextFloat() - .5f); plane = plane.scale(distance); @@ -90,13 +91,14 @@ public class SuperGlueItem extends Item { for (int i = fullBlock ? 40 : 15; i > 0; i--) { Vec3d offset = VecHelper.rotate(plane, 360 * world.rand.nextFloat(), direction.getAxis()); - Vec3d motion = offset.normalize().scale(1 / 16f); + Vec3d motion = offset.normalize() + .scale(1 / 16f); if (fullBlock) offset = new Vec3d(MathHelper.clamp(offset.x, -.5, .5), MathHelper.clamp(offset.y, -.5, .5), - MathHelper.clamp(offset.z, -.5, .5)); + MathHelper.clamp(offset.z, -.5, .5)); Vec3d particlePos = facePos.add(offset); world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), particlePos.x, particlePos.y, - particlePos.z, motion.x, motion.y, motion.z); + particlePos.z, motion.x, motion.y, motion.z); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index cf50bdf67..f44b9dc8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -41,6 +41,8 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -177,7 +179,7 @@ public class CartAssemblerBlock extends AbstractRailBlock newType = type; if (newType == null) return ActionResultType.PASS; - + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1); world.setBlockState(pos, state.with(RAIL_TYPE, newType)); if (!player.isCreative()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java index f323002e4..1ee299c5b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java @@ -13,6 +13,8 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.ItemUseContext; import net.minecraft.state.properties.RailShape; import net.minecraft.util.ActionResultType; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -25,8 +27,10 @@ public class CartAssemblerBlockItem extends BlockItem { @Override @Nonnull public ActionResultType onItemUse(ItemUseContext context) { - if (tryPlaceAssembler(context)) + if (tryPlaceAssembler(context)) { + context.getWorld().playSound(null, context.getPos(), SoundEvents.BLOCK_STONE_PLACE, SoundCategory.BLOCKS, 1, 1); return ActionResultType.SUCCESS; + } return super.onItemUse(context); } 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 6aa84ae26..4f7b006c8 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 @@ -80,13 +80,13 @@ public class MountedContraption extends Contraption { @Override public CompoundNBT writeNBT() { CompoundNBT writeNBT = super.writeNBT(); - writeNBT.putString("RotationMode", NBTHelper.writeEnum(rotationMode)); + NBTHelper.writeEnum(writeNBT, "RotationMode", rotationMode); return writeNBT; } @Override public void readNBT(World world, CompoundNBT nbt) { - rotationMode = NBTHelper.readEnum(nbt.getString("RotationMode"), CartMovementMode.class); + rotationMode = NBTHelper.readEnum(nbt, "RotationMode", CartMovementMode.class); super.readNBT(world, nbt); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java index fa3c241f7..5c21f6c80 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java @@ -1,16 +1,17 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.foundation.block.ProperDirectionalBlock; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; @@ -22,67 +23,91 @@ import net.minecraft.util.math.RayTraceResult; 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; -public class MechanicalPistonHeadBlock extends ProperDirectionalBlock { +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; - public static final EnumProperty TYPE = BlockStateProperties.PISTON_TYPE; +public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements IWaterLoggable { - public MechanicalPistonHeadBlock(Properties p_i48415_1_) { - super(p_i48415_1_); - } + public static final EnumProperty TYPE = BlockStateProperties.PISTON_TYPE; - @Override - protected void fillStateContainer(Builder builder) { - builder.add(TYPE); - super.fillStateContainer(builder); - } + public MechanicalPistonHeadBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.NORMAL; - } + @Override + protected void fillStateContainer(Builder builder) { + builder.add(TYPE, BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, - PlayerEntity player) { - return AllBlocks.PISTON_EXTENSION_POLE.asStack(); - } + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } - @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - Direction direction = state.get(FACING); - BlockPos pistonHead = pos; - BlockPos pistonBase = null; + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + return AllBlocks.PISTON_EXTENSION_POLE.asStack(); + } - for (int offset = 1; offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset++) { - BlockPos currentPos = pos.offset(direction.getOpposite(), offset); - BlockState block = worldIn.getBlockState(currentPos); + @Override + public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + Direction direction = state.get(FACING); + BlockPos pistonHead = pos; + BlockPos pistonBase = null; - if (isExtensionPole(block) && direction.getAxis() == block.get(BlockStateProperties.FACING) - .getAxis()) - continue; + for (int offset = 1; offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset++) { + BlockPos currentPos = pos.offset(direction.getOpposite(), offset); + BlockState block = worldIn.getBlockState(currentPos); - if (MechanicalPistonBlock.isPiston(block) && block.get(BlockStateProperties.FACING) == direction) - pistonBase = currentPos; + if (isExtensionPole(block) && direction.getAxis() == block.get(BlockStateProperties.FACING) + .getAxis()) + continue; - break; - } + if (MechanicalPistonBlock.isPiston(block) && block.get(BlockStateProperties.FACING) == direction) + pistonBase = currentPos; - if (pistonHead != null && pistonBase != null) { - final BlockPos basePos = pistonBase; - BlockPos.getAllInBox(pistonBase, pistonHead) - .filter(p -> !p.equals(pos) && !p.equals(basePos)) - .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); - worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) - .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); - } + break; + } - super.onBlockHarvested(worldIn, pos, state, player); - } + if (pistonHead != null && pistonBase != null) { + final BlockPos basePos = pistonBase; + BlockPos.getAllInBox(pistonBase, pistonHead) + .filter(p -> !p.equals(pos) && !p.equals(basePos)) + .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); + worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) + .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.MECHANICAL_PISTON_HEAD.get(state.get(FACING)); - } + super.onBlockHarvested(worldIn, pos, state, player); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.MECHANICAL_PISTON_HEAD.get(state.get(FACING)); + } + + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index 8c05ac120..379d3c202 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -1,18 +1,18 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPiston; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; - import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; +import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ProperDirectionalBlock; - +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -21,75 +21,98 @@ import net.minecraft.util.math.BlockPos; 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; -public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable { +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; - public PistonExtensionPoleBlock(Properties properties) { - super(properties); - setDefaultState(getDefaultState().with(FACING, Direction.UP)); - } +public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable { - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.NORMAL; - } + public PistonExtensionPoleBlock(Properties properties) { + super(properties); + setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false)); + } - @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - Axis axis = state.get(FACING) - .getAxis(); - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - BlockPos pistonHead = null; - BlockPos pistonBase = null; + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } - for (int modifier : new int[] { 1, -1 }) { - for (int offset = modifier; modifier * offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset += - modifier) { - BlockPos currentPos = pos.offset(direction, offset); - BlockState block = worldIn.getBlockState(currentPos); + @Override + public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + Axis axis = state.get(FACING) + .getAxis(); + Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + BlockPos pistonHead = null; + BlockPos pistonBase = null; - if (isExtensionPole(block) && axis == block.get(FACING) - .getAxis()) - continue; + for (int modifier : new int[]{1, -1}) { + for (int offset = modifier; modifier * offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset += + modifier) { + BlockPos currentPos = pos.offset(direction, offset); + BlockState block = worldIn.getBlockState(currentPos); - if (isPiston(block) && block.get(BlockStateProperties.FACING) - .getAxis() == axis) - pistonBase = currentPos; + if (isExtensionPole(block) && axis == block.get(FACING) + .getAxis()) + continue; - if (isPistonHead(block) && block.get(BlockStateProperties.FACING) - .getAxis() == axis) - pistonHead = currentPos; + if (isPiston(block) && block.get(BlockStateProperties.FACING) + .getAxis() == axis) + pistonBase = currentPos; - break; - } - } + if (isPistonHead(block) && block.get(BlockStateProperties.FACING) + .getAxis() == axis) + pistonHead = currentPos; - if (pistonHead != null && pistonBase != null && worldIn.getBlockState(pistonHead) - .get(BlockStateProperties.FACING) == worldIn.getBlockState(pistonBase) - .get(BlockStateProperties.FACING)) { + break; + } + } - final BlockPos basePos = pistonBase; - BlockPos.getAllInBox(pistonBase, pistonHead) - .filter(p -> !p.equals(pos) && !p.equals(basePos)) - .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); - worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) - .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); - } + if (pistonHead != null && pistonBase != null && worldIn.getBlockState(pistonHead) + .get(BlockStateProperties.FACING) == worldIn.getBlockState(pistonBase) + .get(BlockStateProperties.FACING)) { - super.onBlockHarvested(worldIn, pos, state, player); - } + final BlockPos basePos = pistonBase; + BlockPos.getAllInBox(pistonBase, pistonHead) + .filter(p -> !p.equals(pos) && !p.equals(basePos)) + .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); + worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) + .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.FOUR_VOXEL_POLE.get(state.get(FACING) - .getAxis()); - } + super.onBlockHarvested(worldIn, pos, state, player); + } - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(FACING, context.getFace() - .getOpposite()); - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.FOUR_VOXEL_POLE.get(state.get(FACING) + .getAxis()); + } + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + return getDefaultState().with(FACING, context.getFace().getOpposite()) + .with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } + + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + protected void fillStateContainer(Builder builder) { + builder.add(BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java index d1c889fc8..2f650d4e9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java @@ -5,13 +5,17 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.foundation.block.ITE; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.state.EnumProperty; +import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; @@ -24,128 +28,156 @@ import net.minecraft.util.math.RayTraceResult; 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; public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE { - public static EnumProperty HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; + public static EnumProperty HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; - public PulleyBlock(Properties properties) { - super(properties); - } + public PulleyBlock(Properties properties) { + super(properties); + } - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.ROPE_PULLEY.create(); - } + private static void onRopeBroken(World world, BlockPos pulleyPos) { + TileEntity te = world.getTileEntity(pulleyPos); + if (!(te instanceof PulleyTileEntity)) + return; + PulleyTileEntity pulley = (PulleyTileEntity) te; + pulley.offset = 0; + pulley.sendData(); + } - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.getBlock() != newState.getBlock()) { - if (!worldIn.isRemote) { - BlockState below = worldIn.getBlockState(pos.down()); - if (below.getBlock() instanceof RopeBlockBase) - worldIn.destroyBlock(pos.down(), true); - } - if (state.hasTileEntity()) - worldIn.removeTileEntity(pos); - } - } + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.ROPE_PULLEY.create(); + } - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, - BlockRayTraceResult hit) { - if (!player.isAllowEdit()) - return ActionResultType.PASS; - if (player.isSneaking()) - return ActionResultType.PASS; - if (player.getHeldItem(handIn) - .isEmpty()) { - withTileEntityDo(worldIn, pos, te -> te.assembleNextTick = true); - return ActionResultType.SUCCESS; - } - return ActionResultType.PASS; - } + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.getBlock() != newState.getBlock()) { + if (!worldIn.isRemote) { + BlockState below = worldIn.getBlockState(pos.down()); + if (below.getBlock() instanceof RopeBlockBase) + worldIn.destroyBlock(pos.down(), true); + } + if (state.hasTileEntity()) + worldIn.removeTileEntity(pos); + } + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.PULLEY.get(state.get(HORIZONTAL_AXIS)); - } + public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + if (!player.isAllowEdit()) + return ActionResultType.PASS; + if (player.isSneaking()) + return ActionResultType.PASS; + if (player.getHeldItem(handIn) + .isEmpty()) { + withTileEntityDo(worldIn, pos, te -> te.assembleNextTick = true); + return ActionResultType.SUCCESS; + } + return ActionResultType.PASS; + } - private static void onRopeBroken(World world, BlockPos pulleyPos) { - TileEntity te = world.getTileEntity(pulleyPos); - if (!(te instanceof PulleyTileEntity)) - return; - PulleyTileEntity pulley = (PulleyTileEntity) te; - pulley.offset = 0; - pulley.sendData(); - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.PULLEY.get(state.get(HORIZONTAL_AXIS)); + } - private static class RopeBlockBase extends Block { + @Override + public Class getTileEntityClass() { + return PulleyTileEntity.class; + } - public RopeBlockBase(Properties properties) { - super(properties); - } + private static class RopeBlockBase extends Block implements IWaterLoggable { - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.BLOCK; - } + public RopeBlockBase(Properties properties) { + super(properties); + setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, - PlayerEntity player) { - return AllBlocks.ROPE_PULLEY.asStack(); - } + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.BLOCK; + } - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (!isMoving) { - onRopeBroken(worldIn, pos.up()); - if (!worldIn.isRemote) { - BlockState above = worldIn.getBlockState(pos.up()); - BlockState below = worldIn.getBlockState(pos.down()); - if (above.getBlock() instanceof RopeBlockBase) - worldIn.destroyBlock(pos.up(), true); - if (below.getBlock() instanceof RopeBlockBase) - worldIn.destroyBlock(pos.down(), true); - } - } - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - worldIn.removeTileEntity(pos); - } - } + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + return AllBlocks.ROPE_PULLEY.asStack(); + } - } + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && (!state.has(BlockStateProperties.WATERLOGGED) || !newState.has(BlockStateProperties.WATERLOGGED) || state.get(BlockStateProperties.WATERLOGGED) == newState.get(BlockStateProperties.WATERLOGGED))) { + onRopeBroken(worldIn, pos.up()); + if (!worldIn.isRemote) { + BlockState above = worldIn.getBlockState(pos.up()); + BlockState below = worldIn.getBlockState(pos.down()); + if (above.getBlock() instanceof RopeBlockBase) + worldIn.destroyBlock(pos.up(), true); + if (below.getBlock() instanceof RopeBlockBase) + worldIn.destroyBlock(pos.down(), true); + } + } + if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { + worldIn.removeTileEntity(pos); + } + } - public static class MagnetBlock extends RopeBlockBase { - public MagnetBlock(Properties properties) { - super(properties); - } + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.PULLEY_MAGNET; - } + @Override + protected void fillStateContainer(Builder builder) { + builder.add(BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } - } + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } - public static class RopeBlock extends RopeBlockBase { + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } - public RopeBlock(Properties properties) { - super(properties); - } + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.FOUR_VOXEL_POLE.get(Direction.UP); - } + public static class MagnetBlock extends RopeBlockBase { - } + public MagnetBlock(Properties properties) { + super(properties); + } - @Override - public Class getTileEntityClass() { - return PulleyTileEntity.class; - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.PULLEY_MAGNET; + } + + } + + public static class RopeBlock extends RopeBlockBase { + + public RopeBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.FOUR_VOXEL_POLE.get(Direction.UP); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index 3642285e8..122d7be6c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -8,9 +8,13 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pis import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; - +import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; @@ -19,170 +23,180 @@ import net.minecraft.util.math.Vec3d; public class PulleyTileEntity extends LinearActuatorTileEntity { - protected int initialOffset; + protected int initialOffset; - public PulleyTileEntity(TileEntityType type) { - super(type); - } + public PulleyTileEntity(TileEntityType type) { + super(type); + } - @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().expand(0, -offset, 0); - } + @Override + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox().expand(0, -offset, 0); + } - @Override - public double getMaxRenderDistanceSquared() { - return super.getMaxRenderDistanceSquared() + offset * offset; - } + @Override + public double getMaxRenderDistanceSquared() { + return super.getMaxRenderDistanceSquared() + offset * offset; + } - @Override - protected void assemble() { - if (!(world.getBlockState(pos) - .getBlock() instanceof PulleyBlock)) - return; - if (speed == 0) - return; - if (offset >= getExtensionRange() && getSpeed() > 0) - return; - if (offset <= 0 && getSpeed() < 0) - return; + @Override + protected void assemble() { + if (!(world.getBlockState(pos) + .getBlock() instanceof PulleyBlock)) + return; + if (speed == 0) + return; + if (offset >= getExtensionRange() && getSpeed() > 0) + return; + if (offset <= 0 && getSpeed() < 0) + return; - // Collect Construct - if (!world.isRemote) { - BlockPos anchor = pos.down((int) (offset + 1)); - initialOffset = (int) (offset); - PulleyContraption contraption = PulleyContraption.assemblePulleyAt(world, anchor, (int) offset); + // Collect Construct + if (!world.isRemote) { + BlockPos anchor = pos.down((int) (offset + 1)); + initialOffset = (int) (offset); + PulleyContraption contraption = PulleyContraption.assemblePulleyAt(world, anchor, (int) offset); - if (contraption != null) { - Direction movementDirection = getSpeed() > 0 ? Direction.DOWN : Direction.UP; - if (ContraptionCollider.isCollidingWithWorld(world, contraption, anchor.offset(movementDirection), - movementDirection)) - contraption = null; - } + if (contraption != null) { + Direction movementDirection = getSpeed() > 0 ? Direction.DOWN : Direction.UP; + if (ContraptionCollider.isCollidingWithWorld(world, contraption, anchor.offset(movementDirection), + movementDirection)) + contraption = null; + } - if (contraption == null && getSpeed() > 0) - return; + if (contraption == null && getSpeed() > 0) + return; - for (int i = ((int) offset); i > 0; i--) { - BlockPos offset = pos.down(i); - world.setBlockState(offset, Blocks.AIR.getDefaultState(), 66); - } + for (int i = ((int) offset); i > 0; i--) { + BlockPos offset = pos.down(i); + BlockState oldState = world.getBlockState(offset); + if (oldState.getBlock() instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED)) { + world.setBlockState(offset, Blocks.WATER.getDefaultState(), 66); + continue; + } + world.setBlockState(offset, Blocks.AIR.getDefaultState(), 66); + } - if (contraption != null && !contraption.blocks.isEmpty()) { - contraption.removeBlocksFromWorld(world, BlockPos.ZERO); - movedContraption = ContraptionEntity.createStationary(world, contraption) - .controlledBy(this); - movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); - world.addEntity(movedContraption); - forceMove = true; - } - } + if (contraption != null && !contraption.blocks.isEmpty()) { + contraption.removeBlocksFromWorld(world, BlockPos.ZERO); + movedContraption = ContraptionEntity.createStationary(world, contraption) + .controlledBy(this); + movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + world.addEntity(movedContraption); + forceMove = true; + } + } - clientOffsetDiff = 0; - running = true; - sendData(); - } + clientOffsetDiff = 0; + running = true; + sendData(); + } - @Override - public void disassemble() { - if (!running && movedContraption == null) - return; - offset = getGridOffset(offset); - if (movedContraption != null) - applyContraptionPosition(); + @Override + public void disassemble() { + if (!running && movedContraption == null) + return; + offset = getGridOffset(offset); + if (movedContraption != null) + applyContraptionPosition(); - if (!world.isRemote) { - if (!removed) { - if (offset > 0) { - BlockPos magnetPos = pos.down((int) offset); - world.destroyBlock(magnetPos, world.getBlockState(magnetPos) - .getCollisionShape(world, magnetPos) - .isEmpty()); - world.setBlockState(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState(), 66); - } - - for (int i = 1; i <= ((int) offset) - 1; i++) { - BlockPos ropePos = pos.down(i); - world.destroyBlock(ropePos, world.getBlockState(ropePos) - .getCollisionShape(world, ropePos) - .isEmpty()); - } - for (int i = 1; i <= ((int) offset) - 1; i++) - world.setBlockState(pos.down(i), AllBlocks.ROPE.getDefaultState(), 66); - } + if (!world.isRemote) { + if (!removed) { + if (offset > 0) { + BlockPos magnetPos = pos.down((int) offset); + IFluidState ifluidstate = world.getFluidState(magnetPos); + world.destroyBlock(magnetPos, world.getBlockState(magnetPos) + .getCollisionShape(world, magnetPos) + .isEmpty()); + world.setBlockState(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState().with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)), 66); + } - if (movedContraption != null) - movedContraption.disassemble(); - } + boolean[] waterlog = new boolean[(int) offset]; - if (movedContraption != null) - movedContraption.remove(); - movedContraption = null; - initialOffset = 0; - running = false; - sendData(); - } + for (int i = 1; i <= ((int) offset) - 1; i++) { + BlockPos ropePos = pos.down(i); + IFluidState ifluidstate = world.getFluidState(ropePos); + waterlog[i] = ifluidstate.getFluid() == Fluids.WATER; + world.destroyBlock(ropePos, world.getBlockState(ropePos) + .getCollisionShape(world, ropePos) + .isEmpty()); + } + for (int i = 1; i <= ((int) offset) - 1; i++) + world.setBlockState(pos.down(i), AllBlocks.ROPE.getDefaultState().with(BlockStateProperties.WATERLOGGED, waterlog[i]), 66); + } - @Override - protected Vec3d toPosition(float offset) { - if (movedContraption.getContraption() instanceof PulleyContraption) { - PulleyContraption contraption = (PulleyContraption) movedContraption.getContraption(); - return new Vec3d(contraption.getAnchor()).add(0, contraption.initialOffset - offset, 0); + if (movedContraption != null) + movedContraption.disassemble(); + } - } - return Vec3d.ZERO; - } + if (movedContraption != null) + movedContraption.remove(); + movedContraption = null; + initialOffset = 0; + running = false; + sendData(); + } - @Override - protected void visitNewPosition() { - super.visitNewPosition(); - if (world.isRemote) - return; - if (movedContraption != null) - return; - if (getSpeed() <= 0) - return; + @Override + protected Vec3d toPosition(float offset) { + if (movedContraption.getContraption() instanceof PulleyContraption) { + PulleyContraption contraption = (PulleyContraption) movedContraption.getContraption(); + return new Vec3d(contraption.getAnchor()).add(0, contraption.initialOffset - offset, 0); - BlockPos posBelow = pos.down((int) (offset + getMovementSpeed()) + 1); - if (!BlockMovementTraits.movementNecessary(world, posBelow)) - return; - if (BlockMovementTraits.isBrittle(world.getBlockState(posBelow))) - return; + } + return Vec3d.ZERO; + } - disassemble(); - assembleNextTick = true; - } + @Override + protected void visitNewPosition() { + super.visitNewPosition(); + if (world.isRemote) + return; + if (movedContraption != null) + return; + if (getSpeed() <= 0) + return; - @Override - public void read(CompoundNBT tag) { - initialOffset = tag.getInt("InitialOffset"); - super.read(tag); - } + BlockPos posBelow = pos.down((int) (offset + getMovementSpeed()) + 1); + if (!BlockMovementTraits.movementNecessary(world, posBelow)) + return; + if (BlockMovementTraits.isBrittle(world.getBlockState(posBelow))) + return; - @Override - public CompoundNBT write(CompoundNBT tag) { - tag.putInt("InitialOffset", initialOffset); - return super.write(tag); - } + disassemble(); + assembleNextTick = true; + } - @Override - protected int getExtensionRange() { - return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1)); - } + @Override + public void read(CompoundNBT tag) { + initialOffset = tag.getInt("InitialOffset"); + super.read(tag); + } - @Override - protected int getInitialOffset() { - return initialOffset; - } + @Override + public CompoundNBT write(CompoundNBT tag) { + tag.putInt("InitialOffset", initialOffset); + return super.write(tag); + } - @Override - protected Vec3d toMotionVector(float speed) { - return new Vec3d(0, -speed, 0); - } + @Override + protected int getExtensionRange() { + return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1)); + } - @Override - protected ValueBoxTransform getMovementModeSlot() { - return new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP); - } + @Override + protected int getInitialOffset() { + return initialOffset; + } + + @Override + protected Vec3d toMotionVector(float speed) { + return new Vec3d(0, -speed, 0); + } + + @Override + protected ValueBoxTransform getMovementModeSlot() { + return new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java index 83d2f16c7..e5923468e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java @@ -34,7 +34,7 @@ public class WaterWheelBlock extends HorizontalKineticBlock implements ITE= tanks.length) + return FluidStack.EMPTY; + return tanks[tank]; + } + + @Override + public int getTankCapacity(int tank) { + return capacity; + } + + @Override + public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { + return (!stack.isEmpty()) && (tanks[tank].isEmpty() || tanks[tank].isFluidEqual(stack)) + && tanks[tank].getAmount() < capacity; + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + int tankIndex; + int amount = resource.getAmount(); + while ((tankIndex = getFittingFluidSlot(resource)) != -1) { + int newAmount = MathHelper.clamp(amount - capacity - tanks[tankIndex].getAmount(), 0, Integer.MAX_VALUE); + if (action == FluidAction.EXECUTE) + if (tanks[tankIndex].isEmpty()) + tanks[tankIndex] = new FluidStack(resource.getFluid(), amount - newAmount); + else + tanks[tankIndex].grow(amount - newAmount); + amount = newAmount; + if (amount == 0) + return 0; + } + return amount; + } + + @Nonnull + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + if (resource.isEmpty()) + return FluidStack.EMPTY; + + FluidStack stack = new FluidStack(resource, 0); + + for (int i = 0; i < tanks.length; i++) { + if (tanks[i].isFluidEqual(resource)) { + stack.grow(tanks[i].getAmount()); + if (action == FluidAction.EXECUTE) + tanks[i] = FluidStack.EMPTY; + } + } + + return stack.isEmpty() ? FluidStack.EMPTY : stack; + } + + @Nonnull + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + + FluidStack stack = new FluidStack(tanks[0].getFluid(), 0); + + for (int i = 0; i < tanks.length; i++) { + if (tanks[i].isFluidEqual(stack)) { + int newDrainAmount = MathHelper.clamp(stack.getAmount() + tanks[i].getAmount(), 0, maxDrain); + if (action == FluidAction.EXECUTE) { + tanks[i].shrink(newDrainAmount - stack.getAmount()); + if (tanks[i].isEmpty()) + tanks[i] = FluidStack.EMPTY; + } + stack.setAmount(newDrainAmount); + } + } + + return stack.isEmpty() ? FluidStack.EMPTY : stack; + } + + private int getFittingFluidSlot(FluidStack fluidStack) { + return IntStream.range(0, tanks.length) + .filter(i -> isFluidValid(i, fluidStack)) + .findFirst() + .orElse(-1); + } + + private void setFluid(FluidStack fluid, int tank) { + tanks[tank] = fluid; + } + + public CombinedFluidHandler readFromNBT(ListNBT fluidNBTs) { + for (int i = 0; i < Math.min(tanks.length, fluidNBTs.size()); i++) + setFluid(FluidStack.loadFluidStackFromNBT(fluidNBTs.getCompound(i)), i); + return this; + } + + public ListNBT getListNBT() { + return Arrays.stream(tanks) + .map(fluid -> fluid.writeToNBT(new CompoundNBT())) + .collect(Collectors.toCollection(ListNBT::new)); + } + + public void forEachTank(NonNullConsumer fluidStackConsumer) { + Arrays.stream(tanks) + .forEach(fluidStackConsumer::accept); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBlock.java index 20c2ff3e2..f3cc7c6de 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBlock.java @@ -3,9 +3,13 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; import net.minecraft.block.SixWayBlock; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; @@ -17,10 +21,11 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import javax.annotation.Nullable; -public class FluidPipeBlock extends SixWayBlock { +public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable { public FluidPipeBlock(Properties properties) { super(4 / 16f, properties); + this.setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); } public static boolean isPipe(BlockState state) { @@ -28,7 +33,7 @@ public class FluidPipeBlock extends SixWayBlock { } public static boolean isTank(BlockState state, IBlockReader world, BlockPos pos, Direction blockFace) { - return state.hasTileEntity() && world.getTileEntity(pos).getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, blockFace.getOpposite()) != null; + return state.hasTileEntity() && world.getTileEntity(pos).getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, blockFace.getOpposite()).isPresent(); } // TODO: more generic pipe connection handling. Ideally without marker interface @@ -98,18 +103,23 @@ public class FluidPipeBlock extends SixWayBlock { @Override protected void fillStateContainer(Builder builder) { - builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN); + builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); return updateBlockState(getDefaultState(), context.getNearestLookingDirection(), null, context.getWorld(), - context.getPos()); + context.getPos()).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); } @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } return updateBlockState(state, direction, direction.getOpposite(), world, pos); } @@ -139,4 +149,9 @@ public class FluidPipeBlock extends SixWayBlock { return state.with(FACING_TO_PROPERTY_MAP.get(preferredDirection), true) .with(FACING_TO_PROPERTY_MAP.get(preferredDirection.getOpposite()), true); } + + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java index 6ef74d921..822f86505 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; @@ -14,6 +15,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IBlockReader; import net.minecraft.world.ILightReader; import net.minecraft.world.IWorld; @@ -23,114 +25,125 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class FluidTankBlock extends Block { - public static final BooleanProperty TOP = BooleanProperty.create("top"); - public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom"); + public static final BooleanProperty TOP = BooleanProperty.create("top"); + public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom"); - public FluidTankBlock(Properties p_i48440_1_) { - super(p_i48440_1_); - setDefaultState(getDefaultState().with(TOP, true) - .with(BOTTOM, true)); - } - public static boolean shouldDrawDiagonalFiller(ILightReader world, BlockPos pos, BlockState state, boolean north, - boolean east) { - if (!isTank(state)) - return false; - int northOffset = north ? 1 : -1; - int eastOffset = east ? 1 : -1; - if (!isTank(world.getBlockState(pos.north(northOffset)))) - return false; - if (!isTank(world.getBlockState(pos.east(eastOffset)))) - return false; - return !isTank(world.getBlockState(pos.east(eastOffset) - .north(northOffset))); - } + public FluidTankBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + setDefaultState(getDefaultState().with(TOP, true) + .with(BOTTOM, true)); + } - public static boolean shouldDrawCapFiller(ILightReader world, BlockPos pos, BlockState state, Direction direction, - boolean top) { - if (!isTank(state)) - return false; - if (top && !state.get(TOP)) - return false; - if (!top && !state.get(BOTTOM)) - return false; - BlockPos adjacentPos = pos.offset(direction); - BlockState adjacentState = world.getBlockState(adjacentPos); - if (!isTank(adjacentState)) - return false; - if (top && adjacentState.get(TOP)) - return false; - return top || !adjacentState.get(BOTTOM); - } + public static boolean shouldDrawDiagonalFiller(ILightReader world, BlockPos pos, BlockState state, boolean north, + boolean east) { + if (!isTank(state)) + return false; + int northOffset = north ? 1 : -1; + int eastOffset = east ? 1 : -1; + if (!isTank(world.getBlockState(pos.north(northOffset)))) + return false; + if (!isTank(world.getBlockState(pos.east(eastOffset)))) + return false; + return !isTank(world.getBlockState(pos.east(eastOffset) + .north(northOffset))); + } - public static boolean isTank(BlockState state) { - return state.getBlock() instanceof FluidTankBlock; - } + public static boolean shouldDrawCapFiller(ILightReader world, BlockPos pos, BlockState state, Direction direction, + boolean top) { + if (!isTank(state)) + return false; + if (top && !state.get(TOP)) + return false; + if (!top && !state.get(BOTTOM)) + return false; + BlockPos adjacentPos = pos.offset(direction); + BlockState adjacentState = world.getBlockState(adjacentPos); + if (!isTank(adjacentState)) + return false; + if (top && adjacentState.get(TOP)) + return false; + return top || !adjacentState.get(BOTTOM); + } - @Override - protected void fillStateContainer(Builder p_206840_1_) { - p_206840_1_.add(TOP, BOTTOM); - } + public static boolean isTank(BlockState state) { + return state.getBlock() instanceof FluidTankBlock; + } - @Override - public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { - World world = p_196258_1_.getWorld(); - BlockPos pos = p_196258_1_.getPos(); - BlockState state = super.getStateForPlacement(p_196258_1_); - state = updateState(state, world, pos, Direction.UP); - state = updateState(state, world, pos, Direction.DOWN); - return state; - } + @Override + protected void fillStateContainer(Builder p_206840_1_) { + p_206840_1_.add(TOP, BOTTOM); + } - private boolean isTankToDirection(IBlockReader world, BlockPos pos, Direction direction) { - return world.getBlockState(pos.offset(direction)).getBlock() instanceof FluidTankBlock; - } + @Override + public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { + World world = p_196258_1_.getWorld(); + BlockPos pos = p_196258_1_.getPos(); + BlockState state = super.getStateForPlacement(p_196258_1_); + state = updateState(state, world, pos, Direction.UP); + state = updateState(state, world, pos, Direction.DOWN); + return state; + } - public AxisAlignedBB getTankBodyShape(IBlockReader world, BlockPos pos) { - return new AxisAlignedBB((isTankToDirection(world, pos, Direction.WEST) ? 0 : 2) / 16f, - (isTankToDirection(world, pos, Direction.DOWN) ? 0 : 4) / 16f, - (isTankToDirection(world, pos, Direction.NORTH) ? 0 : 2) / 16f, - (isTankToDirection(world, pos, Direction.EAST) ? 16 : 14) / 16f, - (isTankToDirection(world, pos, Direction.UP) ? 16 : 12) / 16f, - (isTankToDirection(world, pos, Direction.SOUTH) ? 16 : 14) / 16f); - } + private boolean isTankToDirection(IBlockReader world, BlockPos pos, Direction direction) { + return world.getBlockState(pos.offset(direction)).getBlock() instanceof FluidTankBlock; + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, - ISelectionContext p_220053_4_) { - boolean top = state.get(TOP); - boolean bottom = state.get(BOTTOM); - return top ? bottom ? AllShapes.TANK_TOP_BOTTOM : AllShapes.TANK_TOP - : bottom ? AllShapes.TANK_BOTTOM : AllShapes.TANK; - } + public AxisAlignedBB getTankShape(IBlockReader world, BlockPos pos) { + return new AxisAlignedBB((isTankToDirection(world, pos, Direction.WEST) ? 0 : 2) / 16f, + (isTankToDirection(world, pos, Direction.DOWN) ? 0 : 4) / 16f, + (isTankToDirection(world, pos, Direction.NORTH) ? 0 : 2) / 16f, + (isTankToDirection(world, pos, Direction.EAST) ? 16 : 14) / 16f, + (isTankToDirection(world, pos, Direction.UP) ? 16 : 12) / 16f, + (isTankToDirection(world, pos, Direction.SOUTH) ? 16 : 14) / 16f); - @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, - BlockPos pos, BlockPos p_196271_6_) { - return updateState(state, world, pos, direction); - } + } - private BlockState updateState(BlockState state, ILightReader reader, BlockPos pos, Direction direction) { - if (direction.getAxis() - .isHorizontal()) - return state; - return state.with(direction == Direction.UP ? TOP : BOTTOM, - !AllBlocks.FLUID_TANK.has(reader.getBlockState(pos.offset(direction)))); - } + public AxisAlignedBB getBodyShape(IBlockReader world, BlockPos pos) { + return new AxisAlignedBB((isTankToDirection(world, pos, Direction.WEST) ? 0 : 1) / 16f, + 0, + (isTankToDirection(world, pos, Direction.NORTH) ? 0 : 1) / 16f, + (isTankToDirection(world, pos, Direction.EAST) ? 16 : 15) / 16f, + 1, + (isTankToDirection(world, pos, Direction.SOUTH) ? 16 : 15) / 16f); + } - @Override - @OnlyIn(Dist.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { - return adjacentBlockState.getBlock() == this; - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, + ISelectionContext p_220053_4_) { + boolean top = state.get(TOP); + boolean bottom = state.get(BOTTOM); + return VoxelShapes.or(top ? bottom ? AllShapes.TANK_TOP_BOTTOM : AllShapes.TANK_TOP + : bottom ? AllShapes.TANK_BOTTOM : AllShapes.TANK, VoxelShapes.create(getBodyShape(world, pos))); + } - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, + BlockPos pos, BlockPos p_196271_6_) { + return updateState(state, world, pos, direction); + } - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.FLUID_TANK.create(); - } + private BlockState updateState(BlockState state, ILightReader reader, BlockPos pos, Direction direction) { + if (direction.getAxis() + .isHorizontal()) + return state; + return state.with(direction == Direction.UP ? TOP : BOTTOM, + !AllBlocks.FLUID_TANK.has(reader.getBlockState(pos.offset(direction)))); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + return adjacentBlockState.getBlock() == this; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.FLUID_TANK.create(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankRenderer.java index 452de1254..54405a81e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankRenderer.java @@ -175,7 +175,7 @@ public class FluidTankRenderer extends SafeTileEntityRenderer getTanksToRender(FluidTankTileEntity te) { - return Collections.singletonList(new FluidTankRenderInfo(te, ((FluidTankBlock) te.getBlockState().getBlock()).getTankBodyShape(te.getWorld(), te.getPos()))); + return Collections.singletonList(new FluidTankRenderInfo(te, ((FluidTankBlock) te.getBlockState().getBlock()).getTankShape(te.getWorld(), te.getPos()))); } private static class FluidTankRenderInfo { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java index bcef27b33..788dcee2f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java @@ -3,8 +3,14 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; - +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; +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.Direction.Axis; @@ -12,45 +18,73 @@ import net.minecraft.util.math.BlockPos; 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; -public class PumpBlock extends DirectionalKineticBlock { +public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable { - public PumpBlock(Properties p_i48415_1_) { - super(p_i48415_1_); - } + public PumpBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.MECHANICAL_PUMP.create(); - } + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.MECHANICAL_PUMP.create(); + } - @Override - public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { - return originalState.with(FACING, originalState.get(FACING) - .getOpposite()); - } + @Override + public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { + return originalState.with(FACING, originalState.get(FACING) + .getOpposite()); + } - @Override - public Axis getRotationAxis(BlockState state) { - return state.get(FACING) - .getAxis(); - } + @Override + public Axis getRotationAxis(BlockState state) { + return state.get(FACING) + .getAxis(); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, - ISelectionContext p_220053_4_) { - return AllShapes.PUMP.get(state.get(FACING)); - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.PUMP.get(state.get(FACING)); + } - @Override - public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { - return true; - } + @Override + public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { + return true; + } + + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + protected void fillStateContainer(Builder builder) { + builder.add(BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java new file mode 100644 index 000000000..edb006233 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java @@ -0,0 +1,86 @@ +package com.simibubi.create.content.contraptions.goggles; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.Lang; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextFormatting; + +import java.util.ArrayList; +import java.util.List; + +public class GoggleConfigScreen extends AbstractSimiScreen { + + private int offsetX; + private int offsetY; + private final List tooltip; + + public GoggleConfigScreen() { + String spacing = " "; + tooltip = new ArrayList<>(); + tooltip.add(spacing + Lang.translate("gui.config.overlay1")); + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.config.overlay2")); + tooltip.add(""); + tooltip.add(spacing + Lang.translate("gui.config.overlay3")); + tooltip.add(spacing + Lang.translate("gui.config.overlay4")); + tooltip.add(""); + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.config.overlay5")); + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.config.overlay6")); + tooltip.add(""); + tooltip.add(spacing + Lang.translate("gui.config.overlay7")); + tooltip.add(spacing + Lang.translate("gui.config.overlay8")); + } + + @Override + protected void init() { + Minecraft mc = Minecraft.getInstance(); + this.width = mc.getWindow().getScaledWidth(); + this.height = mc.getWindow().getScaledHeight(); + + offsetX = AllConfigs.CLIENT.overlayOffsetX.get(); + offsetY = AllConfigs.CLIENT.overlayOffsetY.get(); + } + + @Override + public void removed() { + AllConfigs.CLIENT.overlayOffsetX.set(offsetX); + AllConfigs.CLIENT.overlayOffsetY.set(offsetY); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + updateOffset(x, y); + + return true; + } + + @Override + public boolean mouseDragged(double p_mouseDragged_1_, double p_mouseDragged_3_, int p_mouseDragged_5_, double p_mouseDragged_6_, double p_mouseDragged_8_) { + updateOffset(p_mouseDragged_1_, p_mouseDragged_3_); + + return true; + } + + private void updateOffset(double windowX, double windowY) { + offsetX = (int) (windowX - (this.width / 2)); + offsetY = (int) (windowY - (this.height / 2)); + } + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + RenderSystem.pushMatrix(); + int posX = this.width / 2 + offsetX; + int posY = this.height / 2 + offsetY; + //tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2); + renderTooltip(tooltip, posX, posY); + + ItemStack item = AllItems.GOGGLES.asStack(); + //GuiGameElement.of(item).at(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16).render(); + GuiGameElement.of(item).at(posX + 10, posY - 16).render(); + RenderSystem.popMatrix(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index 710c76388..2e728d649 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -1,12 +1,9 @@ package com.simibubi.create.content.contraptions.goggles; -import java.util.ArrayList; -import java.util.List; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.GuiGameElement; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.world.ClientWorld; @@ -23,6 +20,9 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.ArrayList; +import java.util.List; + @EventBusSubscriber(value = Dist.CLIENT) public class GoggleOverlayRenderer { @@ -76,10 +76,14 @@ public class GoggleOverlayRenderer { RenderSystem.pushMatrix(); Screen tooltipScreen = new TooltipScreen(null); tooltipScreen.init(mc, mc.getWindow().getScaledWidth(), mc.getWindow().getScaledHeight()); - tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2); - + int posX = tooltipScreen.width / 2 + AllConfigs.CLIENT.overlayOffsetX.get(); + int posY = tooltipScreen.height / 2 + AllConfigs.CLIENT.overlayOffsetY.get(); + //tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2); + tooltipScreen.renderTooltip(tooltip, posX, posY); + ItemStack item = AllItems.GOGGLES.asStack(); - GuiGameElement.of(item).at(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16).render(); + //GuiGameElement.of(item).at(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16).render(); + GuiGameElement.of(item).at(posX + 10, posY - 16).render(); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index cd43ee148..bc1c0d703 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -43,7 +43,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.BASIN.create(); } - + @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { return ActionResultType.FAIL; @@ -51,8 +51,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, - BlockRayTraceResult hit) { - if (!player.getHeldItem(handIn).isEmpty()) + BlockRayTraceResult hit) { + if (!player.getHeldItem(handIn) + .isEmpty()) return ActionResultType.PASS; try { @@ -63,7 +64,8 @@ public class BasinBlock extends Block implements ITE, IWrenchab inv.setStackInSlot(slot, ItemStack.EMPTY); } te.onEmptied(); - } catch (TileEntityException e) {} + } catch (TileEntityException e) { + } return ActionResultType.SUCCESS; } @@ -79,15 +81,15 @@ public class BasinBlock extends Block implements ITE, IWrenchab return; ItemEntity itemEntity = (ItemEntity) entityIn; withTileEntityDo(worldIn, entityIn.getPosition(), te -> { - ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false); + ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputItemInventory, itemEntity.getItem() + .copy(), false); if (insertItem.isEmpty()) { itemEntity.remove(); if (!itemEntity.world.isRemote) - AllTriggers - .triggerForNearbyPlayers(AllTriggers.BASIN_THROW, itemEntity.world, - itemEntity.getPosition(), 3); + AllTriggers.triggerForNearbyPlayers(AllTriggers.BASIN_THROW, itemEntity.world, + itemEntity.getPosition(), 3); return; } @@ -107,8 +109,8 @@ public class BasinBlock extends Block implements ITE, IWrenchab } withTileEntityDo(worldIn, pos, te -> { - ItemHelper.dropContents(worldIn, pos, te.inputInventory); - ItemHelper.dropContents(worldIn, pos, te.outputInventory); + ItemHelper.dropContents(worldIn, pos, te.inputItemInventory); + ItemHelper.dropContents(worldIn, pos, te.outputItemInventory); }); worldIn.removeTileEntity(pos); } @@ -121,8 +123,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { try { - return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory); - } catch (TileEntityException e) {} + return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputItemInventory); + } catch (TileEntityException e) { + } return 0; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index 121b3e6f4..492c3f106 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -7,6 +7,7 @@ import java.util.stream.Collectors; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.SimpleTrigger; @@ -22,6 +23,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.NonNullList; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -32,8 +35,9 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { public DeferralBehaviour basinChecker; public boolean basinRemoved; protected IRecipe lastRecipe; - protected LazyOptional basinInv = LazyOptional.empty(); - protected List inputs; + protected LazyOptional basinItemInv = LazyOptional.empty(); + protected LazyOptional basinFluidInv = LazyOptional.empty(); + protected MultiIngredientTypeList inputs; public BasinOperatingTileEntity(TileEntityType typeIn) { super(typeIn); @@ -55,17 +59,19 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { } public void gatherInputs() { - if (!basinInv.isPresent()) - return; - BasinInventory inv = (BasinInventory) basinInv.orElse(null); - inputs = new ArrayList<>(); - IItemHandlerModifiable inputHandler = inv.getInputHandler(); - for (int slot = 0; slot < inputHandler.getSlots(); ++slot) { - ItemStack itemstack = inputHandler.extractItem(slot, inputHandler.getSlotLimit(slot), true); - if (!itemstack.isEmpty()) { - inputs.add(itemstack); + inputs = new MultiIngredientTypeList(); + + basinItemInv.ifPresent(inv -> { + IItemHandlerModifiable inputHandler = ((BasinInventory) inv).getInputHandler(); + for (int slot = 0; slot < inputHandler.getSlots(); ++slot) { + ItemStack itemstack = inputHandler.extractItem(slot, inputHandler.getSlotLimit(slot), true); + if (!itemstack.isEmpty()) { + inputs.add(itemstack); + } } - } + }); + + basinFluidInv.ifPresent(iFluidHandler -> ((CombinedFluidHandler) iFluidHandler).forEachTank(inputs::add)); } @Override @@ -91,12 +97,16 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { Optional basinTe = getBasin(); if (!basinTe.isPresent()) return true; - if (!basinInv.isPresent()) - basinInv = basinTe.get().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); - if (!basinInv.isPresent()) + if (!basinItemInv.isPresent()) + basinItemInv = basinTe.get() + .getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + if (!basinFluidInv.isPresent()) + basinFluidInv = basinTe.get() + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + if (!basinFluidInv.isPresent() || !basinItemInv.isPresent()) return true; - if (world.isRemote) + if (world == null || world.isRemote) return true; gatherInputs(); @@ -112,8 +122,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract boolean isRunning(); - public void startProcessingBasin() { - } + public void startProcessingBasin() {} public boolean continueWithPreviousRecipe() { return true; @@ -122,12 +131,10 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { public void applyBasinRecipe() { if (lastRecipe == null) return; - if (!basinInv.isPresent()) + if (!basinItemInv.isPresent() || !basinFluidInv.isPresent()) return; - BasinInventory inv = (BasinInventory) basinInv.orElse(null); - if (inv == null) - return; + BasinInventory inv = (BasinInventory) basinItemInv.orElse(null); IItemHandlerModifiable inputs = inv.getInputHandler(); IItemHandlerModifiable outputs = inv.getOutputHandler(); @@ -142,25 +149,29 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { continue; ItemStack extracted = inputs.extractItem(slot, 1, false); if ((lastRecipe instanceof ProcessingRecipe) - && ((ProcessingRecipe) lastRecipe).getRollableIngredients().get(i).remains()) { + && ((ProcessingRecipe) lastRecipe).getRollableIngredients() + .get(i) + .remains()) { catalysts.add(extracted.copy()); } else if (extracted.hasContainerItem()) { - containers.add(extracted.getContainerItem().copy()); + containers.add(extracted.getContainerItem() + .copy()); } continue Ingredients; } // something wasn't found return; } - - if (!world.isRemote) { + + if (world != null && !world.isRemote) { SimpleTrigger trigger = AllTriggers.MIXER_MIX; if (AllTileEntities.MECHANICAL_PRESS.is(this)) trigger = AllTriggers.PRESS_COMPACT; AllTriggers.triggerForNearbyPlayers(trigger, world, pos, 4); } - ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput().copy(), false); + ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput() + .copy(), false); containers.forEach(stack -> ItemHandlerHelper.insertItemStacked(outputs, stack, false)); catalysts.forEach(c -> ItemHandlerHelper.insertItemStacked(outputs, c, false)); @@ -176,9 +187,12 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected List> getMatchingRecipes() { List> list = RecipeFinder.get(getRecipeCacheKey(), world, this::matchStaticFilters); - return list.stream().filter(this::matchBasinRecipe) - .sorted((r1, r2) -> -r1.getIngredients().size() + r2.getIngredients().size()) - .collect(Collectors.toList()); + return list.stream() + .filter(this::matchBasinRecipe) + .sorted((r1, r2) -> -r1.getIngredients() + .size() + r2.getIngredients() + .size()) + .collect(Collectors.toList()); } protected void basinRemoved() { @@ -186,6 +200,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { } protected Optional getBasin() { + if (world == null) + return Optional.empty(); TileEntity basinTE = world.getTileEntity(pos.down(2)); if (!(basinTE instanceof BasinTileEntity)) return Optional.empty(); 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 0c9c8febf..78f4d7b95 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 @@ -1,8 +1,12 @@ package com.simibubi.create.content.contraptions.processing; +import java.util.List; import java.util.Optional; -import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; +import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -12,6 +16,7 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; @@ -19,11 +24,13 @@ import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper; -public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEntity { +import javax.annotation.Nonnull; + +public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity { public boolean contentsChanged; - protected ItemStackHandler outputInventory = new ItemStackHandler(9) { + protected ItemStackHandler outputItemInventory = new ItemStackHandler(9) { protected void onContentsChanged(int slot) { sendData(); markDirty(); @@ -32,18 +39,19 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn public class BasinInputInventory extends RecipeWrapper { public BasinInputInventory() { - super(inputInventory); + super(inputItemInventory); } } - protected ItemStackHandler inputInventory = new ItemStackHandler(9) { + protected ItemStackHandler inputItemInventory = new ItemStackHandler(9) { protected void onContentsChanged(int slot) { contentsChanged = true; sendData(); markDirty(); - }; + } - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + @Nonnull + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { for (int i = 0; i < getSlots(); i++) { ItemStack stackInSlot = getStackInSlot(i); if (ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)) @@ -51,7 +59,7 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn return stack; } return super.insertItem(slot, stack, simulate); - }; + } }; public static class BasinInventory extends CombinedInvWrapper { @@ -59,6 +67,7 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn super(input, output); } + @Nonnull @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { if (isInput(slot)) @@ -66,8 +75,9 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn return super.extractItem(slot, amount, simulate); } + @Nonnull @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if (!isInput(slot)) return stack; return super.insertItem(slot, stack, simulate); @@ -88,7 +98,11 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn } protected LazyOptional inventory = - LazyOptional.of(() -> new BasinInventory(inputInventory, outputInventory)); + LazyOptional.of(() -> new BasinInventory(inputItemInventory, outputItemInventory)); + + protected LazyOptional fluidInventory = + LazyOptional.of(() -> new CombinedFluidHandler(9, 1000)); + public BasinInputInventory recipeInventory; public BasinTileEntity(TileEntityType type) { @@ -97,18 +111,27 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn recipeInventory = new BasinInputInventory(); } + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this)); + } + @Override public void read(CompoundNBT compound) { super.read(compound); - inputInventory.deserializeNBT(compound.getCompound("InputItems")); - outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + inputItemInventory.deserializeNBT(compound.getCompound("InputItems")); + outputItemInventory.deserializeNBT(compound.getCompound("OutputItems")); + if (compound.hasUniqueId("fluids")) + fluidInventory + .ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10))); } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); - compound.put("InputItems", inputInventory.serializeNBT()); - compound.put("OutputItems", outputInventory.serializeNBT()); + compound.put("InputItems", inputItemInventory.serializeNBT()); + compound.put("OutputItems", outputItemInventory.serializeNBT()); + fluidInventory.ifPresent(combinedFuidHandler -> compound.put("fluids", combinedFuidHandler.getListNBT())); return compound; } @@ -120,13 +143,17 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn public void remove() { onEmptied(); inventory.invalidate(); + fluidInventory.invalidate(); super.remove(); } + @Nonnull @Override - public LazyOptional getCapability(Capability cap, Direction side) { + public LazyOptional getCapability(@Nonnull Capability cap, Direction side) { if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return inventory.cast(); + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + return fluidInventory.cast(); return super.getCapability(cap, side); } @@ -139,6 +166,8 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn } private Optional getOperator() { + if (world == null) + return Optional.empty(); TileEntity te = world.getTileEntity(pos.up(2)); if (te instanceof BasinOperatingTileEntity) return Optional.of((BasinOperatingTileEntity) te); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/MultiIngredientTypeList.java b/src/main/java/com/simibubi/create/content/contraptions/processing/MultiIngredientTypeList.java new file mode 100644 index 000000000..1206bc283 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/MultiIngredientTypeList.java @@ -0,0 +1,28 @@ +package com.simibubi.create.content.contraptions.processing; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import java.util.ArrayList; +import java.util.function.Consumer; + +public class MultiIngredientTypeList { + private final ArrayList itemIngredients = new ArrayList<>(); + private final ArrayList fluidIngredients = new ArrayList<>(); + + public void add(ItemStack itemstack) { + itemIngredients.add(itemstack); + } + + public void add(FluidStack fluidStack) { + fluidIngredients.add(fluidStack); + } + + public void forEachItemStack(Consumer itemStackConsumer) { + itemIngredients.forEach(itemStackConsumer); + } + + public void forEachFluidStack(Consumer fluidStackConsumer) { + fluidIngredients.forEach(fluidStackConsumer); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index 5a50fffc1..b28c352f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -88,16 +88,16 @@ public class Instruction { CompoundNBT serialize() { CompoundNBT tag = new CompoundNBT(); - tag.putString("Type", NBTHelper.writeEnum(instruction)); - tag.putString("Modifier", NBTHelper.writeEnum(speedModifier)); + NBTHelper.writeEnum(tag, "Type", instruction); + NBTHelper.writeEnum(tag, "Modifier", speedModifier); tag.putInt("Value", value); return tag; } static Instruction deserialize(CompoundNBT tag) { Instruction instruction = - new Instruction(NBTHelper.readEnum(tag.getString("Type"), SequencerInstructions.class)); - instruction.speedModifier = NBTHelper.readEnum(tag.getString("Modifier"), InstructionSpeedModifiers.class); + new Instruction(NBTHelper.readEnum(tag, "Type", SequencerInstructions.class)); + instruction.speedModifier = NBTHelper.readEnum(tag, "Modifier", InstructionSpeedModifiers.class); instruction.value = tag.getInt("Value"); return instruction; } 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 82cee9d3c..8f6fc42a3 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 @@ -102,8 +102,8 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Axis preferredAxis = RotatedPillarKineticBlock.getPreferredAxis(context); - if (preferredAxis != null && !context.getPlayer() - .isSneaking()) + if (preferredAxis != null && (context.getPlayer() == null || !context.getPlayer() + .isSneaking())) return withAxis(preferredAxis, context); return withAxis(context.getNearestLookingDirection() .getAxis(), context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/AllBeltAttachments.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/AllBeltAttachments.java deleted file mode 100644 index 7f01d12e6..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/AllBeltAttachments.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.simibubi.create.content.contraptions.relays.belt; - -import java.util.LinkedList; -import java.util.List; -import java.util.function.Consumer; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorld; -import net.minecraft.world.World; - -public enum AllBeltAttachments { //TODO rework this nonsense - - BELT_FUNNEL(AllBlocks.FUNNEL.get()), - BELT_OBSERVER(AllBlocks.BELT_OBSERVER.get()), - MECHANICAL_PRESS(AllBlocks.MECHANICAL_PRESS.get()), - LOGISTICAL_ATTACHABLES(AllBlocks.EXTRACTOR.get()), - - ; - - IBeltAttachment attachment; - - private AllBeltAttachments(Block attachment) { - this.attachment = (IBeltAttachment) attachment; - } - - public interface IBeltAttachment { - - public List getPotentialAttachmentPositions(IWorld world, BlockPos pos, BlockState beltState); - - public BlockPos getBeltPositionForAttachment(IWorld world, BlockPos pos, BlockState state); - - default boolean isAttachedCorrectly(IWorld world, BlockPos attachmentPos, BlockPos beltPos, - BlockState attachmentState, BlockState beltState) { - return true; - } - - default boolean processEntity(BeltTileEntity te, Entity entity, BeltAttachmentState state) { - return false; - } - - default boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, - BeltAttachmentState state) { - return false; - } - - default boolean processItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - return false; - } - - default void onAttachmentPlaced(IWorld world, BlockPos pos, BlockState state) { - BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); - BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos); - - if (belt == null) - return; - if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos))) - return; - - belt.attachmentTracker.addAttachment(world, pos); - belt.markDirty(); - belt.sendData(); - } - - default void onAttachmentRemoved(IWorld world, BlockPos pos, BlockState state) { - BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); - BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos); - - if (belt == null) - return; - if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos))) - return; - - belt.attachmentTracker.removeAttachment(pos); - belt.markDirty(); - belt.sendData(); - } - - } - - public static class BeltAttachmentState { - public IBeltAttachment attachment; - public BlockPos attachmentPos; - public int processingDuration; - public Entity processingEntity; - public TransportedItemStack processingStack; - - public BeltAttachmentState(IBeltAttachment attachment, BlockPos attachmentPos) { - this.attachment = attachment; - this.attachmentPos = attachmentPos; - } - - } - - public static class Tracker { - public List attachments; - private BeltTileEntity te; - - public Tracker(BeltTileEntity te) { - attachments = new LinkedList<>(); - this.te = te; - } - - public void findAttachments(BeltTileEntity belt) { - for (AllBeltAttachments ba : AllBeltAttachments.values()) { - World world = belt.getWorld(); - BlockPos beltPos = belt.getPos(); - BlockState beltState = belt.getBlockState(); - List attachmentPositions = - ba.attachment.getPotentialAttachmentPositions(world, beltPos, beltState); - - for (BlockPos potentialPos : attachmentPositions) { - if (!world.isBlockPresent(potentialPos)) - continue; - BlockState state = world.getBlockState(potentialPos); - if (!(state.getBlock() instanceof IBeltAttachment)) - continue; - IBeltAttachment attachment = (IBeltAttachment) state.getBlock(); - if (!attachment.getBeltPositionForAttachment(world, potentialPos, state).equals(beltPos)) - continue; - if (!attachment.isAttachedCorrectly(world, potentialPos, beltPos, state, beltState)) - continue; - - addAttachment(world, potentialPos); - } - } - } - - public BeltAttachmentState addAttachment(IWorld world, BlockPos pos) { - BlockState state = world.getBlockState(pos); - removeAttachment(pos); - if (!(state.getBlock() instanceof IBeltAttachment)) { - Create.logger.warn("Missing belt attachment for Belt at " + pos.toString()); - return null; - } - BeltAttachmentState newAttachmentState = new BeltAttachmentState((IBeltAttachment) state.getBlock(), pos); - attachments.add(newAttachmentState); - te.markDirty(); - return newAttachmentState; - } - - public void removeAttachment(BlockPos pos) { - BeltAttachmentState toRemove = null; - for (BeltAttachmentState atState : attachments) - if (atState.attachmentPos.equals(pos)) - toRemove = atState; - if (toRemove != null) - attachments.remove(toRemove); - te.markDirty(); - } - - public void forEachAttachment(Consumer consumer) { - attachments.forEach(consumer::accept); - } - - public void readAndSearch(CompoundNBT nbt, BeltTileEntity belt) { - attachments.clear(); - if (!nbt.contains("HasAttachments")) { - findAttachments(belt); - return; - } - if (nbt.contains("AttachmentData")) { - ListNBT list = (ListNBT) nbt.get("AttachmentData"); - for (INBT data : list) { - CompoundNBT stateNBT = (CompoundNBT) data; - BlockPos attachmentPos = NBTUtil.readBlockPos(stateNBT.getCompound("Position")); - BeltAttachmentState atState = addAttachment(belt.getWorld(), attachmentPos); - if (atState == null) - continue; - atState.processingDuration = stateNBT.getInt("Duration"); - } - } - } - - public void write(CompoundNBT nbt) { - if (!attachments.isEmpty()) { - nbt.putBoolean("HasAttachments", true); - ListNBT list = new ListNBT(); - forEachAttachment(atState -> { - CompoundNBT stateNBT = new CompoundNBT(); - stateNBT.put("Position", NBTUtil.writeBlockPos(atState.attachmentPos)); - stateNBT.putInt("Duration", atState.processingDuration); - list.add(stateNBT); - }); - nbt.put("AttachmentData", list); - } - - } - - } - -} 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 a85c22e84..8116171dc 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 @@ -5,12 +5,14 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; +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; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; @@ -18,7 +20,6 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; @@ -47,7 +48,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Hand; -import net.minecraft.util.IStringSerializable; import net.minecraft.util.NonNullList; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; @@ -58,6 +58,7 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraft.world.WorldType; @@ -70,14 +71,14 @@ import net.minecraftforge.items.IItemHandler; public class BeltBlock extends HorizontalKineticBlock implements ITE, ISpecialBlockItemRequirement { - public static final IProperty SLOPE = EnumProperty.create("slope", Slope.class); - public static final IProperty PART = EnumProperty.create("part", Part.class); + public static final IProperty SLOPE = EnumProperty.create("slope", BeltSlope.class); + public static final IProperty PART = EnumProperty.create("part", BeltPart.class); public static final BooleanProperty CASING = BooleanProperty.create("casing"); public BeltBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(SLOPE, Slope.HORIZONTAL) - .with(PART, Part.START) + setDefaultState(getDefaultState().with(SLOPE, BeltSlope.HORIZONTAL) + .with(PART, BeltPart.START) .with(CASING, false)); } @@ -99,6 +100,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE getDrops(BlockState state, net.minecraft.world.storage.loot.LootContext.Builder builder) { List drops = super.getDrops(state, builder); - if (state.get(CASING)) - drops.addAll(AllBlocks.BRASS_CASING.getDefaultState() - .getDrops(builder)); TileEntity tileEntity = builder.get(LootParameters.BLOCK_ENTITY); if (tileEntity instanceof BeltTileEntity && ((BeltTileEntity) tileEntity).hasPulley()) drops.addAll(AllBlocks.SHAFT.getDefaultState() @@ -162,7 +162,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { - te.attachmentTracker.findAttachments(te); - }); + public static boolean canTransport(BlockState state) { + if (!AllBlocks.BELT.has(state)) + return false; + BeltSlope slope = state.get(SLOPE); + return slope != BeltSlope.VERTICAL && slope != BeltSlope.SIDEWAYS; } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (player.isSneaking() || !player.isAllowEdit()) return ActionResultType.PASS; ItemStack heldItem = player.getHeldItem(handIn); - boolean isShaft = heldItem.getItem() == AllBlocks.SHAFT.get() - .asItem(); - boolean isCasing = heldItem.getItem() == AllBlocks.BRASS_CASING.get() - .asItem(); + boolean isShaft = AllBlocks.SHAFT.isIn(heldItem); boolean isDye = Tags.Items.DYES.contains(heldItem.getItem()); boolean isHand = heldItem.isEmpty() && handIn == Hand.MAIN_HAND; if (isDye) { - if (worldIn.isRemote) + if (world.isRemote) return ActionResultType.SUCCESS; - withTileEntityDo(worldIn, pos, te -> { + withTileEntityDo(world, pos, te -> { DyeColor dyeColor = DyeColor.getColor(heldItem); if (dyeColor == null) return; @@ -242,7 +238,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { - player.inventory.placeItemBackInInventory(worldIn, transportedItemStack.stack); + .applyToEachWithin(belt.index + .5f, .55f, (transportedItemStack) -> { + player.inventory.placeItemBackInInventory(world, transportedItemStack.stack); return Collections.emptyList(); }); } if (isShaft) { - if (state.get(PART) != Part.MIDDLE) + if (state.get(PART) != BeltPart.MIDDLE) return ActionResultType.PASS; - if (worldIn.isRemote) + if (world.isRemote) return ActionResultType.SUCCESS; if (!player.isCreative()) heldItem.shrink(1); - worldIn.setBlockState(pos, state.with(PART, Part.PULLEY), 2); - belt.attachKinetics(); + KineticTileEntity.switchToBlockState(world, pos, state.with(PART, BeltPart.PULLEY)); return ActionResultType.SUCCESS; } - if (isCasing) { - if (state.get(CASING)) - return ActionResultType.PASS; - if (state.get(SLOPE) == Slope.VERTICAL) - return ActionResultType.PASS; - if (!player.isCreative()) - heldItem.shrink(1); - worldIn.setBlockState(pos, state.with(CASING, true), 2); + if (AllBlocks.BRASS_CASING.isIn(heldItem)) { + if (world.isRemote) + return ActionResultType.SUCCESS; + withTileEntityDo(world, pos, te -> te.setCasingType(CasingType.BRASS)); + return ActionResultType.SUCCESS; + } + + if (AllBlocks.ANDESITE_CASING.isIn(heldItem)) { + if (world.isRemote) + return ActionResultType.SUCCESS; + withTileEntityDo(world, pos, te -> te.setCasingType(CasingType.ANDESITE)); return ActionResultType.SUCCESS; } @@ -289,26 +287,20 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.setCasingType(CasingType.NONE)); return ActionResultType.SUCCESS; } - if (state.get(PART) == Part.PULLEY) { + if (state.get(PART) == BeltPart.PULLEY) { if (world.isRemote) return ActionResultType.SUCCESS; - world.setBlockState(context.getPos(), state.with(PART, Part.MIDDLE), 2); - BeltTileEntity belt = BeltHelper.getSegmentTE(world, context.getPos()); - if (belt != null) { - belt.detachKinetics(); - belt.attachKinetics(); - } - if (!player.isCreative()) + KineticTileEntity.switchToBlockState(world, pos, state.with(PART, BeltPart.MIDDLE)); + if (player != null && !player.isCreative()) player.inventory.placeItemBackInInventory(world, AllBlocks.SHAFT.asStack()); return ActionResultType.SUCCESS; } @@ -409,8 +401,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE getBeltChain(World world, BlockPos controllerPos) { @@ -573,18 +537,18 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE required = new ArrayList<>(); - if (state.get(PART) != Part.MIDDLE) + if (state.get(PART) != BeltPart.MIDDLE) required.add(AllBlocks.SHAFT.asStack()); - if (state.get(CASING)) - required.add(AllBlocks.BRASS_CASING.asStack()); - if (state.get(PART) == Part.START) + if (state.get(PART) == BeltPart.START) required.add(AllItems.BELT_CONNECTOR.asStack()); if (required.isEmpty()) return ItemRequirement.NONE; @@ -638,15 +600,15 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { Boolean casing = state.get(BeltBlock.CASING); - BeltBlock.Part part = state.get(BeltBlock.PART); + BeltPart part = state.get(BeltBlock.PART); Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); - Slope slope = state.get(BeltBlock.SLOPE); - boolean diagonal = slope == Slope.UPWARD || slope == Slope.DOWNWARD; - boolean vertical = slope == Slope.VERTICAL; - boolean pulley = part == Part.PULLEY; + BeltSlope slope = state.get(BeltBlock.SLOPE); + boolean downward = slope == BeltSlope.DOWNWARD; + boolean diagonal = slope == BeltSlope.UPWARD || downward; + boolean vertical = slope == BeltSlope.VERTICAL; + boolean pulley = part == BeltPart.PULLEY; + boolean sideways = slope == BeltSlope.SIDEWAYS; boolean negative = direction.getAxisDirection() == AxisDirection.NEGATIVE; if (!casing && pulley) - part = Part.MIDDLE; + part = BeltPart.MIDDLE; - if ((!casing && vertical && negative || casing && diagonal && negative != (direction.getAxis() == Axis.X)) - && part != Part.MIDDLE && !pulley) - part = part == Part.END ? Part.START : Part.END; + if ((vertical && negative || casing && downward || sideways && negative) && part != BeltPart.MIDDLE && !pulley) + part = part == BeltPart.END ? BeltPart.START : BeltPart.END; if (!casing && vertical) - slope = Slope.HORIZONTAL; + slope = BeltSlope.HORIZONTAL; + if (casing && vertical) + slope = BeltSlope.SIDEWAYS; String path = "block/" + (casing ? "belt_casing/" : "belt/"); String slopeName = slope.getName(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java index 226f2b026..90d18bd81 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.contraptions.relays.belt; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.tileentity.TileEntity; @@ -42,16 +41,16 @@ public class BeltHelper { public static BlockPos getPositionForOffset(BeltTileEntity controller, int offset) { BlockPos pos = controller.getPos(); Vec3i vec = controller.getBeltFacing().getDirectionVec(); - Slope slope = controller.getBlockState().get(BeltBlock.SLOPE); - int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; + BeltSlope slope = controller.getBlockState().get(BeltBlock.SLOPE); + int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, controller.beltLength - 1) * verticality, offset * vec.getZ()); } public static Vec3d getVectorForOffset(BeltTileEntity controller, float offset) { - Slope slope = controller.getBlockState().get(BeltBlock.SLOPE); - int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; + BeltSlope slope = controller.getBlockState().get(BeltBlock.SLOPE); + int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; float verticalMovement = verticality; if (offset < .5) verticalMovement = 0; @@ -60,7 +59,7 @@ public class BeltHelper { Vec3d vec = VecHelper.getCenterOf(controller.getPos()); Vec3d horizontalMovement = new Vec3d(controller.getBeltFacing().getDirectionVec()).scale(offset - .5f); - if (slope == Slope.VERTICAL) + if (slope == BeltSlope.VERTICAL) horizontalMovement = Vec3d.ZERO; vec = vec.add(horizontalMovement).add(0, verticalMovement, 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java new file mode 100644 index 000000000..c4d6a592d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java @@ -0,0 +1,74 @@ +package com.simibubi.create.content.contraptions.relays.belt; + +import static com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity.CASING_PROPERTY; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity.CasingType; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.util.Direction; +import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.data.IModelData; + +public class BeltModel extends BakedModelWrapper { + + public BeltModel(IBakedModel template) { + super(template); + } + + @Override + public List getQuads(BlockState state, Direction side, Random rand, IModelData extraData) { + List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData)); + if (!extraData.hasProperty(CASING_PROPERTY)) + return quads; + CasingType type = extraData.getData(CASING_PROPERTY); + if (type == CasingType.NONE || type == CasingType.BRASS) + return quads; + + SpriteShiftEntry spriteShift = AllSpriteShifts.ANDESIDE_BELT_CASING; + + for (int i = 0; i < quads.size(); i++) { + BakedQuad quad = quads.get(i); + if (spriteShift == null) + continue; + if (quad.getSprite() != spriteShift.getOriginal()) + continue; + + TextureAtlasSprite original = quad.getSprite(); + TextureAtlasSprite target = spriteShift.getTarget(); + BakedQuad newQuad = new BakedQuad(Arrays.copyOf(quad.getVertexData(), quad.getVertexData().length), + quad.getTintIndex(), quad.getFace(), target, quad.shouldApplyDiffuseLighting()); + + VertexFormat format = DefaultVertexFormats.BLOCK; + int[] vertexData = newQuad.getVertexData(); + + for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) { + int uvOffset = 16 / 4; + int uIndex = vertex + uvOffset; + int vIndex = vertex + uvOffset + 1; + float u = Float.intBitsToFloat(vertexData[uIndex]); + float v = Float.intBitsToFloat(vertexData[vIndex]); + vertexData[uIndex] = + Float.floatToRawIntBits(target.getInterpolatedU((SuperByteBuffer.getUnInterpolatedU(original, u)))); + vertexData[vIndex] = + Float.floatToRawIntBits(target.getInterpolatedV((SuperByteBuffer.getUnInterpolatedV(original, v)))); + } + + quads.set(i, newQuad); + } + return quads; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java new file mode 100644 index 000000000..df539fa25 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java @@ -0,0 +1,14 @@ +package com.simibubi.create.content.contraptions.relays.belt; + +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.util.IStringSerializable; + +public enum BeltPart implements IStringSerializable { + START, MIDDLE, END, PULLEY; + + @Override + public String getName() { + return Lang.asId(name()); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index dca55c139..fc42ce225 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -12,7 +12,6 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -41,10 +40,10 @@ public class BeltRenderer extends SafeTileEntityRenderer { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } - + @Override protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) @@ -59,9 +58,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { // UV shift float speed = te.getSpeed(); if (speed != 0) { - float time = - AnimationTickHolder.getRenderTick() * blockState.get(HORIZONTAL_FACING).getAxisDirection().getOffset(); - if (renderedState.get(BeltBlock.HORIZONTAL_FACING).getAxis() == Axis.X) + float time = AnimationTickHolder.getRenderTick() * blockState.get(HORIZONTAL_FACING) + .getAxisDirection() + .getOffset(); + Direction facing = renderedState.get(BeltBlock.HORIZONTAL_FACING); + if (facing.getAxis() == Axis.X && renderedState.get(BeltBlock.SLOPE) != BeltSlope.SIDEWAYS) speed = -speed; int textureIndex = (int) ((speed * time / 36) % 16); if (textureIndex < 0) @@ -71,30 +72,41 @@ public class BeltRenderer extends SafeTileEntityRenderer { } else { beltBuffer.dontShiftUV(); } - + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, te.getPos()); - beltBuffer.light(packedLightmapCoords).renderInto(ms, vb); + beltBuffer.light(packedLightmapCoords) + .renderInto(ms, vb); if (te.hasPulley()) { // TODO 1.15 find a way to cache this model matrix computation MatrixStack modelTransform = new MatrixStack(); - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING); - modelTransform.translate(0.5, 0.5, 0.5); - modelTransform.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (dir.getAxis() == Axis.X ? 0 : Math.PI / 2))); - modelTransform.multiply(Vector3f.POSITIVE_X.getRadialQuaternion((float) (Math.PI / 2))); - modelTransform.translate(-0.5, -0.5, -0.5); - SuperByteBuffer superBuffer = CreateClient.bufferCache.renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) + .rotateY(); + if (blockState.get(BeltBlock.SLOPE) == BeltSlope.SIDEWAYS) + dir = Direction.UP; + MatrixStacker msr = MatrixStacker.of(modelTransform); + + msr.centre(); + if (dir.getAxis() == Axis.X) + msr.rotateY(90); + if (dir.getAxis() == Axis.Y) + msr.rotateX(90); + msr.rotateX(90); + msr.unCentre(); + + SuperByteBuffer superBuffer = CreateClient.bufferCache + .renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light) - .renderInto(ms, vb); + .renderInto(ms, vb); } - + renderItems(te, partialTicks, ms, buffer, light, overlay); } protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { if (!te.isController()) return; if (te.beltLength == 0) @@ -102,16 +114,22 @@ public class BeltRenderer extends SafeTileEntityRenderer { ms.push(); - Vec3i directionVec = te.getBeltFacing().getDirectionVec(); - Vec3d beltStartOffset = new Vec3d(directionVec).scale(-.5).add(.5, 13 / 16f + .125f, .5); + Vec3i directionVec = te.getBeltFacing() + .getDirectionVec(); + Vec3d beltStartOffset = new Vec3d(directionVec).scale(-.5) + .add(.5, 13 / 16f + .125f, .5); ms.translate(beltStartOffset.x, beltStartOffset.y, beltStartOffset.z); - Slope slope = te.getBlockState().get(BeltBlock.SLOPE); - int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; - boolean slopeAlongX = te.getBeltFacing().getAxis() == Axis.X; + BeltSlope slope = te.getBlockState() + .get(BeltBlock.SLOPE); + int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; + boolean slopeAlongX = te.getBeltFacing() + .getAxis() == Axis.X; - for (TransportedItemStack transported : te.getInventory().getItems()) { + for (TransportedItemStack transported : te.getInventory() + .getTransportedItems()) { ms.push(); - MatrixStacker.of(ms).nudge(transported.angle); + MatrixStacker.of(ms) + .nudge(transported.angle); float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); float verticalMovement = verticality; @@ -124,25 +142,31 @@ public class BeltRenderer extends SafeTileEntityRenderer { if (offset < .5) verticalMovement = 0; verticalMovement = verticalMovement * (Math.min(offset, te.beltLength - .5f) - .5f); - Vec3d offsetVec = new Vec3d(directionVec).scale(offset).add(0, verticalMovement, 0); - boolean onSlope = slope != Slope.HORIZONTAL && MathHelper.clamp(offset, .5f, te.beltLength - .5f) == offset; - boolean tiltForward = - (slope == Slope.DOWNWARD ^ te.getBeltFacing().getAxisDirection() == AxisDirection.POSITIVE) == (te - .getBeltFacing().getAxis() == Axis.Z); + Vec3d offsetVec = new Vec3d(directionVec).scale(offset) + .add(0, verticalMovement, 0); + boolean onSlope = slope != BeltSlope.HORIZONTAL && MathHelper.clamp(offset, .5f, te.beltLength - .5f) == offset; + boolean tiltForward = (slope == BeltSlope.DOWNWARD ^ te.getBeltFacing() + .getAxisDirection() == AxisDirection.POSITIVE) == (te.getBeltFacing() + .getAxis() == Axis.Z); float slopeAngle = onSlope ? tiltForward ? -45 : 45 : 0; ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); - boolean alongX = te.getBeltFacing().rotateY().getAxis() == Axis.X; + boolean alongX = te.getBeltFacing() + .rotateY() + .getAxis() == Axis.X; if (!alongX) sideOffset *= -1; ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); - ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); - boolean blockItem = itemRenderer.getItemModelWithOverrides(transported.stack, te.getWorld(), null).isGui3d(); + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + boolean blockItem = itemRenderer.getItemModelWithOverrides(transported.stack, te.getWorld(), null) + .isGui3d(); if (Minecraft.getInstance().gameSettings.fancyGraphics) { - Vec3d shadowPos = new Vec3d(te.getPos()).add(beltStartOffset.scale(1).add(offsetVec) - .add(alongX ? sideOffset : 0, .39, alongX ? 0 : sideOffset)); + Vec3d shadowPos = new Vec3d(te.getPos()).add(beltStartOffset.scale(1) + .add(offsetVec) + .add(alongX ? sideOffset : 0, .39, alongX ? 0 : sideOffset)); ShadowRenderHelper.renderShadow(ms, buffer, shadowPos, .75f, blockItem ? .2f : .2f); } @@ -181,7 +205,8 @@ public class BeltRenderer extends SafeTileEntityRenderer { } protected BlockState getBeltState(KineticTileEntity te) { - return te.getBlockState().with(BeltBlock.CASING, false); + return te.getBlockState() + .with(BeltBlock.CASING, false); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java index b43c3cc10..07658e8da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java @@ -6,8 +6,6 @@ import java.util.HashMap; import java.util.Map; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.foundation.utility.VoxelShaper; import net.minecraft.block.BlockState; @@ -73,6 +71,8 @@ public class BeltShapes { private static final VoxelShape SLOPE_DESC_PART = makeSlopePart(false), SLOPE_ASC_PART = makeSlopePart(true), + SIDEWAYS_FULL_PART = makeSidewaysFull(), + SIDEWAYS_END_PART = makeSidewaysEnding(), FLAT_FULL_PART = makeFlatFull(), FLAT_END_PART = makeFlatEnding(); @@ -84,11 +84,19 @@ public class BeltShapes { VERTICAL_FULL = VerticalBeltShaper.make(FLAT_FULL_PART), VERTICAL_END = VerticalBeltShaper.make(compose(FLAT_END_PART, FLAT_FULL_PART)), VERTICAL_START = VerticalBeltShaper.make(compose(FLAT_FULL_PART, FLAT_END_PART)); + //Flat Shapes private static final VoxelShaper FLAT_FULL = VoxelShaper.forHorizontalAxis(FLAT_FULL_PART, Axis.Z), FLAT_END = VoxelShaper.forHorizontal(compose(FLAT_END_PART, FLAT_FULL_PART), Direction.SOUTH), FLAT_START = VoxelShaper.forHorizontal(compose(FLAT_FULL_PART, FLAT_END_PART), Direction.SOUTH); + + //Sideways Shapes + private static final VoxelShaper + SIDE_FULL = VoxelShaper.forHorizontalAxis(SIDEWAYS_FULL_PART, Axis.Z), + SIDE_END = VoxelShaper.forHorizontal(compose(SIDEWAYS_END_PART, SIDEWAYS_FULL_PART), Direction.SOUTH), + SIDE_START = VoxelShaper.forHorizontal(compose(SIDEWAYS_FULL_PART, SIDEWAYS_END_PART), Direction.SOUTH); + //Sloped Shapes private static final VoxelShaper SLOPE_DESC = VoxelShaper.forHorizontal(SLOPE_DESC_PART, Direction.SOUTH), @@ -129,14 +137,25 @@ public class BeltShapes { private static VoxelShape makeFlatEnding(){ return VoxelShapes.or( - makeCuboidShape(1,4,0,15,12,16), - makeCuboidShape(1,3,1,15,13,15) + makeCuboidShape(1,4,0,15,12,16), + makeCuboidShape(1,3,1,15,13,15) ); } private static VoxelShape makeFlatFull(){ return makeCuboidShape(1,3,0,15,13,16); } + + private static VoxelShape makeSidewaysEnding(){ + return VoxelShapes.or( + makeCuboidShape(4,1,0,12,15,16), + makeCuboidShape(3,1,1,13,15,15) + ); + } + + private static VoxelShape makeSidewaysFull(){ + return makeCuboidShape(3,1,0,13,15,16); + } public static VoxelShape getShape(BlockState state) { if (cache.containsKey(state)) @@ -157,33 +176,41 @@ public class BeltShapes { private static VoxelShape getBeltShape(BlockState state) { Direction facing = state.get(BeltBlock.HORIZONTAL_FACING); Axis axis = facing.getAxis(); - Part part = state.get(BeltBlock.PART); - Slope slope = state.get(BeltBlock.SLOPE); + BeltPart part = state.get(BeltBlock.PART); + BeltSlope slope = state.get(BeltBlock.SLOPE); //vertical - if (slope == Slope.VERTICAL) { - if (part == Part.MIDDLE || part == Part.PULLEY) + if (slope == BeltSlope.VERTICAL) { + if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) return VERTICAL_FULL.get(axis); //vertical ending - return (part == Part.START ? VERTICAL_START : VERTICAL_END).get(facing); + return (part == BeltPart.START ? VERTICAL_START : VERTICAL_END).get(facing); } //flat part - if (slope == Slope.HORIZONTAL) { - if (part == Part.MIDDLE || part == Part.PULLEY) + if (slope == BeltSlope.HORIZONTAL) { + if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) return FLAT_FULL.get(axis); //flat ending - return (part == Part.START ? FLAT_START : FLAT_END).get(facing); + return (part == BeltPart.START ? FLAT_START : FLAT_END).get(facing); + } + + //sideways part + if (slope == BeltSlope.SIDEWAYS) { + if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) + return SIDE_FULL.get(axis); + //flat ending + return (part == BeltPart.START ? SIDE_START : SIDE_END).get(facing); } //slope - if (part == Part.MIDDLE || part == Part.PULLEY) - return (slope == Slope.DOWNWARD ? SLOPE_DESC : SLOPE_ASC).get(facing); + if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) + return (slope == BeltSlope.DOWNWARD ? SLOPE_DESC : SLOPE_ASC).get(facing); //sloped ending - if (part == Part.START) - return (slope == Slope.DOWNWARD ? SLOPE_DESC_START : SLOPE_ASC_START).get(facing); - if (part == Part.END) - return (slope == Slope.DOWNWARD ? SLOPE_DESC_END : SLOPE_ASC_END).get(facing); + if (part == BeltPart.START) + return (slope == BeltSlope.DOWNWARD ? SLOPE_DESC_START : SLOPE_ASC_START).get(facing); + if (part == BeltPart.END) + return (slope == BeltSlope.DOWNWARD ? SLOPE_DESC_END : SLOPE_ASC_END).get(facing); //bad state return VoxelShapes.empty(); @@ -194,23 +221,25 @@ public class BeltShapes { return VoxelShapes.empty(); Direction facing = state.get(BeltBlock.HORIZONTAL_FACING); - Part part = state.get(BeltBlock.PART); - Slope slope = state.get(BeltBlock.SLOPE); + BeltPart part = state.get(BeltBlock.PART); + BeltSlope slope = state.get(BeltBlock.SLOPE); - if (slope == Slope.VERTICAL) + if (slope == BeltSlope.VERTICAL) + return VoxelShapes.empty(); + if (slope == BeltSlope.SIDEWAYS) return VoxelShapes.empty(); - if (slope == Slope.HORIZONTAL) { + if (slope == BeltSlope.HORIZONTAL) { return AllShapes.CASING_11PX.get(Direction.UP); } - if (part == Part.MIDDLE || part == Part.PULLEY) - return PARTIAL_CASING.get(slope == Slope.UPWARD ? facing : facing.getOpposite()); + if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) + return PARTIAL_CASING.get(slope == BeltSlope.UPWARD ? facing : facing.getOpposite()); - if (part == Part.START) - return slope == Slope.UPWARD ? AllShapes.CASING_11PX.get(Direction.UP) : PARTIAL_CASING.get(facing.getOpposite()); - if (part == Part.END) - return slope == Slope.DOWNWARD ? AllShapes.CASING_11PX.get(Direction.UP) : PARTIAL_CASING.get(facing); + if (part == BeltPart.START) + return slope == BeltSlope.UPWARD ? AllShapes.CASING_11PX.get(Direction.UP) : PARTIAL_CASING.get(facing.getOpposite()); + if (part == BeltPart.END) + return slope == BeltSlope.DOWNWARD ? AllShapes.CASING_11PX.get(Direction.UP) : PARTIAL_CASING.get(facing); //something went wrong return VoxelShapes.fullCube(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java new file mode 100644 index 000000000..8f934e10f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java @@ -0,0 +1,14 @@ +package com.simibubi.create.content.contraptions.relays.belt; + +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.util.IStringSerializable; + +public enum BeltSlope implements IStringSerializable { + HORIZONTAL, UPWARD, DOWNWARD, VERTICAL, SIDEWAYS; + + @Override + public String getName() { + return Lang.asId(name()); + } +} \ No newline at end of file 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 6d2bb7392..dc6ae7376 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 @@ -1,10 +1,7 @@ package com.simibubi.create.content.contraptions.relays.belt; -import static com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part.END; -import static com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part.MIDDLE; -import static com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope.DOWNWARD; -import static com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope.HORIZONTAL; -import static com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope.UPWARD; +import static com.simibubi.create.content.contraptions.relays.belt.BeltPart.MIDDLE; +import static com.simibubi.create.content.contraptions.relays.belt.BeltSlope.HORIZONTAL; import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; import static net.minecraft.util.Direction.AxisDirection.POSITIVE; @@ -12,17 +9,22 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.Tracker; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; +import com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnelInteractionHandler; +import com.simibubi.create.content.contraptions.relays.belt.transport.ItemHandlerBeltSegment; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +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.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -37,7 +39,11 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; @@ -46,11 +52,11 @@ import net.minecraftforge.items.IItemHandler; public class BeltTileEntity extends KineticTileEntity { public Map passengers; - public AllBeltAttachments.Tracker attachmentTracker; public int color; public int beltLength; public int index; public Direction lastInsert; + public CasingType casing; protected BlockPos controller; protected BeltInventory inventory; @@ -58,14 +64,27 @@ public class BeltTileEntity extends KineticTileEntity { public CompoundNBT trackerUpdateTag; + public static enum CasingType { + NONE, ANDESITE, BRASS; + } + public BeltTileEntity(TileEntityType type) { super(type); controller = BlockPos.ZERO; - attachmentTracker = new Tracker(this); itemHandler = LazyOptional.empty(); + casing = CasingType.NONE; color = -1; } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours.add(new DirectBeltInputBehaviour(this) + .setInsertionHandler(this::tryInsertingFromSide)); + behaviours.add(new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) + .withStackPlacement(this::getWorldPositionOf)); + } + @Override public void tick() { super.tick(); @@ -75,12 +94,6 @@ public class BeltTileEntity extends KineticTileEntity { BeltBlock.initBelt(world, pos); if (!AllBlocks.BELT.has(world.getBlockState(pos))) return; - - // Initialize Belt Attachments - if (world != null && trackerUpdateTag != null) { - attachmentTracker.readAndSearch(trackerUpdateTag, this); - trackerUpdateTag = null; - } if (getSpeed() == 0) return; @@ -136,7 +149,7 @@ public class BeltTileEntity extends KineticTileEntity { BeltInventory inventory = ((BeltTileEntity) te).getInventory(); if (inventory == null) return; - IItemHandler handler = inventory.createHandlerForSegment(index); + IItemHandler handler = new ItemHandlerBeltSegment(inventory, index); itemHandler = LazyOptional.of(() -> handler); } @@ -163,20 +176,30 @@ public class BeltTileEntity extends KineticTileEntity { @Override public CompoundNBT write(CompoundNBT compound) { - attachmentTracker.write(compound); - 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 (isController()) compound.put("Inventory", getInventory().write()); return super.write(compound); } + @Override + public void readClientUpdate(CompoundNBT tag) { + CasingType casingBefore = casing; + super.readClientUpdate(tag); + if (casingBefore != casing) { + requestModelDataUpdate(); + if (hasWorld()) + world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + } + } + @Override public void read(CompoundNBT compound) { super.read(compound); @@ -195,6 +218,8 @@ public class BeltTileEntity extends KineticTileEntity { if (isController()) getInventory().read(compound.getCompound("Inventory")); + + casing = NBTHelper.readEnum(compound, "Casing", CasingType.class); } @Override @@ -246,7 +271,8 @@ public class BeltTileEntity extends KineticTileEntity { } public float getDirectionAwareBeltMovementSpeed() { - int offset = getBeltFacing().getAxisDirection().getOffset(); + int offset = getBeltFacing().getAxisDirection() + .getOffset(); if (getBeltFacing().getAxis() == Axis.X) offset *= -1; return getBeltMovementSpeed() * offset; @@ -255,7 +281,7 @@ public class BeltTileEntity extends KineticTileEntity { public boolean hasPulley() { if (!AllBlocks.BELT.has(getBlockState())) return false; - return getBlockState().get(BeltBlock.PART) != Part.MIDDLE; + return getBlockState().get(BeltBlock.PART) != BeltPart.MIDDLE; } protected boolean isLastBelt() { @@ -263,16 +289,16 @@ public class BeltTileEntity extends KineticTileEntity { return false; Direction direction = getBeltFacing(); - if (getBlockState().get(BeltBlock.SLOPE) == Slope.VERTICAL) + if (getBlockState().get(BeltBlock.SLOPE) == BeltSlope.VERTICAL) return false; - Part part = getBlockState().get(BeltBlock.PART); + BeltPart part = getBlockState().get(BeltBlock.PART); if (part == MIDDLE) return false; - boolean movingPositively = - (getSpeed() > 0 == (direction.getAxisDirection().getOffset() == 1)) ^ direction.getAxis() == Axis.X; - return part == Part.START ^ movingPositively; + boolean movingPositively = (getSpeed() > 0 == (direction.getAxisDirection() + .getOffset() == 1)) ^ direction.getAxis() == Axis.X; + return part == BeltPart.START ^ movingPositively; } public Vec3i getMovementDirection(boolean firstHalf) { @@ -289,8 +315,8 @@ public class BeltTileEntity extends KineticTileEntity { final BlockState blockState = getBlockState(); final Direction beltFacing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); - final Slope slope = blockState.get(BeltBlock.SLOPE); - final Part part = blockState.get(BeltBlock.PART); + final BeltSlope slope = blockState.get(BeltBlock.SLOPE); + final BeltPart part = blockState.get(BeltBlock.PART); final Axis axis = beltFacing.getAxis(); Direction movementFacing = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis); @@ -299,9 +325,9 @@ public class BeltTileEntity extends KineticTileEntity { movementFacing = movementFacing.getOpposite(); Vec3i movement = movementFacing.getDirectionVec(); - boolean slopeBeforeHalf = (part == END) == (beltFacing.getAxisDirection() == POSITIVE); + boolean slopeBeforeHalf = (part == BeltPart.END) == (beltFacing.getAxisDirection() == POSITIVE); boolean onSlope = notHorizontal && (part == MIDDLE || slopeBeforeHalf == firstHalf || ignoreHalves); - boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? UPWARD : DOWNWARD); + boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.UPWARD : BeltSlope.DOWNWARD); if (!onSlope) return movement; @@ -311,8 +337,8 @@ public class BeltTileEntity extends KineticTileEntity { public Direction getMovementFacing() { Axis axis = getBeltFacing().getAxis(); - return Direction - .getFacingFromAxisDirection(axis, getBeltMovementSpeed() < 0 ^ axis == Axis.X ? NEGATIVE : POSITIVE); + return Direction.getFacingFromAxisDirection(axis, + getBeltMovementSpeed() < 0 ^ axis == Axis.X ? NEGATIVE : POSITIVE); } protected Direction getBeltFacing() { @@ -332,29 +358,84 @@ public class BeltTileEntity extends KineticTileEntity { return inventory; } - public boolean tryInsertingFromSide(Direction side, ItemStack stack, boolean simulate) { - return tryInsertingFromSide(side, new TransportedItemStack(stack), simulate); + private void applyToAllItems(float maxDistanceFromCenter, + Function> processFunction) { + BeltTileEntity controller = getControllerTE(); + if (controller != null) + controller.getInventory() + .applyToEachWithin(index + .5f, maxDistanceFromCenter, processFunction); } - public boolean tryInsertingFromSide(Direction side, TransportedItemStack transportedStack, boolean simulate) { + private Vec3d getWorldPositionOf(TransportedItemStack transported) { + BeltTileEntity controllerTE = getControllerTE(); + if (controllerTE == null) + return Vec3d.ZERO; + return BeltHelper.getVectorForOffset(controllerTE, transported.beltPosition); + } + + public void setCasingType(CasingType type) { + if (casing == type) + return; + casing = type; + boolean shouldBlockHaveCasing = type != CasingType.NONE; + BlockState blockState = getBlockState(); + if (blockState.get(BeltBlock.CASING) != shouldBlockHaveCasing) + KineticTileEntity.switchToBlockState(world, pos, blockState.with(BeltBlock.CASING, shouldBlockHaveCasing)); + markDirty(); + sendData(); + } + + /** + * always target a DirectBeltInsertionBehaviour + */ + @Deprecated + public boolean tryInsertingFromSide(Direction side, ItemStack stack, boolean simulate) { + return tryInsertingFromSide(new TransportedItemStack(stack), side, simulate).isEmpty(); + } + + private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) { BeltTileEntity nextBeltController = getControllerTE(); + ItemStack inserted = transportedStack.stack; + ItemStack empty = ItemStack.EMPTY; + if (nextBeltController == null) - return false; + return inserted; BeltInventory nextInventory = nextBeltController.getInventory(); + + TileEntity teAbove = world.getTileEntity(pos.up()); + if (teAbove instanceof BrassTunnelTileEntity) { + BrassTunnelTileEntity tunnelTE = (BrassTunnelTileEntity) teAbove; + if (tunnelTE.hasDistributionBehaviour()) { + if (!tunnelTE.getStackToDistribute().isEmpty()) + return inserted; + if (!tunnelTE.testFlapFilter(side.getOpposite(), inserted)) + return inserted; + if (!simulate) { + BeltTunnelInteractionHandler.flapTunnel(nextInventory, index, side.getOpposite(), true); + tunnelTE.setStackToDistribute(inserted); + } + return empty; + } + } if (getSpeed() == 0) - return false; - if (!nextInventory.canInsertFrom(index, side)) - return false; + return inserted; + if (getMovementFacing() == side.getOpposite()) + return inserted; + if (!nextInventory.canInsertAtFromSide(index, side)) + return inserted; if (simulate) - return true; + return empty; + transportedStack = transportedStack.copy(); transportedStack.beltPosition = index + .5f - Math.signum(getDirectionAwareBeltMovementSpeed()) / 16f; Direction movementFacing = getMovementFacing(); - if (!side.getAxis().isVertical()) { + if (!side.getAxis() + .isVertical()) { if (movementFacing != side) { - transportedStack.sideOffset = side.getAxisDirection().getOffset() * .35f; + transportedStack.sideOffset = side.getAxisDirection() + .getOffset() * .35f; if (side.getAxis() == Axis.X) transportedStack.sideOffset *= -1; } else @@ -365,11 +446,21 @@ public class BeltTileEntity extends KineticTileEntity { transportedStack.insertedAt = index; transportedStack.insertedFrom = side; transportedStack.prevBeltPosition = transportedStack.beltPosition; + + BeltTunnelInteractionHandler.flapTunnel(nextInventory, index, side.getOpposite(), true); + nextInventory.addItem(transportedStack); nextBeltController.markDirty(); nextBeltController.sendData(); + return empty; + } - return true; + public static ModelProperty CASING_PROPERTY = new ModelProperty<>(); + + @Override + public IModelData getModelData() { + return new ModelDataMap.Builder().withInitial(CASING_PROPERTY, casing) + .build(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java index f6d0428b9..2c9c15812 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java @@ -50,23 +50,27 @@ public class BeltConnectorHandler { BlockPos first = NBTUtil.readBlockPos(tag.getCompound("FirstPulley")); - if (!world.getBlockState(first).has(BlockStateProperties.AXIS)) + if (!world.getBlockState(first) + .has(BlockStateProperties.AXIS)) continue; - Axis axis = world.getBlockState(first).get(BlockStateProperties.AXIS); + Axis axis = world.getBlockState(first) + .get(BlockStateProperties.AXIS); RayTraceResult rayTrace = Minecraft.getInstance().objectMouseOver; if (rayTrace == null || !(rayTrace instanceof BlockRayTraceResult)) { if (r.nextInt(50) == 0) { world.addParticle(new RedstoneParticleData(.3f, .9f, .5f, 1), - first.getX() + .5f + randomOffset(.25f), first.getY() + .5f + randomOffset(.25f), - first.getZ() + .5f + randomOffset(.25f), 0, 0, 0); + first.getX() + .5f + randomOffset(.25f), first.getY() + .5f + randomOffset(.25f), + first.getZ() + .5f + randomOffset(.25f), 0, 0, 0); } return; } BlockPos selected = ((BlockRayTraceResult) rayTrace).getPos(); - if (world.getBlockState(selected).getMaterial().isReplaceable()) + if (world.getBlockState(selected) + .getMaterial() + .isReplaceable()) return; if (!ShaftBlock.isShaft(world.getBlockState(selected))) selected = selected.offset(((BlockRayTraceResult) rayTrace).getFace()); @@ -79,7 +83,8 @@ public class BeltConnectorHandler { Vec3d start = new Vec3d(first); Vec3d end = new Vec3d(selected); Vec3d actualDiff = end.subtract(start); - end = end.subtract(axis.getCoordinate(actualDiff.x, 0, 0), 0, axis.getCoordinate(0, 0, actualDiff.z)); + end = end.subtract(axis.getCoordinate(actualDiff.x, 0, 0), axis.getCoordinate(0, actualDiff.y, 0), + axis.getCoordinate(0, 0, actualDiff.z)); Vec3d diff = end.subtract(start); double x = Math.abs(diff.x); @@ -96,6 +101,8 @@ public class BeltConnectorHandler { for (int k = -1; k <= 1; k++) { if (axis.getCoordinate(i, j, k) != 0) continue; + if (axis == Axis.Y && i != 0 && k != 0) + continue; if (i == 0 && j == 0 && k == 0) continue; validDiffs.add(new Vec3d(i, j, k)); @@ -110,15 +117,17 @@ public class BeltConnectorHandler { } } step = validDiffs.get(closestIndex); - } + if (axis == Axis.Y && step.x != 0 && step.z != 0) + return; + step = new Vec3d(Math.signum(step.x), Math.signum(step.y), Math.signum(step.z)); for (float f = 0; f < length; f += .0625f) { Vec3d position = start.add(step.scale(f)); if (r.nextInt(10) == 0) { world.addParticle(new RedstoneParticleData(canConnect ? .3f : .9f, canConnect ? .9f : .3f, .5f, 1), - position.x + .5f, position.y + .5f, position.z + .5f, 0, 0, 0); + position.x + .5f, position.y + .5f, position.z + .5f, 0, 0, 0); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java index 5ea299429..9f51af84f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java @@ -3,17 +3,20 @@ package com.simibubi.create.content.contraptions.relays.belt.item; import java.util.LinkedList; import java.util.List; +import javax.annotation.Nonnull; + import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -48,12 +51,13 @@ public class BeltConnectorItem extends BlockItem { super.fillItemGroup(p_150895_1_, p_150895_2_); } + @Nonnull @Override public ActionResultType onItemUse(ItemUseContext context) { - if (context.getPlayer() - .isSneaking()) { + PlayerEntity playerEntity = context.getPlayer(); + if (playerEntity != null && playerEntity.isSneaking()) { context.getItem() - .setTag(null); + .setTag(null); return ActionResultType.SUCCESS; } @@ -65,20 +69,20 @@ public class BeltConnectorItem extends BlockItem { return validAxis ? ActionResultType.SUCCESS : ActionResultType.FAIL; CompoundNBT tag = context.getItem() - .getOrCreateTag(); + .getOrCreateTag(); BlockPos firstPulley = null; // Remove first if no longer existant or valid if (tag.contains("FirstPulley")) { firstPulley = NBTUtil.readBlockPos(tag.getCompound("FirstPulley")); - if (!validateAxis(world, firstPulley)) { + if (!validateAxis(world, firstPulley) || !firstPulley.withinDistance(pos, maxLength() * 2)) { tag.remove("FirstPulley"); context.getItem() - .setTag(tag); + .setTag(tag); } } - if (!validAxis) + if (!validAxis || playerEntity == null) return ActionResultType.FAIL; if (tag.contains("FirstPulley")) { @@ -86,56 +90,56 @@ public class BeltConnectorItem extends BlockItem { if (!canConnect(world, firstPulley, pos)) return ActionResultType.FAIL; - if (firstPulley != null && !firstPulley.equals(pos) && !world.isRemote) { + if (firstPulley != null && !firstPulley.equals(pos)) { createBelts(world, firstPulley, pos); - AllTriggers.triggerFor(AllTriggers.CONNECT_BELT, context.getPlayer()); - if (!context.getPlayer() - .isCreative()) + AllTriggers.triggerFor(AllTriggers.CONNECT_BELT, playerEntity); + if (!playerEntity.isCreative()) context.getItem() - .shrink(1); + .shrink(1); } if (!context.getItem() - .isEmpty()) { + .isEmpty()) { context.getItem() - .setTag(null); - context.getPlayer() - .getCooldownTracker() - .setCooldown(this, 5); + .setTag(null); + playerEntity.getCooldownTracker() + .setCooldown(this, 5); } return ActionResultType.SUCCESS; } tag.put("FirstPulley", NBTUtil.writeBlockPos(pos)); context.getItem() - .setTag(tag); - context.getPlayer() - .getCooldownTracker() - .setCooldown(this, 5); + .setTag(tag); + playerEntity.getCooldownTracker() + .setCooldown(this, 5); return ActionResultType.SUCCESS; } public static void createBelts(World world, BlockPos start, BlockPos end) { - BeltBlock.Slope slope = getSlopeBetween(start, end); + BeltSlope slope = getSlopeBetween(start, end); Direction facing = getFacingFromTo(start, end); BlockPos diff = end.subtract(start); if (diff.getX() == diff.getZ()) facing = Direction.getFacingFromAxis(facing.getAxisDirection(), world.getBlockState(start) - .get(BlockStateProperties.AXIS) == Axis.X ? Axis.Z : Axis.X); + .get(BlockStateProperties.AXIS) == Axis.X ? Axis.Z : Axis.X); List beltsToCreate = getBeltChainBetween(start, end, slope, facing); BlockState beltBlock = AllBlocks.BELT.getDefaultState(); for (BlockPos pos : beltsToCreate) { - BeltBlock.Part part = pos.equals(start) ? Part.START : pos.equals(end) ? Part.END : Part.MIDDLE; - boolean pulley = ShaftBlock.isShaft(world.getBlockState(pos)); - if (part == Part.MIDDLE && pulley) - part = Part.PULLEY; + BeltPart part = pos.equals(start) ? BeltPart.START : pos.equals(end) ? BeltPart.END : BeltPart.MIDDLE; + BlockState shaftState = world.getBlockState(pos); + boolean pulley = ShaftBlock.isShaft(shaftState); + if (part == BeltPart.MIDDLE && pulley) + part = BeltPart.PULLEY; + if (pulley && shaftState.get(ShaftBlock.AXIS) == Axis.Y) + slope = BeltSlope.SIDEWAYS; world.setBlockState(pos, beltBlock.with(BeltBlock.SLOPE, slope) - .with(BeltBlock.PART, part) - .with(BeltBlock.HORIZONTAL_FACING, facing), 3); + .with(BeltBlock.PART, part) + .with(BeltBlock.HORIZONTAL_FACING, facing), 3); } } @@ -148,23 +152,23 @@ public class BeltConnectorItem extends BlockItem { axisDirection = diff.getY() > 0 ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; else axisDirection = beltAxis.getCoordinate(diff.getX(), 0, diff.getZ()) > 0 ? AxisDirection.POSITIVE - : AxisDirection.NEGATIVE; + : AxisDirection.NEGATIVE; return Direction.getFacingFromAxis(axisDirection, beltAxis); } - private static Slope getSlopeBetween(BlockPos start, BlockPos end) { + private static BeltSlope getSlopeBetween(BlockPos start, BlockPos end) { BlockPos diff = end.subtract(start); if (diff.getY() != 0) { if (diff.getZ() != 0 || diff.getX() != 0) - return diff.getY() > 0 ? Slope.UPWARD : Slope.DOWNWARD; - return Slope.VERTICAL; + return diff.getY() > 0 ? BeltSlope.UPWARD : BeltSlope.DOWNWARD; + return BeltSlope.VERTICAL; } - return Slope.HORIZONTAL; + return BeltSlope.HORIZONTAL; } - private static List getBeltChainBetween(BlockPos start, BlockPos end, Slope slope, Direction direction) { + private static List getBeltChainBetween(BlockPos start, BlockPos end, BeltSlope slope, Direction direction) { List positions = new LinkedList<>(); int limit = 1000; BlockPos current = start; @@ -172,14 +176,14 @@ public class BeltConnectorItem extends BlockItem { do { positions.add(current); - if (slope == Slope.VERTICAL) { + if (slope == BeltSlope.VERTICAL) { current = current.up(direction.getAxisDirection() == AxisDirection.POSITIVE ? 1 : -1); continue; } current = current.offset(direction); - if (slope != Slope.HORIZONTAL) - current = current.up(slope == Slope.UPWARD ? 1 : -1); + if (slope != BeltSlope.HORIZONTAL) + current = current.up(slope == BeltSlope.UPWARD ? 1 : -1); } while (!current.equals(end) && limit-- > 0); @@ -192,25 +196,27 @@ public class BeltConnectorItem extends BlockItem { return false; if (!world.isAreaLoaded(second, 1)) return false; - if (!second.withinDistance(first, AllConfigs.SERVER.kinetics.maxBeltLength.get())) + if (!second.withinDistance(first, maxLength())) return false; BlockPos diff = second.subtract(first); - Axis axis = world.getBlockState(first) - .get(BlockStateProperties.AXIS); + Axis shaftAxis = world.getBlockState(first) + .get(BlockStateProperties.AXIS); int x = diff.getX(); int y = diff.getY(); int z = diff.getZ(); int sames = ((Math.abs(x) == Math.abs(y)) ? 1 : 0) + ((Math.abs(y) == Math.abs(z)) ? 1 : 0) - + ((Math.abs(z) == Math.abs(x)) ? 1 : 0); + + ((Math.abs(z) == Math.abs(x)) ? 1 : 0); - if (axis.getCoordinate(x, y, z) != 0) + if (shaftAxis.getCoordinate(x, y, z) != 0) return false; if (sames != 1) return false; - if (axis != world.getBlockState(second) - .get(BlockStateProperties.AXIS)) + if (shaftAxis != world.getBlockState(second) + .get(BlockStateProperties.AXIS)) + return false; + if (shaftAxis == Axis.Y && x != 0 && z != 0) return false; TileEntity tileEntity = world.getTileEntity(first); @@ -231,10 +237,10 @@ public class BeltConnectorItem extends BlockItem { for (BlockPos currentPos = first.add(step); !currentPos.equals(second) && limit-- > 0; currentPos = currentPos.add(step)) { BlockState blockState = world.getBlockState(currentPos); - if (ShaftBlock.isShaft(blockState) && blockState.get(ShaftBlock.AXIS) == axis) + if (ShaftBlock.isShaft(blockState) && blockState.get(ShaftBlock.AXIS) == shaftAxis) continue; if (!blockState.getMaterial() - .isReplaceable()) + .isReplaceable()) return false; } @@ -242,14 +248,15 @@ public class BeltConnectorItem extends BlockItem { } + protected static Integer maxLength() { + return AllConfigs.SERVER.kinetics.maxBeltLength.get(); + } + public static boolean validateAxis(World world, BlockPos pos) { if (!world.isAreaLoaded(pos, 1)) return false; if (!ShaftBlock.isShaft(world.getBlockState(pos))) return false; - if (world.getBlockState(pos) - .get(BlockStateProperties.AXIS) == Axis.Y) - return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java new file mode 100644 index 000000000..7a5b372f4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java @@ -0,0 +1,74 @@ +package com.simibubi.create.content.contraptions.relays.belt.transport; + +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +public class BeltFunnelInteractionHandler { + + public static boolean checkForFunnels(BeltInventory beltInventory, TransportedItemStack currentItem, + float nextOffset) { + boolean beltMovementPositive = beltInventory.beltMovementPositive; + int firstUpcomingSegment = (int) (currentItem.beltPosition + (beltMovementPositive ? .5f : -.5f)); + int step = beltMovementPositive ? 1 : -1; + firstUpcomingSegment = MathHelper.clamp(firstUpcomingSegment, 0, beltInventory.belt.beltLength - 1); + + for (int segment = firstUpcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset + : segment + .5f >= nextOffset; segment += step) { + BlockPos funnelPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment) + .up(); + World world = beltInventory.belt.getWorld(); + BlockState funnelState = world.getBlockState(funnelPos); + if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) + continue; + if (funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) != beltInventory.belt.getMovementFacing() + .getOpposite()) + continue; + + currentItem.beltPosition = segment + .5f; + + if (world.isRemote) + return true; + if (funnelState.get(BeltFunnelBlock.PUSHING)) + return true; + if (funnelState.has(BeltFunnelBlock.POWERED) && funnelState.get(BeltFunnelBlock.POWERED)) + return true; + + TileEntity te = world.getTileEntity(funnelPos); + if (!(te instanceof FunnelTileEntity)) + return true; + + FunnelTileEntity funnelTE = (FunnelTileEntity) te; + InsertingBehaviour inserting = TileEntityBehaviour.get(funnelTE, InsertingBehaviour.TYPE); + FilteringBehaviour filtering = TileEntityBehaviour.get(funnelTE, FilteringBehaviour.TYPE); + + if (inserting == null) + return true; + if (filtering != null && !filtering.test(currentItem.stack)) + return true; + + ItemStack before = currentItem.stack.copy(); + ItemStack remainder = inserting.insert(before, false); + if (before.equals(remainder, false)) + return true; + + funnelTE.flap(true); + currentItem.stack = remainder; + beltInventory.belt.sendData(); + return true; + } + + return false; + } + +} 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 d362f6672..2efb20fdf 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 @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.relays.belt.transport; +import static com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnelInteractionHandler.flapTunnel; + import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -8,32 +10,27 @@ import java.util.List; import java.util.function.Function; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; 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.belts.tunnel.BeltTunnelBlock; -import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; -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.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; public class BeltInventory { @@ -52,9 +49,9 @@ public class BeltInventory { public void tick() { // Reverse item collection if belt just reversed - if (beltMovementPositive != movingPositive()) { - beltMovementPositive = movingPositive(); - Collections.reverse(getItems()); + if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) { + beltMovementPositive = !beltMovementPositive; + Collections.reverse(items); belt.markDirty(); belt.sendData(); } @@ -69,23 +66,31 @@ public class BeltInventory { // Assuming the first entry is furthest on the belt TransportedItemStack stackInFront = null; - TransportedItemStack current = null; - Iterator iterator = getItems().iterator(); + TransportedItemStack currentItem = null; + Iterator iterator = items.iterator(); + // Useful stuff float beltSpeed = belt.getDirectionAwareBeltMovementSpeed(); Direction movementFacing = belt.getMovementFacing(); + boolean horizontal = belt.getBlockState() + .get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL; float spacing = 1; - boolean onClient = belt.getWorld().isRemote; + World world = belt.getWorld(); + boolean onClient = world.isRemote; - Items: while (iterator.hasNext()) { - stackInFront = current; - current = iterator.next(); - current.prevBeltPosition = current.beltPosition; - current.prevSideOffset = current.sideOffset; + // resolve ending only when items will reach it this tick + Ending ending = Ending.UNRESOLVED; - if (current.stack.isEmpty()) { + // Loop over items + while (iterator.hasNext()) { + stackInFront = currentItem; + currentItem = iterator.next(); + currentItem.prevBeltPosition = currentItem.beltPosition; + currentItem.prevSideOffset = currentItem.sideOffset; + + if (currentItem.stack.isEmpty()) { iterator.remove(); - current = null; + currentItem = null; continue; } @@ -93,12 +98,12 @@ public class BeltInventory { if (onClient) movement *= ServerSpeedProvider.get(); - // Don't move if locked - if (onClient && current.locked) + // Don't move if held by processing (client) + if (onClient && currentItem.locked) continue; // Don't move if other items are waiting in front - float currentPos = current.beltPosition; + float currentPos = currentItem.beltPosition; if (stackInFront != null) { float diff = stackInFront.beltPosition - currentPos; if (Math.abs(diff) <= spacing) @@ -107,236 +112,201 @@ public class BeltInventory { beltMovementPositive ? Math.min(movement, diff - spacing) : Math.max(movement, diff + spacing); } - // Determine current segment - int segmentBefore = (int) currentPos; - float min = segmentBefore + .5f - (SEGMENT_WINDOW / 2); - float max = segmentBefore + .5f + (SEGMENT_WINDOW / 2); - if (currentPos < min || currentPos > max) - segmentBefore = -1; - // Don't move beyond the edge float diffToEnd = beltMovementPositive ? belt.beltLength - currentPos : -currentPos; + if (Math.abs(diffToEnd) < Math.abs(movement) + 1) { + if (ending == Ending.UNRESOLVED) + ending = resolveEnding(); + diffToEnd += beltMovementPositive ? -ending.margin : ending.margin; + } float limitedMovement = beltMovementPositive ? Math.min(movement, diffToEnd) : Math.max(movement, diffToEnd); - float nextOffset = current.beltPosition + limitedMovement; + float nextOffset = currentItem.beltPosition + limitedMovement; - if (!onClient && segmentBefore != -1) { - // Don't move if belt attachments want to continue processing - if (current.locked) { - BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore); - if (beltSegment != null) { - - // wait in case belt isnt initialized yet - if (current.locked && beltSegment.trackerUpdateTag != null) - continue; - - current.locked = false; - List attachments = beltSegment.attachmentTracker.attachments; - for (BeltAttachmentState attachmentState : attachments) { - if (attachmentState.attachment.processItem(beltSegment, current, attachmentState)) - current.locked = true; - } - if (!current.locked || current.stack.isEmpty()) { - if (!attachments.isEmpty()) - attachments.add(attachments.remove(0)); - belt.sendData(); - } - continue; - } - } - - // See if any new belt processing catches the item - if (current.beltPosition > .5f || beltMovementPositive) { - int firstUpcomingSegment = (int) (current.beltPosition + (beltMovementPositive ? .5f : -.5f)); - for (int segment = firstUpcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset - : segment + .5f >= nextOffset; segment += beltMovementPositive ? 1 : -1) { - BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segment); - if (beltSegment == null) - break; - for (BeltAttachmentState attachmentState : beltSegment.attachmentTracker.attachments) { - ItemStack stackBefore = current.stack.copy(); - if (attachmentState.attachment.startProcessingItem(beltSegment, current, attachmentState)) { - current.beltPosition = segment + .5f + (beltMovementPositive ? 1 / 64f : -1 / 64f); - current.locked = true; - belt.sendData(); - continue Items; - } - if (!stackBefore.equals(current.stack, true)) - belt.sendData(); - } - } + // Belt item processing + if (!onClient && horizontal) { + ItemStack item = currentItem.stack; + if (handleBeltProcessingAndCheckIfRemoved(currentItem, nextOffset)) { + iterator.remove(); + belt.sendData(); + continue; } + if (item != currentItem.stack) + belt.sendData(); + if (currentItem.locked) + continue; } - // Belt tunnels - { - int seg1 = (int) current.beltPosition; - int seg2 = (int) nextOffset; - if (!beltMovementPositive && nextOffset == 0) - seg2 = -1; - if (seg1 != seg2) { - if (stuckAtTunnel(seg2, current.stack, movementFacing)) { - continue; - } - if (!onClient) { - flapTunnel(seg1, movementFacing, false); - flapTunnel(seg2, movementFacing.getOpposite(), true); - } - } - } + // Belt Tunnels + if (BeltTunnelInteractionHandler.flapTunnelsAndCheckIfStuck(this, currentItem, nextOffset)) + continue; + + // Belt Funnels + if (BeltFunnelInteractionHandler.checkForFunnels(this, currentItem, nextOffset)) + continue; // Apply Movement - current.beltPosition += limitedMovement; - current.sideOffset += (current.getTargetSideOffset() - current.sideOffset) * Math.abs(limitedMovement) * 2f; - currentPos = current.beltPosition; + currentItem.beltPosition += limitedMovement; + currentItem.sideOffset += + (currentItem.getTargetSideOffset() - currentItem.sideOffset) * Math.abs(limitedMovement) * 2f; + currentPos = currentItem.beltPosition; - // Determine segment after movement - int segmentAfter = (int) currentPos; - min = segmentAfter + .5f - (SEGMENT_WINDOW / 2); - max = segmentAfter + .5f + (SEGMENT_WINDOW / 2); - if (currentPos < min || currentPos > max) - segmentAfter = -1; - - // Item changed segments - World world = belt.getWorld(); - if (segmentBefore != segmentAfter) { - for (int segment : new int[] { segmentBefore, segmentAfter }) { - if (segment == -1) - continue; - if (!world.isRemote) - world - .updateComparatorOutputLevel(BeltHelper.getPositionForOffset(belt, segment), - belt.getBlockState().getBlock()); - } - } + // Movement successful + if (limitedMovement == movement || onClient) + continue; // End reached - if (limitedMovement != movement) { - if (world.isRemote) + int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; + BlockPos nextPosition = BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); + + if (ending == Ending.FUNNEL) + continue; + + if (ending == Ending.INSERT) { + DirectBeltInputBehaviour inputBehaviour = + TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); + if (inputBehaviour == null) + continue; + if (!inputBehaviour.canInsertFromSide(movementFacing)) continue; - int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; - BlockPos nextPosition = - BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); - BlockState state = world.getBlockState(nextPosition); - - // next block is a basin or a saw - if (AllBlocks.BASIN.has(state) || AllBlocks.MECHANICAL_SAW.has(state) - || AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(state)) { - TileEntity te = world.getTileEntity(nextPosition); - if (te != null) { - LazyOptional optional = - te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP); - if (optional.isPresent()) { - IItemHandler itemHandler = optional.orElse(null); - ItemStack remainder = - ItemHandlerHelper.insertItemStacked(itemHandler, current.stack.copy(), false); - if (remainder.equals(current.stack, false)) - continue; - - current.stack = remainder; - if (remainder.isEmpty()) { - iterator.remove(); - current = null; - flapTunnel(lastOffset, movementFacing, false); - } - - belt.sendData(); - } - } - continue; - } - - // next block is not a belt - if (!AllBlocks.BELT.has(state) || state.get(BeltBlock.SLOPE) == Slope.VERTICAL) { - if (!Block.hasSolidSide(state, world, nextPosition, movementFacing.getOpposite())) { - eject(current); - iterator.remove(); - current = null; - flapTunnel(lastOffset, movementFacing, false); - belt.sendData(); - } - continue; - } - - // Next block is a belt - TileEntity te = world.getTileEntity(nextPosition); - if (te == null || !(te instanceof BeltTileEntity)) - continue; - BeltTileEntity nextBelt = (BeltTileEntity) te; - Direction nextMovementFacing = nextBelt.getMovementFacing(); - - // next belt goes the opposite way - if (nextMovementFacing == movementFacing.getOpposite()) + ItemStack remainder = inputBehaviour.handleInsertion(currentItem, movementFacing, false); + if (remainder.equals(currentItem.stack, false)) continue; - // Inserting into other belt - if (nextBelt.tryInsertingFromSide(movementFacing, current, false)) { + currentItem.stack = remainder; + if (remainder.isEmpty()) iterator.remove(); - current = null; - flapTunnel(lastOffset, movementFacing, false); - belt.sendData(); - } + flapTunnel(this, lastOffset, movementFacing, false); + belt.sendData(); + continue; } - } + if (ending == Ending.BLOCKED) + continue; + if (ending == Ending.EJECT) { + eject(currentItem); + iterator.remove(); + flapTunnel(this, lastOffset, movementFacing, false); + belt.sendData(); + continue; + } + } } - private boolean stuckAtTunnel(int offset, ItemStack stack, Direction movementDirection) { - BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up(); - if (!AllBlocks.BELT_TUNNEL.has(belt.getWorld().getBlockState(pos))) - return false; - TileEntity te = belt.getWorld().getTileEntity(pos); - if (te == null || !(te instanceof BeltTunnelTileEntity)) - return false; + protected boolean handleBeltProcessingAndCheckIfRemoved(TransportedItemStack currentItem, float nextOffset) { + int currentSegment = (int) currentItem.beltPosition; - Direction flapFacing = movementDirection.getOpposite(); + // Continue processing if held + if (currentItem.locked) { + BeltProcessingBehaviour processingBehaviour = getBeltProcessingAtSegment(currentSegment); + TransportedItemStackHandlerBehaviour stackHandlerBehaviour = + getTransportedItemStackHandlerAtSegment(currentSegment); - BeltTunnelTileEntity tunnel = (BeltTunnelTileEntity) te; - if (!tunnel.flaps.containsKey(flapFacing)) - return false; - if (!tunnel.syncedFlaps.containsKey(flapFacing)) - return false; - ItemStack heldItem = tunnel.syncedFlaps.get(flapFacing); - if (heldItem == null) { - tunnel.syncedFlaps.put(flapFacing, ItemStack.EMPTY); + if (stackHandlerBehaviour == null) + return false; + if (processingBehaviour == null) { + currentItem.locked = false; + belt.sendData(); + return false; + } + + ProcessingResult result = processingBehaviour.handleHeldItem(currentItem, stackHandlerBehaviour); + if (result == ProcessingResult.REMOVE) + return true; + if (result == ProcessingResult.HOLD) + return false; + + currentItem.locked = false; belt.sendData(); return false; } - if (heldItem == ItemStack.EMPTY) { - tunnel.syncedFlaps.put(flapFacing, stack); - return true; + + // See if any new belt processing catches the item + if (currentItem.beltPosition > .5f || beltMovementPositive) { + int firstUpcomingSegment = (int) (currentItem.beltPosition + (beltMovementPositive ? .5f : -.5f)); + int step = beltMovementPositive ? 1 : -1; + + for (int segment = firstUpcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset + : segment + .5f >= nextOffset; segment += step) { + + BeltProcessingBehaviour processingBehaviour = getBeltProcessingAtSegment(segment); + TransportedItemStackHandlerBehaviour stackHandlerBehaviour = + getTransportedItemStackHandlerAtSegment(segment); + + if (processingBehaviour == null) + continue; + if (stackHandlerBehaviour == null) + continue; + if (BeltProcessingBehaviour.isBlocked(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment))) + continue; + + ProcessingResult result = processingBehaviour.handleReceivedItem(currentItem, stackHandlerBehaviour); + if (result == ProcessingResult.REMOVE) + return true; + + if (result == ProcessingResult.HOLD) { + currentItem.beltPosition = segment + .5f + (beltMovementPositive ? 1 / 64f : -1 / 64f); + currentItem.locked = true; + belt.sendData(); + return false; + } + } } - List group = BeltTunnelBlock.getSynchronizedGroup(belt.getWorld(), pos, flapFacing); - for (BeltTunnelTileEntity otherTunnel : group) - if (otherTunnel.syncedFlaps.get(flapFacing) == ItemStack.EMPTY) - return true; - for (BeltTunnelTileEntity otherTunnel : group) - otherTunnel.syncedFlaps.put(flapFacing, null); - - return true; + return false; } - private void flapTunnel(int offset, Direction side, boolean inward) { - if (belt.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL) - return; - BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up(); - if (!AllBlocks.BELT_TUNNEL.has(belt.getWorld().getBlockState(pos))) - return; - TileEntity te = belt.getWorld().getTileEntity(pos); - if (te == null || !(te instanceof BeltTunnelTileEntity)) - return; - ((BeltTunnelTileEntity) te).flap(side, inward ^ side.getAxis() == Axis.Z); + protected BeltProcessingBehaviour getBeltProcessingAtSegment(int segment) { + return TileEntityBehaviour.get(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment) + .up(2), BeltProcessingBehaviour.TYPE); } + protected TransportedItemStackHandlerBehaviour getTransportedItemStackHandlerAtSegment(int segment) { + return TileEntityBehaviour.get(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment), + TransportedItemStackHandlerBehaviour.TYPE); + } + + private enum Ending { + UNRESOLVED(0), EJECT(0), INSERT(.25f), FUNNEL(.5f), BLOCKED(.45f); + + private float margin; + + Ending(float f) { + this.margin = f; + } + } + + private Ending resolveEnding() { + int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; + World world = belt.getWorld(); + BlockPos lastPosition = BeltHelper.getPositionForOffset(belt, lastOffset); + BlockPos nextPosition = BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); + + if (AllBlocks.BRASS_BELT_FUNNEL.has(world.getBlockState(lastPosition.up()))) + return Ending.FUNNEL; + + DirectBeltInputBehaviour inputBehaviour = + TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); + if (inputBehaviour != null) + return Ending.INSERT; + + if (Block.hasSolidSide(world.getBlockState(nextPosition), world, nextPosition, belt.getMovementFacing() + .getOpposite())) + return Ending.BLOCKED; + + return Ending.EJECT; + } + + // + public boolean canInsertAt(int segment) { - return canInsertFrom(segment, Direction.UP); + return canInsertAtFromSide(segment, Direction.UP); } - public boolean canInsertFrom(int segment, Direction side) { + public boolean canInsertAtFromSide(int segment, Direction side) { float segmentPos = segment; if (belt.getMovementFacing() == side.getOpposite()) return false; @@ -345,7 +315,7 @@ public class BeltInventory { else if (!beltMovementPositive) segmentPos += 1f; - for (TransportedItemStack stack : getItems()) + for (TransportedItemStack stack : items) if (isBlocking(segment, side, segmentPos, stack)) return false; for (TransportedItemStack stack : toInsert) @@ -358,7 +328,7 @@ public class BeltInventory { private boolean isBlocking(int segment, Direction side, float segmentPos, TransportedItemStack stack) { float currentPos = stack.beltPosition; if (stack.insertedAt == segment && stack.insertedFrom == side - && (beltMovementPositive ? currentPos <= segmentPos + 1 : currentPos >= segmentPos - 1)) + && (beltMovementPositive ? currentPos <= segmentPos + 1 : currentPos >= segmentPos - 1)) return true; return false; } @@ -368,23 +338,23 @@ public class BeltInventory { } private void insert(TransportedItemStack newStack) { - if (getItems().isEmpty()) - getItems().add(newStack); + if (items.isEmpty()) + items.add(newStack); else { int index = 0; - for (TransportedItemStack stack : getItems()) { + for (TransportedItemStack stack : items) { if (stack.compareTo(newStack) > 0 == beltMovementPositive) break; index++; } - getItems().add(index, newStack); + items.add(index, newStack); } } public TransportedItemStack getStackAtOffset(int offset) { - float min = offset + .5f - (SEGMENT_WINDOW / 2); - float max = offset + .5f + (SEGMENT_WINDOW / 2); - for (TransportedItemStack stack : getItems()) { + float min = offset; + float max = offset + 1; + for (TransportedItemStack stack : items) { if (stack.beltPosition > max) continue; if (stack.beltPosition > min) @@ -394,17 +364,16 @@ public class BeltInventory { } public void read(CompoundNBT nbt) { - getItems().clear(); - nbt - .getList("Items", NBT.TAG_COMPOUND) - .forEach(inbt -> getItems().add(TransportedItemStack.read((CompoundNBT) inbt))); + items.clear(); + nbt.getList("Items", NBT.TAG_COMPOUND) + .forEach(inbt -> items.add(TransportedItemStack.read((CompoundNBT) inbt))); beltMovementPositive = nbt.getBoolean("PositiveOrder"); } public CompoundNBT write() { CompoundNBT nbt = new CompoundNBT(); ListNBT itemsNBT = new ListNBT(); - getItems().forEach(stack -> itemsNBT.add(stack.serializeNBT())); + items.forEach(stack -> itemsNBT.add(stack.serializeNBT())); nbt.put("Items", itemsNBT); nbt.putBoolean("PositiveOrder", beltMovementPositive); return nbt; @@ -414,38 +383,35 @@ public class BeltInventory { ItemStack ejected = stack.stack; Vec3d outPos = BeltHelper.getVectorForOffset(belt, stack.beltPosition); float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f); - Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed).add(0, 1 / 8f, 0); + Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed) + .add(0, 1 / 8f, 0); outPos.add(outMotion.normalize()); ItemEntity entity = new ItemEntity(belt.getWorld(), outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); entity.setMotion(outMotion); entity.setDefaultPickupDelay(); entity.velocityChanged = true; - belt.getWorld().addEntity(entity); + belt.getWorld() + .addEntity(entity); } public void ejectAll() { - getItems().forEach(this::eject); - getItems().clear(); + items.forEach(this::eject); + items.clear(); } - private boolean movingPositive() { - return belt.getDirectionAwareBeltMovementSpeed() > 0; - } - - public IItemHandler createHandlerForSegment(int segment) { - return new ItemHandlerBeltSegment(this, segment); - } - - public void forEachWithin(float position, float distance, - Function> callback) { + public void applyToEachWithin(float position, float maxDistanceToPosition, + Function> processFunction) { List toBeAdded = new ArrayList<>(); boolean dirty = false; - for (Iterator iterator = getItems().iterator(); iterator.hasNext();) { + for (Iterator iterator = items.iterator(); iterator.hasNext();) { TransportedItemStack transportedItemStack = iterator.next(); - if (Math.abs(position - transportedItemStack.beltPosition) < distance) { - List apply = callback.apply(transportedItemStack); + ItemStack stackBefore = transportedItemStack.stack.copy(); + if (Math.abs(position - transportedItemStack.beltPosition) < maxDistanceToPosition) { + List apply = processFunction.apply(transportedItemStack); if (apply == null) continue; + if (apply.size() == 1 && apply.get(0).stack.equals(stackBefore, false)) + continue; dirty = true; toBeAdded.addAll(apply); iterator.remove(); @@ -458,7 +424,7 @@ public class BeltInventory { } } - public List getItems() { + public List getTransportedItems() { return items; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java index e93ab65b9..cbea2b1dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java @@ -8,11 +8,10 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -85,7 +84,7 @@ public class BeltMovementHandler { } // Too slow - boolean notHorizontal = beltTe.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL; + boolean notHorizontal = beltTe.getBlockState().get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL; if (Math.abs(beltTe.getSpeed()) < 1) return; @@ -99,18 +98,8 @@ public class BeltMovementHandler { ((LivingEntity) entityIn).addPotionEffect(new EffectInstance(Effects.SLOWNESS, 10, 1, false, false)); } - BeltTileEntity belt = (BeltTileEntity) te; - - // Attachment pauses movement - for (BeltAttachmentState state : belt.attachmentTracker.attachments) { - if (state.attachment.processEntity(belt, entityIn, state)) { - info.ticksSinceLastCollision--; - return; - } - } - final Direction beltFacing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); - final Slope slope = blockState.get(BeltBlock.SLOPE); + final BeltSlope slope = blockState.get(BeltBlock.SLOPE); final Axis axis = beltFacing.getAxis(); float movementSpeed = beltTe.getBeltMovementSpeed(); final Direction movementDirection = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis); @@ -123,14 +112,14 @@ public class BeltMovementHandler { if (Math.abs(diffCenter) > 48 / 64f) return; - Part part = blockState.get(BeltBlock.PART); + BeltPart part = blockState.get(BeltBlock.PART); float top = 13 / 16f; - boolean onSlope = notHorizontal && (part == Part.MIDDLE || part == Part.PULLEY - || part == (slope == Slope.UPWARD ? Part.END : Part.START) && entityIn.getY() - pos.getY() < top - || part == (slope == Slope.UPWARD ? Part.START : Part.END) && entityIn.getY() - pos.getY() > top); + boolean onSlope = notHorizontal && (part == BeltPart.MIDDLE || part == BeltPart.PULLEY + || part == (slope == BeltSlope.UPWARD ? BeltPart.END : BeltPart.START) && entityIn.getY() - pos.getY() < top + || part == (slope == BeltSlope.UPWARD ? BeltPart.START : BeltPart.END) && entityIn.getY() - pos.getY() > top); - boolean movingDown = onSlope && slope == (movementFacing == beltFacing ? Slope.DOWNWARD : Slope.UPWARD); - boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? Slope.UPWARD : Slope.DOWNWARD); + boolean movingDown = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.DOWNWARD : BeltSlope.UPWARD); + boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.UPWARD : BeltSlope.DOWNWARD); if (beltFacing.getAxis() == Axis.Z) { boolean b = movingDown; 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 new file mode 100644 index 000000000..b916628dc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java @@ -0,0 +1,107 @@ +package com.simibubi.create.content.contraptions.relays.belt.transport; + +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.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; +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 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; + +public class BeltTunnelInteractionHandler { + + public static boolean flapTunnelsAndCheckIfStuck(BeltInventory beltInventory, TransportedItemStack current, + float nextOffset) { + + int currentSegment = (int) current.beltPosition; + int upcomingSegment = (int) nextOffset; + + 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; + } + 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.getStackToDistribute() + .isEmpty()) + return true; + if (onServer) { + brassTunnel.setStackToDistribute(current.stack); + current.stack = ItemStack.EMPTY; + beltInventory.belt.sendData(); + beltInventory.belt.markDirty(); + } + removed = true; + } + } + + if (onServer) { + flapTunnel(beltInventory, currentSegment, movementFacing, false); + flapTunnel(beltInventory, upcomingSegment, movementFacing.getOpposite(), true); + } + + if (removed) + return true; + } + + return false; + } + + public static boolean stuckAtTunnel(BeltInventory beltInventory, int offset, ItemStack stack, + Direction movementDirection) { + BeltTileEntity belt = beltInventory.belt; + BlockPos pos = BeltHelper.getPositionForOffset(belt, offset) + .up(); + if (!(belt.getWorld() + .getBlockState(pos) + .getBlock() instanceof BrassTunnelBlock)) + return false; + TileEntity te = belt.getWorld() + .getTileEntity(pos); + if (te == null || !(te instanceof BrassTunnelTileEntity)) + return false; + BrassTunnelTileEntity tunnel = (BrassTunnelTileEntity) te; + return !tunnel.canInsert(movementDirection.getOpposite(), stack); + } + + public static void flapTunnel(BeltInventory beltInventory, int offset, Direction side, boolean inward) { + BeltTunnelTileEntity te = getTunnelOnSegement(beltInventory, offset); + if (te == null) + return; + te.flap(side, inward ^ side.getAxis() == Axis.Z); + } + + protected static BeltTunnelTileEntity getTunnelOnSegement(BeltInventory beltInventory, int offset) { + BeltTileEntity belt = beltInventory.belt; + if (belt.getBlockState() + .get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + return null; + BlockPos pos = BeltHelper.getPositionForOffset(belt, offset) + .up(); + if (!(belt.getWorld() + .getBlockState(pos) + .getBlock() instanceof BeltTunnelBlock)) + return null; + TileEntity te = belt.getWorld() + .getTileEntity(pos); + if (te == null || !(te instanceof BeltTunnelTileEntity)) + return null; + return ((BeltTunnelTileEntity) te); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java index 3b5f91c4c..d0d9d5a7b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java @@ -9,6 +9,9 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; public class TransportedItemStack implements Comparable { + + private static Random R = new Random(); + public ItemStack stack; public float beltPosition; public float sideOffset; @@ -25,7 +28,7 @@ public class TransportedItemStack implements Comparable { public TransportedItemStack(ItemStack stack) { this.stack = stack; - angle = new Random().nextInt(360); + angle = R.nextInt(360); sideOffset = prevSideOffset = getTargetSideOffset(); insertedFrom = Direction.UP; } @@ -54,6 +57,7 @@ public class TransportedItemStack implements Comparable { public TransportedItemStack copy() { TransportedItemStack copy = getSimilar(); copy.angle = angle; + copy.sideOffset = sideOffset; return copy; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java index 55d2299e5..e8d7e1310 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java @@ -4,12 +4,14 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.NonNullList; @@ -22,95 +24,96 @@ import net.minecraft.world.World; public class CogWheelBlock extends ShaftBlock { - boolean isLarge; + boolean isLarge; - public static CogWheelBlock small(Properties properties) { - return new CogWheelBlock(false, properties); - } + private CogWheelBlock(boolean large, Properties properties) { + super(properties); + isLarge = large; + } - public static CogWheelBlock large(Properties properties) { - return new CogWheelBlock(true, properties); - } + public static CogWheelBlock small(Properties properties) { + return new CogWheelBlock(false, properties); + } - private CogWheelBlock(boolean large, Properties properties) { - super(properties); - isLarge = large; - } + public static CogWheelBlock large(Properties properties) { + return new CogWheelBlock(true, properties); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS)); - } + public static boolean isSmallCog(BlockState state) { + return AllBlocks.COGWHEEL.has(state); + } - @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - for (Direction facing : Direction.values()) { - if (facing.getAxis() == state.get(AXIS)) - continue; + public static boolean isLargeCog(BlockState state) { + return AllBlocks.LARGE_COGWHEEL.has(state); + } - BlockState blockState = worldIn.getBlockState(pos.offset(facing)); - if (isLargeCog(blockState) || isLarge && isSmallCog(blockState)) - return false; - } - return true; - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS)); + } - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockPos placedOnPos = context.getPos() - .offset(context.getFace() - .getOpposite()); - World world = context.getWorld(); - BlockState placedAgainst = world.getBlockState(placedOnPos); - Block block = placedAgainst.getBlock(); + @Override + public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { + for (Direction facing : Direction.values()) { + if (facing.getAxis() == state.get(AXIS)) + continue; - BlockState stateBelow = world.getBlockState(context.getPos() - .down()); - if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) { - return this.getDefaultState() - .with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X); - } + BlockState blockState = worldIn.getBlockState(pos.offset(facing)); + if (isLargeCog(blockState) || isLarge && isSmallCog(blockState)) + return false; + } + return true; + } - if (!(block instanceof IRotate) - || !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) { - Axis preferredAxis = getPreferredAxis(context); - if (preferredAxis != null) - return this.getDefaultState() - .with(AXIS, preferredAxis); - return this.getDefaultState() - .with(AXIS, context.getFace() - .getAxis()); - } + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + BlockPos placedOnPos = context.getPos() + .offset(context.getFace() + .getOpposite()); + World world = context.getWorld(); + BlockState placedAgainst = world.getBlockState(placedOnPos); + Block block = placedAgainst.getBlock(); - return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst)); - } + BlockState stateBelow = world.getBlockState(context.getPos() + .down()); + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) { + return this.getDefaultState().with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)) + .with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X); + } - @Override - public float getParticleTargetRadius() { - return isLarge ? 1.125f : .65f; - } + if (!(block instanceof IRotate) + || !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) { + Axis preferredAxis = getPreferredAxis(context); + if (preferredAxis != null) + return this.getDefaultState() + .with(AXIS, preferredAxis).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + return this.getDefaultState() + .with(AXIS, context.getFace() + .getAxis()).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } - @Override - public float getParticleInitialRadius() { - return isLarge ? 1f : .75f; - } + return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst)); + } - public static boolean isSmallCog(BlockState state) { - return AllBlocks.COGWHEEL.has(state); - } + @Override + public float getParticleTargetRadius() { + return isLarge ? 1.125f : .65f; + } - public static boolean isLargeCog(BlockState state) { - return AllBlocks.LARGE_COGWHEEL.has(state); - } + @Override + public float getParticleInitialRadius() { + return isLarge ? 1f : .75f; + } - public void fillItemGroup(ItemGroup group, NonNullList items) { - items.add(new ItemStack(this)); - } + public void fillItemGroup(ItemGroup group, NonNullList items) { + items.add(new ItemStack(this)); + } - // IRotate + // IRotate - @Override - public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { - return !isLarge; - } + @Override + public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { + return !isLarge; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 56a291984..e13efbdd8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -4,12 +4,18 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; - +import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; +import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +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.Direction.Axis; @@ -18,63 +24,90 @@ import net.minecraft.util.math.BlockPos; 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; -public class ShaftBlock extends RotatedPillarKineticBlock { +public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLoggable { - public ShaftBlock(Properties properties) { - super(properties); - } - - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.NORMAL; - } + public ShaftBlock(Properties properties) { + super(properties); + setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.ENTITYBLOCK_ANIMATED; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.SIMPLE_KINETIC.create(); - } + public static boolean isShaft(BlockState state) { + return AllBlocks.SHAFT.has(state); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)); - } + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } - @Override - public float getParticleTargetRadius() { - return .25f; - } + @Override + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.ENTITYBLOCK_ANIMATED; + } - @Override - public float getParticleInitialRadius() { - return 0f; - } - - @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { - super.fillItemGroup(group, items); - } - - public static boolean isShaft(BlockState state) { - return AllBlocks.SHAFT.has(state); - } + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.SIMPLE_KINETIC.create(); + } - // IRotate: + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)); + } - @Override - public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); - } + @Override + public float getParticleTargetRadius() { + return .25f; + } - @Override - public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); - } + @Override + public float getParticleInitialRadius() { + return 0f; + } + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) { + super.fillItemGroup(group, items); + } + + // IRotate: + + @Override + public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == state.get(AXIS); + } + + @Override + public Axis getRotationAxis(BlockState state) { + return state.get(AXIS); + } + + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + protected void fillStateContainer(Builder builder) { + builder.add(BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java index e28b40615..46d0891c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java @@ -29,7 +29,8 @@ import net.minecraft.world.IWorldReader; public class EncasedBeltBlock extends RotatedPillarKineticBlock { public static final IProperty PART = EnumProperty.create("part", Part.class); - public static final BooleanProperty CONNECTED_ALONG_FIRST_COORDINATE = DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; + public static final BooleanProperty CONNECTED_ALONG_FIRST_COORDINATE = + DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; public EncasedBeltBlock(Properties properties) { super(properties); @@ -40,12 +41,12 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) { return false; } - + @Override public PushReaction getPushReaction(BlockState state) { return PushReaction.NORMAL; } - + @Override protected void fillStateContainer(Builder builder) { super.fillStateContainer(builder.add(PART, CONNECTED_ALONG_FIRST_COORDINATE)); @@ -53,8 +54,10 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - Axis placedAxis = context.getNearestLookingDirection().getAxis(); - Axis axis = context.getPlayer().isSneaking() ? placedAxis : getPreferredAxis(context); + Axis placedAxis = context.getNearestLookingDirection() + .getAxis(); + Axis axis = context.getPlayer() != null && context.getPlayer() + .isSneaking() ? placedAxis : getPreferredAxis(context); if (axis == null) axis = placedAxis; @@ -64,20 +67,20 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { continue; BlockPos pos = context.getPos(); BlockPos offset = pos.offset(facing); - state = updatePostPlacement(state, facing, context.getWorld().getBlockState(offset), context.getWorld(), - pos, offset); + state = updatePostPlacement(state, facing, context.getWorld() + .getBlockState(offset), context.getWorld(), pos, offset); } return state; } @Override public BlockState updatePostPlacement(BlockState stateIn, Direction face, BlockState neighbour, IWorld worldIn, - BlockPos currentPos, BlockPos facingPos) { + BlockPos currentPos, BlockPos facingPos) { Part part = stateIn.get(PART); Axis axis = stateIn.get(AXIS); boolean connectionAlongFirst = stateIn.get(CONNECTED_ALONG_FIRST_COORDINATE); - Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) - : (axis == Axis.Z ? Axis.Y : Axis.Z); + Axis connectionAxis = + connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z); Axis faceAxis = face.getAxis(); boolean facingAlongFirst = axis == Axis.X ? faceAxis.isVertical() : faceAxis == Axis.X; @@ -99,8 +102,8 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { Part otherPart = neighbour.get(PART); Axis otherAxis = neighbour.get(AXIS); boolean otherConnection = neighbour.get(CONNECTED_ALONG_FIRST_COORDINATE); - Axis otherConnectionAxis = otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) - : (otherAxis == Axis.Z ? Axis.Y : Axis.Z); + Axis otherConnectionAxis = + otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) : (otherAxis == Axis.Z ? Axis.Y : Axis.Z); if (neighbour.get(AXIS) == faceAxis) return stateIn; @@ -117,12 +120,14 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { if ((part == Part.START) != positive) part = Part.MIDDLE; - return stateIn.with(PART, part).with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); + return stateIn.with(PART, part) + .with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); } @Override public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { - Blocks.AIR.getDefaultState().updateNeighbors(context.getWorld(), context.getPos(), 1); + Blocks.AIR.getDefaultState() + .updateNeighbors(context.getWorld(), context.getPos(), 1); Axis axis = newState.get(AXIS); newState = getDefaultState().with(AXIS, axis); for (Direction facing : Direction.values()) { @@ -130,8 +135,9 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { continue; BlockPos pos = context.getPos(); BlockPos offset = pos.offset(facing); - newState = updatePostPlacement(newState, facing, context.getWorld().getBlockState(offset), context.getWorld(), - pos, offset); } + newState = updatePostPlacement(newState, facing, context.getWorld() + .getBlockState(offset), context.getWorld(), pos, offset); + } newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2); return newState; } @@ -150,13 +156,13 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { Part part = state.get(PART); Axis axis = state.get(AXIS); boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE); - Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) - : (axis == Axis.Z ? Axis.Y : Axis.Z); + Axis connectionAxis = + connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z); Axis otherAxis = other.get(AXIS); boolean otherConnection = other.get(CONNECTED_ALONG_FIRST_COORDINATE); - Axis otherConnectionAxis = otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) - : (otherAxis == Axis.Z ? Axis.Y : Axis.Z); + Axis otherConnectionAxis = + otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) : (otherAxis == Axis.Z ? Axis.Y : Axis.Z); if (otherConnectionAxis != connectionAxis) return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java index 56b8ccfe2..ef275df56 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java @@ -36,11 +36,13 @@ public class EncasedShaftBlock extends RotatedPillarKineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - if (context.getPlayer().isSneaking()) + if (context.getPlayer() != null && context.getPlayer() + .isSneaking()) return super.getStateForPlacement(context); Axis preferredAxis = getPreferredAxis(context); - return this.getDefaultState().with(AXIS, - preferredAxis == null ? context.getNearestLookingDirection().getAxis() : preferredAxis); + return this.getDefaultState() + .with(AXIS, preferredAxis == null ? context.getNearestLookingDirection() + .getAxis() : preferredAxis); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java index 13efbdc8d..6b4bb4481 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java @@ -52,7 +52,7 @@ public interface IWrenchable { BlockPos pos = context.getPos(); PlayerEntity player = context.getPlayer(); if (world instanceof ServerWorld) { - if (!player.isCreative()) + if (player != null && !player.isCreative()) Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos), player, context.getItem()) .forEach(itemStack -> { player.inventory.placeItemBackInInventory(world, itemStack); diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java index e71a6d08d..839d6ec74 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java @@ -6,24 +6,28 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemUseContext; import net.minecraft.util.ActionResultType; +import javax.annotation.Nonnull; + public class WrenchItem extends Item { public WrenchItem(Properties properties) { super(properties); } + @Nonnull @Override public ActionResultType onItemUse(ItemUseContext context) { PlayerEntity player = context.getPlayer(); - if (!player.isAllowEdit()) + if (player == null || !player.isAllowEdit()) return super.onItemUse(context); - - BlockState state = context.getWorld().getBlockState(context.getPos()); + + BlockState state = context.getWorld() + .getBlockState(context.getPos()); if (!(state.getBlock() instanceof IWrenchable)) return super.onItemUse(context); IWrenchable actor = (IWrenchable) state.getBlock(); - if (player.isSneaking()) + if (player.isSneaking()) return actor.onSneakWrenched(state, context); return actor.onWrenched(state, context); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java index c43b8dca9..104095a74 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java @@ -21,7 +21,8 @@ public class TreeFertilizerItem extends Item { @Override public ActionResultType onItemUse(ItemUseContext context) { - BlockState state = context.getWorld().getBlockState(context.getPos()); + BlockState state = context.getWorld() + .getBlockState(context.getPos()); Block block = state.getBlock(); if (block instanceof SaplingBlock) { @@ -34,31 +35,46 @@ public class TreeFertilizerItem extends Item { BlockPos saplingPos = context.getPos(); for (BlockPos pos : BlockPos.getAllInBoxMutable(-1, 0, -1, 1, 0, 1)) { - if (context.getWorld().getBlockState(saplingPos.add(pos)).getBlock() == block) + if (context.getWorld() + .getBlockState(saplingPos.add(pos)) + .getBlock() == block) world.setBlockState(pos.up(10), state.with(SaplingBlock.STAGE, 1)); } - ((SaplingBlock) block).grow(world, world.getRandom(), BlockPos.ZERO.up(10), state.with(SaplingBlock.STAGE, 1)); + ((SaplingBlock) block).grow(world, world.getRandom(), BlockPos.ZERO.up(10), + state.with(SaplingBlock.STAGE, 1)); for (BlockPos pos : world.blocksAdded.keySet()) { - BlockPos actualPos = pos.add(saplingPos).down(10); + BlockPos actualPos = pos.add(saplingPos) + .down(10); // Don't replace Bedrock - if (context.getWorld().getBlockState(actualPos).getBlockHardness(context.getWorld(), actualPos) == -1) + if (context.getWorld() + .getBlockState(actualPos) + .getBlockHardness(context.getWorld(), actualPos) == -1) continue; // Don't replace solid blocks with leaves - if (!world.getBlockState(pos).isNormalCube(world, pos) && !context.getWorld().getBlockState(actualPos) - .getCollisionShape(context.getWorld(), actualPos).isEmpty()) + if (!world.getBlockState(pos) + .isNormalCube(world, pos) + && !context.getWorld() + .getBlockState(actualPos) + .getCollisionShape(context.getWorld(), actualPos) + .isEmpty()) continue; - if (world.getBlockState(pos).getBlock() == Blocks.GRASS_BLOCK - || world.getBlockState(pos).getBlock() == Blocks.PODZOL) + if (world.getBlockState(pos) + .getBlock() == Blocks.GRASS_BLOCK + || world.getBlockState(pos) + .getBlock() == Blocks.PODZOL) continue; - context.getWorld().setBlockState(actualPos, world.getBlockState(pos)); + context.getWorld() + .setBlockState(actualPos, world.getBlockState(pos)); } - if (!context.getPlayer().isCreative()) - context.getItem().shrink(1); + if (context.getPlayer() != null && !context.getPlayer() + .isCreative()) + context.getItem() + .shrink(1); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index 40b5fb682..5ee1ba62a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -38,6 +38,8 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; +import javax.annotation.Nonnull; + public class SymmetryWandItem extends Item { public static final String SYMMETRY = "symmetry"; @@ -48,10 +50,13 @@ public class SymmetryWandItem extends Item { .rarity(Rarity.UNCOMMON)); } + @Nonnull @Override public ActionResultType onItemUse(ItemUseContext context) { PlayerEntity player = context.getPlayer(); BlockPos pos = context.getPos(); + if (player == null) + return ActionResultType.PASS; player.getCooldownTracker() .setCooldown(this, 5); ItemStack wand = player.getHeldItem(context.getHand()); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripInteractionPacket.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripInteractionPacket.java index e0f545027..63739b632 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripInteractionPacket.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripInteractionPacket.java @@ -57,6 +57,8 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase { .enqueueWork(() -> { ServerPlayerEntity sender = context.get() .getSender(); + if (sender == null) + return; Entity entityByID = sender.getServerWorld() .getEntityByID(target); if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 18328c84f..952e42022 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -41,6 +41,8 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; +import javax.annotation.Nonnull; + public abstract class ZapperItem extends Item { public ZapperItem(Properties properties) { @@ -80,10 +82,11 @@ public abstract class ZapperItem extends Item { return newStack.getItem() instanceof ZapperItem; } + @Nonnull @Override public ActionResultType onItemUse(ItemUseContext context) { // Shift -> open GUI - if (context.getPlayer() + if (context.getPlayer() != null && context.getPlayer() .isSneaking()) { if (context.getWorld().isRemote) { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { @@ -218,7 +221,7 @@ public abstract class ZapperItem extends Item { public boolean onEntitySwing(ItemStack stack, LivingEntity entity) { return true; } - + @Override public boolean canPlayerBreakBlockWhileHolding(BlockState state, World worldIn, BlockPos pos, PlayerEntity player) { return false; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java index b2d43c796..b06e9864f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java @@ -351,17 +351,16 @@ public class BlockzapperItem extends ZapperItem { .contains(component.name())) stack.getOrCreateTag() .putString(component.name(), ComponentTier.None.name()); - return NBTHelper.readEnum(stack.getTag() - .getString(component.name()), ComponentTier.class); + return NBTHelper.readEnum(stack.getTag(), component.name(), ComponentTier.class); } public static void setTier(Components component, ComponentTier tier, ItemStack stack) { - stack.getOrCreateTag() - .putString(component.name(), NBTHelper.writeEnum(tier)); + NBTHelper.writeEnum(stack.getOrCreateTag(), component.name(), tier); } public static enum ComponentTier { None(TextFormatting.DARK_GRAY), Brass(TextFormatting.GOLD), Chromatic(TextFormatting.LIGHT_PURPLE); + public TextFormatting color; private ComponentTier(TextFormatting color) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java index c3b375f8f..5a2117eb0 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java @@ -53,7 +53,7 @@ public class WorldshaperItem extends ZapperItem { @Override protected boolean canActivateWithoutSelectedBlock(ItemStack stack) { CompoundNBT tag = stack.getOrCreateTag(); - TerrainTools tool = NBTHelper.readEnum(tag.getString("Tool"), TerrainTools.class); + TerrainTools tool = NBTHelper.readEnum(tag, "Tool", TerrainTools.class); return !tool.requiresSelectedBlock(); } @@ -65,11 +65,11 @@ public class WorldshaperItem extends ZapperItem { List affectedPositions = new ArrayList<>(); CompoundNBT tag = stack.getOrCreateTag(); - Brush brush = NBTHelper.readEnum(tag.getString("Brush"), TerrainBrushes.class) + Brush brush = NBTHelper.readEnum(tag, "Brush", TerrainBrushes.class) .get(); BlockPos params = NBTUtil.readBlockPos(tag.getCompound("BrushParams")); - PlacementOptions option = NBTHelper.readEnum(tag.getString("Placement"), PlacementOptions.class); - TerrainTools tool = NBTHelper.readEnum(tag.getString("Tool"), TerrainTools.class); + PlacementOptions option = NBTHelper.readEnum(tag, "Placement", PlacementOptions.class); + TerrainTools tool = NBTHelper.readEnum(tag, "Tool", TerrainTools.class); brush.set(params.getX(), params.getY(), params.getZ()); targetPos = targetPos.add(brush.getOffset(player.getLookVec(), raytrace.getFace(), option)); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java index ca8522bb4..aa1c55b60 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java @@ -69,9 +69,9 @@ public class WorldshaperRenderHandler { return; } - Brush brush = NBTHelper.readEnum(tag.getString("Brush"), TerrainBrushes.class) + Brush brush = NBTHelper.readEnum(tag, "Brush", TerrainBrushes.class) .get(); - PlacementOptions placement = NBTHelper.readEnum(tag.getString("Placement"), PlacementOptions.class); + PlacementOptions placement = NBTHelper.readEnum(tag, "Placement", PlacementOptions.class); BlockPos params = NBTUtil.readBlockPos(tag.getCompound("BrushParams")); brush.set(params.getX(), params.getY(), params.getZ()); renderedShape = brush.getIncludedPositions(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java index 351ee6dfe..f9d6ec474 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java @@ -53,9 +53,12 @@ public class WorldshaperScreen extends ZapperScreen { brushLabel = new Label(i + 58, j + 28, "").withShadow(); brushInput = new SelectionScrollInput(i + 55, j + 25, 78, 14).forOptions(brushOptions) - .titled(Lang.translate("gui.terrainzapper.brush")).writingTo(brushLabel).calling(this::brushChanged); + .titled(Lang.translate("gui.terrainzapper.brush")) + .writingTo(brushLabel) + .calling(this::brushChanged); if (nbt.contains("Brush")) - brushInput.setState(NBTHelper.readEnum(nbt.getString("Brush"), TerrainBrushes.class).ordinal()); + brushInput.setState(NBTHelper.readEnum(nbt, "Brush", TerrainBrushes.class) + .ordinal()); widgets.add(brushLabel); widgets.add(brushInput); @@ -66,11 +69,13 @@ public class WorldshaperScreen extends ZapperScreen { for (int id = 0; id < toolValues.length; id++) { TerrainTools tool = toolValues[id]; toolButtons.add(new IconButton(i + 8 + id * 18, j + 76, tool.icon)); - toolButtons.get(id).setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey)); + toolButtons.get(id) + .setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey)); } if (nbt.contains("Tool")) - toolButtons.get(NBTHelper.readEnum(nbt.getString("Tool"), TerrainTools.class).ordinal()).active = false; + toolButtons.get(NBTHelper.readEnum(nbt, "Tool", TerrainTools.class) + .ordinal()).active = false; widgets.addAll(toolButtons); placementButtons = new Vector<>(3); @@ -78,21 +83,25 @@ public class WorldshaperScreen extends ZapperScreen { for (int id = 0; id < placementValues.length; id++) { PlacementOptions option = placementValues[id]; placementButtons.add(new IconButton(i + 147 + id * 18, j + 76, option.icon)); - placementButtons.get(id).setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey)); + placementButtons.get(id) + .setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey)); } if (nbt.contains("Placement")) - placementButtons - .get(NBTHelper.readEnum(nbt.getString("Placement"), PlacementOptions.class).ordinal()).active = - false; + placementButtons.get(NBTHelper.readEnum(nbt, "Placement", PlacementOptions.class) + .ordinal()).active = false; widgets.addAll(placementButtons); } public void initBrushParams() { if (brushParams != null) { - nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParams.get(0).getState(), - brushParams.get(1).getState(), brushParams.get(2).getState()))); + nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParams.get(0) + .getState(), + brushParams.get(1) + .getState(), + brushParams.get(2) + .getState()))); widgets.removeAll(brushParamLabels); widgets.removeAll(brushParams); @@ -109,10 +118,12 @@ public class WorldshaperScreen extends ZapperScreen { brushParamLabels.add(label); int indexFinal = index; ScrollInput input = new ScrollInput(i + 55 + 18 * index, j + 43, 14, 14) - .withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1).writingTo(label) - .titled(currentBrush.getParamLabel(index)).calling(state -> { - label.x = i + 62 + 18 * indexFinal - font.getStringWidth(label.text) / 2; - }); + .withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1) + .writingTo(label) + .titled(currentBrush.getParamLabel(index)) + .calling(state -> { + label.x = i + 62 + 18 * indexFinal - font.getStringWidth(label.text) / 2; + }); input.setState(params[index]); input.onChanged(); if (index >= currentBrush.amtParams) { @@ -140,7 +151,8 @@ public class WorldshaperScreen extends ZapperScreen { if (placementButton.isHovered()) { placementButtons.forEach(b -> b.active = true); placementButton.active = false; - placementButton.playDownSound(Minecraft.getInstance().getSoundHandler()); + placementButton.playDownSound(Minecraft.getInstance() + .getSoundHandler()); nbt.putString("Placement", PlacementOptions.values()[placementButtons.indexOf(placementButton)].name()); } } @@ -149,7 +161,8 @@ public class WorldshaperScreen extends ZapperScreen { if (toolButton.isHovered()) { toolButtons.forEach(b -> b.active = true); toolButton.active = false; - toolButton.playDownSound(Minecraft.getInstance().getSoundHandler()); + toolButton.playDownSound(Minecraft.getInstance() + .getSoundHandler()); nbt.putString("Tool", TerrainTools.values()[toolButtons.indexOf(toolButton)].name()); } } @@ -173,9 +186,13 @@ public class WorldshaperScreen extends ZapperScreen { @Override protected void writeAdditionalOptions(CompoundNBT nbt) { super.writeAdditionalOptions(nbt); - nbt.putString("Brush", NBTHelper.writeEnum(TerrainBrushes.values()[brushInput.getState()])); - nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParams.get(0).getState(), - brushParams.get(1).getState(), brushParams.get(2).getState()))); + NBTHelper.writeEnum(nbt, "Brush", TerrainBrushes.values()[brushInput.getState()]); + nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParams.get(0) + .getState(), + brushParams.get(1) + .getState(), + brushParams.get(2) + .getState()))); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java index 88739c43a..b2765dd7d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java @@ -8,7 +8,6 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; @@ -61,7 +60,7 @@ public class InWorldProcessing { if (fluidState.getFluid() == Fluids.WATER || fluidState.getFluid() == Fluids.FLOWING_WATER) return Type.SPLASHING; if (blockState.getBlock() == Blocks.FIRE - || (blockState.getBlock() == Blocks.CAMPFIRE && blockState.get(CampfireBlock.LIT))) + || (blockState.getBlock() == Blocks.CAMPFIRE && blockState.get(CampfireBlock.LIT))) return Type.SMOKING; if (blockState.getBlock() == Blocks.LAVA) return Type.BLASTING; @@ -70,8 +69,10 @@ public class InWorldProcessing { } public static boolean canProcess(ItemEntity entity, Type type) { - if (entity.getPersistentData().contains("CreateData")) { - CompoundNBT compound = entity.getPersistentData().getCompound("CreateData"); + if (entity.getPersistentData() + .contains("CreateData")) { + CompoundNBT compound = entity.getPersistentData() + .getCompound("CreateData"); if (compound.contains("Processing")) { CompoundNBT processing = compound.getCompound("Processing"); @@ -100,7 +101,8 @@ public class InWorldProcessing { SmokerTileEntity smoker = new SmokerTileEntity(); smoker.setLocation(world, BlockPos.ZERO); smoker.setInventorySlotContents(0, stack); - Optional recipe = world.getRecipeManager().getRecipe(IRecipeType.SMOKING, smoker, world); + Optional recipe = world.getRecipeManager() + .getRecipe(IRecipeType.SMOKING, smoker, world); return recipe.isPresent(); } @@ -112,8 +114,8 @@ public class InWorldProcessing { public static boolean isWashable(ItemStack stack, World world) { splashingInv.setInventorySlotContents(0, stack); - Optional recipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.SPLASHING.getType(), splashingInv, world); + Optional recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.SPLASHING.getType(), splashingInv, world); return recipe.isPresent(); } @@ -135,15 +137,15 @@ public class InWorldProcessing { } } - public static List applyProcessing(TransportedItemStack transported, BeltTileEntity belt, - Type type) { + public static List applyProcessing(TransportedItemStack transported, + World world, Type type) { if (transported.processedBy != type) { transported.processedBy = type; int timeModifierForStackSize = ((transported.stack.getCount() - 1) / 16) + 1; int processingTime = (int) (AllConfigs.SERVER.kinetics.inWorldProcessingTime.get() * timeModifierForStackSize) + 1; transported.processingTime = processingTime; - if (!canProcess(transported.stack, type, belt.getWorld())) + if (!canProcess(transported.stack, type, world)) transported.processingTime = -1; return null; } @@ -152,15 +154,13 @@ public class InWorldProcessing { if (transported.processingTime-- > 0) return null; - List stacks = process(transported.stack, type, belt.getWorld()); + List stacks = process(transported.stack, type, world); if (stacks == null) return null; - + List transportedStacks = new ArrayList<>(); for (ItemStack additional : stacks) { TransportedItemStack newTransported = transported.getSimilar(); - newTransported.beltPosition -= Math.signum(belt.getDirectionAwareBeltMovementSpeed()) * 1/32f; - newTransported.prevBeltPosition = newTransported.beltPosition; newTransported.stack = additional.copy(); transportedStacks.add(newTransported); } @@ -170,8 +170,8 @@ public class InWorldProcessing { private static List process(ItemStack stack, Type type, World world) { if (type == Type.SPLASHING) { splashingInv.setInventorySlotContents(0, stack); - Optional recipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.SPLASHING.getType(), splashingInv, world); + Optional recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.SPLASHING.getType(), splashingInv, world); if (recipe.isPresent()) return applyRecipeOn(stack, recipe.get()); return null; @@ -181,15 +181,16 @@ public class InWorldProcessing { SmokerTileEntity smoker = new SmokerTileEntity(); smoker.setLocation(world, BlockPos.ZERO); smoker.setInventorySlotContents(0, stack); - Optional smokingRecipe = world.getRecipeManager().getRecipe(IRecipeType.SMOKING, smoker, world); + Optional smokingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.SMOKING, smoker, world); if (type == Type.BLASTING) { // FIXME this does not need to be a TE FurnaceTileEntity furnace = new FurnaceTileEntity(); furnace.setLocation(world, BlockPos.ZERO); furnace.setInventorySlotContents(0, stack); - Optional smeltingRecipe = - world.getRecipeManager().getRecipe(IRecipeType.SMELTING, furnace, world); + Optional smeltingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.SMELTING, furnace, world); if (!smokingRecipe.isPresent()) { if (smeltingRecipe.isPresent()) @@ -199,8 +200,8 @@ public class InWorldProcessing { BlastFurnaceTileEntity blastFurnace = new BlastFurnaceTileEntity(); blastFurnace.setLocation(world, BlockPos.ZERO); blastFurnace.setInventorySlotContents(0, stack); - Optional blastingRecipe = - world.getRecipeManager().getRecipe(IRecipeType.BLASTING, blastFurnace, world); + Optional blastingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.BLASTING, blastFurnace, world); if (blastingRecipe.isPresent()) return applyRecipeOn(stack, blastingRecipe.get()); @@ -228,7 +229,8 @@ public class InWorldProcessing { if (!processing.contains("Type") || Type.valueOf(processing.getString("Type")) != type) { processing.putString("Type", type.name()); - int timeModifierForStackSize = ((entity.getItem().getCount() - 1) / 16) + 1; + int timeModifierForStackSize = ((entity.getItem() + .getCount() - 1) / 16) + 1; int processingTime = (int) (AllConfigs.SERVER.kinetics.inWorldProcessingTime.get() * timeModifierForStackSize) + 1; processing.putInt("Time", processingTime); @@ -269,7 +271,7 @@ public class InWorldProcessing { if (!ItemHandlerHelper.canItemStacksStack(stack, previouslyRolled)) continue; int amount = Math.min(previouslyRolled.getMaxStackSize() - previouslyRolled.getCount(), - stack.getCount()); + stack.getCount()); previouslyRolled.grow(amount); stack.shrink(amount); } @@ -281,7 +283,8 @@ public class InWorldProcessing { } } } else { - ItemStack out = recipe.getRecipeOutput().copy(); + ItemStack out = recipe.getRecipeOutput() + .copy(); stacks = ItemHelper.multipliedOutput(stackIn, out); } @@ -304,10 +307,10 @@ public class InWorldProcessing { case SPLASHING: Vec3d color = ColorHelper.getRGB(0x0055FF); world.addParticle(new RedstoneParticleData((float) color.x, (float) color.y, (float) color.z, 1), - vec.x + (world.rand.nextFloat() - .5f) * .5f, vec.y + .5f, - vec.z + (world.rand.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); + vec.x + (world.rand.nextFloat() - .5f) * .5f, vec.y + .5f, vec.z + (world.rand.nextFloat() - .5f) * .5f, + 0, 1 / 8f, 0); world.addParticle(ParticleTypes.SPIT, vec.x + (world.rand.nextFloat() - .5f) * .5f, vec.y + .5f, - vec.z + (world.rand.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); + vec.z + (world.rand.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); break; default: break; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/BeltAttachableLogisticalBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/BeltAttachableLogisticalBlock.java index 314cf7c67..7f5da2547 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/BeltAttachableLogisticalBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/BeltAttachableLogisticalBlock.java @@ -1,93 +1,25 @@ package com.simibubi.create.content.logistics.block.belts; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorld; import net.minecraft.world.World; -public abstract class BeltAttachableLogisticalBlock extends AttachedLogisticalBlock implements IBeltAttachment { +public abstract class BeltAttachableLogisticalBlock extends AttachedLogisticalBlock { public BeltAttachableLogisticalBlock(Properties properties) { super(properties); } - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - onAttachmentPlaced(worldIn, pos, state); - } - @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - onAttachmentRemoved(worldIn, pos, state); if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); worldIn.removeTileEntity(pos); } } - @Override - public BlockPos getBeltPositionForAttachment(IWorld world, BlockPos pos, BlockState state) { - return pos.offset(getBlockFacing(state)); - } - - @Override - public List getPotentialAttachmentPositions(IWorld world, BlockPos pos, BlockState beltState) { - return Arrays.asList(Direction.values()).stream().filter(d -> d != Direction.UP).map(pos::offset) - .collect(Collectors.toList()); - } - - public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - BlockPos pos = state.attachmentPos; - World world = te.getWorld(); - ItemStack stack = transported.stack; - - FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); - SingleTargetAutoExtractingBehaviour extracting = TileEntityBehaviour.get(world, pos, - SingleTargetAutoExtractingBehaviour.TYPE); - - if (extracting == null) - return false; - if (filtering != null && (!filtering.test(stack) || stack.getCount() < filtering.getAmount())) - return false; - - return true; - } - - public boolean processItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - BlockPos pos = state.attachmentPos; - World world = te.getWorld(); - ItemStack stack = transported.stack; - - SingleTargetAutoExtractingBehaviour extracting = TileEntityBehaviour.get(world, pos, - SingleTargetAutoExtractingBehaviour.TYPE); - - if (extracting == null) - return false; - if (extracting.getShouldPause().get()) - return false; - - FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); - if (filtering != null && (!filtering.test(stack) || stack.getCount() < filtering.getAmount())) - return false; - if (!extracting.getShouldExtract().get()) - return true; - - return !extracting.extractFromInventory(); - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverBlock.java index bbf38ec79..99949c701 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverBlock.java @@ -1,33 +1,21 @@ package com.simibubi.create.content.logistics.block.belts.observer; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; 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.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.PushReaction; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.ItemEntity; 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; @@ -37,18 +25,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; public class BeltObserverBlock extends HorizontalBlock - implements ITE, IBeltAttachment, IWrenchable { + implements ITE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty BELT = BooleanProperty.create("belt"); @@ -94,9 +77,9 @@ public class BeltObserverBlock extends HorizontalBlock if (!AllBlocks.BELT.has(blockState)) return false; - if (blockState.get(BeltBlock.SLOPE) != Slope.HORIZONTAL) + if (blockState.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) return false; - if (blockState.get(BeltBlock.PART) != Part.MIDDLE) + if (blockState.get(BeltBlock.PART) != BeltPart.MIDDLE) return false; if (blockState.get(BeltBlock.HORIZONTAL_FACING).getAxis() == direction.getAxis()) return false; @@ -116,7 +99,7 @@ public class BeltObserverBlock extends HorizontalBlock BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(face)); if (AllBlocks.BELT.has(blockState) && blockState.get(BlockStateProperties.HORIZONTAL_FACING).getAxis() != face.getAxis() - && blockState.get(BeltBlock.SLOPE) == Slope.HORIZONTAL) + && blockState.get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL) if (preferredFacing == null) preferredFacing = face; else { @@ -138,23 +121,6 @@ public class BeltObserverBlock extends HorizontalBlock return state; } - @Override - public List getPotentialAttachmentPositions(IWorld world, BlockPos pos, BlockState beltState) { - Direction side = beltState.get(BeltBlock.HORIZONTAL_FACING).rotateY(); - return Arrays.asList(pos.offset(side), pos.offset(side.getOpposite())); - } - - @Override - public BlockPos getBeltPositionForAttachment(IWorld world, BlockPos pos, BlockState state) { - return pos.offset(state.get(HORIZONTAL_FACING)); - } - - @Override - public boolean isAttachedCorrectly(IWorld world, BlockPos attachmentPos, BlockPos beltPos, - BlockState attachmentState, BlockState beltState) { - return attachmentState.get(BELT); - } - @Override public boolean canProvidePower(BlockState state) { return state.get(POWERED); @@ -172,118 +138,12 @@ public class BeltObserverBlock extends HorizontalBlock @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (newState.getBlock() != this || newState.with(POWERED, false) != state.with(POWERED, false)) - onAttachmentRemoved(worldIn, pos, state); if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); worldIn.removeTileEntity(pos); } } - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - if (oldState.getBlock() != this || oldState.with(POWERED, false) != state.with(POWERED, false)) - onAttachmentPlaced(worldIn, pos, state); - } - - @Override - public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - World world = te.getWorld(); - BlockState blockState = world.getBlockState(state.attachmentPos); - if (blockState.get(MODE) == Mode.DETECT) - return false; - - FilteringBehaviour behaviour = - TileEntityBehaviour.get(te.getWorld(), state.attachmentPos, FilteringBehaviour.TYPE); - if (behaviour != null && !behaviour.test(transported.stack)) - return false; - - world.setBlockState(state.attachmentPos, blockState.with(POWERED, true)); - world.notifyNeighborsOfStateChange(state.attachmentPos, this); - withTileEntityDo(world, state.attachmentPos, BeltObserverTileEntity::resetTurnOffCooldown); - - Mode mode = blockState.get(MODE); - if (mode == Mode.EJECT || mode == Mode.SPLIT) { - ItemStack copy = transported.stack.copy(); - ItemStack toEject = mode == Mode.EJECT ? transported.stack : copy.split(transported.stack.getCount() / 2); - - if (!toEject.isEmpty()) { - if (!eject(world, toEject, state.attachmentPos, blockState.get(HORIZONTAL_FACING))) - return true; - transported.stack = mode == Mode.EJECT ? ItemStack.EMPTY : copy; - } - } - - return false; - } - - @Override - public boolean processItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - World world = te.getWorld(); - BlockState blockState = world.getBlockState(state.attachmentPos); - withTileEntityDo(world, state.attachmentPos, BeltObserverTileEntity::resetTurnOffCooldown); - - Mode mode = blockState.get(MODE); - if (mode == Mode.EJECT || mode == Mode.SPLIT) { - ItemStack copy = transported.stack.copy(); - ItemStack toEject = mode == Mode.EJECT ? transported.stack : copy.split(transported.stack.getCount() / 2); - - if (!eject(world, toEject, state.attachmentPos, blockState.get(HORIZONTAL_FACING))) - return true; - transported.stack = mode == Mode.EJECT ? ItemStack.EMPTY : copy; - } - - return false; - } - - private boolean eject(World world, ItemStack stack, BlockPos observerPos, Direction facing) { - BlockPos potentialBeltPos = observerPos.offset(facing, 2); - TileEntity tileEntity = world.getTileEntity(potentialBeltPos); - if (tileEntity instanceof BeltTileEntity) { - BeltTileEntity belt = (BeltTileEntity) tileEntity; - return belt.tryInsertingFromSide(facing, stack, false); - } - - boolean empty = world.getBlockState(potentialBeltPos).getCollisionShape(world, potentialBeltPos).isEmpty(); - float yOffset = empty ? 0 : .5f; - AxisAlignedBB bb = new AxisAlignedBB(empty ? potentialBeltPos : potentialBeltPos.up()); - if (!world.getEntitiesWithinAABBExcludingEntity(null, bb).isEmpty()) - return false; - - Vec3d motion = new Vec3d(facing.getDirectionVec()).scale(1 / 16f); - Vec3d entityPos = VecHelper.getCenterOf(potentialBeltPos).add(0, yOffset + .25f, 0).subtract(motion); - ItemEntity entity = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, stack); - entity.setMotion(motion); - entity.setPickupDelay(5); - world.playSound(null, observerPos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .125f, .1f); - world.addEntity(entity); - return true; - } - - @Override - public boolean processEntity(BeltTileEntity te, Entity entity, BeltAttachmentState state) { - if (te.getWorld().isRemote) - return false; - if (entity.getPositionVec().distanceTo(VecHelper.getCenterOf(te.getPos())) > .5f) - return false; - - World world = te.getWorld(); - BlockState blockState = world.getBlockState(state.attachmentPos); - if (blockState.get(POWERED)) - return false; - - world.setBlockState(state.attachmentPos, blockState.with(POWERED, true)); - world.notifyNeighborsOfStateChange(state.attachmentPos, this); - withTileEntityDo(te.getWorld(), state.attachmentPos, BeltObserverTileEntity::resetTurnOffCooldown); - return false; - } - - @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { - worldIn.setBlockState(pos, state.with(POWERED, false), 2); - worldIn.notifyNeighborsOfStateChange(pos, this); - } - @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { World world = context.getWorld(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java index f56148779..b423dadfa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java @@ -53,7 +53,7 @@ public class BeltObserverTileEntity extends SmartTileEntity { if (controllerTE == null) return; - controllerTE.getInventory().forEachWithin(beltTE.index + .5f, .45f, stack -> { + controllerTE.getInventory().applyToEachWithin(beltTE.index + .5f, .45f, stack -> { if (filtering.test(stack.stack) && turnOffTicks != 6) { world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true)); world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock()); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java index 4e5b8b9fa..b9690831c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java @@ -1,15 +1,14 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; 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.Lang; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; @@ -66,21 +65,28 @@ public class BeltTunnelBlock extends Block implements ITE, @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.BELT_TUNNEL.create(); + return AllTileEntities.ANDESITE_TUNNEL.create(); } @Override public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { BlockState blockState = worldIn.getBlockState(pos.down()); - if (!AllBlocks.BELT.has(blockState)) - return false; - if (blockState.get(BeltBlock.SLOPE) != Slope.HORIZONTAL) + if (!isValidPositionForPlacement(state, worldIn, pos)) return false; if (!blockState.get(BeltBlock.CASING)) return false; return true; } + public boolean isValidPositionForPlacement(BlockState state, IWorldReader worldIn, BlockPos pos) { + BlockState blockState = worldIn.getBlockState(pos.down()); + if (!AllBlocks.BELT.has(blockState)) + return false; + if (blockState.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + return false; + return true; + } + public static boolean hasWindow(BlockState state) { Shape shape = state.get(SHAPE); return shape == Shape.WINDOW || shape == Shape.HALFSHADE || shape == Shape.FULLSHADE; @@ -95,13 +101,21 @@ public class BeltTunnelBlock extends Block implements ITE, return getTunnelState(context.getWorld(), context.getPos()); } + @Override + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { + if (!(world instanceof WrappedWorld) && !world.isRemote()) + withTileEntityDo(world, pos, BeltTunnelTileEntity::updateTunnelConnections); + } + @Override public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { - if (!(worldIn instanceof WrappedWorld)) - withTileEntityDo(worldIn, currentPos, BeltTunnelTileEntity::initFlaps); + if (facing.getAxis() + .isVertical()) + return state; + if (!(worldIn instanceof WrappedWorld) && !worldIn.isRemote()) + withTileEntityDo(worldIn, currentPos, BeltTunnelTileEntity::updateTunnelConnections); BlockState tunnelState = getTunnelState(worldIn, currentPos); - if (tunnelState.get(HORIZONTAL_AXIS) == state.get(HORIZONTAL_AXIS)) { if (hasWindow(tunnelState) == hasWindow(state)) return state; @@ -110,43 +124,19 @@ public class BeltTunnelBlock extends Block implements ITE, return tunnelState; } - public static void updateTunnel(World world, BlockPos pos) { + public void updateTunnel(IWorld world, BlockPos pos) { BlockState tunnel = world.getBlockState(pos); BlockState newTunnel = getTunnelState(world, pos); if (tunnel != newTunnel) { world.setBlockState(pos, newTunnel, 3); TileEntity te = world.getTileEntity(pos); if (te != null && (te instanceof BeltTunnelTileEntity)) - ((BeltTunnelTileEntity) te).initFlaps(); + ((BeltTunnelTileEntity) te).updateTunnelConnections(); } } - public static List getSynchronizedGroup(World world, BlockPos pos, Direction flapFacing) { - List group = new ArrayList<>(); - Direction searchDirection = flapFacing.rotateY(); - - for (Direction d : Arrays.asList(searchDirection, searchDirection.getOpposite())) { - BlockPos currentPos = pos; - while (true) { - if (!world.isBlockPresent(currentPos)) - break; - TileEntity te = world.getTileEntity(currentPos); - if (te == null || !(te instanceof BeltTunnelTileEntity)) - break; - BeltTunnelTileEntity tunnel = (BeltTunnelTileEntity) te; - if (!tunnel.syncedFlaps.containsKey(flapFacing)) - break; - group.add(tunnel); - currentPos = currentPos.offset(d); - } - } - - return group; - } - - private static BlockState getTunnelState(IBlockReader reader, BlockPos pos) { - BlockState state = AllBlocks.BELT_TUNNEL.getDefaultState(); - + private BlockState getTunnelState(IBlockReader reader, BlockPos pos) { + BlockState state = getDefaultState(); BlockState belt = reader.getBlockState(pos.down()); if (AllBlocks.BELT.has(belt)) state = state.with(HORIZONTAL_AXIS, belt.get(BeltBlock.HORIZONTAL_FACING) @@ -156,14 +146,8 @@ public class BeltTunnelBlock extends Block implements ITE, // T and Cross Direction left = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) .rotateY(); - BlockState leftState = reader.getBlockState(pos.offset(left) - .down()); - boolean onLeft = AllBlocks.BELT.has(leftState) && leftState.get(BeltBlock.HORIZONTAL_FACING) - .getAxis() != axis; - BlockState rightState = reader.getBlockState(pos.offset(left.getOpposite()) - .down()); - boolean onRight = AllBlocks.BELT.has(rightState) && rightState.get(BeltBlock.HORIZONTAL_FACING) - .getAxis() != axis; + boolean onLeft = hasValidOutput(reader, pos.down(), left); + boolean onRight = hasValidOutput(reader, pos.down(), left.getOpposite()); if (onLeft && onRight) state = state.with(SHAPE, Shape.CROSS); @@ -174,24 +158,37 @@ public class BeltTunnelBlock extends Block implements ITE, if (state.get(SHAPE) == Shape.STRAIGHT) { Direction fw = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - if (AllBlocks.BELT_TUNNEL.has(reader.getBlockState(pos.offset(fw))) - && AllBlocks.BELT_TUNNEL.has(reader.getBlockState(pos.offset(fw.getOpposite())))) + BlockState blockState1 = reader.getBlockState(pos.offset(fw)); + BlockState blockState2 = reader.getBlockState(pos.offset(fw.getOpposite())); + boolean funnel1 = blockState1.getBlock() instanceof BeltFunnelBlock + && blockState1.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw.getOpposite(); + boolean funnel2 = blockState2.getBlock() instanceof BeltFunnelBlock + && blockState2.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw; + boolean valid1 = blockState1.getBlock() instanceof BeltTunnelBlock || funnel1; + boolean valid2 = blockState2.getBlock() instanceof BeltTunnelBlock || funnel2; + + if (valid1 && valid2 && !(funnel1 && funnel2)) state = state.with(SHAPE, Shape.WINDOW); } return state; } + private boolean hasValidOutput(IBlockReader world, BlockPos pos, Direction side) { + BlockState blockState = world.getBlockState(pos.offset(side)); + if (AllBlocks.BELT.has(blockState)) + return blockState.get(BeltBlock.HORIZONTAL_FACING).getAxis() == side.getAxis(); + DirectBeltInputBehaviour behaviour = + TileEntityBehaviour.get(world, pos.offset(side), DirectBeltInputBehaviour.TYPE); + return behaviour != null && behaviour.canInsertFromSide(side); + } + @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - - // Toggle sync - if (toggleSync(context.getWorld(), context.getPos(), context.getFace())) - return ActionResultType.SUCCESS; + if (!hasWindow(state)) + return ActionResultType.PASS; // Toggle windows - if (!hasWindow(state)) - return IWrenchable.super.onWrenched(state, context); Shape next = state.get(SHAPE); switch (state.get(SHAPE)) { case FULLSHADE: @@ -212,14 +209,6 @@ public class BeltTunnelBlock extends Block implements ITE, return ActionResultType.SUCCESS; } - private boolean toggleSync(World world, BlockPos pos, Direction face) { - TileEntity te = world.getTileEntity(pos); - if (te == null || !(te instanceof BeltTunnelTileEntity)) - return false; - BeltTunnelTileEntity tunnel = (BeltTunnelTileEntity) te; - return tunnel.toggleSyncForFlap(face); - } - @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java new file mode 100644 index 000000000..c083c15bc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +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.contraptions.relays.belt.BeltTileEntity.CasingType; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.World; + +public class BeltTunnelItem extends BlockItem { + + public BeltTunnelItem(Block p_i48527_1_, Properties p_i48527_2_) { + super(p_i48527_1_, p_i48527_2_); + } + + @Override + protected boolean canPlace(BlockItemUseContext ctx, BlockState state) { + PlayerEntity playerentity = ctx.getPlayer(); + ISelectionContext iselectioncontext = + playerentity == null ? ISelectionContext.dummy() : ISelectionContext.forEntity(playerentity); + World world = ctx.getWorld(); + BlockPos pos = ctx.getPos(); + return (!this.checkPosition() || AllBlocks.ANDESITE_TUNNEL.get() + .isValidPositionForPlacement(state, world, pos)) && world.canPlace(state, pos, iselectioncontext); + } + + @Override + protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, + BlockState state) { + boolean flag = super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, state); + if (!world.isRemote) { + BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos.down()); + if (belt != null && belt.casing == CasingType.NONE) + belt.setCasingType(AllBlocks.ANDESITE_TUNNEL.has(state) ? CasingType.ANDESITE : CasingType.BRASS); + } + return flag; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index d728b837a..8a7b11b11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -3,12 +3,10 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -18,7 +16,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -public class BeltTunnelRenderer extends SafeTileEntityRenderer { +public class BeltTunnelRenderer extends SmartTileEntityRenderer { public BeltTunnelRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -27,8 +25,8 @@ public class BeltTunnelRenderer extends SafeTileEntityRenderer flaps; - public HashMap syncedFlaps; - private LazyOptional cap = LazyOptional.empty(); - private boolean initialize; - - private List> flapsToSend; + protected LazyOptional cap = LazyOptional.empty(); + protected List> flapsToSend; public BeltTunnelTileEntity(TileEntityType type) { super(type); flaps = new HashMap<>(); - syncedFlaps = new HashMap<>(); - initialize = true; flapsToSend = new LinkedList<>(); } - @Override - public LazyOptional getCapability(Capability capability, Direction side) { - - if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - if (!this.cap.isPresent()) { - if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) { - TileEntity teBelow = world.getTileEntity(pos.down()); - if (teBelow != null) { - T capBelow = teBelow.getCapability(capability, Direction.UP).orElse(null); - if (capBelow != null) { - cap = LazyOptional.of(() -> capBelow).cast(); - } - } - } - } - return this.cap.cast(); - } - return super.getCapability(capability, side); - } - @Override public void remove() { super.remove(); @@ -74,38 +53,30 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT @Override public CompoundNBT write(CompoundNBT compound) { - CompoundNBT dyedFlapsNBT = new CompoundNBT(); - syncedFlaps.forEach((direction, pair) -> { - dyedFlapsNBT.putBoolean(direction.name(), true); - }); - compound.put("syncedFlaps", dyedFlapsNBT); + ListNBT flapsNBT = new ListNBT(); + for (Direction direction : flaps.keySet()) + flapsNBT.add(IntNBT.of(direction.getIndex())); + compound.put("Flaps", flapsNBT); return super.write(compound); } @Override public void read(CompoundNBT compound) { - if (compound.contains("syncedFlaps")) { - syncedFlaps.clear(); - CompoundNBT dyedFlapsNBT = compound.getCompound("syncedFlaps"); - for (Direction direction : Direction.values()) { - if (dyedFlapsNBT.contains(direction.name())) - syncedFlaps.put(direction, ItemStack.EMPTY); - } - } - super.read(compound); - } - - public boolean toggleSyncForFlap(Direction face) { - if (!flaps.containsKey(face)) - return false; - if (syncedFlaps.containsKey(face)) - syncedFlaps.remove(face); - else - syncedFlaps.put(face, ItemStack.EMPTY); + Set newFlaps = new HashSet<>(6); + ListNBT flapsNBT = compound.getList("Flaps", NBT.TAG_INT); + for (INBT inbt : flapsNBT) + if (inbt instanceof IntNBT) + newFlaps.add(Direction.byIndex(((IntNBT) inbt).getInt())); - markDirty(); - sendData(); - return true; + for (Direction d : Iterate.directions) + if (!newFlaps.contains(d)) + flaps.remove(d); + else if (!flaps.containsKey(d)) + flaps.put(d, new InterpolatedChasingValue().start(.25f) + .target(0) + .withSpeed(.05f)); + + super.read(compound); } @Override @@ -115,11 +86,12 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT ListNBT flapsNBT = new ListNBT(); for (Pair pair : flapsToSend) { CompoundNBT flap = new CompoundNBT(); - flap.putInt("Flap", pair.getKey().getIndex()); + flap.putInt("Flap", pair.getKey() + .getIndex()); flap.putBoolean("FlapInward", pair.getValue()); flapsNBT.add(flap); } - writeToClient.put("Flaps", flapsNBT); + writeToClient.put("TriggerFlaps", flapsNBT); flapsToSend.clear(); } return writeToClient; @@ -128,33 +100,29 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT @Override public void readClientUpdate(CompoundNBT tag) { super.readClientUpdate(tag); - if (tag.contains("Flaps")) { - ListNBT flapsNBT = tag.getList("Flaps", NBT.TAG_COMPOUND); + if (tag.contains("TriggerFlaps")) { + ListNBT flapsNBT = tag.getList("TriggerFlaps", NBT.TAG_COMPOUND); for (INBT inbt : flapsNBT) { CompoundNBT flap = (CompoundNBT) inbt; Direction side = Direction.byIndex(flap.getInt("Flap")); flap(side, flap.getBoolean("FlapInward")); } - } else - initFlaps(); + } } - public void initFlaps() { - if (!world.isRemote) { - sendData(); - } - - initialize = false; + public void updateTunnelConnections() { flaps.clear(); BlockState tunnelState = getBlockState(); for (Direction direction : Direction.values()) { - if (direction.getAxis().isVertical()) + if (direction.getAxis() + .isVertical()) continue; - if (AllBlocks.BELT_TUNNEL.has(world.getBlockState(pos.offset(direction)))) + 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; + boolean positive = + direction.getAxisDirection() == AxisDirection.POSITIVE ^ direction.getAxis() == Axis.Z; Shape shape = tunnelState.get(BeltTunnelBlock.SHAPE); if (BeltTunnelBlock.isStraight(tunnelState)) continue; @@ -163,24 +131,39 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT if (!positive && shape == Shape.T_RIGHT) continue; } - flaps.put(direction, new InterpolatedChasingValue().target(0).withSpeed(.05f)); + + BlockState funnelState = world.getBlockState(getPos().offset(direction)); + if (funnelState.getBlock() instanceof BeltFunnelBlock) + if (funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) == direction.getOpposite()) + continue; + + flaps.put(direction, new InterpolatedChasingValue().start(.25f) + .target(0) + .withSpeed(.05f)); } + sendData(); } public void flap(Direction side, boolean inward) { if (world.isRemote) { if (flaps.containsKey(side)) - flaps.get(side).set(inward ? -1 : 1); + flaps.get(side) + .set(inward ? -1 : 1); return; } flapsToSend.add(Pair.of(side, inward)); } + @Override + public void initialize() { + super.initialize(); +// updateTunnelConnections(); + } + @Override public void tick() { - if (initialize) - initFlaps(); + super.tick(); if (!world.isRemote) { if (!flapsToSend.isEmpty()) sendData(); @@ -189,4 +172,28 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT flaps.forEach((d, value) -> value.tick()); } + @Override + public void addBehaviours(List behaviours) {} + + @Override + public LazyOptional getCapability(Capability capability, Direction side) { + if (capability != CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return super.getCapability(capability, side); + + if (!this.cap.isPresent()) { + if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) { + TileEntity teBelow = world.getTileEntity(pos.down()); + if (teBelow != null) { + T capBelow = teBelow.getCapability(capability, Direction.UP) + .orElse(null); + if (capBelow != null) { + cap = LazyOptional.of(() -> capBelow) + .cast(); + } + } + } + } + return this.cap.cast(); + } + } 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 new file mode 100644 index 000000000..034f2f73f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlock.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +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.BlockState; +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.IWorld; +import net.minecraft.world.World; + +public class BrassTunnelBlock extends BeltTunnelBlock { + + public BrassTunnelBlock(Properties properties) { + super(properties); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.BRASS_TUNNEL.create(); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, + BlockPos currentPos, BlockPos facingPos) { + return super.updatePostPlacement(state, facing, facingState, worldIn, currentPos, facingPos); + } + + @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() || !p_196243_4_.hasTileEntity())) { + TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); + p_196243_2_.removeTileEntity(p_196243_3_); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java new file mode 100644 index 000000000..34b36e171 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; + +public class BrassTunnelCTBehaviour extends ConnectedTextureBehaviour { + + @Override + public CTSpriteShiftEntry get(BlockState state, Direction direction) { + return direction == Direction.UP ? AllSpriteShifts.BRASS_TUNNEL_TOP : null; + } + + @Override + public boolean connectsTo(BlockState state, BlockState other, ILightReader reader, BlockPos pos, BlockPos otherPos, + Direction face) { + int yDiff = otherPos.getY() - pos.getY(); + int zDiff = otherPos.getZ() - pos.getZ(); + if (yDiff != 0) + return false; + + TileEntity te = reader.getTileEntity(pos); + if (!(te instanceof BrassTunnelTileEntity)) + return false; + BrassTunnelTileEntity tunnelTE = (BrassTunnelTileEntity) te; + boolean leftSide = zDiff > 0; + return tunnelTE.isConnected(leftSide); + } + + @Override + public CTContext buildContext(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + return super.buildContext(reader, pos, state, face); + } + + @Override + protected boolean reverseUVs(BlockState state, Direction face) { + return super.reverseUVs(state, face); + } + + @Override + protected boolean reverseUVsHorizontally(BlockState state, Direction face) { + return super.reverseUVsHorizontally(state, face); + } + + @Override + protected boolean reverseUVsVertically(BlockState state, Direction face) { + return super.reverseUVsVertically(state, face); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java new file mode 100644 index 000000000..874747623 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java @@ -0,0 +1,15 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.util.math.Vec3d; + +public class BrassTunnelFilterSlot extends ValueBoxTransform.Sided { + + @Override + protected Vec3d getSouthLocation() { + return VecHelper.voxelSpace(8, 12, 15.5f); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelItemHandler.java new file mode 100644 index 000000000..b103dd5ae --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelItemHandler.java @@ -0,0 +1,59 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; + +public class BrassTunnelItemHandler implements IItemHandler { + + private BrassTunnelTileEntity te; + + public BrassTunnelItemHandler(BrassTunnelTileEntity te) { + this.te = te; + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return te.stackToDistribute; + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!te.hasDistributionBehaviour()) { + LazyOptional beltCapability = te.getBeltCapability(); + if (!beltCapability.isPresent()) + return stack; + return beltCapability.orElse(null).insertItem(slot, stack, simulate); + } + + if (!te.stackToDistribute.isEmpty()) + return stack; + if (!simulate) + te.setStackToDistribute(stack); + return ItemStack.EMPTY; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + LazyOptional beltCapability = te.getBeltCapability(); + if (!beltCapability.isPresent()) + return ItemStack.EMPTY; + return beltCapability.orElse(null).extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + return te.stackToDistribute.isEmpty() ? 64 : te.stackToDistribute.getMaxStackSize(); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return true; + } + +} 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 new file mode 100644 index 000000000..97b70ce99 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -0,0 +1,467 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + +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.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.filtering.SidedFilteringBehaviour; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +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.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; + +public class BrassTunnelTileEntity extends BeltTunnelTileEntity { + + SidedFilteringBehaviour filtering; + + boolean connectedLeft; + boolean connectedRight; + + ItemStack stackToDistribute; + float distributionProgress; + List> distributionTargets; + int distributionDistanceLeft; + int distributionDistanceRight; + + private LazyOptional beltCapability; + private LazyOptional tunnelCapability; + + public BrassTunnelTileEntity(TileEntityType type) { + super(type); + distributionTargets = new ArrayList<>(); + stackToDistribute = ItemStack.EMPTY; + beltCapability = LazyOptional.empty(); + tunnelCapability = LazyOptional.of(() -> new BrassTunnelItemHandler(this)); + } + + @Override + public void tick() { + super.tick(); + BeltTileEntity beltBelow = BeltHelper.getSegmentTE(world, pos.down()); + + if (beltBelow == null || beltBelow.getSpeed() == 0) + return; + if (stackToDistribute.isEmpty()) + return; + if (world.isRemote) + return; + + if (distributionProgress == -1) { + distributionTargets.clear(); + distributionDistanceLeft = 0; + distributionDistanceRight = 0; + for (Pair pair : gatherValidOutputs()) { + BrassTunnelTileEntity tunnel = pair.getKey(); + Direction output = pair.getValue(); + if (!insertIntoTunnel(tunnel, output, stackToDistribute, true).isEmpty()) + continue; + distributionTargets.add(Pair.of(tunnel.pos, output)); + int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); + if (distance < 0) + distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); + else + distributionDistanceRight = Math.max(distributionDistanceRight, distance); + } + + if (distributionTargets.isEmpty()) + return; + + distributionProgress = 0; + sendData(); + return; + } + + // TODO this is instant for now + if (distributionProgress == 0) { + List> validTargets = new ArrayList<>(); + for (Pair pair : distributionTargets) { + BlockPos tunnelPos = pair.getKey(); + Direction output = pair.getValue(); + TileEntity te = world.getTileEntity(tunnelPos); + if (!(te instanceof BrassTunnelTileEntity)) + continue; + validTargets.add(Pair.of((BrassTunnelTileEntity) te, output)); + } + + if (validTargets.size() == 0) { + distributionProgress = -1; + sendData(); + return; + } + + int stackSizeBefore = stackToDistribute.getCount(); + int stackSizeForOutput = stackSizeBefore / validTargets.size(); + int remainder = stackSizeBefore % validTargets.size(); + + for (Pair pair : validTargets) { + BrassTunnelTileEntity tunnel = pair.getKey(); + Direction side = pair.getValue(); + int stackSize = stackSizeForOutput + (remainder > 0 ? 1 : 0); + ItemStack toOutput = stackToDistribute.copy() + .split(stackSize); + if (!insertIntoTunnel(tunnel, side, toOutput, false).isEmpty()) + continue; + stackToDistribute.shrink(stackSize); + remainder--; + } + + distributionProgress = -1; + markDirty(); + sendData(); + return; + } + + } + + public void setStackToDistribute(ItemStack stack) { + stackToDistribute = stack; + distributionProgress = -1; + sendData(); + markDirty(); + } + + public ItemStack getStackToDistribute() { + return stackToDistribute; + } + + protected ItemStack insertIntoTunnel(BrassTunnelTileEntity tunnel, Direction side, ItemStack stack, + boolean simulate) { + if (stack.isEmpty()) + return stack; + if (!tunnel.testFlapFilter(side, stack)) + return stack; + + BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnel.pos.down()); + if (below == null) + return stack; + BlockPos offset = tunnel.getPos() + .down() + .offset(side); + DirectBeltInputBehaviour sideOutput = TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + if (sideOutput != null) { + ItemStack result = sideOutput.handleInsertion(stack, side, simulate); + if (result.isEmpty() && !simulate) + tunnel.flap(side, true); + return result; + } + + Direction movementFacing = below.getMovementFacing(); + if (side == movementFacing) + if (!Block.hasSolidSide(world.getBlockState(offset), world, offset, side.getOpposite())) { + BeltTileEntity controllerTE = below.getControllerTE(); + if (controllerTE == null) + return stack; + + if (!simulate) { + tunnel.flap(side, true); + ItemStack ejected = stack; + float beltMovementSpeed = below.getDirectionAwareBeltMovementSpeed(); + float movementSpeed = Math.max(Math.abs(beltMovementSpeed), 1 / 8f); + int additionalOffset = beltMovementSpeed > 0 ? 1 : 0; + Vec3d outPos = BeltHelper.getVectorForOffset(controllerTE, below.index + additionalOffset); + Vec3d outMotion = new Vec3d(side.getDirectionVec()).scale(movementSpeed) + .add(0, 1 / 8f, 0); + outPos.add(outMotion.normalize()); + ItemEntity entity = new ItemEntity(world, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); + entity.setMotion(outMotion); + entity.setDefaultPickupDelay(); + entity.velocityChanged = true; + world.addEntity(entity); + } + + return ItemStack.EMPTY; + } + + return stack; + } + + public boolean testFlapFilter(Direction side, ItemStack stack) { + if (filtering == null) + return false; + if (filtering.get(side) == null) { + FilteringBehaviour adjacentFilter = + TileEntityBehaviour.get(world, pos.offset(side), FilteringBehaviour.TYPE); + if (adjacentFilter == null) + return true; + return adjacentFilter.test(stack); + } + return filtering.test(side, stack); + } + + @Override + public void initialize() { + if (filtering == null) { + filtering = createSidedFilter(); + putBehaviour(filtering); + } + super.initialize(); + } + + public boolean canInsert(Direction side, ItemStack stack) { + if (filtering != null && !filtering.test(side, stack)) + return false; + if (!hasDistributionBehaviour()) + return true; + if (!stackToDistribute.isEmpty()) + return false; + return true; + } + + public boolean hasDistributionBehaviour() { + if (flaps.isEmpty()) + return false; + if (connectedLeft || connectedRight) + return true; + BlockState blockState = getBlockState(); + if (!AllBlocks.BRASS_TUNNEL.has(blockState)) + return false; + Axis axis = blockState.get(BrassTunnelBlock.HORIZONTAL_AXIS); + for (Direction direction : flaps.keySet()) + if (direction.getAxis() != axis) + return true; + return false; + } + + private List> gatherValidOutputs() { + List> validOutputs = new ArrayList<>(); + addValidOutputsOf(this, validOutputs); + for (boolean left : Iterate.trueAndFalse) { + BrassTunnelTileEntity adjacent = this; + while (adjacent != null) { + if (!world.isAreaLoaded(adjacent.getPos(), 1)) + return null; + adjacent = adjacent.getAdjacent(left); + if (adjacent != null) + addValidOutputsOf(adjacent, validOutputs); + } + } + return validOutputs; + } + + private void addValidOutputsOf(BrassTunnelTileEntity tunnelTE, + List> validOutputs) { + BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnelTE.pos.down()); + if (below == null) + return; + Direction movementFacing = below.getMovementFacing(); + BlockState blockState = getBlockState(); + if (!AllBlocks.BRASS_TUNNEL.has(blockState)) + return; + + for (Direction direction : Iterate.horizontalDirections) { + if (direction == movementFacing && below.getSpeed() == 0) + continue; + if (tunnelTE.flaps.containsKey(direction) || tunnelTE.hasValidOutputFunnel(direction)) { + BlockPos offset = tunnelTE.pos.down() + .offset(direction); + DirectBeltInputBehaviour inputBehaviour = + TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + if (inputBehaviour == null) { + if (direction == movementFacing) + if (!Block.hasSolidSide(world.getBlockState(offset), world, offset, direction.getOpposite())) + validOutputs.add(Pair.of(tunnelTE, direction)); + continue; + } + if (inputBehaviour.canInsertFromSide(direction)) + validOutputs.add(Pair.of(tunnelTE, direction)); + continue; + } + } + } + + 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.PUSHING); + } + + @Override + public void addBehavioursDeferred(List behaviours) { + super.addBehavioursDeferred(behaviours); + filtering = createSidedFilter(); + behaviours.add(filtering); + } + + protected SidedFilteringBehaviour createSidedFilter() { + return new SidedFilteringBehaviour(this, new BrassTunnelFilterSlot(), this::makeFilter, + this::isValidFaceForFilter); + } + + private FilteringBehaviour makeFilter(Direction side, FilteringBehaviour filter) { + return filter; + } + + private boolean isValidFaceForFilter(Direction side) { + return flaps.containsKey(side); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + compound.putBoolean("ConnectedLeft", connectedLeft); + compound.putBoolean("ConnectedRight", connectedRight); + + compound.put("StackToDistribute", stackToDistribute.serializeNBT()); + compound.putFloat("DistributionProgress", distributionProgress); + compound.putInt("DistanceLeft", distributionDistanceLeft); + compound.putInt("DistanceRight", distributionDistanceRight); + compound.put("Targets", NBTHelper.writeCompoundList(distributionTargets, pair -> { + CompoundNBT nbt = new CompoundNBT(); + nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey())); + nbt.putInt("Face", pair.getValue() + .getIndex()); + return nbt; + })); + + return super.write(compound); + } + + @Override + public void read(CompoundNBT compound) { + connectedLeft = compound.getBoolean("ConnectedLeft"); + connectedRight = compound.getBoolean("ConnectedRight"); + + stackToDistribute = ItemStack.read(compound.getCompound("StackToDistribute")); + distributionProgress = compound.getFloat("DistributionProgress"); + distributionDistanceLeft = compound.getInt("DistanceLeft"); + distributionDistanceRight = compound.getInt("DistanceRight"); + distributionTargets = NBTHelper.readCompoundList(compound.getList("Targets", NBT.TAG_COMPOUND), nbt -> { + BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos")); + Direction face = Direction.byIndex(nbt.getInt("Face")); + return Pair.of(pos, face); + }); + + super.read(compound); + } + + @Override + public void readClientUpdate(CompoundNBT tag) { + boolean wasConnectedLeft = connectedLeft; + boolean wasConnectedRight = connectedRight; + super.readClientUpdate(tag); + if (wasConnectedLeft != connectedLeft || wasConnectedRight != connectedRight) { + requestModelDataUpdate(); + if (hasWorld()) + world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + } + filtering.updateFilterPresence(); + } + + public boolean isConnected(boolean leftSide) { + return leftSide ? connectedLeft : connectedRight; + } + + @Override + public void updateTunnelConnections() { + super.updateTunnelConnections(); + boolean connectivityChanged = false; + boolean nowConnectedLeft = determineIfConnected(true); + boolean nowConnectedRight = determineIfConnected(false); + + if (connectedLeft != nowConnectedLeft) { + connectedLeft = nowConnectedLeft; + connectivityChanged = true; + BrassTunnelTileEntity adjacent = getAdjacent(true); + if (adjacent != null && !world.isRemote) + adjacent.updateTunnelConnections(); + } + if (connectedRight != nowConnectedRight) { + connectedRight = nowConnectedRight; + connectivityChanged = true; + BrassTunnelTileEntity adjacent = getAdjacent(false); + if (adjacent != null && !world.isRemote) + adjacent.updateTunnelConnections(); + } + + if (filtering != null) + filtering.updateFilterPresence(); + if (connectivityChanged) + sendData(); + } + + protected boolean determineIfConnected(boolean leftSide) { + if (flaps.isEmpty()) + return false; + BrassTunnelTileEntity adjacentTunnelTE = getAdjacent(leftSide); + return adjacentTunnelTE != null && !adjacentTunnelTE.flaps.isEmpty(); + } + + @Nullable + protected BrassTunnelTileEntity getAdjacent(boolean leftSide) { + if (!hasWorld()) + return null; + + BlockState blockState = getBlockState(); + if (!AllBlocks.BRASS_TUNNEL.has(blockState)) + return null; + + Axis axis = blockState.get(BrassTunnelBlock.HORIZONTAL_AXIS); + Direction baseDirection = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + Direction direction = leftSide ? baseDirection.rotateYCCW() : baseDirection.rotateY(); + BlockPos adjacentPos = pos.offset(direction); + BlockState adjacentBlockState = world.getBlockState(adjacentPos); + + if (!AllBlocks.BRASS_TUNNEL.has(adjacentBlockState)) + return null; + if (adjacentBlockState.get(BrassTunnelBlock.HORIZONTAL_AXIS) != axis) + return null; + TileEntity adjacentTE = world.getTileEntity(adjacentPos); + if (!(adjacentTE instanceof BrassTunnelTileEntity)) + return null; + return (BrassTunnelTileEntity) adjacentTE; + } + + @Override + public void remove() { + tunnelCapability.invalidate(); + super.remove(); + } + + @Override + public LazyOptional getCapability(Capability capability, Direction side) { + if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return tunnelCapability.cast(); + return super.getCapability(capability, side); + } + + public LazyOptional getBeltCapability() { + if (!beltCapability.isPresent()) { + TileEntity tileEntity = world.getTileEntity(pos.down()); + if (tileEntity != null) + beltCapability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + } + return beltCapability; + } + +} 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 new file mode 100644 index 000000000..e8a978360 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -0,0 +1,253 @@ +package com.simibubi.create.content.logistics.block.chute; + +import java.util.HashMap; +import java.util.Map; + +import com.simibubi.create.AllShapes; +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.belt.DirectBeltInputBehaviour; +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.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; +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.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; + +public class ChuteBlock extends Block implements IWrenchable, ITE { + public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); + public static final DirectionProperty FACING = BlockStateProperties.FACING_EXCEPT_UP; + + public enum Shape implements IStringSerializable { + START(), WINDOW_STRAIGHT(), NORMAL(); + + @Override + public String getName() { + return Lang.asId(name()); + } + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.CHUTE.create(); + } + + public ChuteBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + setDefaultState(getDefaultState().with(SHAPE, Shape.NORMAL) + .with(FACING, Direction.DOWN)); + } + + @Override + public void onLanded(IBlockReader worldIn, Entity entityIn) { + super.onLanded(worldIn, entityIn); + if (!(entityIn instanceof ItemEntity)) + return; + if (entityIn.world.isRemote) + 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) { + Direction facing = state.get(FACING); + BlockPos toUpdate = pos.down(); + if (facing.getAxis() + .isHorizontal()) + toUpdate = toUpdate.offset(facing.getOpposite()); + + 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 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 = + 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 boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + BlockState above = world.getBlockState(pos.up()); + return !(above.getBlock() instanceof ChuteBlock) || above.get(FACING) == Direction.DOWN; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + Direction face = ctx.getFace(); + if (face.getAxis() + .isHorizontal() && !ctx.shouldCancelInteraction()) { + World world = ctx.getWorld(); + BlockPos pos = ctx.getPos(); + return updateDiagonalState(state.with(FACING, face), world.getBlockState(pos.up()), world, pos); + } + return state; + } + + public static BlockState updateDiagonalState(BlockState state, BlockState above, IBlockReader world, BlockPos pos) { + if (!(state.getBlock() instanceof ChuteBlock)) + return state; + + Map connections = new HashMap<>(); + int amtConnections = 0; + Direction facing = state.get(FACING); + + if (facing == Direction.DOWN) + return state; + BlockState target = world.getBlockState(pos.down() + .offset(facing.getOpposite())); + if (!(target.getBlock() instanceof ChuteBlock)) + return state.with(FACING, Direction.DOWN) + .with(SHAPE, Shape.NORMAL); + + for (Direction direction : Iterate.horizontalDirections) { + BlockState diagonalInputChute = world.getBlockState(pos.up() + .offset(direction)); + boolean value = + diagonalInputChute.getBlock() instanceof ChuteBlock && diagonalInputChute.get(FACING) == direction; + connections.put(direction, value); + if (value) + amtConnections++; + } + + if (amtConnections == 0) + return state.with(SHAPE, Shape.START); + if (connections.get(Direction.NORTH) && connections.get(Direction.SOUTH)) + return state.with(SHAPE, Shape.START); + if (connections.get(Direction.EAST) && connections.get(Direction.WEST)) + return state.with(SHAPE, Shape.START); + if (amtConnections == 1 && connections.get(facing) + && !(above.getBlock() instanceof ChuteBlock && above.get(FACING) == Direction.DOWN)) + return state.with(SHAPE, Shape.WINDOW_STRAIGHT); + return state.with(SHAPE, Shape.NORMAL); + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (!context.getWorld().isRemote && state.get(FACING) == Direction.DOWN) + context.getWorld() + .setBlockState(context.getPos(), state.with(SHAPE, + state.get(SHAPE) == Shape.WINDOW_STRAIGHT ? Shape.NORMAL : Shape.WINDOW_STRAIGHT)); + return ActionResultType.SUCCESS; + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.CHUTE; + } + + @Override + protected void fillStateContainer(Builder 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/ChuteGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java new file mode 100644 index 000000000..d79d9c8b0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java @@ -0,0 +1,41 @@ +package com.simibubi.create.content.logistics.block.chute; + +import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; +import com.simibubi.create.foundation.data.AssetLookup; +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraftforge.client.model.generators.ModelFile; + +public class ChuteGenerator extends SpecialBlockStateGen { + + @Override + protected int getXRotation(BlockState state) { + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + return horizontalAngle(state.get(ChuteBlock.FACING)); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + boolean horizontal = state.get(ChuteBlock.FACING) != Direction.DOWN; + ChuteBlock.Shape shape = state.get(ChuteBlock.SHAPE); + + if (!horizontal) + return shape == Shape.NORMAL ? AssetLookup.partialBaseModel(ctx, prov) + : AssetLookup.partialBaseModel(ctx, prov, "windowed"); + + return shape == Shape.NORMAL ? AssetLookup.partialBaseModel(ctx, prov, "diagonal") + : shape == Shape.START ? AssetLookup.partialBaseModel(ctx, prov, "diagonal", "start") + : AssetLookup.partialBaseModel(ctx, prov, "diagonal", "straight"); + } + +} 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 new file mode 100644 index 000000000..265929820 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.logistics.block.chute; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class ChuteItem extends BlockItem { + + public ChuteItem(Block p_i48527_1_, Properties p_i48527_2_) { + super(p_i48527_1_, p_i48527_2_); + } + + @Override + public ActionResultType tryPlace(BlockItemUseContext context) { + Direction face = context.getFace(); + BlockPos placedOnPos = context.getPos() + .offset(face.getOpposite()); + World world = context.getWorld(); + BlockState placedOnState = world.getBlockState(placedOnPos); + + if (!(placedOnState.getBlock() instanceof ChuteBlock) || context.shouldCancelInteraction()) + return super.tryPlace(context); + if (face.getAxis() + .isVertical()) + return super.tryPlace(context); + + BlockPos correctPos = context.getPos() + .up(); + + BlockState blockState = world.getBlockState(correctPos); + if (blockState.getMaterial() + .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; + } + } + return ActionResultType.FAIL; + } + + return super.tryPlace(context); + } + +} 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 new file mode 100644 index 000000000..bb4b3dad8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItemHandler.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.logistics.block.chute; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +public class ChuteItemHandler implements IItemHandler { + + private ChuteTileEntity te; + + public ChuteItemHandler(ChuteTileEntity te) { + this.te = te; + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return te.item; + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!te.item.isEmpty()) + return stack; + if (!simulate) + te.setItem(stack); + return ItemStack.EMPTY; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack remainder = te.item.copy(); + ItemStack split = remainder.split(amount); + if (!simulate) + te.setItem(remainder); + return split; + } + + @Override + public int getSlotLimit(int slot) { + return Math.min(64, getStackInSlot(slot).getMaxStackSize()); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return true; + } + +} 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 new file mode 100644 index 000000000..5094ec246 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.logistics.block.chute; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; + +public class ChuteRenderer extends SafeTileEntityRenderer { + + public ChuteRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(ChuteTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + if (te.item.isEmpty()) + return; + BlockState blockState = te.getBlockState(); + if (blockState.get(ChuteBlock.FACING) != Direction.DOWN) + return; + if (blockState.get(ChuteBlock.SHAPE) != Shape.WINDOW_STRAIGHT) + return; + + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + MatrixStacker msr = MatrixStacker.of(ms); + ms.push(); + msr.centre(); + float itemScale = .5f; + float itemPosition = te.itemPosition.get(partialTicks); + ms.translate(0, -.5 + itemPosition, 0); + ms.scale(itemScale, itemScale, itemScale); + msr.rotateX(itemPosition * 180); + msr.rotateY(itemPosition * 180); + itemRenderer.renderItem(te.item, TransformType.FIXED, light, overlay, ms, buffer); + ms.pop(); + } + +} 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 new file mode 100644 index 000000000..0e65b0f99 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -0,0 +1,466 @@ +package com.simibubi.create.content.logistics.block.chute; + +import java.util.LinkedList; +import java.util.List; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlocks; +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.logistics.block.chute.ChuteBlock.Shape; +import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.ChuteFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.ItemParticleData; +import net.minecraft.particles.ParticleTypes; +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; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; + +public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation { + + float pull; + float push; + + ItemStack item; + InterpolatedValue itemPosition; + ChuteItemHandler itemHandler; + LazyOptional lazyHandler; + boolean canPickUpItems; + + public ChuteTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + item = ItemStack.EMPTY; + itemPosition = new InterpolatedValue(); + itemHandler = new ChuteItemHandler(this); + lazyHandler = LazyOptional.of(() -> itemHandler); + canPickUpItems = false; + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen((d) -> canDirectlyInsertCached())); + } + + // Cached per-tick, useful when a lot of items are waiting on top of it + public boolean canDirectlyInsertCached() { + return canPickUpItems; + } + + private boolean canDirectlyInsert() { + BlockState blockState = getBlockState(); + BlockState blockStateAbove = world.getBlockState(pos.up()); + if (!AllBlocks.CHUTE.has(blockState)) + return false; + if (AllBlocks.CHUTE.has(blockStateAbove) && blockStateAbove.get(ChuteBlock.FACING) == Direction.DOWN) + return false; + if (getItemMotion() > 0 && getInputChutes().isEmpty()) + return false; + return blockState.get(ChuteBlock.FACING) == Direction.DOWN || blockState.get(ChuteBlock.SHAPE) == Shape.START; + } + + @Override + public void initialize() { + super.initialize(); + } + + @Override + public void tick() { + super.tick(); + canPickUpItems = canDirectlyInsert(); + if (item.isEmpty()) + return; + float itemMotion = getItemMotion(); + float nextOffset = itemPosition.value + itemMotion; + + if (itemMotion < 0) { + if (nextOffset < .5f) { + if (handleSideOutput()) + return; + boolean success = handleDownwardOutput(true); + if (!success) + nextOffset = .5f; + else if (nextOffset < 0) { + handleDownwardOutput(world.isRemote); + return; + } + } + } + + if (itemMotion > 0) { + if (nextOffset > .5f) { + if (handleSideOutput()) + return; + boolean success = handleUpwardOutput(true); + if (!success) + nextOffset = .5f; + else if (nextOffset > 1) { + handleUpwardOutput(world.isRemote); + return; + } + } + } + + itemPosition.set(nextOffset); + } + + private boolean handleDownwardOutput(boolean simulate) { + BlockState blockState = getBlockState(); + ChuteTileEntity targetChute = getTargetChute(blockState); + + if (targetChute != null) { + boolean canInsert = targetChute.item.isEmpty(); + if (!simulate && canInsert) { + targetChute.setItem(item, 1); + setItem(ItemStack.EMPTY); + } + return canInsert; + } + + // Diagonal chutes can only insert into other chutes + if (blockState.get(ChuteBlock.FACING) + .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 (Block.hasSolidSideOnTop(world, pos.down())) + return false; + + if (!simulate) { + Vec3d dropVec = VecHelper.getCenterOf(pos) + .add(0, -12 / 16f, 0); + ItemEntity dropped = new ItemEntity(world, dropVec.x, dropVec.y, dropVec.z, item.copy()); + dropped.setDefaultPickupDelay(); + dropped.setMotion(0, -.25f, 0); + world.addEntity(dropped); + setItem(ItemStack.EMPTY); + } + + return true; + } + + 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; + } + } + } + + ChuteTileEntity bestOutput = null; + List inputChutes = getInputChutes(); + for (ChuteTileEntity targetChute : inputChutes) { + if (!targetChute.item.isEmpty()) + continue; + float itemMotion = targetChute.getItemMotion(); + if (itemMotion < 0) + continue; + if (bestOutput == null || bestOutput.getItemMotion() < itemMotion) { + bestOutput = targetChute; + } + } + + if (bestOutput != null) { + if (!simulate) { + bestOutput.setItem(item, 0); + setItem(ItemStack.EMPTY); + } + return true; + } + + if (Block.hasSolidSide(stateAbove, world, pos.up(), Direction.DOWN)) + return false; + if (!inputChutes.isEmpty()) + return false; + + if (!simulate) { + Vec3d dropVec = VecHelper.getCenterOf(pos) + .add(0, 8 / 16f, 0); + ItemEntity dropped = new ItemEntity(world, dropVec.x, dropVec.y, dropVec.z, item.copy()); + dropped.setDefaultPickupDelay(); + dropped.setMotion(0, getItemMotion() * 2, 0); + world.addEntity(dropped); + setItem(ItemStack.EMPTY); + } + return true; + } + + private boolean handleSideOutput() { + if (world.isRemote) + return false; + for (Direction direction : Iterate.horizontalDirections) { + BlockPos funnelPos = pos.offset(direction); + BlockState funnelState = world.getBlockState(funnelPos); + if (AllBlocks.BRASS_CHUTE_FUNNEL.has(funnelState)) { + if (funnelState.get(ChuteFunnelBlock.POWERED)) + continue; + if (funnelState.get(ChuteFunnelBlock.HORIZONTAL_FACING) != direction.getOpposite()) + continue; + if (funnelState.get(ChuteFunnelBlock.PUSHING)) + continue; + ItemStack remainder = FunnelBlock.tryInsert(world, funnelPos, item.copy(), world.isRemote); + if (remainder.getCount() != item.getCount() && !world.isRemote) + setItem(remainder); + } + } + return item.isEmpty(); + } + + public void setItem(ItemStack stack) { + setItem(stack, getItemMotion() < 0 ? 1 : 0); + } + + public void setItem(ItemStack stack, float insertionPos) { + item = stack; + itemPosition.lastValue = itemPosition.value = insertionPos; + markDirty(); + sendData(); + } + + @Override + public void remove() { + super.remove(); + if (lazyHandler != null) + lazyHandler.invalidate(); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + compound.put("Item", item.serializeNBT()); + compound.putFloat("ItemPosition", itemPosition.value); + compound.putFloat("Pull", pull); + compound.putFloat("Push", push); + return super.write(compound); + } + + @Override + public void read(CompoundNBT compound) { + ItemStack previousItem = item; + item = ItemStack.read(compound.getCompound("Item")); + itemPosition.lastValue = itemPosition.value = compound.getFloat("ItemPosition"); + pull = compound.getFloat("Pull"); + push = compound.getFloat("Push"); + super.read(compound); + + if (hasWorld() && world.isRemote && !previousItem.equals(item, false) && !item.isEmpty()) { + if (world.rand.nextInt(3) != 0) + return; + Vec3d p = VecHelper.getCenterOf(pos); + p = VecHelper.offsetRandomly(p, world.rand, .5f); + Vec3d m = Vec3d.ZERO; + world.addParticle(new ItemParticleData(ParticleTypes.ITEM, item), p.x, p.y, p.z, m.x, m.y, m.z); + } + } + + public float getItemMotion() { + // Chutes per second + final float fanSpeedModifier = 1 / 64f; + final float maxUpwardItemSpeed = 20f; + final float gravity = 4f; + + float upwardMotion = (push + pull) * fanSpeedModifier; + return (upwardMotion == 0 ? -gravity : MathHelper.clamp(upwardMotion, 0, maxUpwardItemSpeed)) / 20f; + } + + public void onRemoved(BlockState chuteState) { + ChuteTileEntity targetChute = getTargetChute(chuteState); + List inputChutes = getInputChutes(); + if (!item.isEmpty()) + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), item); + super.remove(); + if (targetChute != null) { + targetChute.updatePull(); + targetChute.propagatePush(); + } + inputChutes.forEach(c -> c.updatePush(inputChutes.size())); + } + + public void onAdded() { + updateContainingBlockInfo(); + updatePull(); + ChuteTileEntity targetChute = getTargetChute(getBlockState()); + if (targetChute != null) + targetChute.propagatePush(); + else + updatePush(1); + } + + public void updatePull() { + float totalPull = calculatePull(); + if (pull == totalPull) + return; + pull = totalPull; + sendData(); + ChuteTileEntity targetChute = getTargetChute(getBlockState()); + if (targetChute != null) + targetChute.updatePull(); + } + + public void updatePush(int branchCount) { + float totalPush = calculatePush(branchCount); + if (push == totalPush) + return; + push = totalPush; + sendData(); + propagatePush(); + } + + public void propagatePush() { + List inputs = getInputChutes(); + inputs.forEach(c -> c.updatePush(inputs.size())); + } + + protected float calculatePull() { + BlockState blockStateAbove = world.getBlockState(pos.up()); + if (AllBlocks.ENCASED_FAN.has(blockStateAbove) + && blockStateAbove.get(EncasedFanBlock.FACING) == Direction.DOWN) { + TileEntity te = world.getTileEntity(pos.up()); + if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { + EncasedFanTileEntity fan = (EncasedFanTileEntity) te; + return Math.abs(fan.getSpeed()); + } + } + + float totalPull = 0; + for (Direction d : Iterate.directions) { + ChuteTileEntity inputChute = getInputChute(d); + if (inputChute == null) + continue; + totalPull += inputChute.pull; + } + return totalPull; + } + + protected float calculatePush(int branchCount) { + BlockState blockStateBelow = world.getBlockState(pos.down()); + if (AllBlocks.ENCASED_FAN.has(blockStateBelow) && blockStateBelow.get(EncasedFanBlock.FACING) == Direction.UP) { + TileEntity te = world.getTileEntity(pos.down()); + if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { + EncasedFanTileEntity fan = (EncasedFanTileEntity) te; + return Math.abs(fan.getSpeed()); + } + } + + ChuteTileEntity targetChute = getTargetChute(getBlockState()); + if (targetChute == null) + return 0; + return targetChute.push / branchCount; + } + + @Nullable + private ChuteTileEntity getTargetChute(BlockState state) { + Direction targetDirection = state.get(ChuteBlock.FACING); + BlockPos chutePos = pos.down(); + if (targetDirection.getAxis() + .isHorizontal()) + chutePos = chutePos.offset(targetDirection.getOpposite()); + BlockState chuteState = world.getBlockState(chutePos); + if (!AllBlocks.CHUTE.has(chuteState)) + return null; + TileEntity te = world.getTileEntity(chutePos); + if (te instanceof ChuteTileEntity) + return (ChuteTileEntity) te; + return null; + } + + private List getInputChutes() { + List inputs = new LinkedList<>(); + for (Direction d : Iterate.directions) { + ChuteTileEntity inputChute = getInputChute(d); + if (inputChute == null) + continue; + inputs.add(inputChute); + } + return inputs; + } + + @Nullable + private ChuteTileEntity getInputChute(Direction direction) { + if (direction == Direction.DOWN) + return null; + direction = direction.getOpposite(); + BlockPos chutePos = pos.up(); + if (direction.getAxis() + .isHorizontal()) + chutePos = chutePos.offset(direction); + BlockState chuteState = world.getBlockState(chutePos); + if (!AllBlocks.CHUTE.has(chuteState) || chuteState.get(ChuteBlock.FACING) != direction) + return null; + TileEntity te = world.getTileEntity(chutePos); + if (te instanceof ChuteTileEntity && !te.isRemoved()) + return (ChuteTileEntity) te; + return null; + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + tooltip.add(spacing + TextFormatting.GOLD + "Pull: " + TextFormatting.WHITE + pull); + tooltip.add(spacing + TextFormatting.GOLD + "Push: " + TextFormatting.WHITE + push); + tooltip.add(TextFormatting.YELLOW + "-> Item Motion: " + TextFormatting.WHITE + getItemMotion()); + return true; + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return lazyHandler.cast(); + return super.getCapability(cap, side); + } + + public ItemStack getItem() { + return item; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java new file mode 100644 index 000000000..c29347c7c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java @@ -0,0 +1,133 @@ +package com.simibubi.create.content.logistics.block.depot; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.items.ItemStackHandler; + +public class DepotBlock extends Block implements ITE { + + public DepotBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.DEPOT; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.DEPOT.create(); + } + + @Override + public Class getTileEntityClass() { + return DepotTileEntity.class; + } + + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult ray) { + if (ray.getFace() != Direction.UP) + return ActionResultType.PASS; + if (world.isRemote) + return ActionResultType.SUCCESS; + + withTileEntityDo(world, pos, te -> { + ItemStack heldItem = player.getHeldItem(hand); + boolean wasEmptyHanded = heldItem.isEmpty(); + boolean shouldntPlaceItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem); + + ItemStack mainItemStack = te.getHeldItemStack(); + if (!mainItemStack.isEmpty()) { + player.inventory.placeItemBackInInventory(world, mainItemStack); + te.setHeldItem(null); + } + ItemStackHandler outputs = te.processingOutputBuffer; + for (int i = 0; i < outputs.getSlots(); i++) + player.inventory.placeItemBackInInventory(world, outputs.extractItem(i, 64, false)); + + if (!wasEmptyHanded && !shouldntPlaceItem) { + TransportedItemStack transported = new TransportedItemStack(heldItem); + transported.insertedFrom = player.getHorizontalFacing(); + transported.prevBeltPosition = .25f; + transported.beltPosition = .25f; + te.setHeldItem(transported); + player.setHeldItem(hand, ItemStack.EMPTY); + } + + te.markDirty(); + te.sendData(); + }); + + return ActionResultType.SUCCESS; + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) { + return; + } + + withTileEntityDo(worldIn, pos, te -> { + ItemHelper.dropContents(worldIn, pos, te.processingOutputBuffer); + if (!te.getHeldItemStack() + .isEmpty()) + InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), te.getHeldItemStack()); + }); + worldIn.removeTileEntity(pos); + } + + @Override + public void onLanded(IBlockReader worldIn, Entity entityIn) { + super.onLanded(worldIn, entityIn); + if (!AllBlocks.DEPOT.has(worldIn.getBlockState(entityIn.getPosition()))) + return; + if (!(entityIn instanceof ItemEntity)) + return; + if (!entityIn.isAlive()) + return; + if (entityIn.world.isRemote) + return; + ItemEntity itemEntity = (ItemEntity) entityIn; + DirectBeltInputBehaviour inputBehaviour = + TileEntityBehaviour.get(worldIn, entityIn.getPosition(), DirectBeltInputBehaviour.TYPE); + if (inputBehaviour == null) + return; + ItemStack remainder = inputBehaviour.handleInsertion(itemEntity.getItem(), Direction.DOWN, false); + itemEntity.setItem(remainder); + if (remainder.isEmpty()) + itemEntity.remove(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java new file mode 100644 index 000000000..c67813496 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java @@ -0,0 +1,74 @@ +package com.simibubi.create.content.logistics.block.depot; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +public class DepotItemHandler implements IItemHandler { + + private static final int MAIN_SLOT = 0; + private DepotTileEntity te; + + public DepotItemHandler(DepotTileEntity te) { + this.te = te; + } + + @Override + public int getSlots() { + return 9; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return slot == MAIN_SLOT ? te.getHeldItemStack() : te.processingOutputBuffer.getStackInSlot(slot - 1); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (slot != MAIN_SLOT) + return stack; + if (!te.getHeldItemStack() + .isEmpty()) + return stack; + if (!te.isOutputEmpty()) + return stack; + if (!simulate) { + te.setHeldItem(new TransportedItemStack(stack)); + te.markDirty(); + te.sendData(); + } + return ItemStack.EMPTY; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot != MAIN_SLOT) + return te.processingOutputBuffer.extractItem(slot - 1, amount, simulate); + + TransportedItemStack held = te.heldItem; + if (held == null) + return ItemStack.EMPTY; + ItemStack stack = held.stack.copy(); + ItemStack extracted = stack.split(amount); + if (!simulate) { + te.heldItem.stack = stack; + if (stack.isEmpty()) + te.heldItem = null; + te.markDirty(); + te.sendData(); + } + return extracted; + } + + @Override + public int getSlotLimit(int slot) { + return 64; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return slot == MAIN_SLOT; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java new file mode 100644 index 000000000..4d428f935 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java @@ -0,0 +1,107 @@ +package com.simibubi.create.content.logistics.block.depot; + +import java.util.Random; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class DepotRenderer extends SafeTileEntityRenderer { + + public DepotRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(DepotTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + + TransportedItemStack transported = te.heldItem; + MatrixStacker msr = MatrixStacker.of(ms); + + ms.push(); + ms.translate(.5f, 15 / 16f, .5f); + + // Render main item + if (transported != null) { + ms.push(); + msr.nudge(0); + float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); + float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); + + if (transported.insertedFrom.getAxis() + .isHorizontal()) { + Vec3d offsetVec = new Vec3d(transported.insertedFrom.getOpposite() + .getDirectionVec()).scale(.5f - offset); + ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); + boolean alongX = transported.insertedFrom.rotateY() + .getAxis() == Axis.X; + if (!alongX) + sideOffset *= -1; + ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); + } + + ItemStack itemStack = transported.stack; + int angle = transported.angle; + Random r = new Random(0); + renderItem(ms, buffer, light, overlay, itemStack, angle, r); + ms.pop(); + } + + // Render output items + for (int i = 0; i < te.processingOutputBuffer.getSlots(); i++) { + ItemStack stack = te.processingOutputBuffer.getStackInSlot(i); + if (stack.isEmpty()) + continue; + ms.push(); + msr.nudge(i); + msr.rotateY(360 / 8f * i); + ms.translate(.35f, 0, 0); + Random r = new Random(i + 1); + int angle = (int) (360 * r.nextFloat()); + renderItem(ms, buffer, light, overlay, stack, angle, r); + ms.pop(); + } + + ms.pop(); + } + + protected void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack itemStack, + int angle, Random r) { + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + MatrixStacker msr = MatrixStacker.of(ms); + int count = (int) (MathHelper.log2((int) (itemStack.getCount()))) / 2; + boolean blockItem = itemRenderer.getItemModelWithOverrides(itemStack, null, null) + .isGui3d(); + for (int i = 0; i <= count; i++) { + ms.push(); + msr.rotateY(angle); + if (!blockItem) { + ms.translate(0, -.09375, 0); + msr.rotateX(90); + } + if (blockItem) + ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); + ms.scale(.5f, .5f, .5f); + itemRenderer.renderItem(itemStack, TransformType.FIXED, light, overlay, ms, buffer); + ms.pop(); + + if (!blockItem) + msr.rotateY(10); + ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java new file mode 100644 index 000000000..c813c00c9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java @@ -0,0 +1,214 @@ +package com.simibubi.create.content.logistics.block.depot; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemStackHandler; + +public class DepotTileEntity extends SmartTileEntity { + + TransportedItemStack heldItem; + ItemStackHandler processingOutputBuffer; + + DepotItemHandler itemHandler; + LazyOptional lazyItemHandler; + + public DepotTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + itemHandler = new DepotItemHandler(this); + lazyItemHandler = LazyOptional.of(() -> itemHandler); + processingOutputBuffer = new ItemStackHandler(8) { + protected void onContentsChanged(int slot) { + markDirty(); + sendData(); + }; + }; + } + + @Override + public void tick() { + super.tick(); + if (heldItem == null) + return; + + heldItem.prevBeltPosition = heldItem.beltPosition; + heldItem.prevSideOffset = heldItem.sideOffset; + float diff = .5f - heldItem.beltPosition; + if (diff > 1 / 512f) { + if (diff > 1 / 32f) + heldItem.angle += 1; + heldItem.beltPosition += diff / 4f; + } + + if (diff > 1 / 16f) + return; + if (world.isRemote) + return; + + BeltProcessingBehaviour processingBehaviour = + TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE); + if (processingBehaviour == null) + return; + if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos)) + return; + + boolean wasLocked = heldItem.locked; + ItemStack previousItem = heldItem.stack; + TransportedItemStackHandlerBehaviour handler = getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, handler) + : processingBehaviour.handleReceivedItem(heldItem, handler); + if (result == ProcessingResult.REMOVE) { + heldItem = null; + sendData(); + return; + } + + heldItem.locked = result == ProcessingResult.HOLD; + if (heldItem.locked != wasLocked || !previousItem.equals(heldItem.stack, false)) + sendData(); + } + + @Override + public void remove() { + super.remove(); + if (lazyItemHandler != null) + lazyItemHandler.invalidate(); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + if (heldItem != null) + compound.put("HeldItem", heldItem.serializeNBT()); + compound.put("OutputBuffer", processingOutputBuffer.serializeNBT()); + return super.write(compound); + } + + @Override + public void read(CompoundNBT compound) { + heldItem = null; + if (compound.contains("HeldItem")) + heldItem = TransportedItemStack.read(compound.getCompound("HeldItem")); + processingOutputBuffer.deserializeNBT(compound.getCompound("OutputBuffer")); + super.read(compound); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this).setInsertionHandler(this::tryInsertingFromSide)); + behaviours.add(new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) + .withStackPlacement(this::getWorldPositionOf)); + } + + public ItemStack getHeldItemStack() { + return heldItem == null ? ItemStack.EMPTY : heldItem.stack; + } + + public void setHeldItem(TransportedItemStack heldItem) { + this.heldItem = heldItem; + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return lazyItemHandler.cast(); + return super.getCapability(cap, side); + } + + private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) { + ItemStack inserted = transportedStack.stack; + ItemStack empty = ItemStack.EMPTY; + + if (!getHeldItemStack().isEmpty()) + return inserted; + if (!isOutputEmpty()) + return inserted; + if (simulate) + return empty; + + transportedStack = transportedStack.copy(); + transportedStack.beltPosition = side.getAxis() + .isVertical() ? .5f : 0; + transportedStack.insertedFrom = side; + transportedStack.prevSideOffset = transportedStack.sideOffset; + transportedStack.prevBeltPosition = transportedStack.beltPosition; + setHeldItem(transportedStack); + markDirty(); + sendData(); + + return empty; + } + + private void applyToAllItems(float maxDistanceFromCentre, + Function> processFunction) { + if (heldItem == null) + return; + if (.5f - heldItem.beltPosition > maxDistanceFromCentre) + return; + + boolean dirty = false; + List toBeAdded = new ArrayList<>(); + TransportedItemStack transportedItemStack = heldItem; + ItemStack stackBefore = transportedItemStack.stack.copy(); + List apply = processFunction.apply(transportedItemStack); + + if (apply == null) + return; + if (apply.size() == 1 && apply.get(0).stack.equals(stackBefore, false)) + return; + + dirty = true; + heldItem = null; + toBeAdded.addAll(apply); + for (TransportedItemStack added : toBeAdded) { + if (heldItem == null) { + heldItem = added; + heldItem.beltPosition = 0.5f; + heldItem.prevBeltPosition = 0.5f; + continue; + } + for (int i = 0; i < processingOutputBuffer.getSlots(); i++) { + ItemStack stackInSlot = processingOutputBuffer.getStackInSlot(i); + if (!stackInSlot.isEmpty()) + continue; + processingOutputBuffer.setStackInSlot(i, added.stack); + break; + } + } + + if (dirty) { + markDirty(); + sendData(); + } + } + + public boolean isOutputEmpty() { + for (int i = 0; i < processingOutputBuffer.getSlots(); i++) + if (!processingOutputBuffer.getStackInSlot(i) + .isEmpty()) + return false; + return true; + } + + private Vec3d getWorldPositionOf(TransportedItemStack transported) { + Vec3d offsetVec = new Vec3d(.5f, 14 / 16f, .5f); + return offsetVec.add(new Vec3d(pos)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorTileEntity.java index 3ba3e231d..2cdb2e2b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorTileEntity.java @@ -106,7 +106,7 @@ public class ExtractorTileEntity extends SmartTileEntity { BeltInventory inventory = controller.getInventory(); if (inventory == null) return false; - if (!inventory.canInsertFrom(belt.index, Direction.UP)) + if (!inventory.canInsertAtFromSide(belt.index, Direction.UP)) return false; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/VerticalExtractorGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/VerticalExtractorGenerator.java index 27f87ac30..6a78f11e4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/VerticalExtractorGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/extractor/VerticalExtractorGenerator.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.logistics.block.extractor; -import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.foundation.data.AssetLookup; import com.simibubi.create.foundation.data.SpecialBlockStateGen; import com.tterrag.registrate.providers.DataGenContext; @@ -25,7 +24,7 @@ public class VerticalExtractorGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - return (state.get(FunnelBlock.UPWARD) ? 0 : 180) + horizontalAngle(state.get(FunnelBlock.HORIZONTAL_FACING)); + return (state.get(ExtractorBlock.UPWARD) ? 0 : 180) + horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); } @Override 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 new file mode 100644 index 000000000..8ce624cd4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteBeltFunnelBlock.java @@ -0,0 +1,16 @@ +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 false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteChuteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteChuteFunnelBlock.java new file mode 100644 index 000000000..80bfc2baf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteChuteFunnelBlock.java @@ -0,0 +1,16 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlocks; + +public class AndesiteChuteFunnelBlock extends ChuteFunnelBlock { + + public AndesiteChuteFunnelBlock(Properties p_i48377_1_) { + super(AllBlocks.ANDESITE_FUNNEL, p_i48377_1_); + } + + @Override + public boolean hasPoweredProperty() { + return false; + } + +} 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 new file mode 100644 index 000000000..87a3c1705 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java @@ -0,0 +1,30 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlocks; + +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; + +public class AndesiteFunnelBlock extends FunnelBlock { + + public AndesiteFunnelBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + } + + @Override + public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { + Direction facing = state.get(FACING); + return AllBlocks.ANDESITE_BELT_FUNNEL.getDefaultState() + .with(BeltFunnelBlock.HORIZONTAL_FACING, facing); + } + + @Override + public BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state) { + Direction facing = state.get(FACING); + return AllBlocks.ANDESITE_CHUTE_FUNNEL.getDefaultState() + .with(ChuteFunnelBlock.HORIZONTAL_FACING, facing); + } + +} 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 new file mode 100644 index 000000000..c0b721908 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -0,0 +1,134 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.block.depot.DepotBlock; +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.item.BlockItemUseContext; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.IProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.BlockPos; +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 BeltFunnelBlock extends HorizontalInteractionFunnelBlock { + + public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); + + public enum Shape implements IStringSerializable { + RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED); + + VoxelShaper shaper; + + private Shape(VoxelShaper shaper) { + this.shaper = shaper; + } + + @Override + public String getName() { + return Lang.asId(name()); + } + } + + public BeltFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { + super(parent, p_i48377_1_); + setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + return getStateForPosition(ctx.getWorld(), ctx.getPos(), state, ctx.getFace()); + } + + public BlockState getStateForPosition(World world, BlockPos pos, BlockState defaultState, Direction facing) { + BlockState state = defaultState.with(HORIZONTAL_FACING, facing); + BlockPos posBelow = pos.down(); + BlockState stateBelow = world.getBlockState(posBelow); + if (!AllBlocks.BELT.has(stateBelow)) + return state; + TileEntity teBelow = world.getTileEntity(posBelow); + if (teBelow == null || !(teBelow instanceof BeltTileEntity)) + return state; + BeltTileEntity beltTileEntity = (BeltTileEntity) teBelow; + if (beltTileEntity.getSpeed() == 0) + return state; + Direction movementFacing = beltTileEntity.getMovementFacing(); + return state.with(PUSHING, movementFacing == facing); + } + + @Override + protected void fillStateContainer(Builder p_206840_1_) { + super.fillStateContainer(p_206840_1_.add(SHAPE)); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING)); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, + BlockPos pos, BlockPos p_196271_6_) { + if (direction == state.get(HORIZONTAL_FACING)) + return updateShape(state, world, pos); + else + return super.updatePostPlacement(state, direction, neighbour, world, pos, p_196271_6_); + } + + public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) { + BlockState stateBelow = world.getBlockState(pos.down()); + if (stateBelow.getBlock() instanceof DepotBlock) + return true; + if (!(stateBelow.getBlock() instanceof BeltBlock)) + return false; + if (!BeltBlock.canTransport(stateBelow)) + return false; + if (stateBelow.get(BeltBlock.HORIZONTAL_FACING) + .getAxis() != state.get(HORIZONTAL_FACING) + .getAxis()) + return false; + return true; + } + + public static BlockState updateShape(BlockState state, IBlockReader world, BlockPos pos) { + state = state.with(SHAPE, Shape.RETRACTED); + BlockState neighbour = world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING))); + if (canConnectTo(state, neighbour)) + return state.with(SHAPE, Shape.EXTENDED); + return state; + } + + private static boolean canConnectTo(BlockState state, BlockState neighbour) { + if (neighbour.getBlock() instanceof BeltTunnelBlock) + return true; + if (neighbour.getBlock() instanceof BeltFunnelBlock + && neighbour.get(HORIZONTAL_FACING) == state.get(HORIZONTAL_FACING) + .getOpposite()) + return true; + return false; + } + + @Override + protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) { + return isOnValidBelt(state, world, pos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java new file mode 100644 index 000000000..05fb003b2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class BeltFunnelGenerator extends SpecialBlockStateGen { + + private String type; + + public BeltFunnelGenerator(String type) { + this.type = type; + } + + @Override + protected int getXRotation(BlockState state) { + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180; + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + boolean pushing = state.get(BeltFunnelBlock.PUSHING); + boolean powered = state.has(BeltFunnelBlock.POWERED) && state.get(BeltFunnelBlock.POWERED); + String shapeName = state.get(BeltFunnelBlock.SHAPE) + .getName(); + String suffix = (pushing ? "push" : "pull") + (powered ? "_powered" : ""); + String name = ctx.getName() + "_" + suffix; + String textureName = type + "_funnel_" + suffix; + return prov.models() + .withExistingParent(name + "_" + shapeName, prov.modLoc("block/belt_funnel/block_" + shapeName)) + .texture("particle", prov.modLoc("block/" + type + "_casing")) + .texture("2", prov.modLoc("block/" + textureName)) + .texture("3", prov.modLoc("block/" + type + "_funnel_back")) + .texture("4", prov.modLoc("block/" + type + "_funnel_plating")); + } + +} 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 new file mode 100644 index 000000000..17dae6807 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassBeltFunnelBlock.java @@ -0,0 +1,16 @@ +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/BrassChuteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassChuteFunnelBlock.java new file mode 100644 index 000000000..cba22d4e5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassChuteFunnelBlock.java @@ -0,0 +1,16 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlocks; + +public class BrassChuteFunnelBlock extends ChuteFunnelBlock { + + public BrassChuteFunnelBlock(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 new file mode 100644 index 000000000..96d4bce9c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlocks; + +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.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class BrassFunnelBlock extends FunnelBlock { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public BrassFunnelBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + setDefaultState(getDefaultState().with(POWERED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return super.getStateForPlacement(context).with(POWERED, context.getWorld() + .isBlockPowered(context.getPos())); + } + + @Override + protected boolean canInsertIntoFunnel(BlockState state) { + return super.canInsertIntoFunnel(state) && !state.get(POWERED); + } + + @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); + } + + @Override + public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { + Direction facing = state.get(FACING); + return AllBlocks.BRASS_BELT_FUNNEL.getDefaultState() + .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) + .with(POWERED, state.get(POWERED)); + } + + @Override + public BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state) { + Direction facing = state.get(FACING); + return AllBlocks.BRASS_CHUTE_FUNNEL.getDefaultState() + .with(ChuteFunnelBlock.HORIZONTAL_FACING, facing) + .with(POWERED, state.get(POWERED)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelBlock.java new file mode 100644 index 000000000..f059f6861 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelBlock.java @@ -0,0 +1,40 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.logistics.block.chute.ChuteBlock; +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; + +public abstract class ChuteFunnelBlock extends HorizontalInteractionFunnelBlock { + + public ChuteFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { + super(parent, p_i48377_1_); + } + + public static boolean isOnValidChute(BlockState state, IWorldReader world, BlockPos pos) { + Direction direction = state.get(HORIZONTAL_FACING); + if (world.getBlockState(pos.offset(direction)) + .getBlock() instanceof ChuteBlock) + return true; + return false; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.CHUTE_FUNNEL.get(state.get(HORIZONTAL_FACING)); + } + + @Override + protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) { + return isOnValidChute(state, world, pos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelGenerator.java new file mode 100644 index 000000000..1bc7fa6c2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelGenerator.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class ChuteFunnelGenerator extends SpecialBlockStateGen { + + private String type; + + public ChuteFunnelGenerator(String type) { + this.type = type; + } + + @Override + protected int getXRotation(BlockState state) { + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180; + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + boolean pushing = state.get(ChuteFunnelBlock.PUSHING); + boolean powered = state.has(ChuteFunnelBlock.POWERED) && state.get(ChuteFunnelBlock.POWERED); + String suffix = (pushing ? "push" : "pull") + (powered ? "_powered" : ""); + String textureName = type + "_funnel_" + suffix; + String modelName = ctx.getName() + "_" + suffix; + return prov.models() + .withExistingParent(modelName, prov.modLoc("block/chute_funnel/block")) + .texture("particle", prov.modLoc("block/" + type + "_casing")) + .texture("3", prov.modLoc("block/" + textureName)) + .texture("1_2", prov.modLoc("block/" + type + "_funnel_back")) + .texture("4", prov.modLoc("block/" + type + "_funnel_plating")); + } + +} 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 62e929c6e..aa414f12a 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,23 +1,17 @@ package com.simibubi.create.content.logistics.block.funnel; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; -import com.simibubi.create.content.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; -import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; +import com.simibubi.create.content.logistics.block.chute.ChuteBlock; 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.InsertingBehaviour; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -26,35 +20,99 @@ 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.state.BooleanProperty; -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.Direction.AxisDirection; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.Vec3d; 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 class FunnelBlock extends AttachedLogisticalBlock - implements IBeltAttachment, ITE, IPortableBlock { +public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE { - public static final BooleanProperty BELT = BooleanProperty.create("belt"); - public static final MovementBehaviour MOVEMENT = new FunnelMovementBehaviour(); - - public FunnelBlock(Properties properties) { - super(properties); + public FunnelBlock(Properties p_i48415_1_) { + super(p_i48415_1_); } @Override - protected void fillStateContainer(Builder builder) { - if (!isVertical()) - builder.add(BELT); - super.fillStateContainer(builder); + public BlockState getStateForPlacement(BlockItemUseContext context) { + Direction facing = context.getFace(); + if (facing.getAxis() + .isVertical() + && context.getWorld() + .getBlockState(context.getPos() + .offset(facing.getOpposite())) + .getBlock() instanceof ChuteBlock) + facing = facing.getOpposite(); + return getDefaultState().with(FACING, facing); + + } + + @Override + public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + + ItemStack heldItem = player.getHeldItem(handIn); + boolean shouldntInsertItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem) || !canInsertIntoFunnel(state); + + if (hit.getFace() == getFunnelFacing(state) && !shouldntInsertItem) { + if (!worldIn.isRemote) + withTileEntityDo(worldIn, pos, te -> { + ItemStack toInsert = heldItem.copy(); + ItemStack remainder = tryInsert(worldIn, pos, toInsert, false); + if (!ItemStack.areItemStacksEqual(remainder, toInsert)) + player.setHeldItem(handIn, remainder); + }); + return ActionResultType.SUCCESS; + } + + return ActionResultType.PASS; + } + + @Override + public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { + if (worldIn.isRemote) + return; + if (!(entityIn instanceof ItemEntity)) + return; + if (!canInsertIntoFunnel(state)) + return; + ItemEntity itemEntity = (ItemEntity) entityIn; + + Direction direction = state.get(FACING); + Vec3d diff = entityIn.getPositionVec() + .subtract(VecHelper.getCenterOf(pos)); + double projectedDiff = direction.getAxis() + .getCoordinate(diff.x, diff.y, diff.z); + if (projectedDiff < 0 == (direction.getAxisDirection() == AxisDirection.POSITIVE)) + return; + + ItemStack toInsert = itemEntity.getItem(); + ItemStack remainder = tryInsert(worldIn, pos, toInsert, false); + + if (remainder.isEmpty()) + itemEntity.remove(); + if (remainder.getCount() < toInsert.getCount()) + itemEntity.setItem(remainder); + } + + public static ItemStack tryInsert(World worldIn, BlockPos pos, ItemStack toInsert, boolean simulate) { + FilteringBehaviour filter = TileEntityBehaviour.get(worldIn, pos, FilteringBehaviour.TYPE); + InsertingBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InsertingBehaviour.TYPE); + if (inserter == null) + return toInsert; + if (filter != null && !filter.test(toInsert)) + return toInsert; + ItemStack remainder = inserter.insert(toInsert, simulate); + return remainder; } @Override @@ -68,169 +126,80 @@ public class FunnelBlock extends AttachedLogisticalBlock } @Override - protected boolean isVertical() { - return false; + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + return AllShapes.FUNNEL.get(state.get(FACING)); } @Override - public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - if (worldIn.isRemote) - return; - if (!(entityIn instanceof ItemEntity)) - return; - ItemEntity itemEntity = (ItemEntity) entityIn; - withTileEntityDo(worldIn, pos, te -> { - ItemStack remainder = te.tryToInsert(itemEntity.getItem()); - if (remainder.isEmpty()) - itemEntity.remove(); - if (remainder.getCount() < itemEntity.getItem().getCount()) - itemEntity.setItem(remainder); - }); + public VoxelShape getCollisionShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + if (context.getEntity() instanceof ItemEntity) + return AllShapes.FUNNEL_COLLISION.get(state.get(FACING)); + return getShape(state, world, pos, context); } @Override - protected BlockState getVerticalDefaultState() { - return AllBlocks.VERTICAL_FUNNEL.getDefaultState(); - } - - @Override - protected BlockState getHorizontalDefaultState() { - return AllBlocks.FUNNEL.getDefaultState(); - } - - @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, - BlockPos currentPos, BlockPos facingPos) { - if (facing == Direction.DOWN && !isVertical(stateIn)) - return stateIn.with(BELT, isOnBelt(worldIn, currentPos)); - return stateIn; - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = super.getStateForPlacement(context); - if (!isVertical(state)) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); - state = state.with(BELT, isOnBelt(world, pos)); + 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 BeltFunnelBlock.updateShape(equivalentFunnel, world, pos); + } + if (direction == facing) { + BlockState equivalentFunnel = getEquivalentChuteFunnel(null, null, state); + if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos)) + return equivalentFunnel; + } + if (direction == facing.getOpposite()) { + BlockState equivalentFunnel = getEquivalentChuteFunnel(null, null, state); + if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos)) + return equivalentFunnel; + } } return state; } - protected boolean isOnBelt(IWorld world, BlockPos pos) { - return AllBlocks.BELT.has(world.getBlockState(pos.down())); + public abstract BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState 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 HorizontalInteractionFunnelBlock); + } + + @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 VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - Direction direction = getBlockFacing(state); - if (!isVertical(state) && state.get(BELT)) - return AllShapes.BELT_FUNNEL.get(direction); - return AllShapes.FUNNEL.get(direction); - } - - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - onAttachmentPlaced(worldIn, pos, state); - if (worldIn.isRemote) - return; - - if (isOnBelt(worldIn, pos)) { - BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos.down()); - if (belt == null) - return; - - BeltTileEntity controllerBelt = belt.getControllerTE(); - if (controllerBelt == null) - return; - - controllerBelt.getInventory().forEachWithin(belt.index + .5f, .55f, (transportedItemStack) -> { - controllerBelt.getInventory().eject(transportedItemStack); - return Collections.emptyList(); - }); + 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 void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - onAttachmentRemoved(worldIn, pos, state); - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); - } - } - - @Override - public List getPotentialAttachmentPositions(IWorld world, BlockPos pos, BlockState beltState) { - return Arrays.asList(pos.up()); - } - - @Override - public BlockPos getBeltPositionForAttachment(IWorld world, BlockPos pos, BlockState state) { - return pos.down(); - } - - @Override - public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - return process(te, transported, state); - } - - @Override - public boolean isAttachedCorrectly(IWorld world, BlockPos attachmentPos, BlockPos beltPos, - BlockState attachmentState, BlockState beltState) { - return !isVertical(attachmentState); - } - - @Override - public boolean processItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - Direction movementFacing = te.getMovementFacing(); - if (movementFacing != te.getWorld().getBlockState(state.attachmentPos).get(HORIZONTAL_FACING)) - return false; - return process(te, transported, state); - } - - @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, - BlockRayTraceResult hit) { - - if (hit.getFace() == getBlockFacing(state).getOpposite()) { - if (!worldIn.isRemote) - withTileEntityDo(worldIn, pos, te -> { - ItemStack heldItem = player.getHeldItem(handIn).copy(); - ItemStack remainder = te.tryToInsert(heldItem); - if (!ItemStack.areItemStacksEqual(remainder, heldItem)) - player.setHeldItem(handIn, remainder); - }); - return ActionResultType.SUCCESS; - } - - return ActionResultType.PASS; - } - - public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) { - TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos); - if (!(te instanceof FunnelTileEntity)) - return false; - FunnelTileEntity funnel = (FunnelTileEntity) te; - ItemStack stack = funnel.tryToInsert(transported.stack); - transported.stack = stack; + protected boolean canInsertIntoFunnel(BlockState state) { return true; } - public static class Vertical extends FunnelBlock { - public Vertical(Properties properties) { - super(properties); - } - - @Override - protected boolean isVertical() { - return true; - } - } - - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; + @Nullable + public static boolean isFunnel(BlockState state) { + return state.getBlock() instanceof FunnelBlock || state.getBlock() instanceof HorizontalInteractionFunnelBlock; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlot.java deleted file mode 100644 index a4dea706a..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlot.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.content.logistics.block.funnel; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.content.logistics.block.extractor.ExtractorBlock; -import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; -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 FunnelFilterSlot extends ValueBoxTransform { - - Vec3d offsetForHorizontal = VecHelper.voxelSpace(8f, 14f, 13.5f); - Vec3d offsetForBelt = VecHelper.voxelSpace(8f, 8.5f, 14f); - Vec3d offsetForUpward = VecHelper.voxelSpace(8f, 13.5f, 2f); - Vec3d offsetForDownward = VecHelper.voxelSpace(8f, 2.5f, 2f); - - @Override - protected Vec3d getLocalOffset(BlockState state) { - Vec3d vec = offsetForHorizontal; - float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - if (AttachedLogisticalBlock.isVertical(state)) - vec = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward; - else if (state.get(FunnelBlock.BELT)) - vec = offsetForBelt; - - return VecHelper.rotateCentered(vec, yRot, Axis.Y); - } - - @Override - protected void rotate(BlockState state, MatrixStack ms) { - Direction blockFacing = AttachedLogisticalBlock.getBlockFacing(state); - boolean vertical = AttachedLogisticalBlock.isVertical(state); - float horizontalAngle = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - - float yRot = blockFacing == Direction.DOWN ? horizontalAngle + 180 : horizontalAngle; - float xRot = (vertical || state.get(FunnelBlock.BELT)) ? 90 : 0; - - if (blockFacing == Direction.UP) - xRot += 180; - - MatrixStacker.of(ms) - .rotateY(yRot) - .rotateX(xRot); - } - -} 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 new file mode 100644 index 000000000..add0d05e1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -0,0 +1,96 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlocks; +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.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 { + + @Override + protected Vec3d getLocalOffset(BlockState state) { + if (AllBlocks.BRASS_BELT_FUNNEL.has(state)) + if (state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED) + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 13, 7.5f), + AngleHelper.horizontalAngle(getSide()), Axis.Y); + + Vec3d localOffset = + getSide() == Direction.UP ? VecHelper.voxelSpace(8, 14.5f, 8) : VecHelper.voxelSpace(8, 1.5f, 8); + + if (getSide().getAxis() + .isHorizontal()) { + Vec3d southLocation = VecHelper.voxelSpace(8, 8, 14.5f); + localOffset = VecHelper.rotateCentered(southLocation, AngleHelper.horizontalAngle(getSide()), Axis.Y); + } + + if (AllBlocks.BRASS_CHUTE_FUNNEL.has(state)) { + Direction facing = state.get(ChuteFunnelBlock.HORIZONTAL_FACING); + localOffset = localOffset.subtract(new Vec3d(facing.getDirectionVec()).scale(2 / 16f)); + } + + return localOffset; + } + + @Override + protected void rotate(BlockState state, MatrixStack ms) { + Direction facing = FunnelBlock.getFunnelFacing(state); + + if (!facing.getAxis() + .isVertical() + && !(AllBlocks.BRASS_BELT_FUNNEL.has(state) && state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED)) { + Direction verticalDirection = DirectionHelper.rotateAround(getSide(), facing.rotateY() + .getAxis()); + if (facing.getAxis() == Axis.Z) + verticalDirection = verticalDirection.getOpposite(); + + boolean reverse = state.getBlock() instanceof HorizontalInteractionFunnelBlock + && !state.get(HorizontalInteractionFunnelBlock.PUSHING); + + 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 (reverse) + zRotLast += 180; + + MatrixStacker.of(ms) + .rotateZ(alongX ? xRot : 0) + .rotateX(alongX ? 0 : xRot) + .rotateY(yRot) + .rotateZ(zRotLast); + return; + } + + super.rotate(state, ms); + } + + @Override + protected boolean isSideActive(BlockState state, Direction direction) { + Direction facing = FunnelBlock.getFunnelFacing(state); + + if (facing == null) + return false; + + if (AllBlocks.BRASS_BELT_FUNNEL.has(state)) + return state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED ? direction == facing + : direction != Direction.DOWN && direction.getAxis() != facing.getAxis(); + + return direction.getAxis() != facing.getAxis(); + } + + @Override + protected Vec3d getSouthLocation() { + return Vec3d.ZERO; + } + +} 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 new file mode 100644 index 000000000..9167aa479 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.util.Direction; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.Event.Result; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class FunnelItem extends BlockItem { + + public FunnelItem(Block p_i48527_1_, Properties p_i48527_2_) { + super(p_i48527_1_, p_i48527_2_); + } + + @SubscribeEvent + public static void funnelItemAlwaysPlacesWhenUsed(PlayerInteractEvent.RightClickBlock event) { + if (event.getItemStack() + .getItem() instanceof FunnelItem) + event.setUseBlock(Result.DENY); + } + + @Override + protected BlockState getStateForPlacement(BlockItemUseContext ctx) { + World world = ctx.getWorld(); + BlockPos pos = ctx.getPos(); + BlockState state = super.getStateForPlacement(ctx); + if (state == null) + return state; + if (!(state.getBlock() instanceof FunnelBlock)) + return state; + Direction direction = state.get(FunnelBlock.FACING); + if (!direction.getAxis() + .isHorizontal()) + return state; + + FunnelBlock block = (FunnelBlock) getBlock(); + Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state) + .getBlock(); + Block chuteFunnelBlock = block.getEquivalentChuteFunnel(world, pos, state) + .getBlock(); + + BlockState equivalentBeltFunnel = beltFunnelBlock.getStateForPlacement(ctx) + .with(BeltFunnelBlock.HORIZONTAL_FACING, direction); + BlockState equivalentChuteFunnel = chuteFunnelBlock.getStateForPlacement(ctx) + .with(ChuteFunnelBlock.HORIZONTAL_FACING, direction); + BlockState reversedChuteFunnel = equivalentChuteFunnel.rotate(Rotation.CLOCKWISE_180) + .cycle(ChuteFunnelBlock.PUSHING); + + if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, world, pos)) + return BeltFunnelBlock.updateShape(equivalentBeltFunnel, world, pos); + if (ChuteFunnelBlock.isOnValidChute(equivalentChuteFunnel, world, pos)) + return equivalentChuteFunnel; + if (ChuteFunnelBlock.isOnValidChute(reversedChuteFunnel, world, pos)) + return reversedChuteFunnel; + + return state; + } + +} 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 new file mode 100644 index 000000000..2c49402db --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class FunnelRenderer extends SmartTileEntityRenderer { + + public FunnelRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(FunnelTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + + if (!te.hasFlap()) + return; + + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + SuperByteBuffer flapBuffer = AllBlockPartials.BELT_FUNNEL_FLAP.renderOn(te.getBlockState()); + Vec3d pivot = VecHelper.voxelSpace(0, 10, 9.5f); + MatrixStacker msr = MatrixStacker.of(ms); + + float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(te.getBlockState()) + .getOpposite()); + float f = te.flap.get(partialTicks); + + ms.push(); + msr.centre() + .rotateY(horizontalAngle) + .unCentre(); + + for (int segment = 0; segment <= 3; segment++) { + ms.push(); + + float intensity = segment == 3 ? 1.5f : segment + 1; + float abs = Math.abs(f); + float flapAngle = MathHelper.sin((float) ((1 - abs) * Math.PI * intensity)) * 30 * -f; + if (f > 0) + flapAngle *= .5f; + + msr.translate(pivot) + .rotateX(flapAngle) + .translateBack(pivot); + + flapBuffer.light(light) + .renderInto(ms, vb); + + ms.pop(); + ms.translate(-3 / 16f, 0, 0); + } + ms.pop(); + } + +} 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 fb2d2f541..007898fe3 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,119 +1,245 @@ package com.simibubi.create.content.logistics.block.funnel; +import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; + +import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllSoundEvents; -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.AttachedLogisticalBlock; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; +import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; 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.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.ExtractingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments; -import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.particles.ItemParticleData; -import net.minecraft.particles.ParticleTypes; 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.SoundCategory; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; public class FunnelTileEntity extends SmartTileEntity { private FilteringBehaviour filtering; private InsertingBehaviour inserting; - private ItemStack justEaten; + private ExtractingBehaviour extracting; + private DirectBeltInputBehaviour beltInputBehaviour; - public FunnelTileEntity(TileEntityType type) { - super(type); + int sendFlap; + InterpolatedChasingValue flap; + + static enum Mode { + INVALID, PAUSED, COLLECT, BELT, CHUTE_SIDE, CHUTE_END } - @Override - public void addBehaviours(List behaviours) { - filtering = new FilteringBehaviour(this, new FunnelFilterSlot()).withCallback(this::filterChanged); - behaviours.add(filtering); - inserting = new InsertingBehaviour(this, - Attachments.toward(() -> AttachedLogisticalBlock.getBlockFacing(getBlockState()))); - behaviours.add(inserting); + public FunnelTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + flap = new InterpolatedChasingValue().start(.25f) + .target(0) + .withSpeed(.05f); } - public void filterChanged(ItemStack stack) { - } + public Mode determineCurrentMode() { + BlockState state = getBlockState(); + if (!FunnelBlock.isFunnel(state)) + return Mode.INVALID; + if (state.has(BlockStateProperties.POWERED) && state.get(BlockStateProperties.POWERED)) + return Mode.PAUSED; + if (state.getBlock() instanceof BeltFunnelBlock) + return Mode.BELT; + if (state.getBlock() instanceof ChuteFunnelBlock) + return Mode.CHUTE_SIDE; - @Override - public CompoundNBT writeToClient(CompoundNBT tag) { - if (justEaten != null) { - tag.put("Nom", justEaten.serializeNBT()); - justEaten = null; - } - return super.writeToClient(tag); - } + Direction facing = FunnelBlock.getFunnelFacing(state); + BlockState input = world.getBlockState(pos.offset(facing)); - @Override - public void readClientUpdate(CompoundNBT tag) { - super.readClientUpdate(tag); - if (tag.contains("Nom")) - justEaten = ItemStack.read(tag.getCompound("Nom")); + if (AllBlocks.CHUTE.has(input)) + return Mode.CHUTE_END; + return Mode.COLLECT; } @Override public void tick() { super.tick(); - if (world.isRemote && justEaten != null) { - spawnParticles(justEaten); - justEaten = null; - } + Mode mode = determineCurrentMode(); + if (mode == Mode.BELT) + tickAsBeltFunnel(); + if (world.isRemote) + return; + if (mode == Mode.CHUTE_SIDE) + tickAsHorizontalChuteFunnel(); + if (mode == Mode.CHUTE_END) + tickAsVerticalChuteFunnel(); } - public ItemStack tryToInsert(ItemStack stack) { - if (!filtering.test(stack)) - return stack; - - ItemStack remainder = ItemStack.EMPTY; - - BeltTileEntity targetingBelt = getTargetingBelt(); - if (targetingBelt != null) { - Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()); - if (!targetingBelt.tryInsertingFromSide(facing, stack.copy(), false)) - remainder = stack; - } else { - remainder = inserting.insert(stack.copy(), false); - } - - if (remainder.isEmpty()) { - if (!world.isRemote) - world.playSound(null, pos, AllSoundEvents.BLOCK_FUNNEL_EAT.get(), SoundCategory.BLOCKS, .125f, 1f); - justEaten = stack.copy(); - } - - if (remainder.getCount() != stack.getCount()) - sendData(); - - return remainder; + public void tickAsHorizontalChuteFunnel() { + if (!getBlockState().get(ChuteFunnelBlock.PUSHING)) + return; + BlockPos chutePos = pos.offset(FunnelBlock.getFunnelFacing(getBlockState())); + TileEntity te = world.getTileEntity(chutePos); + if (!(te instanceof ChuteTileEntity)) + return; + ChuteTileEntity chute = (ChuteTileEntity) te; + extracting.setCallback(stack -> chute.setItem(stack, .5f)); + extracting.withAdditionalFilter(stack -> chute.getItem() + .isEmpty()); + extracting.extract(); } - protected BeltTileEntity getTargetingBelt() { - BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState())); - if (!AllBlocks.BELT.has(world.getBlockState(targetPos))) + public void tickAsVerticalChuteFunnel() { + Direction funnelFacing = FunnelBlock.getFunnelFacing(getBlockState()); + BlockPos chutePos = pos.offset(funnelFacing); + TileEntity te = world.getTileEntity(chutePos); + if (!(te instanceof ChuteTileEntity)) + return; + ChuteTileEntity chute = (ChuteTileEntity) te; + if (chute.getItemMotion() > 0 != (funnelFacing == Direction.UP)) + return; + extracting.setCallback(stack -> chute.setItem(stack)); + extracting.withAdditionalFilter(stack -> chute.getItem() + .isEmpty()); + extracting.extract(); + } + + public void tickAsBeltFunnel() { + BlockState blockState = getBlockState(); + Direction facing = blockState.get(BeltFunnelBlock.HORIZONTAL_FACING); + flap.tick(); + if (world.isRemote) + return; + + if (!blockState.get(BeltFunnelBlock.PUSHING)) { + // Belts handle insertion from their side + if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) + return; + TransportedItemStackHandlerBehaviour handler = + TileEntityBehaviour.get(world, pos.down(), TransportedItemStackHandlerBehaviour.TYPE); + if (handler == null) + return; + handler.handleCenteredProcessingOnAllItems(1 / 32f, this::collectFromHandler); + return; + } + + DirectBeltInputBehaviour inputBehaviour = + TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); + if (inputBehaviour == null) + return; + if (!inputBehaviour.canInsertFromSide(facing)) + return; + + extracting.setCallback(stack -> { + flap(false); + inputBehaviour.handleInsertion(stack, facing, false); + }); + + extracting.withAdditionalFilter(stack -> inputBehaviour.handleInsertion(stack, facing, true) + .isEmpty()); + extracting.extract(); + } + + private List collectFromHandler(TransportedItemStack stack) { + ItemStack toInsert = stack.stack.copy(); + if (!filtering.test(toInsert)) return null; - return BeltHelper.getSegmentTE(world, targetPos); + ItemStack remainder = inserting.insert(toInsert, false); + if (remainder.equals(stack.stack, false)) + return null; + List list = new ArrayList<>(); + flap(true); + if (remainder.isEmpty()) + return list; + TransportedItemStack changed = stack.copy(); + changed.stack = remainder; + list.add(changed); + return list; } - public void spawnParticles(ItemStack stack) { - Vec3i directionVec = getBlockState().get(BlockStateProperties.HORIZONTAL_FACING).getDirectionVec(); - float xSpeed = directionVec.getX() * 1 / 8f; - float zSpeed = directionVec.getZ() * 1 / 8f; - Vec3d vec = VecHelper.getCenterOf(pos); - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), vec.x, vec.y - 9 / 16f, vec.z, xSpeed, - 1 / 6f, zSpeed); + @Override + public void addBehaviours(List behaviours) { + Supplier>> direction = + Attachments.toward(() -> FunnelBlock.getFunnelFacing(getBlockState()) + .getOpposite()); + + inserting = new InsertingBehaviour(this, direction); + extracting = new ExtractingBehaviour(this, direction); + behaviours.add(inserting); + behaviours.add(extracting); + + filtering = new FilteringBehaviour(this, new FunnelFilterSlotPositioning()).showCountWhen(() -> { + BlockState blockState = getBlockState(); + return blockState.getBlock() instanceof HorizontalInteractionFunnelBlock + && blockState.get(HorizontalInteractionFunnelBlock.PUSHING) || determineCurrentMode() == Mode.CHUTE_END; + }); + filtering.onlyActiveWhen(this::supportsFiltering); + behaviours.add(filtering); + + beltInputBehaviour = new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput) + .setInsertionHandler(this::handleDirectBeltInput); + behaviours.add(beltInputBehaviour); + } + + private boolean supportsDirectBeltInput(Direction side) { + BlockState blockState = getBlockState(); + return blockState != null && blockState.getBlock() instanceof FunnelBlock + && blockState.get(FunnelBlock.FACING) == Direction.UP; + } + + private boolean supportsFiltering() { + BlockState blockState = getBlockState(); + return blockState != null && blockState.has(BlockStateProperties.POWERED); + } + + private ItemStack handleDirectBeltInput(TransportedItemStack stack, Direction side, boolean simulate) { + ItemStack inserted = stack.stack; + if (!filtering.test(inserted)) + return inserted; + if (determineCurrentMode() == Mode.PAUSED) + return inserted; + return inserting.insert(inserted, simulate); + } + + public void flap(boolean inward) { + sendFlap = inward ? 1 : -1; + sendData(); + } + + public boolean hasFlap() { + return getBlockState().getBlock() instanceof BeltFunnelBlock + && getBlockState().get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED; + } + + @Override + public CompoundNBT writeToClient(CompoundNBT compound) { + if (sendFlap != 0) { + compound.putInt("Flap", sendFlap); + sendFlap = 0; + } + return super.writeToClient(compound); + } + + @Override + public void readClientUpdate(CompoundNBT tag) { + if (tag.contains("Flap")) { + int direction = tag.getInt("Flap"); + flap.set(direction); + } + super.readClientUpdate(tag); + } + + @Override + public double getMaxRenderDistanceSquared() { + return hasFlap() ? super.getMaxRenderDistanceSquared() : 64; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java new file mode 100644 index 000000000..3216e1d8a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java @@ -0,0 +1,128 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +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.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.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.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; + +public abstract class HorizontalInteractionFunnelBlock extends HorizontalBlock implements IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final BooleanProperty PUSHING = BooleanProperty.create("pushing"); + private BlockEntry parent; + + public HorizontalInteractionFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { + super(p_i48377_1_); + this.parent = parent; + BlockState defaultState = getDefaultState().with(PUSHING, true); + 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(); + } + + @Override + protected void fillStateContainer(Builder p_206840_1_) { + if (hasPoweredProperty()) + p_206840_1_.add(POWERED); + super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, PUSHING)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + BlockState stateForPlacement = super.getStateForPlacement(ctx); + if (hasPoweredProperty()) + stateForPlacement = stateForPlacement.with(POWERED, ctx.getWorld() + .isBlockPowered(ctx.getPos())); + return stateForPlacement; + } + + @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() && !FunnelBlock.isFunnel(p_196243_4_) + || !p_196243_4_.hasTileEntity())) { + p_196243_2_.removeTileEntity(p_196243_3_); + } + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + return parent.asStack(); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, + BlockPos pos, BlockPos p_196271_6_) { + if (!canStillInteract(state, world, pos)) { + 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)); + } + return state; + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + return !world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING) + .getOpposite())) + .getShape(world, pos) + .isEmpty(); + } + + protected abstract boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos); + + @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 + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (!context.getWorld().isRemote) + context.getWorld() + .setBlockState(context.getPos(), state.cycle(PUSHING)); + return ActionResultType.SUCCESS; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/VerticalFunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/VerticalFunnelGenerator.java deleted file mode 100644 index 1c1ee2649..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/VerticalFunnelGenerator.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.content.logistics.block.funnel; - -import com.simibubi.create.foundation.data.SpecialBlockStateGen; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.RegistrateBlockstateProvider; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraftforge.client.model.generators.ModelFile; - -public class VerticalFunnelGenerator extends SpecialBlockStateGen { - - @Override - protected int getXRotation(BlockState state) { - return state.get(FunnelBlock.UPWARD) ? 270 : 90; - } - - @Override - protected int getYRotation(BlockState state) { - return (state.get(FunnelBlock.UPWARD) ? 180 : 0) + horizontalAngle(state.get(FunnelBlock.HORIZONTAL_FACING)); - } - - @Override - public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, - BlockState state) { - return prov.models() - .getExistingFile(prov.modLoc("block/funnel/vertical")); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java index 0bc4a69c4..12ff27a6e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java @@ -23,7 +23,8 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { public CrateBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(getDefaultState().with(FACING, Direction.UP).with(DOUBLE, false)); + setDefaultState(getDefaultState().with(FACING, Direction.UP) + .with(DOUBLE, false)); } @Override @@ -33,17 +34,18 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { @Override public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, - BlockPos currentPos, BlockPos facingPos) { + BlockPos currentPos, BlockPos facingPos) { boolean isDouble = stateIn.get(DOUBLE); Direction blockFacing = stateIn.get(FACING); boolean isFacingOther = facingState.getBlock() == this && facingState.get(DOUBLE) - && facingState.get(FACING) == facing.getOpposite(); + && facingState.get(FACING) == facing.getOpposite(); if (!isDouble) { if (!isFacingOther) return stateIn; - return stateIn.with(DOUBLE, true).with(FACING, facing); + return stateIn.with(DOUBLE, true) + .with(FACING, facing); } if (facing != blockFacing) @@ -59,18 +61,22 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { BlockPos pos = context.getPos(); World world = context.getWorld(); - if (!context.getPlayer().isSneaking()) { + if (context.getPlayer() == null || !context.getPlayer() + .isSneaking()) { for (Direction d : Direction.values()) { BlockState state = world.getBlockState(pos.offset(d)); if (state.getBlock() == this && !state.get(DOUBLE)) - return getDefaultState().with(FACING, d).with(DOUBLE, true); + return getDefaultState().with(FACING, d) + .with(DOUBLE, true); } } - Direction placedOnFace = context.getFace().getOpposite(); + Direction placedOnFace = context.getFace() + .getOpposite(); BlockState state = world.getBlockState(pos.offset(placedOnFace)); if (state.getBlock() == this && !state.get(DOUBLE)) - return getDefaultState().with(FACING, placedOnFace).with(DOUBLE, true); + return getDefaultState().with(FACING, placedOnFace) + .with(DOUBLE, true); return getDefaultState(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateInventory.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateInventory.java index ec1b4efca..e8da1b86d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateInventory.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateInventory.java @@ -35,7 +35,7 @@ public class CreativeCrateInventory implements IItemHandler { public ItemStack extractItem(int slot, int amount, boolean simulate) { ItemStack filter = te.filter.getFilter().copy(); if (!filter.isEmpty()) - filter.setCount(amount); + filter.setCount(Math.min(filter.getMaxStackSize(), amount)); return filter; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateTileEntity.java index a98bee4e5..af0fba545 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateTileEntity.java @@ -57,6 +57,12 @@ public class CreativeCrateTileEntity extends CrateTileEntity { otherCrate.filter.setFilter(filter); } + @Override + public void remove() { + if (itemHandler != null) + itemHandler.invalidate(); + } + private CreativeCrateTileEntity getOtherCrate() { if (!AllBlocks.CREATIVE_CRATE.has(getBlockState())) return null; @@ -72,8 +78,9 @@ public class CreativeCrateTileEntity extends CrateTileEntity { CreativeCrateTileEntity otherCrate = getOtherCrate(); if (otherCrate == null) return; - - filter.withCallback($ -> {}); + + filter.withCallback($ -> { + }); filter.setFilter(otherCrate.filter.getFilter()); filter.withCallback(this::filterChanged); } @@ -90,7 +97,8 @@ public class CreativeCrateTileEntity extends CrateTileEntity { @Override protected void rotate(BlockState state, MatrixStack ms) { - MatrixStacker.of(ms).rotateX(90); + MatrixStacker.of(ms) + .rotateX(90); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java new file mode 100644 index 000000000..696b987f0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java @@ -0,0 +1,90 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class ArmAngleTarget { + + static ArmAngleTarget NO_TARGET = new ArmAngleTarget(); + + float baseAngle; + float lowerArmAngle; + float upperArmAngle; + float headAngle; + + private ArmAngleTarget() { + lowerArmAngle = 155; + upperArmAngle = 60; + headAngle = -15; + } + + public ArmAngleTarget(BlockPos armPos, Vec3d pointTarget, Direction clawFacing, boolean ceiling) { +// if (ceiling) +// clawFacing = clawFacing.getOpposite(); + + Vec3d target = pointTarget; + Vec3d origin = VecHelper.getCenterOf(armPos) + .add(0, ceiling ? -4 / 16f : 4 / 16f, 0); + Vec3d clawTarget = target; + target = target.add(new Vec3d(clawFacing.getOpposite() + .getDirectionVec()).scale(.5f)); + + Vec3d diff = target.subtract(origin); + float horizontalDistance = (float) diff.mul(1, 0, 1) + .length(); + + float baseAngle = AngleHelper.deg(MathHelper.atan2(diff.x, diff.z)) + 180; + if (ceiling) { + diff = diff.mul(1, -1, 1); + baseAngle = 180 - baseAngle; + } + + float alphaOffset = AngleHelper.deg(MathHelper.atan2(diff.y, horizontalDistance)); + + float a = 18 / 16f; // lower arm length + float a2 = a * a; + float b = 17 / 16f; // upper arm length + float b2 = b * b; + float diffLength = + MathHelper.clamp(MathHelper.sqrt(diff.y * diff.y + horizontalDistance * horizontalDistance), 1 / 8f, a + b); + float diffLength2 = diffLength * diffLength; + + float alphaRatio = (-b2 + a2 + diffLength2) / (2 * a * diffLength); + float alpha = AngleHelper.deg(Math.acos(alphaRatio)) + alphaOffset; + float betaRatio = (-diffLength2 + a2 + b2) / (2 * b * a); + float beta = AngleHelper.deg(Math.acos(betaRatio)); + + if (Float.isNaN(alpha)) + alpha = 0; + if (Float.isNaN(beta)) + beta = 0; + + Vec3d headPos = new Vec3d(0, 0, 0); + headPos = VecHelper.rotate(headPos.add(0, b, 0), beta + 180, Axis.X); + headPos = VecHelper.rotate(headPos.add(0, a, 0), alpha - 90, Axis.X); + headPos = VecHelper.rotate(headPos, baseAngle, Axis.Y); + headPos = VecHelper.rotate(headPos, ceiling ? 180 : 0, Axis.X); + headPos = headPos.add(origin); + Vec3d headDiff = clawTarget.subtract(headPos); + + if (ceiling) + headDiff = headDiff.mul(1, -1, 1); + + float horizontalHeadDistance = (float) headDiff.mul(1, 0, 1) + .length(); + float headAngle = + (float) (alpha + beta + 135 - AngleHelper.deg(MathHelper.atan2(headDiff.y, horizontalHeadDistance))); + + this.lowerArmAngle = alpha; + this.upperArmAngle = beta; + this.headAngle = -headAngle; + this.baseAngle = baseAngle; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlock.java index 2f840700c..7265722c8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlock.java @@ -1,14 +1,24 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticBlock; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.block.ITE; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; @@ -21,29 +31,34 @@ import net.minecraft.world.World; public class ArmBlock extends KineticBlock implements ITE { + public static final BooleanProperty CEILING = BooleanProperty.create("ceiling"); + public ArmBlock(Properties properties) { super(properties); + setDefaultState(getDefaultState().with(CEILING, false)); + } + + @Override + protected void fillStateContainer(Builder p_206840_1_) { + super.fillStateContainer(p_206840_1_.add(CEILING)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + return getDefaultState().with(CEILING, ctx.getFace() == Direction.DOWN); } @Override public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { return true; } - + @Override - public ActionResultType onUse(BlockState p_225533_1_, World p_225533_2_, BlockPos p_225533_3_, - PlayerEntity p_225533_4_, Hand p_225533_5_, BlockRayTraceResult p_225533_6_) { - withTileEntityDo(p_225533_2_, p_225533_3_, ArmTileEntity::toggleRave); - return ActionResultType.SUCCESS; - } - - - @Override - public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return AllShapes.MECHANICAL_ARM; + return state.get(CEILING) ? AllShapes.MECHANICAL_ARM_CEILING : AllShapes.MECHANICAL_ARM; } - + @Override public Axis getRotationAxis(BlockState state) { return Axis.Y; @@ -59,4 +74,37 @@ public class ArmBlock extends KineticBlock implements ITE { return ArmTileEntity.class; } + @Override + public void onReplaced(BlockState p_196243_1_, World world, BlockPos pos, BlockState p_196243_4_, + boolean p_196243_5_) { + if (p_196243_1_.hasTileEntity() + && (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { + withTileEntityDo(world, pos, te -> { + if (!te.heldItem.isEmpty()) + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), te.heldItem); + }); + world.removeTileEntity(pos); + } + } + + @Override + public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, + Hand p_225533_5_, BlockRayTraceResult p_225533_6_) { + MutableBoolean success = new MutableBoolean(false); + withTileEntityDo(world, pos, te -> { + if (te.heldItem.isEmpty()) + return; + success.setTrue(); + if (world.isRemote) + return; + player.inventory.placeItemBackInInventory(world, te.heldItem); + te.heldItem = ItemStack.EMPTY; + te.phase = Phase.SEARCH_INPUTS; + te.markDirty(); + te.sendData(); + }); + + return success.booleanValue() ? ActionResultType.SUCCESS : ActionResultType.PASS; + } + } 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 new file mode 100644 index 000000000..7923b5adf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -0,0 +1,360 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableMap; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.saw.SawBlock; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.block.JukeboxBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.JukeboxTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public abstract class ArmInteractionPoint { + + static enum Mode { + DEPOSIT, TAKE + } + + BlockPos pos; + BlockState state; + Mode mode; + + private LazyOptional cachedHandler; + private ArmAngleTarget cachedAngles; + + private static ImmutableMap> POINTS = + ImmutableMap.>builder() + .put(new Belt(), Belt::new) + .put(new Depot(), Depot::new) + .put(new Saw(), Saw::new) + .put(new Chute(), Chute::new) + .put(new Jukebox(), Jukebox::new) + .put(new Basin(), Basin::new) + .put(new Millstone(), Millstone::new) + .put(new Funnel(), Funnel::new) + .put(new CrushingWheels(), CrushingWheels::new) + .build(); + + public ArmInteractionPoint() { + cachedHandler = LazyOptional.empty(); + } + + @OnlyIn(Dist.CLIENT) + void transformFlag(MatrixStack stack) {} + + AllBlockPartials getFlagType() { + return mode == Mode.TAKE ? AllBlockPartials.FLAG_LONG_OUT : AllBlockPartials.FLAG_LONG_IN; + } + + void cycleMode() { + mode = mode == Mode.DEPOSIT ? Mode.TAKE : Mode.DEPOSIT; + } + + Vec3d getInteractionPositionVector() { + return VecHelper.getCenterOf(pos); + } + + Direction getInteractionDirection() { + return Direction.DOWN; + } + + abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state); + + static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) { + for (ArmInteractionPoint armInteractionPoint : POINTS.keySet()) + if (armInteractionPoint.isValid(reader, pos, state)) + return true; + return false; + } + + ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) { + if (cachedAngles == null) + cachedAngles = + new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling); + return cachedAngles; + } + + @Nullable + IItemHandler getHandler(World world) { + if (!cachedHandler.isPresent()) { + TileEntity te = world.getTileEntity(pos); + if (te == null) + return null; + cachedHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP); + } + return cachedHandler.orElse(null); + } + + ItemStack insert(World world, ItemStack stack, boolean simulate) { + IItemHandler handler = getHandler(world); + if (handler == null) + return stack; + return ItemHandlerHelper.insertItem(handler, stack, simulate); + } + + ItemStack extract(World world, int slot, int amount, boolean simulate) { + IItemHandler handler = getHandler(world); + if (handler == null) + return ItemStack.EMPTY; + return handler.extractItem(slot, amount, simulate); + } + + ItemStack extract(World world, int slot, boolean simulate) { + return extract(world, slot, 64, simulate); + } + + int getSlotCount(World world) { + IItemHandler handler = getHandler(world); + if (handler == null) + return 0; + return handler.getSlots(); + } + + @Nullable + static ArmInteractionPoint createAt(IBlockReader world, BlockPos pos) { + BlockState state = world.getBlockState(pos); + ArmInteractionPoint point = null; + + for (ArmInteractionPoint armInteractionPoint : POINTS.keySet()) + if (armInteractionPoint.isValid(world, pos, state)) + point = POINTS.get(armInteractionPoint) + .get(); + + if (point != null) { + point.state = state; + point.pos = pos; + point.mode = Mode.DEPOSIT; + } + + return point; + } + + CompoundNBT serialize() { + CompoundNBT nbt = new CompoundNBT(); + nbt.put("Pos", NBTUtil.writeBlockPos(pos)); + NBTHelper.writeEnum(nbt, "Mode", mode); + return nbt; + } + + static ArmInteractionPoint deserialize(IBlockReader world, CompoundNBT nbt) { + BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos")); + ArmInteractionPoint interactionPoint = createAt(world, pos); + if (interactionPoint == null) + return null; + interactionPoint.mode = NBTHelper.readEnum(nbt, "Mode", Mode.class); + return interactionPoint; + } + + static abstract class TopFaceArmInteractionPoint extends ArmInteractionPoint { + + @Override + Vec3d getInteractionPositionVector() { + return new Vec3d(pos).add(.5f, 1, .5f); + } + + } + + static class Depot extends ArmInteractionPoint { + + @Override + Vec3d getInteractionPositionVector() { + return new Vec3d(pos).add(.5f, 14 / 16f, .5f); + } + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.DEPOT.has(state); + } + + } + + static class Saw extends Depot { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.RUNNING) + && state.get(SawBlock.FACING) == Direction.UP; + } + + } + + static class Millstone extends ArmInteractionPoint { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.MILLSTONE.has(state); + } + + } + + static class CrushingWheels extends TopFaceArmInteractionPoint { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(state); + } + + } + + static class Basin extends ArmInteractionPoint { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.BASIN.has(state); + } + + } + + static class Jukebox extends TopFaceArmInteractionPoint { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return state.getBlock() instanceof JukeboxBlock; + } + + @Override + int getSlotCount(World world) { + return 1; + } + + @Override + ItemStack insert(World world, ItemStack stack, boolean simulate) { + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof JukeboxTileEntity)) + return stack; + if (!(state.getBlock() instanceof JukeboxBlock)) + return stack; + JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock(); + JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity; + if (!jukeboxTE.getRecord() + .isEmpty()) + return stack; + ItemStack remainder = stack.copy(); + ItemStack toInsert = remainder.split(1); + if (!simulate && !world.isRemote) { + jukeboxBlock.insertRecord(world, pos, state, toInsert); + world.playEvent((PlayerEntity) null, 1010, pos, Item.getIdFromItem(toInsert.getItem())); + AllTriggers.triggerForNearbyPlayers(AllTriggers.MUSICAL_ARM, world, pos, 10); + } + return remainder; + } + + @Override + ItemStack extract(World world, int slot, int amount, boolean simulate) { + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof JukeboxTileEntity)) + return ItemStack.EMPTY; + if (!(state.getBlock() instanceof JukeboxBlock)) + return ItemStack.EMPTY; + JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity; + ItemStack itemstack = jukeboxTE.getRecord(); + if (itemstack.isEmpty()) + return ItemStack.EMPTY; + if (!simulate && !world.isRemote) { + world.playEvent(1010, pos, 0); + jukeboxTE.clear(); + world.setBlockState(pos, state.with(JukeboxBlock.HAS_RECORD, false), 2); + } + return itemstack; + } + + } + + static class Belt extends Depot { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()) + .getBlock() instanceof BeltTunnelBlock); + } + } + + static class Chute extends TopFaceArmInteractionPoint { + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.CHUTE.has(state); + } + } + + static class Funnel extends ArmInteractionPoint { + + @Override + Vec3d getInteractionPositionVector() { + return VecHelper.getCenterOf(pos) + .add(new Vec3d(FunnelBlock.getFunnelFacing(state) + .getDirectionVec()).scale(.5f)); + } + + @Override + int getSlotCount(World world) { + return 0; + } + + @Override + ItemStack extract(World world, int slot, int amount, boolean simulate) { + return ItemStack.EMPTY; + } + + @Override + Direction getInteractionDirection() { + return FunnelBlock.getFunnelFacing(state) + .getOpposite(); + } + + @Override + ItemStack insert(World world, ItemStack stack, boolean simulate) { + FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); + InsertingBehaviour inserter = TileEntityBehaviour.get(world, pos, InsertingBehaviour.TYPE); + BlockState state = world.getBlockState(pos); + if (state.has(BlockStateProperties.POWERED) && state.get(BlockStateProperties.POWERED)) + return stack; + if (inserter == null) + return stack; + if (filtering != null && !filtering.test(stack)) + return stack; + return inserter.insert(stack, simulate); + } + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return state.getBlock() instanceof FunnelBlock; + } + + @Override + void cycleMode() {} + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java new file mode 100644 index 000000000..7a5a181cc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java @@ -0,0 +1,180 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; +import com.simibubi.create.foundation.networking.AllPackets; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +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.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber(value = Dist.CLIENT) +public class ArmInteractionPointHandler { + + static List currentSelection = new ArrayList<>(); + static ItemStack currentItem; + + static long lastBlockPos = -1; + + @SubscribeEvent + public static void rightClickingBlocksSelectsThem(PlayerInteractEvent.RightClickBlock event) { + if (currentItem == null) + return; + BlockPos pos = event.getPos(); + World world = event.getWorld(); + if (!world.isRemote) + return; + + ArmInteractionPoint selected = getSelected(pos); + + if (selected == null) { + ArmInteractionPoint point = ArmInteractionPoint.createAt(world, pos); + if (point == null) + return; + selected = point; + put(point); + } + + selected.cycleMode(); + event.setCanceled(true); + event.setCancellationResult(ActionResultType.SUCCESS); + } + + @SubscribeEvent + public static void leftClickingBlocksDeselectsThem(PlayerInteractEvent.LeftClickBlock event) { + if (currentItem == null) + return; + if (!event.getWorld().isRemote) + return; + BlockPos pos = event.getPos(); + if (remove(pos) != null) { + event.setCanceled(true); + event.setCancellationResult(ActionResultType.SUCCESS); + } + } + + public static void flushSettings(BlockPos pos) { + if (currentItem == null) + return; + AllPackets.channel.sendToServer(new ArmPlacementPacket(currentSelection, pos)); + currentSelection.clear(); + currentItem = null; + } + + public static void tick() { + PlayerEntity player = Minecraft.getInstance().player; + + if (player == null) + return; + + ItemStack heldItemMainhand = player.getHeldItemMainhand(); + if (!AllBlocks.MECHANICAL_ARM.isIn(heldItemMainhand)) { + currentItem = null; + } else { + if (heldItemMainhand != currentItem) { + currentSelection.clear(); + currentItem = heldItemMainhand; + } + + drawOutlines(currentSelection); + } + + checkForWrench(heldItemMainhand); + } + + private static void checkForWrench(ItemStack heldItem) { + if (!AllItems.WRENCH.isIn(heldItem)) { + return; + } + + RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + if (!(objectMouseOver instanceof BlockRayTraceResult)) { + return; + } + + BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; + BlockPos pos = result.getPos(); + + TileEntity te = Minecraft.getInstance().world.getTileEntity(pos); + if (!(te instanceof ArmTileEntity)) { + lastBlockPos = -1; + currentSelection.clear(); + return; + } + + if (lastBlockPos == -1 || lastBlockPos != pos.toLong()) { + currentSelection.clear(); + ArmTileEntity arm = (ArmTileEntity) te; + arm.inputs.forEach(ArmInteractionPointHandler::put); + arm.outputs.forEach(ArmInteractionPointHandler::put); + lastBlockPos = pos.toLong(); + } + + if (lastBlockPos != -1) { + drawOutlines(currentSelection); + } + } + + private static void drawOutlines(Collection selection) { + World world = Minecraft.getInstance().world; + for (Iterator iterator = selection.iterator(); iterator.hasNext();) { + ArmInteractionPoint point = iterator.next(); + BlockPos pos = point.pos; + BlockState state = world.getBlockState(pos); + + if (!point.isValid(world, pos, state)) { + iterator.remove(); + continue; + } + + VoxelShape shape = state.getShape(world, pos); + if (shape.isEmpty()) + continue; + + int color = point.mode == Mode.DEPOSIT ? 0xffcb74 : 0x4f8a8b; + CreateClient.outliner.showAABB(point, shape.getBoundingBox() + .offset(pos)) + .colored(color) + .lineWidth(1 / 16f); + } + } + + private static void put(ArmInteractionPoint point) { + currentSelection.add(point); + } + + private static ArmInteractionPoint remove(BlockPos pos) { + ArmInteractionPoint result = getSelected(pos); + if (result != null) + currentSelection.remove(result); + return result; + } + + private static ArmInteractionPoint getSelected(BlockPos pos) { + for (ArmInteractionPoint point : currentSelection) { + if (point.pos.equals(pos)) + return point; + } + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java new file mode 100644 index 000000000..eff83fadb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class ArmItem extends BlockItem { + + public ArmItem(Block p_i48527_1_, Properties p_i48527_2_) { + super(p_i48527_1_, p_i48527_2_); + } + + @Override + public ActionResultType onItemUse(ItemUseContext ctx) { + World world = ctx.getWorld(); + BlockPos pos = ctx.getPos(); + if (ArmInteractionPoint.isInteractable(world, pos, world.getBlockState(pos))) + return ActionResultType.SUCCESS; + return super.onItemUse(ctx); + } + + @Override + protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, + BlockState p_195943_5_) { + if (world.isRemote) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ArmInteractionPointHandler.flushSettings(pos)); + return super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); + } + + @Override + public boolean canPlayerBreakBlockWhileHolding(BlockState state, World world, BlockPos pos, + PlayerEntity p_195938_4_) { + return !ArmInteractionPoint.isInteractable(world, pos, state); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java new file mode 100644 index 000000000..dcc51b7f7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import java.util.Collection; +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class ArmPlacementPacket extends SimplePacketBase { + + private Collection points; + private ListNBT receivedTag; + private BlockPos pos; + + public ArmPlacementPacket(Collection points, BlockPos pos) { + this.points = points; + this.pos = pos; + } + + public ArmPlacementPacket(PacketBuffer buffer) { + CompoundNBT nbt = buffer.readCompoundTag(); + receivedTag = nbt.getList("Points", NBT.TAG_COMPOUND); + pos = buffer.readBlockPos(); + } + + @Override + public void write(PacketBuffer buffer) { + CompoundNBT nbt = new CompoundNBT(); + ListNBT pointsNBT = new ListNBT(); + points.stream() + .map(ArmInteractionPoint::serialize) + .forEach(pointsNBT::add); + nbt.put("Points", pointsNBT); + buffer.writeCompoundTag(nbt); + buffer.writeBlockPos(pos); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + World world = player.world; + if (world == null) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity == null || !(tileEntity instanceof ArmTileEntity)) + return; + + ArmTileEntity arm = (ArmTileEntity) tileEntity; + arm.interactionPointTag = receivedTag; + }); + context.get() + .setPacketHandled(true); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index dd281191a..ba13e7bff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -12,9 +13,14 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; public class ArmRenderer extends KineticTileEntityRenderer { @@ -24,64 +30,90 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + protected void renderSafe(KineticTileEntity te, float pt, MatrixStack ms, IRenderTypeBuffer buffer, int light, + int overlay) { + super.renderSafe(te, pt, ms, buffer, light, overlay); + ArmTileEntity arm = (ArmTileEntity) te; IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); BlockState blockState = te.getBlockState(); MatrixStacker msr = MatrixStacker.of(ms); - - float angle = 0; - float clawAngle = -25; - float otherAngle = 0; int color = 0xFFFFFF; + + float baseAngle = arm.baseAngle.get(pt); + float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135; + float upperArmAngle = arm.upperArmAngle.get(pt) - 90; + float headAngle = arm.headAngle.get(pt); - boolean rave = te instanceof ArmTileEntity && ((ArmTileEntity) te).debugRave; + boolean rave = te instanceof ArmTileEntity && ((ArmTileEntity) te).phase == Phase.DANCING; + float renderTick = AnimationTickHolder.getRenderTick() + (te.hashCode() % 64); if (rave) { - clawAngle = angle = MathHelper.lerp((MathHelper.sin(AnimationTickHolder.getRenderTick() / 2) + 1) / 2, -45, 15); - otherAngle = MathHelper.lerp((MathHelper.sin(AnimationTickHolder.getRenderTick() / 4) + 1) / 2, -95, 95); + baseAngle = (renderTick * 10) % 360; + lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); + upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); + headAngle = -lowerArmAngle; color = ColorHelper.rainbowColor(AnimationTickHolder.ticks * 100); } ms.push(); - SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState); - SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState); - SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState); - SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState); - SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState); - SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState); + SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState).light(light); + SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState).light(light); + SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState).light(light); + SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState).light(light); + SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState).light(light); + SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState).light(light); msr.centre(); + + if (blockState.get(ArmBlock.CEILING)) + msr.rotateX(180); ms.translate(0, 4 / 16d, 0); - msr.rotateY(rave ? AnimationTickHolder.getRenderTick() * 10 : 0); + msr.rotateY(baseAngle); base.renderInto(ms, builder); ms.translate(0, 1 / 16d, -2 / 16d); - msr.rotateX(angle); + msr.rotateX(lowerArmAngle); ms.translate(0, -1 / 16d, 0); - lowerBody.color(color).renderInto(ms, builder); - + lowerBody.color(color) + .renderInto(ms, builder); + ms.translate(0, 12 / 16d, 12 / 16d); - msr.rotateX(-otherAngle / 2f); - upperBody.color(color).renderInto(ms, builder); - + msr.rotateX(upperArmAngle); + upperBody.color(color) + .renderInto(ms, builder); + ms.translate(0, 11 / 16d, -11 / 16d); - msr.rotateX(-angle); + msr.rotateX(headAngle); head.renderInto(ms, builder); - + ms.translate(0, 0, -4 / 16d); claw.renderInto(ms, builder); + ItemStack item = arm.heldItem; + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + boolean hasItem = !item.isEmpty(); + boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) + && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) + .isGui3d(); for (int flip : Iterate.positiveAndNegative) { ms.push(); ms.translate(0, flip * 3 / 16d, -1 / 16d); - msr.rotateX(flip * clawAngle); + msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); clawGrip.renderInto(ms, builder); ms.pop(); } + if (hasItem) { + float itemScale = isBlockItem ? .5f : .625f; + msr.rotateX(90); + ms.translate(0, -4 / 16f, 0); + ms.scale(itemScale, itemScale, itemScale); + itemRenderer + .renderItem(item, TransformType.FIXED, light, overlay, ms, buffer); + } + ms.pop(); } 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 30ba76250..77be7ffc7 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 @@ -1,45 +1,333 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Jukebox; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; +import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.gui.widgets.InterpolatedAngle; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.block.JukeboxBlock; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.common.util.Constants.NBT; public class ArmTileEntity extends KineticTileEntity { - boolean debugRave; - - public ArmTileEntity(TileEntityType typeIn) { - super(typeIn); - } - - @Override - public void lazyTick() { - if (hasWorld()) - if (world.rand.nextInt(100) == 0) - toggleRave(); - super.lazyTick(); + // Server + List inputs; + List outputs; + ListNBT interactionPointTag; + + // Both + float chasedPointProgress; + int chasedPointIndex; + ItemStack heldItem; + Phase phase; + + // Client + ArmAngleTarget previousTarget; + InterpolatedAngle lowerArmAngle; + InterpolatedAngle upperArmAngle; + InterpolatedAngle baseAngle; + InterpolatedAngle headAngle; + InterpolatedAngle clawAngle; + float previousBaseAngle; + boolean updateInteractionPoints; + + enum Phase { + SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING } - public void toggleRave() { + public ArmTileEntity(TileEntityType typeIn) { + super(typeIn); + inputs = new ArrayList<>(); + outputs = new ArrayList<>(); + heldItem = ItemStack.EMPTY; + phase = Phase.SEARCH_INPUTS; + baseAngle = new InterpolatedAngle(); + lowerArmAngle = new InterpolatedAngle(); + upperArmAngle = new InterpolatedAngle(); + headAngle = new InterpolatedAngle(); + clawAngle = new InterpolatedAngle(); + previousTarget = ArmAngleTarget.NO_TARGET; + previousBaseAngle = previousTarget.baseAngle; + updateInteractionPoints = true; + } + + @Override + public void tick() { + super.tick(); + initInteractionPoints(); + tickMovementProgress(); + if (world.isRemote) return; - debugRave = !debugRave; - markDirty(); - sendData(); + if (chasedPointProgress < 1) + return; + if (phase == Phase.MOVE_TO_INPUT) + collectItem(); + if (phase == Phase.MOVE_TO_OUTPUT) + depositItem(); } - + + @Override + public void lazyTick() { + super.lazyTick(); + + if (world.isRemote) + return; + if (chasedPointProgress < .5f) + return; + if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING) { + checkForMusic(); + searchForItem(); + } + if (phase == Phase.SEARCH_OUTPUTS) + searchForDestination(); + } + + private void checkForMusic() { + boolean hasMusic = checkForMusicAmong(inputs) || checkForMusicAmong(outputs); + if (hasMusic != (phase == Phase.DANCING)) { + phase = hasMusic ? Phase.DANCING : Phase.SEARCH_INPUTS; + markDirty(); + sendData(); + } + } + + private boolean checkForMusicAmong(List list) { + for (ArmInteractionPoint armInteractionPoint : list) { + if (!(armInteractionPoint instanceof Jukebox)) + continue; + BlockState state = world.getBlockState(armInteractionPoint.pos); + if (state.has(JukeboxBlock.HAS_RECORD) && state.get(JukeboxBlock.HAS_RECORD)) + return true; + } + return false; + } + + private void tickMovementProgress() { + chasedPointProgress += Math.min(256, Math.abs(getSpeed())) / 1024f; + if (chasedPointProgress > 1) + chasedPointProgress = 1; + if (!world.isRemote) + return; + + ArmInteractionPoint targetedInteractionPoint = getTargetedInteractionPoint(); + ArmAngleTarget previousTarget = this.previousTarget; + ArmAngleTarget target = targetedInteractionPoint == null ? ArmAngleTarget.NO_TARGET + : targetedInteractionPoint.getTargetAngles(pos, isOnCeiling()); + + baseAngle.set(AngleHelper.angleLerp(chasedPointProgress, previousBaseAngle, + target == ArmAngleTarget.NO_TARGET ? previousBaseAngle : target.baseAngle)); + + // Arm's angles first backup to resting position and then continue + if (chasedPointProgress < .5f) + target = ArmAngleTarget.NO_TARGET; + else + previousTarget = ArmAngleTarget.NO_TARGET; + float progress = chasedPointProgress == 1 ? 1 : (chasedPointProgress % .5f) * 2; + + lowerArmAngle.set(MathHelper.lerp(progress, previousTarget.lowerArmAngle, target.lowerArmAngle)); + upperArmAngle.set(MathHelper.lerp(progress, previousTarget.upperArmAngle, target.upperArmAngle)); + + headAngle.set(AngleHelper.angleLerp(progress, previousTarget.headAngle % 360, target.headAngle % 360)); + } + + protected boolean isOnCeiling() { + BlockState state = getBlockState(); + return hasWorld() && state != null && state.has(ArmBlock.CEILING) && state.get(ArmBlock.CEILING); + } + + @Nullable + private ArmInteractionPoint getTargetedInteractionPoint() { + if (chasedPointIndex == -1) + return null; + if (phase == Phase.MOVE_TO_INPUT && chasedPointIndex < inputs.size()) + return inputs.get(chasedPointIndex); + if (phase == Phase.MOVE_TO_OUTPUT && chasedPointIndex < outputs.size()) + return outputs.get(chasedPointIndex); + return null; + } + + protected void searchForItem() { + for (int index = 0; index < inputs.size(); index++) { + ArmInteractionPoint armInteractionPoint = inputs.get(index); + for (int i = 0; i < armInteractionPoint.getSlotCount(world); i++) { + if (getDistributableAmount(armInteractionPoint, i) == 0) + continue; + + phase = Phase.MOVE_TO_INPUT; + chasedPointIndex = index; + chasedPointProgress = 0; + sendData(); + markDirty(); + return; + } + } + } + + protected void searchForDestination() { + ItemStack held = heldItem.copy(); + for (int index = 0; index < outputs.size(); index++) { + ArmInteractionPoint armInteractionPoint = outputs.get(index); + ItemStack remainder = armInteractionPoint.insert(world, held, true); + if (remainder.equals(heldItem, false)) + continue; + + phase = Phase.MOVE_TO_OUTPUT; + chasedPointIndex = index; + chasedPointProgress = 0; + sendData(); + markDirty(); + return; + } + } + + protected int getDistributableAmount(ArmInteractionPoint armInteractionPoint, int i) { + ItemStack stack = armInteractionPoint.extract(world, i, true); + ItemStack remainder = simulateInsertion(stack); + return stack.getCount() - remainder.getCount(); + } + + protected void depositItem() { + ArmInteractionPoint armInteractionPoint = getTargetedInteractionPoint(); + if (armInteractionPoint != null) { + ItemStack toInsert = heldItem.copy(); + ItemStack remainder = armInteractionPoint.insert(world, toInsert, false); + heldItem = remainder; + } + phase = heldItem.isEmpty() ? Phase.SEARCH_INPUTS : Phase.SEARCH_OUTPUTS; + chasedPointProgress = 0; + chasedPointIndex = -1; + sendData(); + markDirty(); + + if (!world.isRemote) + AllTriggers.triggerForNearbyPlayers(AllTriggers.MECHANICAL_ARM, world, pos, 10); + } + + protected void collectItem() { + ArmInteractionPoint armInteractionPoint = getTargetedInteractionPoint(); + if (armInteractionPoint != null) + for (int i = 0; i < armInteractionPoint.getSlotCount(world); i++) { + int amountExtracted = getDistributableAmount(armInteractionPoint, i); + if (amountExtracted == 0) + continue; + + heldItem = armInteractionPoint.extract(world, i, amountExtracted, false); + phase = Phase.SEARCH_OUTPUTS; + chasedPointProgress = 0; + chasedPointIndex = -1; + sendData(); + markDirty(); + return; + } + + phase = Phase.SEARCH_INPUTS; + chasedPointProgress = 0; + chasedPointIndex = -1; + sendData(); + markDirty(); + } + + private ItemStack simulateInsertion(ItemStack stack) { + for (ArmInteractionPoint armInteractionPoint : outputs) { + stack = armInteractionPoint.insert(world, stack, true); + if (stack.isEmpty()) + break; + } + return stack; + } + + protected void initInteractionPoints() { + if (!updateInteractionPoints || interactionPointTag == null) + return; + inputs.clear(); + outputs.clear(); + for (INBT inbt : interactionPointTag) { + ArmInteractionPoint point = ArmInteractionPoint.deserialize(world, (CompoundNBT) inbt); + if (point == null) + continue; + if (point.mode == Mode.DEPOSIT) + outputs.add(point); + if (point.mode == Mode.TAKE) + inputs.add(point); + } + updateInteractionPoints = false; + sendData(); + markDirty(); + } + @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); - compound.putBoolean("DebugRave", debugRave); + + ListNBT pointsNBT = new ListNBT(); + inputs.stream() + .map(ArmInteractionPoint::serialize) + .forEach(pointsNBT::add); + outputs.stream() + .map(ArmInteractionPoint::serialize) + .forEach(pointsNBT::add); + + NBTHelper.writeEnum(compound, "Phase", phase); + compound.put("InteractionPoints", pointsNBT); + compound.put("HeldItem", heldItem.serializeNBT()); + compound.putInt("TargetPointIndex", chasedPointIndex); + compound.putFloat("MovementProgress", chasedPointProgress); return compound; } - + + @Override + public CompoundNBT writeToClient(CompoundNBT compound) { + super.writeToClient(compound); + return compound; + } + @Override public void read(CompoundNBT compound) { super.read(compound); - debugRave = compound.getBoolean("DebugRave"); + heldItem = ItemStack.read(compound.getCompound("HeldItem")); + phase = NBTHelper.readEnum(compound, "Phase", Phase.class); + chasedPointIndex = compound.getInt("TargetPointIndex"); + chasedPointProgress = compound.getFloat("MovementProgress"); + interactionPointTag = compound.getList("InteractionPoints", NBT.TAG_COMPOUND); + } + + @Override + public void readClientUpdate(CompoundNBT tag) { + int previousIndex = chasedPointIndex; + Phase previousPhase = phase; + ListNBT interactionPointTagBefore = interactionPointTag; + super.readClientUpdate(tag); + + boolean ceiling = isOnCeiling(); + if (interactionPointTagBefore == null || interactionPointTagBefore.size() != interactionPointTag.size()) + updateInteractionPoints = true; + if (previousIndex != chasedPointIndex || (previousPhase != phase)) { + ArmInteractionPoint previousPoint = null; + if (previousPhase == Phase.MOVE_TO_INPUT && previousIndex < inputs.size()) + previousPoint = inputs.get(previousIndex); + if (previousPhase == Phase.MOVE_TO_OUTPUT && previousIndex < outputs.size()) + previousPoint = outputs.get(previousIndex); + previousTarget = + previousPoint == null ? ArmAngleTarget.NO_TARGET : previousPoint.getTargetAngles(pos, ceiling); + if (previousPoint != null) + previousBaseAngle = previousPoint.getTargetAngles(pos, ceiling).baseAngle; + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java new file mode 100644 index 000000000..8fff2fd09 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.logistics.block.packager; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockReader; + +public class PackagerBlock extends HorizontalAxisKineticBlock { + + public PackagerBlock(Properties properties) { + super(properties); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.PACKAGER.create(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java new file mode 100644 index 000000000..eb43f54fd --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.block.packager; + +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 net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; + +public class PackagerRenderer extends KineticTileEntityRenderer { + + public PackagerRenderer(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); + AllBlockPartials.PACKAGER_SEALER.renderOn(te.getBlockState()) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + } + + @Override + protected BlockState getRenderedBlockState(KineticTileEntity te) { + return shaft(te.getBlockState() + .get(PackagerBlock.HORIZONTAL_AXIS)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerTileEntity.java new file mode 100644 index 000000000..89738885a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerTileEntity.java @@ -0,0 +1,13 @@ +package com.simibubi.create.content.logistics.block.packager; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; + +import net.minecraft.tileentity.TileEntityType; + +public class PackagerTileEntity extends KineticTileEntity { + + public PackagerTileEntity(TileEntityType typeIn) { + super(typeIn); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java index f24c11904..72ea19d51 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java @@ -28,7 +28,8 @@ public class RedstoneContactBlock extends ProperDirectionalBlock implements IPor public RedstoneContactBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERED, false).with(FACING, Direction.UP)); + setDefaultState(getDefaultState().with(POWERED, false) + .with(FACING, Direction.UP)); } @Override @@ -39,10 +40,13 @@ public class RedstoneContactBlock extends ProperDirectionalBlock implements IPor @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = getDefaultState().with(FACING, context.getNearestLookingDirection().getOpposite()); - Direction placeDirection = context.getFace().getOpposite(); + BlockState state = getDefaultState().with(FACING, context.getNearestLookingDirection() + .getOpposite()); + Direction placeDirection = context.getFace() + .getOpposite(); - if (context.getPlayer().isSneaking() || hasValidContact(context.getWorld(), context.getPos(), placeDirection)) + if ((context.getPlayer() != null && context.getPlayer() + .isSneaking()) || hasValidContact(context.getWorld(), context.getPos(), placeDirection)) state = state.with(FACING, placeDirection); if (hasValidContact(context.getWorld(), context.getPos(), state.get(FACING))) state = state.with(POWERED, true); @@ -52,7 +56,7 @@ public class RedstoneContactBlock extends ProperDirectionalBlock implements IPor @Override public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, - BlockPos currentPos, BlockPos facingPos) { + BlockPos currentPos, BlockPos facingPos) { if (facing != stateIn.get(FACING)) return stateIn; boolean hasValidContact = hasValidContact(worldIn, currentPos, facing); 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 80ded0153..bedc6d494 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 @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.redstone; import com.simibubi.create.AllShapes; 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.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.Iterate; @@ -164,6 +165,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE makeSummary(ItemStack filter) { List list = new ArrayList<>(); if (type == FilterType.REGULAR) { ItemStackHandler filterItems = getFilterItems(filter); - boolean blacklist = filter.getOrCreateTag().getBoolean("Blacklist"); + boolean blacklist = filter.getOrCreateTag() + .getBoolean("Blacklist"); list.add(TextFormatting.GOLD - + (blacklist ? Lang.translate("gui.filter.blacklist") : Lang.translate("gui.filter.whitelist"))); + + (blacklist ? Lang.translate("gui.filter.blacklist") : Lang.translate("gui.filter.whitelist"))); int count = 0; for (int i = 0; i < filterItems.getSlots(); i++) { if (count > 3) { @@ -93,7 +99,8 @@ public class FilterItem extends Item implements INamedContainerProvider { ItemStack filterStack = filterItems.getStackInSlot(i); if (filterStack.isEmpty()) continue; - list.add(TextFormatting.GRAY + "- " + filterStack.getDisplayName().getFormattedText()); + list.add(TextFormatting.GRAY + "- " + filterStack.getDisplayName() + .getFormattedText()); count++; } @@ -102,15 +109,17 @@ public class FilterItem extends Item implements INamedContainerProvider { } if (type == FilterType.ATTRIBUTE) { - WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag().getInt("WhitelistMode")]; + WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() + .getInt("WhitelistMode")]; list.add(TextFormatting.GOLD + (whitelistMode == WhitelistMode.WHITELIST_CONJ - ? Lang.translate("gui.attribute_filter.whitelist_conjunctive") - : whitelistMode == WhitelistMode.WHITELIST_DISJ - ? Lang.translate("gui.attribute_filter.whitelist_disjunctive") - : Lang.translate("gui.attribute_filter.blacklist"))); + ? Lang.translate("gui.attribute_filter.whitelist_conjunctive") + : whitelistMode == WhitelistMode.WHITELIST_DISJ + ? Lang.translate("gui.attribute_filter.whitelist_disjunctive") + : Lang.translate("gui.attribute_filter.blacklist"))); int count = 0; - ListNBT attributes = filter.getOrCreateTag().getList("MatchedAttributes", NBT.TAG_COMPOUND); + ListNBT attributes = filter.getOrCreateTag() + .getList("MatchedAttributes", NBT.TAG_COMPOUND); for (INBT inbt : attributes) { ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt); if (count > 3) { @@ -174,15 +183,17 @@ public class FilterItem extends Item implements INamedContainerProvider { private static boolean test(World world, ItemStack stack, ItemStack filter, boolean matchNBT) { if (filter.isEmpty()) return true; - + if (!(filter.getItem() instanceof FilterItem)) return (matchNBT ? ItemHandlerHelper.canItemStacksStack(filter, stack) - : ItemStack.areItemsEqual(filter, stack)); + : ItemStack.areItemsEqual(filter, stack)); if (AllItems.FILTER.get() == filter.getItem()) { ItemStackHandler filterItems = getFilterItems(filter); - boolean respectNBT = filter.getOrCreateTag().getBoolean("RespectNBT"); - boolean blacklist = filter.getOrCreateTag().getBoolean("Blacklist"); + boolean respectNBT = filter.getOrCreateTag() + .getBoolean("RespectNBT"); + boolean blacklist = filter.getOrCreateTag() + .getBoolean("Blacklist"); for (int slot = 0; slot < filterItems.getSlots(); slot++) { ItemStack stackInSlot = filterItems.getStackInSlot(slot); if (stackInSlot.isEmpty()) @@ -195,8 +206,10 @@ public class FilterItem extends Item implements INamedContainerProvider { } if (AllItems.ATTRIBUTE_FILTER.get() == filter.getItem()) { - WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag().getInt("WhitelistMode")]; - ListNBT attributes = filter.getOrCreateTag().getList("MatchedAttributes", NBT.TAG_COMPOUND); + WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() + .getInt("WhitelistMode")]; + ListNBT attributes = filter.getOrCreateTag() + .getList("MatchedAttributes", NBT.TAG_COMPOUND); for (INBT inbt : attributes) { ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt); boolean matches = attribute.appliesTo(stack, world); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java index e3c7808cd..8d49abeb4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java @@ -43,7 +43,9 @@ public class FilterScreenPacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); - + if (player == null) + return; + if (player.openContainer instanceof AbstractFilterContainer) { AbstractFilterContainer c = (AbstractFilterContainer) player.openContainer; if (option == Option.CLEAR) { diff --git a/src/main/java/com/simibubi/create/content/palettes/MetalBlock.java b/src/main/java/com/simibubi/create/content/palettes/MetalBlock.java new file mode 100644 index 000000000..cb2fc6e10 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/palettes/MetalBlock.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.palettes; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorldReader; + +public class MetalBlock extends Block { + private final boolean isBeaconBaseBlock; + + public MetalBlock(Properties properties) { + super(properties); + isBeaconBaseBlock = false; + } + + public MetalBlock(Properties properties, boolean isBeaconBaseBlock) { + super(properties); + this.isBeaconBaseBlock = isBeaconBaseBlock; + } + + @Override + public boolean isBeaconBase(BlockState state, IWorldReader world, BlockPos pos, BlockPos beacon) { + return isBeaconBaseBlock ? true : super.isBeaconBase(state, world, pos, beacon); + } +} diff --git a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java index dfe9b82b6..794016d13 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java +++ b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java @@ -4,6 +4,7 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import com.google.common.collect.ImmutableList; import com.simibubi.create.AllColorHandlers; +import com.simibubi.create.AllTags; import com.simibubi.create.Create; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.utility.Lang; @@ -38,13 +39,16 @@ public class PalettesVariantEntry { if (pattern.isTranslucent()) builder.addLayer(() -> RenderType::getTranslucent); + if (pattern == PaletteBlockPatterns.COBBLESTONE) + builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag); if (pattern.hasFoliage()) builder.onRegister(CreateRegistrate.blockColors(() -> AllColorHandlers::getGrassyBlock)); pattern.createCTBehaviour(variant) .ifPresent(b -> builder.onRegister(connectedTextures(b))); - + builder.recipe((c, p) -> { - p.stonecutting(DataIngredient.items(variant.getBaseBlock().get()), c::get); + p.stonecutting(DataIngredient.items(variant.getBaseBlock() + .get()), c::get); pattern.addRecipes(variant, c, p); }); diff --git a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java index a685417fc..c106c0046 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java @@ -4,7 +4,7 @@ import java.util.Optional; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; @@ -172,7 +172,7 @@ public abstract class LaunchedItem { @Override void place(World world) { // todo place belt - boolean isStart = state.get(BeltBlock.PART) == Part.START; + boolean isStart = state.get(BeltBlock.PART) == BeltPart.START; BlockPos offset = BeltBlock.nextSegmentPosition(state, BlockPos.ZERO, isStart); int i = length - 1; Axis axis = state.get(BeltBlock.HORIZONTAL_FACING).rotateY().getAxis(); diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index e8c11e98b..c28ad8bc9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Part; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; +import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; @@ -481,10 +481,10 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC // is highest belt? boolean isLastSegment = false; Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); - Slope slope = blockState.get(BeltBlock.SLOPE); + BeltSlope slope = blockState.get(BeltBlock.SLOPE); boolean positive = facing.getAxisDirection() == AxisDirection.POSITIVE; - boolean start = blockState.get(BeltBlock.PART) == Part.START; - boolean end = blockState.get(BeltBlock.PART) == Part.END; + boolean start = blockState.get(BeltBlock.PART) == BeltPart.START; + boolean end = blockState.get(BeltBlock.PART) == BeltPart.END; switch (slope) { case DOWNWARD: @@ -499,7 +499,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC isLastSegment = positive && end || !positive && start; } if (!isLastSegment) - blockState = (blockState.get(BeltBlock.PART) == Part.MIDDLE) ? Blocks.AIR.getDefaultState() + blockState = (blockState.get(BeltBlock.PART) == BeltPart.MIDDLE) ? Blocks.AIR.getDefaultState() : AllBlocks.SHAFT.getDefaultState() .with(ShaftBlock.AXIS, facing.rotateY() .getAxis()); 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 fe8a15868..521d74a2e 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 @@ -41,6 +41,8 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.thread.SidedThreadGroups; +import javax.annotation.Nonnull; + public class SchematicItem extends Item { public SchematicItem(Properties properties) { @@ -70,8 +72,10 @@ public class SchematicItem extends Item { @OnlyIn(value = Dist.CLIENT) public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { if (stack.hasTag()) { - if (stack.getTag().contains("File")) - tooltip.add(new StringTextComponent(TextFormatting.GOLD + stack.getTag().getString("File"))); + if (stack.getTag() + .contains("File")) + tooltip.add(new StringTextComponent(TextFormatting.GOLD + stack.getTag() + .getString("File"))); } else { tooltip.add(new StringTextComponent(TextFormatting.RED + Lang.translate("schematic.invalid"))); } @@ -95,12 +99,15 @@ public class SchematicItem extends Item { public static Template loadSchematic(ItemStack blueprint) { Template t = new Template(); - String owner = blueprint.getTag().getString("Owner"); - String schematic = blueprint.getTag().getString("File"); + String owner = blueprint.getTag() + .getString("Owner"); + String schematic = blueprint.getTag() + .getString("File"); String filepath = ""; - if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER) + if (Thread.currentThread() + .getThreadGroup() == SidedThreadGroups.SERVER) filepath = "schematics/uploaded/" + owner + "/" + schematic; else filepath = "schematics/" + schematic; @@ -121,9 +128,10 @@ public class SchematicItem extends Item { return t; } + @Nonnull @Override public ActionResultType onItemUse(ItemUseContext context) { - if (!onItemUse(context.getPlayer(), context.getHand())) + if (context.getPlayer() != null && !onItemUse(context.getPlayer(), context.getHand())) return super.onItemUse(context); return ActionResultType.SUCCESS; } @@ -138,7 +146,8 @@ public class SchematicItem extends Item { private boolean onItemUse(PlayerEntity player, Hand hand) { if (!player.isSneaking() || hand != Hand.MAIN_HAND) return false; - if (!player.getHeldItem(hand).hasTag()) + if (!player.getHeldItem(hand) + .hasTag()) return false; DistExecutor.runWhenOn(Dist.CLIENT, () -> this::displayBlueprintScreen); return true; diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java index f8f9a1e93..c69f1f822 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java @@ -49,6 +49,8 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); + if (player == null) + return; World world = player.world; if (world == null) return; diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java index 4f907675f..869f966f1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java @@ -32,6 +32,8 @@ public class SchematicPlacePacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); + if (player == null) + return; Template t = SchematicItem.loadSchematic(stack); PlacementSettings settings = SchematicItem.getSettings(stack); settings.setIgnoreEntities(false); diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java index 447745bd5..b8c37ac39 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java @@ -68,6 +68,8 @@ public class SchematicUploadPacket extends SimplePacketBase { .enqueueWork(() -> { ServerPlayerEntity player = context.get() .getSender(); + if (player == null) + return; if (code == BEGIN) { BlockPos pos = ((SchematicTableContainer) player.openContainer).getTileEntity() .getPos(); diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 8652270a3..87f2f5c3a 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -80,9 +80,9 @@ public class AllAdvancements implements IDataProvider { andesiteExpertLane(t, andesite_casing); - Advancement drill = - kinecticAdvancement("mechanical_drill", AllBlocks.MECHANICAL_DRILL.get(), TaskType.NORMAL).withParent(andesite_casing) - .register(t, id + ":mechanical_drill"); + Advancement drill = kinecticAdvancement("mechanical_drill", AllBlocks.MECHANICAL_DRILL.get(), TaskType.NORMAL) + .withParent(andesite_casing) + .register(t, id + ":mechanical_drill"); Advancement press = advancement("press", AllBlocks.MECHANICAL_PRESS.get(), TaskType.MILESTONE).withParent(andesite_casing) @@ -98,8 +98,9 @@ public class AllAdvancements implements IDataProvider { itemAdvancement("electron_tube", AllItems.ELECTRON_TUBE, TaskType.NORMAL).withParent(rose_quartz) .register(t, id + ":electron_tube"); - Advancement saw = kinecticAdvancement("mechanical_saw", AllBlocks.MECHANICAL_SAW.get(), TaskType.NORMAL).withParent(press) - .register(t, id + ":mechanical_saw"); + Advancement saw = + kinecticAdvancement("mechanical_saw", AllBlocks.MECHANICAL_SAW.get(), TaskType.NORMAL).withParent(press) + .register(t, id + ":mechanical_saw"); Advancement basin = advancement("basin", AllBlocks.BASIN.get(), TaskType.NORMAL).withParent(press) .withCriterion("0", placeBlock(AllBlocks.BASIN.get())) @@ -196,6 +197,20 @@ public class AllAdvancements implements IDataProvider { .withCriterion("0", AllTriggers.GIGA_EXTENDO.instance()) .register(t, id + ":dual_extendo_grip"); + Advancement mechanical_arm = advancement("mechanical_arm", AllBlocks.MECHANICAL_ARM.get(), TaskType.GOAL) + .withCriterion("0", placeBlock(AllBlocks.MECHANICAL_ARM.get())) + .withCriterion("1", isPowered(AllBlocks.MECHANICAL_ARM.get())) + .withCriterion("2", AllTriggers.MECHANICAL_ARM.instance()) + .withParent(brass_casing) + .register(t, id + ":mechanical_arm"); + + Advancement musical_arm = advancement("musical_arm", Items.MUSIC_DISC_13, TaskType.MILESTONE) + .withCriterion("0", placeBlock(AllBlocks.MECHANICAL_ARM.get())) + .withCriterion("1", isPowered(AllBlocks.MECHANICAL_ARM.get())) + .withCriterion("2", AllTriggers.MUSICAL_ARM.instance()) + .withParent(mechanical_arm) + .register(t, id + ":musical_arm"); + Advancement deployer = kinecticAdvancement("deployer", AllBlocks.DEPLOYER.get(), TaskType.GOAL).withParent(brass_casing) .register(t, id + ":deployer"); diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 34599e5fa..fe199f622 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -33,6 +33,8 @@ public class AllTriggers { UPGRADED_ZAPPER = simple("upgraded_zapper"), EXTENDO = simple("extendo"), GIGA_EXTENDO = simple("giga_extendo"), + MECHANICAL_ARM = simple("mechanical_arm"), + MUSICAL_ARM = simple("musical_arm"), MIXER_MIX = simple("mixer"); private static SimpleTrigger simple(String id) { diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java index 2f7045fd5..ffea6e247 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java @@ -11,7 +11,7 @@ import net.minecraft.world.ILightReader; public abstract class ConnectedTextureBehaviour { - class CTContext { + public class CTContext { boolean up, down, left, right; boolean topLeft, topRight, bottomLeft, bottomRight; } @@ -47,7 +47,7 @@ public abstract class ConnectedTextureBehaviour { return state.getBlock() == other.getBlock(); } - CTContext buildContext(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + public CTContext buildContext(ILightReader reader, BlockPos pos, BlockState state, Direction face) { CTContext context = new CTContext(); CTSpriteShiftEntry textureEntry = get(state, face); diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 354405087..45d17d4b4 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -1,19 +1,23 @@ package com.simibubi.create.foundation.command; -import java.util.function.Supplier; - +import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; - import net.minecraft.network.PacketBuffer; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.logging.log4j.LogManager; + +import java.util.function.Consumer; +import java.util.function.Supplier; public class ConfigureConfigPacket extends SimplePacketBase { - private String option; - private String value; + private final String option; + private final String value; public ConfigureConfigPacket(String option, String value) { this.option = option; @@ -34,11 +38,44 @@ public class ConfigureConfigPacket extends SimplePacketBase { @Override public void handle(Supplier ctx) { ctx.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - if (option.equals("rainbowDebug")) { - AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); + try { + Actions.valueOf(option).performAction(value); + } catch (IllegalArgumentException e) { + LogManager.getLogger().warn("Received ConfigureConfigPacket with invalid Option: " + option); } })); ctx.get().setPacketHandled(true); } + + enum Actions { + rainbowDebug((value) -> { + AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); + }), + overlayScreen((value) -> { + overlayScreenAction(); + }), + overlayReset((value) -> { + AllConfigs.CLIENT.overlayOffsetX.set(0); + AllConfigs.CLIENT.overlayOffsetY.set(0); + }), + + ; + + private final Consumer consumer; + + Actions(Consumer action) { + this.consumer = action; + } + + void performAction(String value){ + consumer.accept(value); + } + + @OnlyIn(Dist.CLIENT) + private static void overlayScreenAction(){ + //this doesn't work if i move it into the enum constructor like the other two. if there's a proper way to do this, please let me know + ScreenOpener.open(new GoggleConfigScreen()); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java b/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java index 27de9b3b2..9126dedba 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java @@ -10,6 +10,7 @@ public class CreateCommand { public CreateCommand(CommandDispatcher dispatcher) { dispatcher.register(Commands.literal("create") .then(ToggleDebugCommand.register()) + .then(OverlayConfigCommand.register()) .then(ClearBufferCacheCommand.register()) //.then(KillTPSCommand.register()) //Commented out for release ); diff --git a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java new file mode 100644 index 000000000..632782c06 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java @@ -0,0 +1,46 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.foundation.networking.AllPackets; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.PacketDistributor; + +public class OverlayConfigCommand { + + public static ArgumentBuilder register() { + return Commands.literal("overlay") + .requires(cs -> cs.hasPermissionLevel(0)) + .then(Commands.literal("reset") + .executes(ctx -> { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayReset.performAction("")); + + DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayReset.name(), ""))); + + ctx.getSource().sendFeedback(new StringTextComponent("reset overlay offset"), true); + + return 1; + }) + ) + .executes(ctx -> { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayScreen.performAction("")); + + DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayScreen.name(), ""))); + + ctx.getSource().sendFeedback(new StringTextComponent("window opened"), true); + + return 1; + }); + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java index a59870fa6..a12ec72d2 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import net.minecraft.command.CommandSource; @@ -21,12 +20,13 @@ public class ToggleDebugCommand { .then(Commands.argument("value", BoolArgumentType.bool()) .executes(ctx -> { boolean value = BoolArgumentType.getBool(ctx, "value"); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); + //DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.rainbowDebug.performAction(String.valueOf(value))); DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), - new ConfigureConfigPacket("rainbowDebug", String.valueOf(value)))); + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), String.valueOf(value)))); ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " rainbow debug"), true); diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index ee189517a..0bd1eb895 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -13,6 +13,9 @@ public class CClient extends ConfigBase { public ConfigBool rainbowDebug = b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); + public ConfigInt overlayOffsetX = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); + public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay"); + @Override public String getName() { return "client"; 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 4d8236df2..4b0c993a8 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -58,6 +58,11 @@ public class BlockStateGen { boolean customItem) { return (c, p) -> p.directionalBlock(c.get(), getBlockModel(customItem, c, p)); } + + public static NonNullBiConsumer, RegistrateBlockstateProvider> directionalBlockProviderIgnoresWaterlogged( + boolean customItem) { + return (c, p) -> directionalBlockIgnoresWaterlogged(c, p, getBlockModel(customItem, c, p)); + } public static NonNullBiConsumer, RegistrateBlockstateProvider> horizontalBlockProvider( boolean customItem) { @@ -99,17 +104,33 @@ public class BlockStateGen { // Generators + public static void directionalBlockIgnoresWaterlogged(DataGenContext ctx, + RegistrateBlockstateProvider prov, Function modelFunc) { + prov.getVariantBuilder(ctx.getEntry()) + .forAllStatesExcept(state -> { + Direction dir = state.get(BlockStateProperties.FACING); + return ConfiguredModel.builder() + .modelFile(modelFunc.apply(state)) + .rotationX(dir == Direction.DOWN ? 180 + : dir.getAxis() + .isHorizontal() ? 90 : 0) + .rotationY(dir.getAxis() + .isVertical() ? 0 : (((int) dir.getHorizontalAngle()) + 180) % 360) + .build(); + }, BlockStateProperties.WATERLOGGED); + } + public static void axisBlock(DataGenContext ctx, RegistrateBlockstateProvider prov, Function modelFunc) { prov.getVariantBuilder(ctx.getEntry()) - .forAllStates(state -> { + .forAllStatesExcept(state -> { Axis axis = state.get(BlockStateProperties.AXIS); return ConfiguredModel.builder() .modelFile(modelFunc.apply(state)) .rotationX(axis == Axis.Y ? 0 : 90) .rotationY(axis == Axis.X ? 90 : axis == Axis.Z ? 180 : 0) .build(); - }); + }, BlockStateProperties.WATERLOGGED); } public static void horizontalAxisBlock(DataGenContext ctx, 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 33bc15785..ad37336ba 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -4,10 +4,15 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import java.util.HashMap; import java.util.Map; +import java.util.function.Function; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.CasingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonGenerator; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelItem; import com.simibubi.create.content.logistics.block.inventories.CrateBlock; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.StandardCTBehaviour; @@ -16,7 +21,9 @@ import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.RenderType; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.PistonType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -44,6 +51,63 @@ public class BuilderTransformers { .simpleItem(); } + public static NonNullUnaryOperator> funnel( + String type, ResourceLocation particleTexture) { + return b -> { + return b.blockstate((c, p) -> { + Function model = s -> { + String powered = + s.has(BlockStateProperties.POWERED) && s.get(BlockStateProperties.POWERED) ? "_powered" : ""; + return p.models() + .withExistingParent("block/" + type + "_funnel" + powered, p.modLoc("block/funnel/block")) + .texture("2", p.modLoc("block/" + type + "_funnel_back")) + .texture("3", p.modLoc("block/" + type + "_funnel" + powered)) + .texture("4", p.modLoc("block/" + type + "_funnel_plating")) + .texture("particle", particleTexture); + }; + p.directionalBlock(c.get(), model); + }) + .item(FunnelItem::new) + .model((c, p) -> { + p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item")) + .texture("2", p.modLoc("block/" + type + "_funnel_back")) + .texture("3", p.modLoc("block/" + type + "_funnel")) + .texture("4", p.modLoc("block/" + type + "_funnel_plating")) + .texture("particle", particleTexture); + }) + .build(); + }; + } + + public static NonNullUnaryOperator> beltTunnel( + String type, ResourceLocation particleTexture) { + return b -> b.initialProperties(SharedProperties::stone) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate((c, p) -> p.getVariantBuilder(c.get()) + .forAllStates(state -> { + String id = "block/" + type + "_tunnel"; + String shapeName = state.get(BeltTunnelBlock.SHAPE) + .getName(); + return ConfiguredModel.builder() + .modelFile(p.models() + .withExistingParent(id + "/" + shapeName, p.modLoc("block/belt_tunnel/" + shapeName)) + .texture("0", p.modLoc(id)) + .texture("1", p.modLoc(id + "_top")) + .texture("particle", particleTexture)) + .rotationY(state.get(BeltTunnelBlock.HORIZONTAL_AXIS) == Axis.X ? 0 : 90) + .build(); + })) + .item(BeltTunnelItem::new) + .model((c, p) -> { + String id = type + "_tunnel"; + p.withExistingParent("item/" + id, p.modLoc("block/belt_tunnel/item")) + .texture("0", p.modLoc("block/" + id)) + .texture("1", p.modLoc("block/" + id + "_top")) + .texture("particle", particleTexture); + }) + .build(); + } + public static NonNullUnaryOperator> mechanicalPiston(PistonType type) { return b -> b.initialProperties(SharedProperties::stone) .properties(p -> p.nonOpaque()) diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index 7a24ac4c8..6c672ee18 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -3,14 +3,20 @@ package com.simibubi.create.foundation.data; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; +import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableObject; -import org.apache.commons.lang3.text.translate.JavaUnicodeEscaper; +import org.apache.commons.lang3.tuple.Pair; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -25,7 +31,6 @@ import net.minecraft.data.DirectoryCache; import net.minecraft.data.IDataProvider; import net.minecraft.util.JSONUtils; -@SuppressWarnings("deprecation") public class LangMerger implements IDataProvider { private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting() @@ -34,11 +39,18 @@ public class LangMerger implements IDataProvider { static final String CATEGORY_HEADER = "\t\"_\": \"->------------------------] %s [------------------------<-\","; private DataGenerator gen; - private List data; + + private List mergedLangData; + private Map> populatedLangData; + private Map> allLocalizedEntries; + private Map missingTranslationTally; public LangMerger(DataGenerator gen) { this.gen = gen; - this.data = new ArrayList<>(); + this.mergedLangData = new ArrayList<>(); + this.allLocalizedEntries = new HashMap<>(); + this.populatedLangData = new HashMap<>(); + this.missingTranslationTally = new HashMap<>(); } @Override @@ -50,11 +62,43 @@ public class LangMerger implements IDataProvider { public void act(DirectoryCache cache) throws IOException { Path path = this.gen.getOutputFolder() .resolve("assets/" + Create.ID + "/lang/" + "en_us.json"); + + for (Pair pair : getAllLocalizationFiles()) { + if (!pair.getRight() + .isJsonObject()) + continue; + Map localizedEntries = new HashMap<>(); + JsonObject jsonobject = pair.getRight() + .getAsJsonObject(); + jsonobject.entrySet() + .stream() + .forEachOrdered(entry -> { + String key = entry.getKey(); + if (key.startsWith("_")) + return; + String value = entry.getValue() + .getAsString(); + localizedEntries.put(key, value); + }); + String key = pair.getKey(); + allLocalizedEntries.put(key, localizedEntries); + populatedLangData.put(key, new ArrayList<>()); + missingTranslationTally.put(key, new MutableInt(0)); + } + collectExistingEntries(path); collectEntries(); - if (data.isEmpty()) + if (mergedLangData.isEmpty()) return; - save(cache, path); + + save(cache, mergedLangData, -1, path, "Merging en_us.json with hand-written lang entries..."); + for (Entry> localization : populatedLangData.entrySet()) { + String key = localization.getKey(); + Path populatedLangPath = this.gen.getOutputFolder() + .resolve("assets/" + Create.ID + "/lang/unfinished/" + key); + save(cache, localization.getValue(), missingTranslationTally.get(key) + .intValue(), populatedLangPath, "Populating " + key + " with missing entries..."); + } } private void collectExistingEntries(Path path) throws IOException { @@ -75,9 +119,9 @@ public class LangMerger implements IDataProvider { return; header = String.format(CATEGORY_HEADER, header); - data.add("\n"); - data.add(header); - data.add("\n\n"); + writeData("\n"); + writeData(header); + writeData("\n\n"); MutableObject previousKey = new MutableObject<>(""); jsonobject.entrySet() @@ -88,12 +132,29 @@ public class LangMerger implements IDataProvider { .getAsString(); if (!previousKey.getValue() .isEmpty() && shouldAddLineBreak(key, previousKey.getValue())) - data.add("\n"); - data.add(new LangEntry(key, value)); + writeData("\n"); + writeEntry(key, value); previousKey.setValue(key); }); - data.add("\n"); + writeData("\n"); + } + + private void writeData(String data) { + mergedLangData.add(data); + populatedLangData.values() + .forEach(l -> l.add(data)); + } + + private void writeEntry(String key, String value) { + mergedLangData.add(new LangEntry(key, value)); + populatedLangData.forEach((k, l) -> { + ForeignLangEntry entry = new ForeignLangEntry(key, value, allLocalizedEntries.get(k)); + if (entry.isMissing()) + missingTranslationTally.get(k) + .increment(); + l.add(entry); + }); } protected boolean shouldAddLineBreak(String key, String previousKey) { @@ -108,11 +169,37 @@ public class LangMerger implements IDataProvider { String[] split2 = previousKey.split("\\."); if (split.length == 0 || split2.length == 0) return false; - + // Start new paragraph if keys before second point do not match return !split[0].equals(split2[0]); } + private List> getAllLocalizationFiles() { + ArrayList> list = new ArrayList<>(); + + String filepath = "assets/" + Create.ID + "/lang/"; + try { + InputStream resourceAsStream = Create.class.getClassLoader() + .getResourceAsStream(filepath); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resourceAsStream)); + while (true) { + String readLine = bufferedReader.readLine(); + if (readLine == null) + break; + if (!readLine.endsWith(".json")) + continue; + if (readLine.startsWith("en_us") || readLine.startsWith("en_ud")) + continue; + list.add(Pair.of(readLine, FilesHelper.loadJsonResource(filepath + "/" + readLine))); + } + resourceAsStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return list; + } + private void collectEntries() { for (AllLangPartials partial : AllLangPartials.values()) { String fileName = Lang.asId(partial.name()); @@ -124,16 +211,18 @@ public class LangMerger implements IDataProvider { } } - private void save(DirectoryCache cache, Path target) throws IOException { - String data = createString(); - data = JavaUnicodeEscaper.outsideOf(0, 0x7f) - .translate(data); + private void save(DirectoryCache cache, List dataIn, int missingKeys, Path target, String message) + throws IOException { + String data = createString(dataIn, missingKeys); +// data = JavaUnicodeEscaper.outsideOf(0, 0x7f) +// .translate(data); String hash = IDataProvider.HASH_FUNCTION.hashUnencodedChars(data) .toString(); if (!Objects.equals(cache.getPreviousHash(target), hash) || !Files.exists(target)) { Files.createDirectories(target.getParent()); try (BufferedWriter bufferedwriter = Files.newBufferedWriter(target)) { + Create.logger.info(message); bufferedwriter.write(data); bufferedwriter.close(); } @@ -142,9 +231,11 @@ public class LangMerger implements IDataProvider { cache.recordHash(target, hash); } - protected String createString() { + protected String createString(List data, int missingKeys) { StringBuilder builder = new StringBuilder(); builder.append("{\n"); + if (missingKeys != -1) + builder.append("\t\"_\": \"Missing Localizations: " + missingKeys + "\",\n"); data.forEach(builder::append); builder.append("\t\"_\": \"Thank you for translating Create!\"\n\n"); builder.append("}"); @@ -169,4 +260,19 @@ public class LangMerger implements IDataProvider { } + private class ForeignLangEntry extends LangEntry { + + private boolean missing; + + ForeignLangEntry(String key, String value, Map localizationMap) { + super(key, localizationMap.getOrDefault(key, "UNLOCALIZED: " + value)); + missing = !localizationMap.containsKey(key); + } + + public boolean isMissing() { + return missing; + } + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java b/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java index 1b143ec12..2c25c51bd 100644 --- a/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java +++ b/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java @@ -14,11 +14,11 @@ public class SharedProperties { public static Block stone() { return Blocks.ANDESITE; } - + public static Block softMetal() { return Blocks.GOLD_BLOCK; } - + public static Block wooden() { return Blocks.STRIPPED_SPRUCE_WOOD; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedAngle.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedAngle.java new file mode 100644 index 000000000..d8dd660e8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedAngle.java @@ -0,0 +1,11 @@ +package com.simibubi.create.foundation.gui.widgets; + +import com.simibubi.create.foundation.utility.AngleHelper; + +public class InterpolatedAngle extends InterpolatedValue { + + public float get(float partialTicks) { + return AngleHelper.angleLerp(partialTicks, lastValue, value); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedChasingAngle.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedChasingAngle.java index 3dc30905e..b9f4f1cc2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedChasingAngle.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedChasingAngle.java @@ -4,6 +4,10 @@ import com.simibubi.create.foundation.utility.AngleHelper; public class InterpolatedChasingAngle extends InterpolatedChasingValue { + public float get(float partialTicks) { + return AngleHelper.angleLerp(partialTicks, lastValue, value); + } + @Override protected float getCurrentDiff() { return AngleHelper.getShortestAngleDiff(value, getTarget()); 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 40a1376d2..141a0499c 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.relays.advanced.sequencer.Config import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; import com.simibubi.create.content.curiosities.zapper.ZapperBeamPacket; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; @@ -44,6 +45,7 @@ public enum AllPackets { CONFIGURE_SCROLLABLE(ScrollValueUpdatePacket.class, ScrollValueUpdatePacket::new), CANCEL_FALL(CancelPlayerFallPacket.class, CancelPlayerFallPacket::new), EXTENDO_INTERACT(ExtendoGripInteractionPacket.class, ExtendoGripInteractionPacket::new), + PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new), diff --git a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java index e03a3fa5c..2ea47f60a 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java @@ -40,6 +40,8 @@ public class NbtPacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); + if (player == null) + return; if (slot == -1) { ItemStack heldItem = player.getHeldItem(hand); diff --git a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java index 0d8da4d47..ba3bd1f3b 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java @@ -35,6 +35,8 @@ public abstract class TileEntityConfigurationPacket public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); + if (player == null) + return; World world = player.world; if (world == null || world.getTileEntity(pos) == null) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java index af552df79..eeb6663ce 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; @@ -14,7 +14,7 @@ import net.minecraft.tileentity.TileEntityType; public abstract class SmartTileEntity extends SyncedTileEntity implements ITickableTileEntity { - private Map, TileEntityBehaviour> behaviours; + private Map, TileEntityBehaviour> behaviours; private boolean initialized; private boolean firstNbtRead; private int lazyTickRate; @@ -120,14 +120,14 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka behaviour.initialize(); } - protected void removeBehaviour(IBehaviourType type) { + protected void removeBehaviour(BehaviourType type) { TileEntityBehaviour remove = behaviours.remove(type); if (remove != null) remove.remove(); } @SuppressWarnings("unchecked") - protected T getBehaviour(IBehaviourType type) { + protected T getBehaviour(BehaviourType type) { if (behaviours.containsKey(type)) return (T) behaviours.get(type); return null; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java index 84712ba6b..c6aa76d99 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java @@ -1,13 +1,13 @@ package com.simibubi.create.foundation.tileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ILightReader; +import net.minecraft.world.IBlockReader; import net.minecraft.world.World; public abstract class TileEntityBehaviour { @@ -23,7 +23,7 @@ public abstract class TileEntityBehaviour { setLazyTickRate(10); } - public abstract IBehaviourType getType(); + public abstract BehaviourType getType(); public void initialize() { @@ -90,19 +90,19 @@ public abstract class TileEntityBehaviour { return tileEntity.getWorld(); } - public static T get(ILightReader reader, BlockPos pos, - IBehaviourType type) { + public static T get(IBlockReader reader, BlockPos pos, + BehaviourType type) { return get(reader.getTileEntity(pos), type); } - public static void destroy(ILightReader reader, BlockPos pos, - IBehaviourType type) { + public static void destroy(IBlockReader reader, BlockPos pos, + BehaviourType type) { T behaviour = get(reader.getTileEntity(pos), type); if (behaviour != null) behaviour.destroy(); } - public static T get(TileEntity te, IBehaviourType type) { + public static T get(TileEntity te, BehaviourType type) { if (te == null) return null; if (!(te instanceof SmartTileEntity)) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/IBehaviourType.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/IBehaviourType.java rename to src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java index bc3ff8758..0942955f5 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/IBehaviourType.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java @@ -2,6 +2,6 @@ package com.simibubi.create.foundation.tileEntity.behaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -public interface IBehaviourType { +public class BehaviourType { } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java index 630ed13b3..3bda767f3 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java @@ -138,12 +138,19 @@ public class ValueBox extends ChasingAABBOutline { ms.translate(17.5f, -5f, 7f); boolean isFilter = stack.getItem() instanceof FilterItem; + boolean isEmpty = stack.isEmpty(); + float scale = 1.5f; + ms.translate(-font.getStringWidth(countString), 0, 0); + if (isFilter) ms.translate(3, 8, 7.25f); + else if (isEmpty) { + ms.translate(-17, -2, 3f); + scale = 2f; + } else - ms.translate(-7 - font.getStringWidth(countString), 10, 10 + 1 / 4f); + ms.translate(-7, 10, 10 + 1 / 4f); - float scale = 1.5f; ms.scale(scale, scale, scale); drawString(ms, buffer, countString, 0, 0, isFilter ? 0xFFFFFF : 0xEDEDED); ms.translate(0, 0, -1 / 16f); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java index b9047e1ed..ad6efc0b1 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java @@ -98,8 +98,8 @@ public abstract class ValueBoxTransform { @Override protected Vec3d getLocalOffset(BlockState state) { Vec3d location = getSouthLocation(); - location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(direction), Axis.Y); - location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(direction), Axis.Z); + location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Axis.Y); + location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(getSide()), Axis.Z); return location; } @@ -107,8 +107,8 @@ public abstract class ValueBoxTransform { @Override protected void rotate(BlockState state, MatrixStack ms) { - float yRot = AngleHelper.horizontalAngle(direction) + 180; - float xRot = direction == Direction.UP ? 90 : direction == Direction.DOWN ? 270 : 0; + float yRot = AngleHelper.horizontalAngle(getSide()) + 180; + float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0; MatrixStacker.of(ms) .rotateY(yRot) .rotateX(xRot); @@ -116,18 +116,22 @@ public abstract class ValueBoxTransform { @Override public boolean shouldRender(BlockState state) { - return super.shouldRender(state) && isSideActive(state, direction); + return super.shouldRender(state) && isSideActive(state, getSide()); } @Override public boolean testHit(BlockState state, Vec3d localHit) { - return isSideActive(state, direction) && super.testHit(state, localHit); + return isSideActive(state, getSide()) && super.testHit(state, localHit); } protected boolean isSideActive(BlockState state, Direction direction) { return true; } + public Direction getSide() { + return direction; + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java new file mode 100644 index 000000000..2cb4f867a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java @@ -0,0 +1,68 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.belt; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; + +/** + * Behaviour for TileEntities which can process items on belts or depots beneath + * them. Currently only supports placement location 2 spaces above the belt + * block. Example use: Mechanical Press + */ +public class BeltProcessingBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + + public static enum ProcessingResult { + PASS, HOLD, REMOVE; + } + + private ProcessingCallback onItemEnter; + private ProcessingCallback continueProcessing; + + public BeltProcessingBehaviour(SmartTileEntity te) { + super(te); + onItemEnter = (s, i) -> ProcessingResult.PASS; + continueProcessing = (s, i) -> ProcessingResult.PASS; + } + + public BeltProcessingBehaviour whenItemEnters(ProcessingCallback callback) { + onItemEnter = callback; + return this; + } + + public BeltProcessingBehaviour whileItemHeld(ProcessingCallback callback) { + continueProcessing = callback; + return this; + } + + public static boolean isBlocked(IBlockReader world, BlockPos processingSpace) { + return !world.getBlockState(processingSpace.up()) + .getCollisionShape(world, processingSpace.up()) + .isEmpty(); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + public ProcessingResult handleReceivedItem(TransportedItemStack stack, + TransportedItemStackHandlerBehaviour inventory) { + return onItemEnter.apply(stack, inventory); + } + + public ProcessingResult handleHeldItem(TransportedItemStack stack, TransportedItemStackHandlerBehaviour inventory) { + return continueProcessing.apply(stack, inventory); + } + + @FunctionalInterface + public interface ProcessingCallback { + public ProcessingResult apply(TransportedItemStack stack, TransportedItemStackHandlerBehaviour inventory); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java new file mode 100644 index 000000000..9aa32a05b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java @@ -0,0 +1,76 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.belt; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +/** + * Behaviour for TileEntities to which belts can transfer items directly in a + * backup-friendly manner. Example uses: Basin, Saw, Depot + */ +public class DirectBeltInputBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + + private InsertionCallback tryInsert; + private AvailabilityPredicate canInsert; + + public DirectBeltInputBehaviour(SmartTileEntity te) { + super(te); + tryInsert = this::defaultInsertionCallback; + canInsert = d -> true; + } + + public DirectBeltInputBehaviour onlyInsertWhen(AvailabilityPredicate pred) { + canInsert = pred; + return this; + } + + public DirectBeltInputBehaviour setInsertionHandler(InsertionCallback callback) { + tryInsert = callback; + return this; + } + + private ItemStack defaultInsertionCallback(TransportedItemStack inserted, Direction side, boolean simulate) { + LazyOptional lazy = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side); + if (!lazy.isPresent()) + return inserted.stack; + return ItemHandlerHelper.insertItemStacked(lazy.orElse(null), inserted.stack.copy(), simulate); + } + + public boolean canInsertFromSide(Direction side) { + return canInsert.test(side); + } + + public ItemStack handleInsertion(ItemStack stack, Direction side, boolean simulate) { + return handleInsertion(new TransportedItemStack(stack), side, simulate); + } + + public ItemStack handleInsertion(TransportedItemStack stack, Direction side, boolean simulate) { + return tryInsert.apply(stack, side, simulate); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + @FunctionalInterface + public interface InsertionCallback { + public ItemStack apply(TransportedItemStack stack, Direction side, boolean simulate); + } + + @FunctionalInterface + public interface AvailabilityPredicate { + public boolean test(Direction side); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java new file mode 100644 index 000000000..4e667247a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java @@ -0,0 +1,60 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.belt; + +import java.util.List; +import java.util.function.Function; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.util.math.Vec3d; + +public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + private ProcessingCallback processingCallback; + private PositionGetter positionGetter; + + public TransportedItemStackHandlerBehaviour(SmartTileEntity te, ProcessingCallback processingCallback) { + super(te); + this.processingCallback = processingCallback; + positionGetter = t -> VecHelper.getCenterOf(te.getPos()); + } + + public TransportedItemStackHandlerBehaviour withStackPlacement(PositionGetter function) { + this.positionGetter = function; + return this; + } + + public void handleProcessingOnAllItems(Function> processFunction) { + handleCenteredProcessingOnAllItems(.51f, processFunction); + } + + public void handleCenteredProcessingOnAllItems(float maxDistanceFromCenter, + Function> processFunction) { + this.processingCallback.applyToAllItems(maxDistanceFromCenter, processFunction); + } + + public Vec3d getWorldPositionOf(TransportedItemStack transported) { + return positionGetter.getWorldPositionVector(transported); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + @FunctionalInterface + public interface ProcessingCallback { + public void applyToAllItems(float maxDistanceFromCenter, + Function> processFunction); + } + + @FunctionalInterface + public interface PositionGetter { + public Vec3d getWorldPositionVector(TransportedItemStack transported); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionBehaviour.java index acc3eb9ef..e4ca847e1 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionBehaviour.java @@ -4,7 +4,7 @@ import java.util.Optional; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.item.Item; import net.minecraft.util.Direction; @@ -13,8 +13,7 @@ import net.minecraft.world.World; public class EdgeInteractionBehaviour extends TileEntityBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); ConnectionCallback connectionCallback; ConnectivityPredicate connectivityPredicate; @@ -38,7 +37,7 @@ public class EdgeInteractionBehaviour extends TileEntityBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java index 0c18968c2..9dbffb81a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.VecHelper; @@ -15,13 +15,13 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public class FilteringBehaviour extends TileEntityBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); ValueBoxTransform slotPositioning; boolean showCount; @@ -31,6 +31,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public int count; private Consumer callback; private Supplier isActive; + private Supplier showCountPredicate; int scrollableValue; int ticksUntilScrollPacket; @@ -41,11 +42,13 @@ public class FilteringBehaviour extends TileEntityBehaviour { filter = ItemStack.EMPTY; slotPositioning = slot; showCount = false; - callback = stack -> {}; + callback = stack -> { + }; isActive = () -> true; textShift = Vec3d.ZERO; count = 0; ticksUntilScrollPacket = -1; + showCountPredicate = () -> showCount; } @Override @@ -96,12 +99,17 @@ public class FilteringBehaviour extends TileEntityBehaviour { callback = filterCallback; return this; } - + public FilteringBehaviour onlyActiveWhen(Supplier condition) { isActive = condition; return this; } + public FilteringBehaviour showCountWhen(Supplier condition) { + showCountPredicate = condition; + return this; + } + public FilteringBehaviour showCount() { showCount = true; return this; @@ -118,6 +126,10 @@ public class FilteringBehaviour extends TileEntityBehaviour { scrollableValue = count; } + public void setFilter(Direction face, ItemStack stack) { + setFilter(stack); + } + public void setFilter(ItemStack stack) { filter = stack.copy(); callback.accept(filter); @@ -139,20 +151,24 @@ public class FilteringBehaviour extends TileEntityBehaviour { super.destroy(); } + public ItemStack getFilter(Direction side) { + return getFilter(); + } + public ItemStack getFilter() { return filter.copy(); } public boolean isCountVisible() { - return showCount && !getFilter().isEmpty(); + return showCountPredicate.get(); } public boolean test(ItemStack stack) { - return filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); + return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } @@ -169,7 +185,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public boolean anyAmount() { return count == 0; } - + public boolean isActive() { return isActive.get(); } 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 b464b7eb9..c911e8680 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 @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.tileEntity.behaviour.filtering; import com.simibubi.create.AllKeys; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.utility.RaycastHelper; import net.minecraft.client.Minecraft; @@ -41,21 +43,31 @@ public class FilteringHandler { FilteringBehaviour behaviour = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); if (behaviour == null) return; - if (!behaviour.isActive()) - return; BlockRayTraceResult ray = RaycastHelper.rayTraceRange(world, player, 10); if (ray == null) return; + if (behaviour instanceof SidedFilteringBehaviour) { + behaviour = ((SidedFilteringBehaviour) behaviour).get(ray.getFace()); + if (behaviour == null) + return; + } + if (!behaviour.isActive()) + return; + if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) + ((Sided) behaviour.slotPositioning).fromSide(ray.getFace()); if (behaviour.testHit(ray.getHitVec())) { if (event.getSide() != LogicalSide.CLIENT) { - ItemStack heldItem = player.getHeldItem(hand).copy(); + ItemStack heldItem = player.getHeldItem(hand) + .copy(); if (!player.isCreative()) { - if (behaviour.getFilter().getItem() instanceof FilterItem) + if (behaviour.getFilter() + .getItem() instanceof FilterItem) player.inventory.placeItemBackInInventory(world, behaviour.getFilter()); if (heldItem.getItem() instanceof FilterItem) - player.getHeldItem(hand).shrink(1); + player.getHeldItem(hand) + .shrink(1); } if (heldItem.getItem() instanceof FilterItem) heldItem.setCount(1); @@ -87,12 +99,11 @@ public class FilteringHandler { return false; if (!filtering.isCountVisible()) return false; + if (filtering.slotPositioning instanceof ValueBoxTransform.Sided) + ((Sided) filtering.slotPositioning).fromSide(result.getFace()); if (!filtering.testHit(objectMouseOver.getHitVec())) return false; ItemStack filterItem = filtering.getFilter(); - if (filterItem.isEmpty()) - return false; - filtering.ticksUntilScrollPacket = 10; int maxAmount = (filterItem.getItem() instanceof FilterItem) ? 64 : filterItem.getMaxStackSize(); filtering.scrollableValue = 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 a1032566d..790e06234 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 @@ -9,6 +9,9 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox.ItemValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxRenderer; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; @@ -16,6 +19,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.world.ClientWorld; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; @@ -36,12 +40,19 @@ public class FilteringRenderer { BlockState state = world.getBlockState(pos); FilteringBehaviour behaviour = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); - if (behaviour == null) - return; - if (!behaviour.isActive()) - return; if (mc.player.isSneaking()) return; + if (behaviour == null) + return; + if (behaviour instanceof SidedFilteringBehaviour) { + behaviour = ((SidedFilteringBehaviour) behaviour).get(result.getFace()); + if (behaviour == null) + return; + } + if (!behaviour.isActive()) + return; + if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) + ((Sided) behaviour.slotPositioning).fromSide(result.getFace()); if (!behaviour.slotPositioning.shouldRender(state)) return; @@ -80,11 +91,35 @@ public class FilteringRenderer { if (!behaviour.isActive()) return; if (behaviour.getFilter() - .isEmpty()) + .isEmpty() && !(behaviour instanceof SidedFilteringBehaviour)) return; + ValueBoxTransform slotPositioning = behaviour.slotPositioning; + BlockState blockState = tileEntityIn.getBlockState(); + + if (slotPositioning instanceof ValueBoxTransform.Sided) { + ValueBoxTransform.Sided sided = (ValueBoxTransform.Sided) slotPositioning; + Direction side = sided.getSide(); + for (Direction d : Iterate.directions) { + ItemStack filter = behaviour.getFilter(d); + if (filter.isEmpty()) + continue; + + sided.fromSide(d); + if (!slotPositioning.shouldRender(blockState)) + continue; + + ms.push(); + slotPositioning.transform(blockState, ms); + ValueBoxRenderer.renderItemIntoValueBox(filter, ms, buffer, light, overlay); + ms.pop(); + } + sided.fromSide(side); + return; + } + ms.push(); - behaviour.slotPositioning.transform(tileEntityIn.getBlockState(), ms); + slotPositioning.transform(blockState, ms); ValueBoxRenderer.renderItemIntoValueBox(behaviour.getFilter(), ms, buffer, light, overlay); ms.pop(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java new file mode 100644 index 000000000..7dc6bf4e3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java @@ -0,0 +1,150 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.filtering; + +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Predicate; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.util.Constants.NBT; + +public class SidedFilteringBehaviour extends FilteringBehaviour { + + Map sidedFilters; + private BiFunction filterFactory; + private Predicate validDirections; + + public SidedFilteringBehaviour(SmartTileEntity te, ValueBoxTransform.Sided sidedSlot, + BiFunction filterFactory, + Predicate validDirections) { + super(te, sidedSlot); + this.filterFactory = filterFactory; + this.validDirections = validDirections; + sidedFilters = new IdentityHashMap<>(); + updateFilterPresence(); + } + + @Override + public void initialize() { + super.initialize(); + } + + public FilteringBehaviour get(Direction side) { + return sidedFilters.get(side); + } + + public void updateFilterPresence() { + Set valid = new HashSet<>(); + for (Direction d : Iterate.directions) + if (validDirections.test(d)) + valid.add(d); + for (Direction d : Iterate.directions) + if (valid.contains(d)) { + if (!sidedFilters.containsKey(d)) + sidedFilters.put(d, filterFactory.apply(d, new FilteringBehaviour(tileEntity, slotPositioning))); + } else if (sidedFilters.containsKey(d)) + removeFilter(d); + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.put("Filters", NBTHelper.writeCompoundList(sidedFilters.entrySet(), entry -> { + CompoundNBT compound = new CompoundNBT(); + compound.putInt("Side", entry.getKey() + .getIndex()); + entry.getValue() + .writeNBT(compound); + return compound; + })); + super.writeNBT(nbt); + } + + @Override + public void readNBT(CompoundNBT nbt) { + NBTHelper.iterateCompoundList(nbt.getList("Filters", NBT.TAG_COMPOUND), compound -> { + Direction face = Direction.byIndex(compound.getInt("Side")); + if (sidedFilters.containsKey(face)) + sidedFilters.get(face) + .readNBT(compound); + }); + super.readNBT(nbt); + } + + @Override + public CompoundNBT writeToClient(CompoundNBT nbt) { + nbt.put("Filters", NBTHelper.writeCompoundList(sidedFilters.entrySet(), entry -> { + CompoundNBT compound = new CompoundNBT(); + compound.putInt("Side", entry.getKey() + .getIndex()); + entry.getValue() + .writeToClient(compound); + return compound; + })); + return super.writeToClient(nbt); + } + + @Override + public void tick() { + super.tick(); + sidedFilters.values() + .forEach(FilteringBehaviour::tick); + } + + @Override + public void setFilter(Direction side, ItemStack stack) { + if (!sidedFilters.containsKey(side)) + return; + sidedFilters.get(side) + .setFilter(stack); + } + + @Override + public ItemStack getFilter(Direction side) { + if (!sidedFilters.containsKey(side)) + return ItemStack.EMPTY; + return sidedFilters.get(side) + .getFilter(); + } + + public boolean test(Direction side, ItemStack stack) { + if (!sidedFilters.containsKey(side)) + return true; + return sidedFilters.get(side) + .test(stack); + } + + @Override + public void destroy() { + sidedFilters.values() + .forEach(FilteringBehaviour::destroy); + super.destroy(); + } + + public void removeFilter(Direction side) { + if (!sidedFilters.containsKey(side)) + return; + sidedFilters.remove(side) + .destroy(); + } + + public boolean testHit(Direction direction, Vec3d hit) { + ValueBoxTransform.Sided sidedPositioning = (Sided) slotPositioning; + BlockState state = tileEntity.getBlockState(); + Vec3d localHit = hit.subtract(new Vec3d(tileEntity.getPos())); + return sidedPositioning.fromSide(direction) + .testHit(state, localHit); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/AutoExtractingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/AutoExtractingBehaviour.java index 4660656b2..ee95b4a82 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/AutoExtractingBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/AutoExtractingBehaviour.java @@ -7,7 +7,7 @@ import java.util.function.Supplier; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; @@ -15,8 +15,7 @@ import net.minecraft.util.math.BlockPos; public class AutoExtractingBehaviour extends ExtractingBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); private int delay; private int timer; @@ -85,7 +84,7 @@ public class AutoExtractingBehaviour extends ExtractingBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/ExtractingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/ExtractingBehaviour.java index c1bdbcf09..aff1a79e1 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/ExtractingBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/ExtractingBehaviour.java @@ -11,7 +11,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import net.minecraft.item.ItemStack; @@ -21,15 +21,19 @@ import net.minecraftforge.items.IItemHandler; public class ExtractingBehaviour extends InventoryManagementBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); private Function customAmountFilter; private Predicate customFilter; private Consumer callback; + public ExtractingBehaviour(SmartTileEntity te, Supplier>> attachments) { + this(te, attachments, item -> { + }); + } + public ExtractingBehaviour(SmartTileEntity te, Supplier>> attachments, - Consumer onExtract) { + Consumer onExtract) { super(te, attachments); customAmountFilter = stack -> 64; customFilter = stack -> true; @@ -90,7 +94,7 @@ public class ExtractingBehaviour extends InventoryManagementBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InsertingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InsertingBehaviour.java index e865065dc..4b18aad01 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InsertingBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InsertingBehaviour.java @@ -6,7 +6,7 @@ import java.util.function.Supplier; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; @@ -16,8 +16,7 @@ import net.minecraftforge.items.ItemHandlerHelper; public class InsertingBehaviour extends InventoryManagementBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); public InsertingBehaviour(SmartTileEntity te, Supplier>> attachments) { super(te, attachments); @@ -33,7 +32,7 @@ public class InsertingBehaviour extends InventoryManagementBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InventoryManagementBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InventoryManagementBehaviour.java index b44a390c5..0318f0375 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InventoryManagementBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InventoryManagementBehaviour.java @@ -11,7 +11,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; @@ -28,8 +28,7 @@ public class InventoryManagementBehaviour extends TileEntityBehaviour { private Supplier>> attachments; private List activeHandlers; - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); public InventoryManagementBehaviour(SmartTileEntity te, Supplier>> attachments) { super(te); @@ -98,7 +97,7 @@ public class InventoryManagementBehaviour extends TileEntityBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SingleTargetAutoExtractingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SingleTargetAutoExtractingBehaviour.java index be0c8a8e3..763b83034 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SingleTargetAutoExtractingBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SingleTargetAutoExtractingBehaviour.java @@ -4,7 +4,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -13,16 +13,14 @@ import net.minecraft.util.math.BlockPos; public class SingleTargetAutoExtractingBehaviour extends AutoExtractingBehaviour { - public static IBehaviourType TYPE = - new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); private Supplier attachmentDirection; boolean synced; boolean advantageOnNextSync; public SingleTargetAutoExtractingBehaviour(SmartTileEntity te, Supplier attachmentDirection, - Consumer onExtract, int delay) { + Consumer onExtract, int delay) { super(te, Attachments.toward(attachmentDirection), onExtract, delay); this.attachmentDirection = attachmentDirection; synced = true; @@ -49,7 +47,8 @@ public class SingleTargetAutoExtractingBehaviour extends AutoExtractingBehaviour @Override public boolean extract() { if (synced) { - BlockPos invPos = tileEntity.getPos().offset(attachmentDirection.get()); + BlockPos invPos = tileEntity.getPos() + .offset(attachmentDirection.get()); return SynchronizedExtraction.extractSynchronized(getWorld(), invPos); } else return extractFromInventory(); @@ -60,7 +59,7 @@ public class SingleTargetAutoExtractingBehaviour extends AutoExtractingBehaviour } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 9bfb26ab5..6d96d6a9b 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import net.minecraft.block.BlockState; @@ -21,8 +21,7 @@ import net.minecraft.util.math.Vec3d; public class LinkBehaviour extends TileEntityBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); enum Mode { TRANSMIT, RECEIVE @@ -162,7 +161,7 @@ public class LinkBehaviour extends TileEntityBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java index 59be89235..a9585d883 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java @@ -6,7 +6,7 @@ import java.util.function.Function; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import net.minecraft.block.BlockState; @@ -16,8 +16,7 @@ import net.minecraft.util.math.Vec3d; public class ScrollValueBehaviour extends TileEntityBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); ValueBoxTransform slotPositioning; Vec3d textShift; @@ -162,7 +161,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/simple/DeferralBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/simple/DeferralBehaviour.java index 9650fbe92..b9a195aa7 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/simple/DeferralBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/simple/DeferralBehaviour.java @@ -4,14 +4,13 @@ import java.util.function.Supplier; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.IBehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.nbt.CompoundNBT; public class DeferralBehaviour extends TileEntityBehaviour { - public static IBehaviourType TYPE = new IBehaviourType() { - }; + public static BehaviourType TYPE = new BehaviourType<>(); private boolean needsUpdate; private Supplier callback; @@ -45,7 +44,7 @@ public class DeferralBehaviour extends TileEntityBehaviour { } @Override - public IBehaviourType getType() { + public BehaviourType getType() { return TYPE; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java index 86a15ee16..bf6fe0122 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java @@ -10,7 +10,7 @@ import net.minecraft.util.math.BlockPos; public class Iterate { public static final boolean[] trueAndFalse = { true, false }; - public static final int[] zeroAndOne = { 1, -1 }; + public static final int[] zeroAndOne = { 0, 1 }; public static final int[] positiveAndNegative = { 1, -1 }; public static final Direction[] directions = Direction.values(); public static final Direction[] horizontalDirections = getHorizontals(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java index 2c971b671..cdb413a78 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import java.util.function.Function; import net.minecraft.item.ItemStack; @@ -12,8 +13,9 @@ import net.minecraft.util.math.AxisAlignedBB; public class NBTHelper { - public static > T readEnum(String name, Class enumClass) { + public static > T readEnum(CompoundNBT nbt, String key, Class enumClass) { T[] enumConstants = enumClass.getEnumConstants(); + String name = nbt.getString(key); if (enumConstants == null) throw new IllegalArgumentException("Non-Enum class passed to readEnum(): " + enumClass.getName()); for (T t : enumConstants) { @@ -22,12 +24,12 @@ public class NBTHelper { } return enumConstants[0]; } - - public static > String writeEnum(T enumConstant) { - return enumConstant.name(); + + public static > void writeEnum(CompoundNBT nbt, String key, T enumConstant) { + nbt.putString(key, enumConstant.name()); } - - public static ListNBT writeCompoundList(List list, Function serializer) { + + public static ListNBT writeCompoundList(Iterable list, Function serializer) { ListNBT listNBT = new ListNBT(); list.forEach(t -> listNBT.add(serializer.apply(t))); return listNBT; @@ -39,6 +41,10 @@ public class NBTHelper { return list; } + public static void iterateCompoundList(ListNBT listNBT, Consumer consumer) { + listNBT.forEach(inbt -> consumer.accept((CompoundNBT) inbt)); + } + public static ListNBT writeItemList(List stacks) { return writeCompoundList(stacks, ItemStack::serializeNBT); } diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java b/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java index 892d93ef7..101edd2c2 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java @@ -5,6 +5,7 @@ import java.util.OptionalDouble; import java.util.Random; import com.simibubi.create.content.curiosities.tools.SandPaperItem; +import com.simibubi.create.content.palettes.MetalBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -20,7 +21,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class OxidizingBlock extends Block { +public class OxidizingBlock extends MetalBlock { public static final IntegerProperty OXIDIZATION = IntegerProperty.create("oxidization", 0, 7); private float chance; @@ -30,6 +31,12 @@ public class OxidizingBlock extends Block { this.chance = chance; setDefaultState(getDefaultState().with(OXIDIZATION, 0)); } + + public OxidizingBlock(Properties properties, float chance, boolean isBeaconBaseBlock) { + super(properties, isBeaconBaseBlock); + this.chance = chance; + setDefaultState(getDefaultState().with(OXIDIZATION, 0)); + } @Override protected void fillStateContainer(Builder builder) { diff --git a/src/main/resources/assets/create/lang/Localization Readme.txt b/src/main/resources/assets/create/lang/Localization Readme.txt index 83027e56e..eeb95b6a7 100644 --- a/src/main/resources/assets/create/lang/Localization Readme.txt +++ b/src/main/resources/assets/create/lang/Localization Readme.txt @@ -1,4 +1,10 @@ Hi there! Looking to contribute with a localization? Wonderful. -You will find the english lang file here: -https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/generated/resources/assets/create/lang/en_us.json \ No newline at end of file + +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 +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 diff --git a/src/main/resources/assets/create/lang/default/advancements.json b/src/main/resources/assets/create/lang/default/advancements.json index fe016827a..9efbca048 100644 --- a/src/main/resources/assets/create/lang/default/advancements.json +++ b/src/main/resources/assets/create/lang/default/advancements.json @@ -61,6 +61,10 @@ "advancement.create.crafter.desc": "Place and power some Mechanical Crafters", "advancement.create.deployer": "Poke, Place, and Attack", "advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.mechanical_arm": "Mechanical Grab'n'Drop", + "advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do all the work for you.", + "advancement.create.musical_arm": "Play me my Theme Tune!", + "advancement.create.musical_arm.desc": "Watch a Mechanical Arm operate your Jukebox.", "advancement.create.fist_bump": "Pound It, Bro!", "advancement.create.fist_bump.desc": "Make two Deployers fist-bump.", "advancement.create.crushing_wheel": "A Pair of Giants", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 2eb783b07..04933d1bf 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -343,6 +343,15 @@ "create.tooltip.analogStrength": "Analog Strength: %1$s/15", "create.mechanical_mixer.min_ingredients": "Min. Ingredients", + "create.gui.config.overlay1": "Hi :)", + "create.gui.config.overlay2": "This is a sample overlay", + "create.gui.config.overlay3": "Click or drag with your mouse", + "create.gui.config.overlay4": "to move this preview", + "create.gui.config.overlay5": "Press ESC to exit this screen", + "create.gui.config.overlay6": "and save the new position", + "create.gui.config.overlay7": "Run /create overlay reset", + "create.gui.config.overlay8": "to reset to the default position", + "create.command.killTPSCommand": "killtps", "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", diff --git a/src/main/resources/assets/create/lang/nl_nl.json b/src/main/resources/assets/create/lang/nl_nl.json index d5d8c298e..8d9108149 100644 --- a/src/main/resources/assets/create/lang/nl_nl.json +++ b/src/main/resources/assets/create/lang/nl_nl.json @@ -194,7 +194,7 @@ "create.recipe.smoking_via_fan": "Bulk Rook", "create.recipe.smoking_via_fan.fan": "Ventilator achter vuur", "create.recipe.blasting_via_fan": "Bulk Smelten", - "create.recipe.blasting_via_fan.fan": "\"Ventilator achter Lava", + "create.recipe.blasting_via_fan.fan": "Ventilator achter Lava", "create.recipe.pressing": "Persen", "create.recipe.mixing": "Mengen", "create.recipe.packing": "Compressen", diff --git a/src/main/resources/assets/create/models/block/belt/downward_end.json b/src/main/resources/assets/create/models/block/belt/downward_end.json index b6a3245a9..af1981e69 100644 --- a/src/main/resources/assets/create/models/block/belt/downward_end.json +++ b/src/main/resources/assets/create/models/block/belt/downward_end.json @@ -1,73 +1,128 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Top", - "from": [ 1.0, 11.0, 9.2 ], - "to": [ 15.0, 13.0, 15.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 7.0 ], "rotation": 270 }, - "south": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 7.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ] } - } - }, - { - "name": "Bottom", - "from": [ 1.0, 3.0, 5.9 ], - "to": [ 15.0, 5.0, 15.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 15.0 ], "rotation": 90 }, - "south": { "texture": "#0", "uv": [ 1.0, 5.0, 15.0, 3.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 15.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 6.0, 15.0, 15.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 6.0, 15.0, 15.0 ], "rotation": 180 } - } - }, - { - "name": "Side", - "from": [ 1.0, 4.0, 14.0 ], - "to": [ 15.0, 12.0, 16.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 12.0 ], "rotation": 180 }, - "south": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 12.0 ], "rotation": 180 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ] } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, -3.325 ], - "to": [ 15.0, 13.0, 6.7 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 5.8, 15.0, 16.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 5.8, 15.0, 16.0 ] } - } - }, - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, -3.325 ], - "to": [ 15.0, 5.0, 10.1 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 13.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 13.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 13.0 ], "rotation": 180 } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Top", + "from": [0.9, 11, 9.2], + "to": [15.1, 13, 15], + "faces": { + "east": {"uv": [0, 1, 2, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 6.8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 1, 15, 6.8], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [2.9, 10, 9.2], + "to": [13.1, 11, 14], + "faces": { + "east": {"uv": [2, 2, 3, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "west": {"uv": [13, 2, 14, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 6.8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [3, 2, 13, 7], "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [0.9, 3, 5.9], + "to": [15.1, 5, 15], + "faces": { + "east": {"uv": [0, 6, 2, 15], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 5, 15, 3], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 6, 16, 15], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 6, 15, 15], "texture": "#0"}, + "down": {"uv": [1, 6, 15, 15], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [2.9, 5, 5.9], + "to": [13.1, 6, 14], + "faces": { + "east": {"uv": [2, 6, 3, 14], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 5, 15, 3], "rotation": 180, "texture": "#0"}, + "west": {"uv": [13, 6, 14, 14], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 7, 13, 15], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [1, 4, 14], + "to": [15, 12, 16], + "faces": { + "north": {"uv": [1, 4, 15, 12], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 4, 2, 12], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 4, 16, 12], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "down": {"uv": [1, 11, 15, 13], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [2.9, 6, 13], + "to": [13.1, 10, 14], + "faces": { + "north": {"uv": [3, 6, 13, 10], "rotation": 180, "texture": "#0"}, + "east": {"uv": [2, 6, 3, 10], "rotation": 180, "texture": "#0"}, + "west": {"uv": [13, 6, 14, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, -3.325], + "to": [15, 13, 6.7], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 7, 15, 9], "texture": "#0"}, + "east": {"uv": [0, 6, 2, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 6, 16, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 6, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 5.8, 15, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, -3.325], + "to": [13, 11, 6.7], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [2, 6, 3, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 6, 14, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 5.8, 13, 16], "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [1, 3, -3.325], + "to": [15, 5, 10.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 7, 15, 9], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 13], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 13], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 13], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 13], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, -3.325], + "to": [13, 6, 9.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [13, 0, 14, 12], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 12], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/downward_middle.json b/src/main/resources/assets/create/models/block/belt/downward_middle.json index 3c7b313f7..1b81b5db9 100644 --- a/src/main/resources/assets/create/models/block/belt/downward_middle.json +++ b/src/main/resources/assets/create/models/block/belt/downward_middle.json @@ -1,62 +1,108 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, -3.325 ], - "to": [ 15.0, 5.0, 6.6 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.1 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, -3.325 ], - "to": [ 15.0, 13.0, 10.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] } - } - }, - { - "name": "Top Diagonal First", - "from": [ 1.0, 11.0, 10.0 ], - "to": [ 15.0, 13.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ] } - } - }, - { - "name": "Bottom Diagonal First", - "from": [ 1.0, 3.0, 6.6 ], - "to": [ 15.0, 5.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom Diagonal", + "from": [1, 3, -3.325], + "to": [15, 5, 6.6], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, -3.325], + "to": [13, 6, 6.6], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 10], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, -3.325], + "to": [15, 13, 10], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, -3.325], + "to": [13, 11, 10], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 3, 14, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 3, 3, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 3, 13, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal First", + "from": [1, 11, 10], + "to": [15, 13, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10.2], "texture": "#0"} + } + }, + { + "name": "Top Diagonal First", + "from": [3, 10, 10], + "to": [13, 11, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 0, 13, 10], "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal First", + "from": [1, 3, 6.6], + "to": [15, 5, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal First", + "from": [3, 5, 6.6], + "to": [13, 6, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 3, 14, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 3, 3, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 3, 13, 16], "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/downward_start.json b/src/main/resources/assets/create/models/block/belt/downward_start.json index e07160dd7..d2654a350 100644 --- a/src/main/resources/assets/create/models/block/belt/downward_start.json +++ b/src/main/resources/assets/create/models/block/belt/downward_start.json @@ -1,73 +1,125 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom", - "from": [ 1.0, 3.0, 1.0 ], - "to": [ 15.0, 5.0, 6.8 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 7.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 7.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ], "rotation": 180 } - } - }, - { - "name": "Top", - "from": [ 1.0, 11.0, 1.0 ], - "to": [ 15.0, 13.0, 10.1 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 15.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 15.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 6.0, 15.0, 15.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 6.0, 15.0, 15.0 ] } - } - }, - { - "name": "Side", - "from": [ 1.0, 4.0, 0.0 ], - "to": [ 15.0, 12.0, 2.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 } - } - }, - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, 9.2 ], - "to": [ 15.0, 5.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 11.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 11.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 11.1 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 11.1 ], "rotation": 180 } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, 5.9 ], - "to": [ 15.0, 13.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 13.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 13.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 13.0 ] } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [0.9, 3, 1], + "to": [15.1, 5, 6.8], + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 1, 2, 7], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 6.8], "texture": "#0"}, + "down": {"uv": [1, 1, 15, 6.8], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [2.9, 5, 2], + "to": [13.1, 6, 6.8], + "faces": { + "east": {"uv": [2, 2, 3, 7], "rotation": 90, "texture": "#0"}, + "west": {"uv": [13, 2, 14, 7], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 2, 13, 7], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [0.9, 11, 1], + "to": [15.1, 13, 10.1], + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 6, 2, 15], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 6, 16, 15], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 6, 15, 15], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 6, 15, 15], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [2.9, 10, 2], + "to": [13.1, 11, 10.1], + "faces": { + "east": {"uv": [13, 6, 14, 14], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 6, 3, 14], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 6, 13, 14], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [1, 4, 0], + "to": [15, 12, 2], + "faces": { + "north": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "east": {"uv": [0, 4, 2, 12], "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "west": {"uv": [14, 4, 16, 12], "texture": "#0"}, + "up": {"uv": [1, 3, 15, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [2.9, 6, 2], + "to": [13.1, 10, 3], + "faces": { + "east": {"uv": [2, 6, 3, 10], "texture": "#0"}, + "south": {"uv": [3, 6, 13, 10], "texture": "#0"}, + "west": {"uv": [13, 6, 14, 10], "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [1, 3, 9.2], + "to": [15, 5, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 1, 2, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 11], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 11.1], "texture": "#0"}, + "down": {"uv": [1, 1, 15, 11], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, 9.2], + "to": [13, 6, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 1, 14, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 1, 3, 11], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 1, 13, 11.1], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, 5.9], + "to": [15, 13, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 13], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 13], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 13], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0, 15, 13], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, 6.9], + "to": [13, 11, 19.3], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 12], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 12], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 0, 13, 12], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/horizontal_end.json b/src/main/resources/assets/create/models/block/belt/horizontal_end.json index e8d932c72..180675f62 100644 --- a/src/main/resources/assets/create/models/block/belt/horizontal_end.json +++ b/src/main/resources/assets/create/models/block/belt/horizontal_end.json @@ -18,6 +18,16 @@ "down": {"uv": [1, 0, 15, 15], "rotation": 180, "texture": "#0"} } }, + { + "name": "Bottom", + "from": [3, 5, 0], + "to": [13, 6, 14], + "faces": { + "east": {"uv": [2, 0, 3, 14], "rotation": 90, "texture": "#0"}, + "west": {"uv": [13, 0, 14, 14], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 14], "texture": "#0"} + } + }, { "name": "Top", "from": [1, 11, 0], @@ -30,10 +40,20 @@ "down": {"uv": [1, 1, 15, 16], "texture": "#0"} } }, + { + "name": "Top", + "from": [3, 10, 0], + "to": [13, 11, 14], + "faces": { + "east": {"uv": [2, 2, 3, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 2, 14, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 2, 13, 16], "texture": "#0"} + } + }, { "name": "Side", - "from": [1, 4, 14], - "to": [15, 12, 16], + "from": [1.1, 4, 14], + "to": [14.9, 12, 16], "faces": { "north": {"uv": [1, 4, 15, 12], "rotation": 180, "texture": "#0"}, "east": {"uv": [0, 4, 2, 12], "rotation": 180, "texture": "#0"}, @@ -42,6 +62,16 @@ "up": {"uv": [1, 3, 15, 5], "rotation": 180, "texture": "#0"}, "down": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"} } + }, + { + "name": "Side", + "from": [3, 6, 13], + "to": [13, 10, 14], + "faces": { + "north": {"uv": [3, 6, 13, 10], "rotation": 180, "texture": "#0"}, + "east": {"uv": [2, 6, 3, 10], "rotation": 180, "texture": "#0"}, + "west": {"uv": [13, 6, 14, 10], "rotation": 180, "texture": "#0"} + } } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/horizontal_middle.json b/src/main/resources/assets/create/models/block/belt/horizontal_middle.json index a80ee37c3..2c2a87512 100644 --- a/src/main/resources/assets/create/models/block/belt/horizontal_middle.json +++ b/src/main/resources/assets/create/models/block/belt/horizontal_middle.json @@ -1,32 +1,52 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom", - "from": [ 1.0, 3.0, 0.0 ], - "to": [ 15.0, 5.0, 16.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 16.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 16.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 16.0 ], "rotation": 180 } - } - }, - { - "name": "Top", - "from": [ 1.0, 11.0, 0.0 ], - "to": [ 15.0, 13.0, 16.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 16.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 16.0 ] } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [1, 3, 0], + "to": [15, 5, 16], + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 16], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [3, 5, 0], + "to": [13, 6, 16], + "faces": { + "east": {"uv": [13, 0, 14, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [1, 11, 0], + "to": [15, 13, 16], + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0, 15, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [3, 10, 0], + "to": [13, 11, 16], + "faces": { + "east": {"uv": [13, 0, 14, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 0, 13, 16], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/horizontal_start.json b/src/main/resources/assets/create/models/block/belt/horizontal_start.json index f96cea473..e58a1b2f9 100644 --- a/src/main/resources/assets/create/models/block/belt/horizontal_start.json +++ b/src/main/resources/assets/create/models/block/belt/horizontal_start.json @@ -1,47 +1,78 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom", - "from": [ 1.0, 3.0, 1.0 ], - "to": [ 15.0, 5.0, 16.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 16.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 16.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 16.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 16.0 ], "rotation": 180 } - } - }, - { - "name": "Top", - "from": [ 1.0, 11.0, 1.0 ], - "to": [ 15.0, 13.0, 16.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 15.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 16.0 ] } - } - }, - { - "name": "Side", - "from": [ 1.0, 4.0, 0.0 ], - "to": [ 15.0, 12.0, 2.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [1, 3, 1], + "to": [15, 5, 16], + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 1, 2, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 16], "texture": "#0"}, + "down": {"uv": [1, 1, 15, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [3, 5, 2], + "to": [13, 6, 16], + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [13, 2, 14, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 2, 3, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [3, 2, 13, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [3, 10, 2], + "to": [13, 11, 16], + "faces": { + "east": {"uv": [2, 2, 3, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 2, 14, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 2, 13, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [1, 11, 1], + "to": [15, 13, 16], + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 15], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 15], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 15], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 1, 15, 16], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [1.1, 4, 0], + "to": [14.9, 12, 2], + "faces": { + "north": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "east": {"uv": [0, 4, 2, 12], "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "west": {"uv": [14, 4, 16, 12], "texture": "#0"}, + "up": {"uv": [1, 3, 15, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [3, 6, 2], + "to": [13, 10, 3], + "faces": { + "east": {"uv": [2, 6, 3, 10], "texture": "#0"}, + "south": {"uv": [3, 6, 13, 10], "texture": "#0"}, + "west": {"uv": [13, 6, 14, 10], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/sideways_end.json b/src/main/resources/assets/create/models/block/belt/sideways_end.json new file mode 100644 index 000000000..b4a5bd46d --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt/sideways_end.json @@ -0,0 +1,77 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [11, 1, 0], + "to": [13, 15, 15], + "faces": { + "east": {"uv": [1, 0, 15, 15], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 3, 15, 5], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1, 0, 15, 15], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 2, 15], "texture": "#0"}, + "down": {"uv": [14, 0, 16, 15], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [10, 3, 0], + "to": [11, 13, 14], + "faces": { + "west": {"uv": [3, 0, 13, 14], "rotation": 270, "texture": "#0"}, + "up": {"uv": [2, 0, 3, 14], "texture": "#0"}, + "down": {"uv": [13, 0, 14, 14], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Top", + "from": [3, 1, 0], + "to": [5, 15, 15], + "faces": { + "east": {"uv": [1, 1, 15, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 5, 15, 3], "rotation": 270, "texture": "#0"}, + "west": {"uv": [1, 1, 15, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 1, 2, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14, 1, 16, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [5, 3, 0], + "to": [6, 13, 14], + "faces": { + "east": {"uv": [3, 2, 13, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [2, 2, 3, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [13, 2, 14, 16], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [4, 1.1, 14], + "to": [12, 14.9, 16], + "faces": { + "north": {"uv": [1, 4, 15, 12], "rotation": 270, "texture": "#0"}, + "east": {"uv": [1, 11, 15, 13], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1, 3, 15, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 4, 2, 12], "rotation": 90, "texture": "#0"}, + "down": {"uv": [14, 4, 16, 12], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [6, 3, 13], + "to": [10, 13, 14], + "faces": { + "north": {"uv": [3, 6, 13, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [2, 6, 3, 10], "rotation": 90, "texture": "#0"}, + "down": {"uv": [13, 6, 14, 10], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/sideways_middle.json b/src/main/resources/assets/create/models/block/belt/sideways_middle.json new file mode 100644 index 000000000..ed352bba5 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt/sideways_middle.json @@ -0,0 +1,52 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [11, 1, 0], + "to": [13, 15, 16], + "faces": { + "east": {"uv": [1, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#0"}, + "down": {"uv": [14, 0, 16, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [10, 3, 0], + "to": [11, 13, 16], + "faces": { + "west": {"uv": [3, 0, 13, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "down": {"uv": [2, 0, 3, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Top", + "from": [3, 1, 0], + "to": [5, 15, 16], + "faces": { + "east": {"uv": [1, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [1, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [5, 3, 0], + "to": [6, 13, 16], + "faces": { + "east": {"uv": [3, 0, 13, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [13, 0, 14, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [13, 0, 14, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/sideways_start.json b/src/main/resources/assets/create/models/block/belt/sideways_start.json new file mode 100644 index 000000000..6ab8c2414 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt/sideways_start.json @@ -0,0 +1,78 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [11, 1, 1], + "to": [13, 15, 16], + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 270, "texture": "#0"}, + "east": {"uv": [1, 1, 15, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1, 1, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 1, 2, 16], "texture": "#0"}, + "down": {"uv": [14, 1, 16, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [10, 3, 2], + "to": [11, 13, 16], + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 270, "texture": "#0"}, + "west": {"uv": [3, 2, 13, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [13, 2, 14, 16], "texture": "#0"}, + "down": {"uv": [2, 2, 3, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [5, 3, 2], + "to": [6, 13, 16], + "faces": { + "east": {"uv": [3, 2, 13, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [2, 2, 3, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [13, 2, 14, 16], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [3, 1, 1], + "to": [5, 15, 16], + "faces": { + "north": {"uv": [1, 3, 15, 5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [1, 1, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [1, 0, 15, 15], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 2, 15], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14, 0, 16, 15], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [4, 1.1, 0], + "to": [12, 14.9, 2], + "faces": { + "north": {"uv": [1, 4, 15, 12], "rotation": 90, "texture": "#0"}, + "east": {"uv": [1, 11, 15, 13], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "rotation": 270, "texture": "#0"}, + "west": {"uv": [1, 3, 15, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 4, 2, 12], "rotation": 270, "texture": "#0"}, + "down": {"uv": [14, 4, 16, 12], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [6, 3, 2], + "to": [10, 13, 3], + "faces": { + "south": {"uv": [3, 6, 13, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [2, 6, 3, 10], "rotation": 270, "texture": "#0"}, + "down": {"uv": [13, 6, 14, 10], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/upward_end.json b/src/main/resources/assets/create/models/block/belt/upward_end.json index b17d62965..3e7cc8f0d 100644 --- a/src/main/resources/assets/create/models/block/belt/upward_end.json +++ b/src/main/resources/assets/create/models/block/belt/upward_end.json @@ -1,73 +1,125 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom", - "from": [ 1.0, 3.0, 9.2 ], - "to": [ 15.0, 5.0, 15.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 9.0, 2.0, 15.0 ], "rotation": 90 }, - "south": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 9.0, 16.0, 15.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 9.0, 15.0, 14.8 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 9.0, 15.0, 14.8 ], "rotation": 180 } - } - }, - { - "name": "Top", - "from": [ 1.0, 11.0, 5.9 ], - "to": [ 15.0, 13.0, 15.0 ], - "faces": { - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 10.0 ], "rotation": 270 }, - "south": { "texture": "#0", "uv": [ 1.0, 13.0, 15.0, 11.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 10.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 10.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 10.0 ] } - } - }, - { - "name": "Side", - "from": [ 1.0, 4.0, 14.0 ], - "to": [ 15.0, 12.0, 16.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 12.0 ], "rotation": 180 }, - "south": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ], "rotation": 180 }, - "west": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 12.0 ], "rotation": 180 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ] } - } - }, - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, -3.328 ], - "to": [ 15.0, 5.0, 6.75 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.1 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, -3.328 ], - "to": [ 15.0, 13.0, 10.1 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom", + "from": [0.9, 3, 9.2], + "to": [15.1, 5, 15], + "faces": { + "east": {"uv": [0, 9, 2, 15], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1, 3, 15, 5], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 9, 16, 15], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 9, 15, 15], "texture": "#0"}, + "down": {"uv": [1, 9, 15, 14.8], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [2.9, 5, 9.2], + "to": [13.1, 6, 14], + "faces": { + "east": {"uv": [13, 9, 14, 14], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 9, 3, 14], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 9, 13, 14], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [0.9, 11, 5.9], + "to": [15.1, 13, 15], + "faces": { + "east": {"uv": [0, 1, 2, 10], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 13, 15, 11], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 10], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 1, 15, 10], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [2.9, 10, 5.9], + "to": [13.1, 11, 14], + "faces": { + "east": {"uv": [13, 2, 14, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 2, 3, 10], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 2, 13, 10], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [1, 4, 14], + "to": [15, 12, 16], + "faces": { + "north": {"uv": [1, 4, 15, 12], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 4, 2, 12], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 4, 16, 12], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "down": {"uv": [1, 11, 15, 13], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [2.9, 6, 13], + "to": [13.1, 10, 14], + "faces": { + "north": {"uv": [3, 6, 13, 10], "rotation": 180, "texture": "#0"}, + "east": {"uv": [13, 6, 14, 10], "rotation": 180, "texture": "#0"}, + "west": {"uv": [2, 6, 3, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [1, 3, -3.328], + "to": [15, 5, 6.75], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10.2], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, -3.328], + "to": [13, 6, 6.75], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 10], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, -3.328], + "to": [15, 13, 10.1], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, -3.328], + "to": [13, 11, 9.1], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 4, 14, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 4, 3, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 4, 13, 16], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/upward_middle.json b/src/main/resources/assets/create/models/block/belt/upward_middle.json index c1dd92010..19fbdcb55 100644 --- a/src/main/resources/assets/create/models/block/belt/upward_middle.json +++ b/src/main/resources/assets/create/models/block/belt/upward_middle.json @@ -1,62 +1,110 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, -3.325 ], - "to": [ 15.0, 5.0, 6.6 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.1 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, -3.325 ], - "to": [ 15.0, 13.0, 10.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] } - } - }, - { - "name": "Top Diagonal First", - "from": [ 1.0, 11.0, 9.98 ], - "to": [ 15.0, 13.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ] } - } - }, - { - "name": "Bottom Diagonal First", - "from": [ 1.0, 3.0, 6.58 ], - "to": [ 15.0, 5.0, 19.3 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Bottom Diagonal", + "from": [1, 3, -3.325], + "to": [15, 5, 6.6], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, -3.325], + "to": [13, 6, 6.6], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 0, 13, 10], "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, -3.325], + "to": [15, 13, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, -3.325], + "to": [13, 11, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 3, 14, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 3, 3, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [3, 3, 13, 16], "texture": "#0"} + } + }, + { + "name": "Top Diagonal First", + "from": [1, 11, 9.98], + "to": [15, 13, 19.3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "texture": "#0"} + } + }, + { + "name": "Top Diagonal First", + "from": [3, 10, 9.98], + "to": [13, 11, 19.3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [3, 0, 13, 10], "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal First", + "from": [1, 3, 6.58], + "to": [15, 5, 19.3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal First", + "from": [3, 5, 6.58], + "to": [13, 6, 19.3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 3, 14, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 3, 3, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 3, 13, 16], "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt/upward_start.json b/src/main/resources/assets/create/models/block/belt/upward_start.json index 3ab4a791c..84dddff12 100644 --- a/src/main/resources/assets/create/models/block/belt/upward_start.json +++ b/src/main/resources/assets/create/models/block/belt/upward_start.json @@ -1,73 +1,125 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "create:block/belt", - "0": "create:block/belt" - }, - "elements": [ - { - "name": "Top", - "from": [ 1.0, 11.0, 1.0 ], - "to": [ 15.0, 13.0, 6.8 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 7.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 7.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 6.8 ] } - } - }, - { - "name": "Bottom", - "from": [ 1.0, 3.0, 1.0 ], - "to": [ 15.0, 5.0, 10.1 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 1.0, 2.0, 10.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 1.0, 16.0, 10.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 10.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 10.0 ], "rotation": 180 } - } - }, - { - "name": "Side", - "from": [ 1.0, 4.0, 0.0 ], - "to": [ 15.0, 12.0, 2.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 } - } - }, - { - "name": "Top Diagonal", - "from": [ 1.0, 11.0, 9.2 ], - "to": [ 15.0, 13.0, 19.325 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 11.0, 15.0, 13.0 ], "rotation": 180 }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 10.0 ], "rotation": 270 }, - "west": { "texture": "#0", "uv": [ 14.0, 0.0, 16.0, 10.0 ], "rotation": 90 }, - "up": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ], "rotation": 180 }, - "down": { "texture": "#0", "uv": [ 1.0, 0.0, 15.0, 10.2 ] } - } - }, - { - "name": "Bottom Diagonal", - "from": [ 1.0, 3.0, 5.9 ], - "to": [ 15.0, 5.0, 19.325 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 3.0, 2.0, 16.0 ], "rotation": 90 }, - "west": { "texture": "#0", "uv": [ 14.0, 3.0, 16.0, 16.0 ], "rotation": 270 }, - "up": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 3.0, 15.0, 16.0 ], "rotation": 180 } - } - } - ] + "textures": { + "0": "create:block/belt", + "particle": "create:block/belt" + }, + "elements": [ + { + "name": "Top", + "from": [0.9, 11, 1], + "to": [15.1, 13, 6.8], + "faces": { + "north": {"uv": [1, 11, 15, 13], "texture": "#0"}, + "east": {"uv": [0, 1, 2, 7], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 1, 15, 6.8], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [2.9, 10, 2], + "to": [13.1, 11, 6.8], + "faces": { + "east": {"uv": [13, 2, 14, 7], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 2, 3, 7], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 2, 13, 6.8], "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [0.9, 3, 1], + "to": [15.1, 5, 10.1], + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 1, 2, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 1, 15, 10], "texture": "#0"}, + "down": {"uv": [1, 1, 15, 10], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [2.9, 5, 2], + "to": [13.1, 6, 10.1], + "faces": { + "east": {"uv": [13, 2, 14, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 2, 3, 10], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 2, 13, 10], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [1, 4, 0], + "to": [15, 12, 2], + "faces": { + "north": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "east": {"uv": [0, 4, 2, 12], "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "west": {"uv": [14, 4, 16, 12], "texture": "#0"}, + "up": {"uv": [1, 3, 15, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [2.9, 6, 2], + "to": [13.1, 10, 3], + "faces": { + "east": {"uv": [13, 6, 14, 10], "texture": "#0"}, + "south": {"uv": [3, 6, 13, 10], "texture": "#0"}, + "west": {"uv": [2, 6, 3, 10], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [1, 11, 9.2], + "to": [15, 13, 19.325], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11, 15, 13], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 2, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [14, 0, 16, 10], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 0, 15, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0, 15, 10], "texture": "#0"} + } + }, + { + "name": "Top Diagonal", + "from": [3, 10, 9.2], + "to": [13, 11, 19.325], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 0, 14, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [2, 0, 3, 10], "rotation": 90, "texture": "#0"}, + "down": {"uv": [3, 0, 13, 10], "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [1, 3, 5.9], + "to": [15, 5, 19.325], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 15, 5], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 3, 16, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [1, 3, 15, 16], "texture": "#0"}, + "down": {"uv": [1, 3, 15, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Bottom Diagonal", + "from": [3, 5, 5.9], + "to": [13, 6, 19.325], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [13, 3, 14, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [2, 3, 3, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 3, 13, 16], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/diagonal_end.json b/src/main/resources/assets/create/models/block/belt_casing/diagonal_end.json index 6b14c21f2..fba079751 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/diagonal_end.json +++ b/src/main/resources/assets/create/models/block/belt_casing/diagonal_end.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", + "4": "create:block/brass_casing_belt", "8": "create:block/gearbox", - "particle": "create:block/brass_casing_side" + "particle": "create:block/brass_casing" }, "elements": [ { @@ -14,9 +13,7 @@ "to": [14.9, 11, 12], "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [4, 5, 14, 12], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 12, 12], "texture": "#8"} } }, @@ -30,56 +27,73 @@ "west": {"uv": [6, 3, 10, 5], "texture": "#8"} } }, - { - "name": "Zfighter2", - "from": [0.5, 0.1, -0.1], - "to": [15.5, 11.1, 0.9], - "faces": { - "north": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "east": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "west": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "rotation": 180, "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 270, "texture": "#2"} - } - }, - { - "name": "Right", - "from": [0, 0, 0], - "to": [16, 11, 5], - "faces": { - "north": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "east": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 2, 11], "texture": "#2"}, - "west": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "up": {"uv": [12, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [12, 0, 16, 16], "rotation": 270, "texture": "#2"} - } - }, - { - "name": "Down", - "from": [0, 0, 5], - "to": [16, 5.1, 11], - "faces": { - "east": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "south": {"uv": [0, 6, 16, 11], "texture": "#2"}, - "west": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 8], "rotation": 180, "texture": "#2"}, - "down": {"uv": [4, 0, 10, 16], "rotation": 270, "texture": "#2"} - } - }, { "name": "Top Diagonal", "from": [-0.1, 2, 11.303], "to": [16.1, 11, 19.328], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "east": {"uv": [8, 8, 12.025, 12.5], "texture": "#4"}, + "south": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [12, 8, 16, 12.5], "texture": "#4"}, + "up": {"uv": [12, 0, 16, 8], "rotation": 90, "texture": "#4"}, + "down": {"uv": [12, 0, 16, 8], "rotation": 90, "texture": "#4"} } + }, + { + "name": "Left", + "from": [0, 0, 0], + "to": [16, 3, 4], + "faces": { + "north": {"uv": [0, 12, 8, 13.5], "texture": "#4"}, + "east": {"uv": [6, 12, 8, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 2, 13.5], "texture": "#4"}, + "up": {"uv": [8, 3, 16, 5], "texture": "#4"}, + "down": {"uv": [6, 0, 8, 8], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [0, 3, 0], + "to": [1, 11, 4], + "faces": { + "north": {"uv": [7.5, 8, 8, 12], "texture": "#4"}, + "east": {"uv": [6, 8, 8, 12], "texture": "#4"}, + "south": {"uv": [0, 8, 0.5, 12], "texture": "#4"}, + "west": {"uv": [0, 8, 2, 12], "texture": "#4"}, + "up": {"uv": [0, 7.5, 2, 8], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [15, 3, 0], + "to": [16, 11, 4], + "faces": { + "north": {"uv": [8, 8, 7.5, 12], "texture": "#4"}, + "east": {"uv": [2, 8, 0, 12], "texture": "#4"}, + "south": {"uv": [0.5, 8, 0, 12], "texture": "#4"}, + "west": {"uv": [8, 8, 6, 12], "texture": "#4"}, + "up": {"uv": [0, 8, 2, 7.5], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Down", + "from": [0, 0, 4], + "to": [16, 5, 12], + "faces": { + "east": {"uv": [2, 11, 6, 13.5], "texture": "#4"}, + "west": {"uv": [2, 11, 6, 13.5], "texture": "#4"}, + "up": {"uv": [8, 2, 16, 6], "texture": "#4"}, + "down": {"uv": [10, 0, 14, 8], "rotation": 90, "texture": "#4"} + } + } + ], + "groups": [0, 1, 2, + { + "name": "horizontal_start", + "origin": [8, 8, 8], + "children": [3, 4, 5, 6] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/diagonal_middle.json b/src/main/resources/assets/create/models/block/belt_casing/diagonal_middle.json index 4f16acd03..30eacb4eb 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/diagonal_middle.json +++ b/src/main/resources/assets/create/models/block/belt_casing/diagonal_middle.json @@ -2,58 +2,21 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "particle": "create:block/brass_casing" }, "elements": [ - { - "name": "Casing", - "from": [1.1, 11, 6], - "to": [14.9, 13, 10], - "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [6, 3, 10, 5], "texture": "#8"}, - "west": {"uv": [6, 3, 10, 5], "texture": "#8"} - } - }, - { - "name": "Left", - "from": [0, 0, 0], - "to": [16, 10, 5], - "faces": { - "north": {"uv": [0, 0, 10, 16], "rotation": 90, "texture": "#2"}, - "east": {"uv": [11, 1, 16, 11], "texture": "#2"}, - "south": {"uv": [0, 1, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 1, 5, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Down", - "from": [0, 0, 5], - "to": [16, 5.1, 11], - "faces": { - "north": {"uv": [0, 6, 16, 11], "texture": "#2"}, - "east": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "west": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 8], "texture": "#2"}, - "down": {"uv": [4, 0, 10, 16], "rotation": 90, "texture": "#2"} - } - }, { "name": "Top Diagonal", "from": [-0.1, 2, -3.325], "to": [16.1, 11, 10], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 13.325, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"} + "north": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "east": {"uv": [9.5, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [8, 8, 14.5, 12.5], "texture": "#4"}, + "up": {"uv": [9.5, 0, 16, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [9.5, 0, 16, 8], "rotation": 270, "texture": "#4"} } }, { @@ -62,12 +25,11 @@ "to": [16.1, 11, 19.3], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 9.3, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 9.3, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"} + "east": {"uv": [8, 8, 13, 12.5], "texture": "#4"}, + "south": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [11, 8, 16, 12.5], "texture": "#4"}, + "up": {"uv": [8, 0, 12.5, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [8, 0, 12.5, 8], "rotation": 270, "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/diagonal_pulley.json b/src/main/resources/assets/create/models/block/belt_casing/diagonal_pulley.json index 86ce620c3..51ce62cfd 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/diagonal_pulley.json +++ b/src/main/resources/assets/create/models/block/belt_casing/diagonal_pulley.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -14,9 +13,7 @@ "to": [14.9, 11, 14], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [2, 5, 14, 11], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 14, 11], "texture": "#8"} } }, @@ -35,24 +32,22 @@ "from": [0, 0, 0], "to": [16, 10, 5], "faces": { - "north": {"uv": [0, 0, 10, 16], "rotation": 90, "texture": "#2"}, - "east": {"uv": [11, 1, 16, 11], "texture": "#2"}, - "south": {"uv": [0, 1, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 1, 5, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [8, 0, 13, 8], "rotation": 90, "texture": "#4"}, + "east": {"uv": [5.5, 3, 8, 8], "texture": "#4"}, + "south": {"uv": [8, 1.5, 16, 6.5], "texture": "#4"}, + "west": {"uv": [0, 3, 2.5, 8], "texture": "#4"}, + "down": {"uv": [13.5, 0, 16, 8], "rotation": 90, "texture": "#4"} } }, { "name": "Down", "from": [0, 0, 5], - "to": [16, 5.1, 11], + "to": [16, 5, 11], "faces": { - "north": {"uv": [0, 6, 16, 11], "texture": "#2"}, - "east": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "west": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 8], "texture": "#2"}, - "down": {"uv": [4, 0, 10, 16], "rotation": 90, "texture": "#2"} + "east": {"uv": [2.5, 5.5, 5.5, 8], "texture": "#4"}, + "west": {"uv": [2.5, 5.5, 5.5, 8], "texture": "#4"}, + "up": {"uv": [8, 2.5, 16, 5.5], "texture": "#4"}, + "down": {"uv": [10.5, 0, 13.5, 8], "rotation": 90, "texture": "#4"} } }, { @@ -61,12 +56,12 @@ "to": [16.1, 11, 4.7], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"} + "north": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "east": {"uv": [12, 8, 16, 12.5], "texture": "#4"}, + "south": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [8, 8, 12, 12.5], "texture": "#4"}, + "up": {"uv": [12, 0, 16, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [12, 0, 16, 8], "rotation": 270, "texture": "#4"} } }, { @@ -75,12 +70,12 @@ "to": [16.1, 11, 19.3], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"} + "north": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "east": {"uv": [8, 8, 12, 12.5], "texture": "#4"}, + "south": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [12, 8, 16, 12.5], "texture": "#4"}, + "up": {"uv": [8, 0, 12, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [8, 0, 12, 8], "rotation": 270, "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/diagonal_start.json b/src/main/resources/assets/create/models/block/belt_casing/diagonal_start.json index 252ffe61c..bbc8e8963 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/diagonal_start.json +++ b/src/main/resources/assets/create/models/block/belt_casing/diagonal_start.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -14,9 +13,7 @@ "to": [14.9, 11, 14], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [2, 5, 14, 11], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 14, 11], "texture": "#8"} } }, @@ -30,69 +27,86 @@ "west": {"uv": [6, 3, 10, 5], "texture": "#8"} } }, - { - "name": "Left", - "from": [0, 0, 0], - "to": [16, 10, 5], - "faces": { - "north": {"uv": [0, 0, 10, 16], "rotation": 90, "texture": "#2"}, - "east": {"uv": [11, 1, 16, 11], "texture": "#2"}, - "south": {"uv": [0, 1, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 1, 5, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 5, 16], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Zfighter2", - "from": [0.5, 0.1, 15.1], - "to": [15.5, 11.1, 16.1], - "faces": { - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "south": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Right", - "from": [0, 0, 11], - "to": [16, 11, 16], - "faces": { - "north": {"uv": [0, 0, 2, 11], "texture": "#2"}, - "east": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "up": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Down", - "from": [0, 0, 5], - "to": [16, 5.1, 11], - "faces": { - "north": {"uv": [0, 6, 16, 11], "texture": "#2"}, - "east": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "west": {"uv": [4, 5.9, 10, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 8], "texture": "#2"}, - "down": {"uv": [4, 0, 10, 16], "rotation": 90, "texture": "#2"} - } - }, { "name": "Top Diagonal", "from": [-0.1, 2, -3.325], "to": [16.1, 11, 4.7], "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "east": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "south": {"uv": [7, 0, 16, 16], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 0, 8.025, 9], "texture": "#2"}, - "up": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 0, 8.025, 16], "rotation": 270, "texture": "#2"} + "north": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "east": {"uv": [12, 8, 16, 12.5], "texture": "#4"}, + "south": {"uv": [8, 8, 16, 12.5], "texture": "#4"}, + "west": {"uv": [8, 8, 12, 12.5], "texture": "#4"}, + "up": {"uv": [12, 0, 16, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [12, 0, 16, 8], "rotation": 270, "texture": "#4"} } + }, + { + "name": "Left", + "from": [0, 0, 12], + "to": [16, 3, 16], + "faces": { + "east": {"uv": [0, 12, 2, 13.5], "texture": "#4"}, + "south": {"uv": [0, 12, 8, 13.5], "texture": "#4"}, + "west": {"uv": [6, 12, 8, 13.5], "texture": "#4"}, + "up": {"uv": [8, 3, 16, 5], "rotation": 180, "texture": "#4"}, + "down": {"uv": [6, 0, 8, 8], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [15, 3, 12], + "to": [16, 11, 16], + "faces": { + "north": {"uv": [0, 8, 0.5, 12], "texture": "#4"}, + "east": {"uv": [0, 8, 2, 12], "texture": "#4"}, + "south": {"uv": [7.5, 8, 8, 12], "texture": "#4"}, + "west": {"uv": [6, 8, 8, 12], "texture": "#4"}, + "up": {"uv": [0, 7.5, 2, 8], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [0, 3, 12], + "to": [1, 11, 16], + "faces": { + "north": {"uv": [0.5, 8, 0, 12], "texture": "#4"}, + "east": {"uv": [8, 8, 6, 12], "texture": "#4"}, + "south": {"uv": [8, 8, 7.5, 12], "texture": "#4"}, + "west": {"uv": [2, 8, 0, 12], "texture": "#4"}, + "up": {"uv": [0, 8, 2, 7.5], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Right", + "from": [0, 0, 0], + "to": [16, 11, 5], + "faces": { + "north": {"uv": [8, 0, 13.5, 8], "rotation": 90, "texture": "#4"}, + "east": {"uv": [5.5, 2.5, 8, 8], "texture": "#4"}, + "south": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "west": {"uv": [0, 8, 2.5, 13.5], "texture": "#4"}, + "up": {"uv": [6, 0, 8, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [8, 0, 10, 8], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Down", + "from": [0, 0, 5], + "to": [16, 5, 12], + "faces": { + "east": {"uv": [2, 11, 5.5, 13.5], "texture": "#4"}, + "west": {"uv": [2.5, 11, 6, 13.5], "texture": "#4"}, + "up": {"uv": [8, 2, 16, 5.5], "rotation": 180, "texture": "#4"}, + "down": {"uv": [10, 0, 14, 8], "rotation": 270, "texture": "#4"} + } + } + ], + "groups": [0, 1, 2, + { + "name": "horizontal_start", + "origin": [8, 8, 8], + "children": [3, 4, 5, 6, 7] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/horizontal_end.json b/src/main/resources/assets/create/models/block/belt_casing/horizontal_end.json index cfe4b73cd..9e1bd4f0e 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/horizontal_end.json +++ b/src/main/resources/assets/create/models/block/belt_casing/horizontal_end.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -13,60 +12,57 @@ "from": [1, 5, 2], "to": [15, 11, 14], "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [2, 5, 14, 11], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 14, 11], "texture": "#8"} } }, { "name": "Left", - "from": [0, 0, 0], - "to": [16, 11, 4], + "from": [0, 0, 12], + "to": [16, 3, 16], "faces": { - "north": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "east": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "south": {"uv": [14, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"} + "east": {"uv": [0, 12, 2, 13.5], "texture": "#4"}, + "south": {"uv": [0, 12, 8, 13.5], "texture": "#4"}, + "west": {"uv": [6, 12, 8, 13.5], "texture": "#4"}, + "up": {"uv": [8, 3, 16, 5], "rotation": 180, "texture": "#4"}, + "down": {"uv": [6, 0, 8, 8], "rotation": 270, "texture": "#4"} } }, { - "name": "Zfighter", - "from": [0.5, 0.1, -0.1], - "to": [15.5, 10.9, 0.9], + "name": "Left", + "from": [15, 3, 12], + "to": [16, 11, 16], "faces": { - "north": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 8, 0.5, 12], "texture": "#4"}, + "east": {"uv": [0, 8, 2, 12], "texture": "#4"}, + "south": {"uv": [7.5, 8, 8, 12], "texture": "#4"}, + "west": {"uv": [6, 8, 8, 12], "texture": "#4"}, + "up": {"uv": [0, 7.5, 2, 8], "rotation": 270, "texture": "#4"} } }, { - "name": "Zfighter2", - "from": [0.5, 0.1, 15.1], - "to": [15.5, 10.9, 16.1], + "name": "Left", + "from": [0, 3, 12], + "to": [1, 11, 16], "faces": { - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "south": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} + "north": {"uv": [0.5, 8, 0, 12], "texture": "#4"}, + "east": {"uv": [8, 8, 6, 12], "texture": "#4"}, + "south": {"uv": [8, 8, 7.5, 12], "texture": "#4"}, + "west": {"uv": [2, 8, 0, 12], "texture": "#4"}, + "up": {"uv": [0, 8, 2, 7.5], "rotation": 270, "texture": "#4"} } }, { "name": "Right", - "from": [0, 0, 12], - "to": [16, 11, 16], + "from": [0, 0, 0], + "to": [16, 11, 4], "faces": { - "north": {"uv": [0, 0, 2, 11], "texture": "#2"}, - "east": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "up": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "east": {"uv": [6, 8, 8, 13.5], "texture": "#4"}, + "south": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "west": {"uv": [0, 8, 2, 13.5], "texture": "#4"}, + "up": {"uv": [6, 0, 8, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [8, 0, 10, 8], "rotation": 270, "texture": "#4"} } }, { @@ -74,10 +70,10 @@ "from": [0, 0, 4], "to": [16, 4, 12], "faces": { - "east": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "west": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 10], "texture": "#2"}, - "down": {"uv": [4, 0, 12, 16], "rotation": 90, "texture": "#2"} + "east": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "west": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "up": {"uv": [8, 2, 16, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [10, 0, 14, 8], "rotation": 270, "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/horizontal_middle.json b/src/main/resources/assets/create/models/block/belt_casing/horizontal_middle.json index f6dd1ac0d..d72517e08 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/horizontal_middle.json +++ b/src/main/resources/assets/create/models/block/belt_casing/horizontal_middle.json @@ -2,9 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side" + "3": "create:block/brass_casing_belt", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -12,12 +11,12 @@ "from": [0, 0, 0], "to": [16, 11, 16], "faces": { - "north": {"uv": [0, 0, 16, 11], "texture": "#1"}, - "east": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 16, 11], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 8, 8, 13.5], "texture": "#3"}, + "east": {"uv": [0, 8, 8, 13.5], "texture": "#3"}, + "south": {"uv": [0, 8, 8, 13.5], "texture": "#3"}, + "west": {"uv": [0, 8, 8, 13.5], "texture": "#3"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 90, "texture": "#3"}, + "down": {"uv": [8, 0, 16, 8], "rotation": 90, "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/horizontal_pulley.json b/src/main/resources/assets/create/models/block/belt_casing/horizontal_pulley.json index cfe4b73cd..a0d43fd8c 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/horizontal_pulley.json +++ b/src/main/resources/assets/create/models/block/belt_casing/horizontal_pulley.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -13,47 +12,21 @@ "from": [1, 5, 2], "to": [15, 11, 14], "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [2, 5, 14, 11], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 14, 11], "texture": "#8"} } }, { - "name": "Left", + "name": "Right", "from": [0, 0, 0], "to": [16, 11, 4], "faces": { - "north": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "east": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "south": {"uv": [14, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Zfighter", - "from": [0.5, 0.1, -0.1], - "to": [15.5, 10.9, 0.9], - "faces": { - "north": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Zfighter2", - "from": [0.5, 0.1, 15.1], - "to": [15.5, 10.9, 16.1], - "faces": { - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "south": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "east": {"uv": [6, 8, 8, 13.5], "texture": "#4"}, + "south": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "west": {"uv": [0, 8, 2, 13.5], "texture": "#4"}, + "up": {"uv": [6, 0, 8, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [8, 0, 10, 8], "rotation": 270, "texture": "#4"} } }, { @@ -61,12 +34,12 @@ "from": [0, 0, 12], "to": [16, 11, 16], "faces": { - "north": {"uv": [0, 0, 2, 11], "texture": "#2"}, - "east": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "up": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [8, 8, 0, 13.5], "texture": "#4"}, + "east": {"uv": [8, 8, 6, 13.5], "texture": "#4"}, + "south": {"uv": [8, 8, 0, 13.5], "texture": "#4"}, + "west": {"uv": [2, 8, 0, 13.5], "texture": "#4"}, + "up": {"uv": [8, 0, 6, 8], "rotation": 270, "texture": "#4"}, + "down": {"uv": [10, 0, 8, 8], "rotation": 270, "texture": "#4"} } }, { @@ -74,10 +47,10 @@ "from": [0, 0, 4], "to": [16, 4, 12], "faces": { - "east": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "west": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 10], "texture": "#2"}, - "down": {"uv": [4, 0, 12, 16], "rotation": 90, "texture": "#2"} + "east": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "west": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "up": {"uv": [8, 2, 16, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [10, 0, 14, 8], "rotation": 270, "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/horizontal_start.json b/src/main/resources/assets/create/models/block/belt_casing/horizontal_start.json index cfe4b73cd..042448aab 100644 --- a/src/main/resources/assets/create/models/block/belt_casing/horizontal_start.json +++ b/src/main/resources/assets/create/models/block/belt_casing/horizontal_start.json @@ -2,10 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "particle": "create:block/brass_casing_side", - "1": "create:block/belt_support_side", - "2": "create:block/brass_casing_side", - "8": "create:block/gearbox" + "4": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" }, "elements": [ { @@ -13,47 +12,44 @@ "from": [1, 5, 2], "to": [15, 11, 14], "faces": { - "north": {"uv": [0, 0, 15, 6], "texture": "#1"}, "east": {"uv": [2, 5, 14, 11], "texture": "#8"}, - "south": {"uv": [0, 0, 15, 6], "texture": "#1"}, "west": {"uv": [2, 5, 14, 11], "texture": "#8"} } }, { "name": "Left", "from": [0, 0, 0], + "to": [16, 3, 4], + "faces": { + "north": {"uv": [0, 12, 8, 13.5], "texture": "#4"}, + "east": {"uv": [6, 12, 8, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 2, 13.5], "texture": "#4"}, + "up": {"uv": [8, 3, 16, 5], "texture": "#4"}, + "down": {"uv": [6, 0, 8, 8], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [0, 3, 0], + "to": [1, 11, 4], + "faces": { + "north": {"uv": [7.5, 8, 8, 12], "texture": "#4"}, + "east": {"uv": [6, 8, 8, 12], "texture": "#4"}, + "south": {"uv": [0, 8, 0.5, 12], "texture": "#4"}, + "west": {"uv": [0, 8, 2, 12], "texture": "#4"}, + "up": {"uv": [0, 7.5, 2, 8], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Left", + "from": [15, 3, 0], "to": [16, 11, 4], "faces": { - "north": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "east": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "south": {"uv": [14, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "up": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 4, 16], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Zfighter", - "from": [0.5, 0.1, -0.1], - "to": [15.5, 10.9, 0.9], - "faces": { - "north": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} - } - }, - { - "name": "Zfighter2", - "from": [0.5, 0.1, 15.1], - "to": [15.5, 10.9, 16.1], - "faces": { - "east": {"uv": [12, 0, 13, 10.8], "texture": "#2"}, - "south": {"uv": [0, 0, 15, 10.8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 10.8], "texture": "#2"}, - "up": {"uv": [0, 0, 15, 1], "texture": "#2"}, - "down": {"uv": [0, 0, 1, 15], "rotation": 90, "texture": "#2"} + "north": {"uv": [8, 8, 7.5, 12], "texture": "#4"}, + "east": {"uv": [2, 8, 0, 12], "texture": "#4"}, + "south": {"uv": [0.5, 8, 0, 12], "texture": "#4"}, + "west": {"uv": [8, 8, 6, 12], "texture": "#4"}, + "up": {"uv": [0, 8, 2, 7.5], "rotation": 90, "texture": "#4"} } }, { @@ -61,12 +57,12 @@ "from": [0, 0, 12], "to": [16, 11, 16], "faces": { - "north": {"uv": [0, 0, 2, 11], "texture": "#2"}, - "east": {"uv": [0, 0, 4, 11], "texture": "#2"}, - "south": {"uv": [0, 0, 16, 11], "texture": "#2"}, - "west": {"uv": [12, 0, 16, 11], "texture": "#2"}, - "up": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "east": {"uv": [0, 8, 2, 13.5], "texture": "#4"}, + "south": {"uv": [0, 8, 8, 13.5], "texture": "#4"}, + "west": {"uv": [6, 8, 8, 13.5], "texture": "#4"}, + "up": {"uv": [6, 0, 8, 8], "rotation": 90, "texture": "#4"}, + "down": {"uv": [8, 0, 10, 8], "rotation": 90, "texture": "#4"} } }, { @@ -74,10 +70,10 @@ "from": [0, 0, 4], "to": [16, 4, 12], "faces": { - "east": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "west": {"uv": [4, 7, 12, 11], "texture": "#2"}, - "up": {"uv": [0, 2, 16, 10], "texture": "#2"}, - "down": {"uv": [4, 0, 12, 16], "rotation": 90, "texture": "#2"} + "east": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "west": {"uv": [2, 11.5, 6, 13.5], "texture": "#4"}, + "up": {"uv": [8, 2, 16, 6], "texture": "#4"}, + "down": {"uv": [10, 0, 14, 8], "rotation": 90, "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/belt_casing/sideways_end.json b/src/main/resources/assets/create/models/block/belt_casing/sideways_end.json new file mode 100644 index 000000000..c35d0e2ec --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_casing/sideways_end.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Casing", + "from": [5, 0, 0], + "to": [11, 16, 4], + "faces": { + "north": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0, 8, 8], "texture": "#3"}, + "south": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0, 2, 8], "texture": "#3"}, + "up": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 15, 12], + "to": [11, 16, 16], + "faces": { + "north": {"uv": [8, 12.5, 8.5, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 2, 0.5], "texture": "#3"}, + "south": {"uv": [8, 12.5, 8.5, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0, 8, 0.5], "texture": "#3"}, + "up": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 14, 2], + "to": [5, 16, 14], + "faces": { + "north": {"uv": [6.5, 12.5, 8, 13.5], "texture": "#3"}, + "east": {"uv": [0, 13.5, 6, 14.5], "texture": "#3"}, + "south": {"uv": [0, 12.5, 1.5, 13.5], "texture": "#3"}, + "west": {"uv": [1, 12.5, 7, 13.5], "texture": "#3"}, + "up": {"uv": [0, 13.5, 6, 15], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 13.5, 6, 15], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 0, 2], + "to": [5, 2, 14], + "faces": { + "north": {"uv": [6.5, 13.5, 8, 12.5], "texture": "#3"}, + "east": {"uv": [0, 14.5, 6, 13.5], "texture": "#3"}, + "south": {"uv": [0, 13.5, 1.5, 12.5], "texture": "#3"}, + "west": {"uv": [1, 13.5, 7, 12.5], "texture": "#3"}, + "up": {"uv": [6, 13.5, 0, 15], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 13.5, 0, 15], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 14, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [8, 12.5, 6.5, 13.5], "texture": "#3"}, + "east": {"uv": [7, 12.5, 1, 13.5], "texture": "#3"}, + "south": {"uv": [1.5, 12.5, 0, 13.5], "texture": "#3"}, + "west": {"uv": [6, 13.5, 0, 14.5], "texture": "#3"}, + "up": {"uv": [0, 15, 6, 13.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 15, 6, 13.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 0, 2], + "to": [14, 2, 14], + "faces": { + "north": {"uv": [8, 13.5, 6.5, 12.5], "texture": "#3"}, + "east": {"uv": [7, 13.5, 1, 12.5], "texture": "#3"}, + "south": {"uv": [1.5, 13.5, 0, 12.5], "texture": "#3"}, + "west": {"uv": [6, 14.5, 0, 13.5], "texture": "#3"}, + "up": {"uv": [6, 15, 0, 13.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 15, 0, 13.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 0, 12], + "to": [11, 1, 16], + "faces": { + "north": {"uv": [8.5, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0.5, 2, 0], "texture": "#3"}, + "south": {"uv": [8.5, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0.5, 8, 0], "texture": "#3"}, + "up": {"uv": [10, 12.5, 8, 15.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [10, 12.5, 8, 15.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 1, 2], + "to": [11, 15, 14], + "faces": { + "up": {"uv": [2, 5, 14, 11], "rotation": 90, "texture": "#8"}, + "down": {"uv": [2, 5, 14, 11], "rotation": 90, "texture": "#8"} + } + } + ], + "groups": [ + { + "name": "horizontal_middle", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6] + }, + { + "name": "horizontal_start", + "origin": [8, 8, 8], + "children": [7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/sideways_middle.json b/src/main/resources/assets/create/models/block/belt_casing/sideways_middle.json new file mode 100644 index 000000000..9886764c4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_casing/sideways_middle.json @@ -0,0 +1,30 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_casing_belt", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Casing", + "from": [5, 0, 0], + "to": [11, 16, 16], + "faces": { + "north": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 8, 8], "rotation": 270, "texture": "#3"}, + "south": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#3"}, + "up": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "horizontal_middle", + "origin": [8, 8, 8], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/sideways_pulley.json b/src/main/resources/assets/create/models/block/belt_casing/sideways_pulley.json new file mode 100644 index 000000000..0f8653d94 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_casing/sideways_pulley.json @@ -0,0 +1,110 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Casing", + "from": [5, 0, 0], + "to": [11, 16, 4], + "faces": { + "north": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0, 8, 8], "texture": "#3"}, + "south": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0, 2, 8], "texture": "#3"}, + "up": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [8, 12.5, 10, 15.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 0, 12], + "to": [11, 16, 16], + "faces": { + "north": {"uv": [8, 15.5, 16, 12.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [8, 0, 6, 8], "texture": "#3"}, + "south": {"uv": [8, 15.5, 16, 12.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [2, 0, 0, 8], "texture": "#3"}, + "up": {"uv": [10, 12.5, 8, 15.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [10, 12.5, 8, 15.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 14, 2], + "to": [5, 16, 14], + "faces": { + "north": {"uv": [6.5, 12.5, 8, 13.5], "texture": "#3"}, + "east": {"uv": [0, 13.5, 6, 14.5], "texture": "#3"}, + "south": {"uv": [0, 12.5, 1.5, 13.5], "texture": "#3"}, + "west": {"uv": [1, 12.5, 7, 13.5], "texture": "#3"}, + "up": {"uv": [0, 13.5, 6, 15], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 13.5, 6, 15], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 0, 2], + "to": [5, 2, 14], + "faces": { + "north": {"uv": [6.5, 13.5, 8, 12.5], "texture": "#3"}, + "east": {"uv": [0, 14.5, 6, 13.5], "texture": "#3"}, + "south": {"uv": [0, 13.5, 1.5, 12.5], "texture": "#3"}, + "west": {"uv": [1, 13.5, 7, 12.5], "texture": "#3"}, + "up": {"uv": [6, 13.5, 0, 15], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 13.5, 0, 15], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 14, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [8, 12.5, 6.5, 13.5], "texture": "#3"}, + "east": {"uv": [7, 12.5, 1, 13.5], "texture": "#3"}, + "south": {"uv": [1.5, 12.5, 0, 13.5], "texture": "#3"}, + "west": {"uv": [6, 13.5, 0, 14.5], "texture": "#3"}, + "up": {"uv": [0, 15, 6, 13.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 15, 6, 13.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 0, 2], + "to": [14, 2, 14], + "faces": { + "north": {"uv": [8, 13.5, 6.5, 12.5], "texture": "#3"}, + "east": {"uv": [7, 13.5, 1, 12.5], "texture": "#3"}, + "south": {"uv": [1.5, 13.5, 0, 12.5], "texture": "#3"}, + "west": {"uv": [6, 14.5, 0, 13.5], "texture": "#3"}, + "up": {"uv": [6, 15, 0, 13.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 15, 0, 13.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 1, 2], + "to": [11, 15, 14], + "faces": { + "up": {"uv": [2, 5, 14, 11], "rotation": 90, "texture": "#8"}, + "down": {"uv": [2, 5, 14, 11], "rotation": 90, "texture": "#8"} + } + } + ], + "groups": [ + { + "name": "horizontal_middle", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "horizontal_start", + "origin": [8, 8, 8], + "children": [6] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/sideways_start.json b/src/main/resources/assets/create/models/block/belt_casing/sideways_start.json new file mode 100644 index 000000000..b4409d0bb --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_casing/sideways_start.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_casing_belt", + "8": "create:block/gearbox", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Casing", + "from": [5, 0, 12], + "to": [11, 16, 16], + "faces": { + "north": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 2, 8], "texture": "#3"}, + "south": {"uv": [8, 12.5, 16, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0, 8, 8], "texture": "#3"}, + "up": {"uv": [8, 12.5, 10, 15.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [8, 12.5, 10, 15.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 15, 0], + "to": [11, 16, 4], + "faces": { + "north": {"uv": [8, 12.5, 8.5, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0, 8, 0.5], "texture": "#3"}, + "south": {"uv": [8, 12.5, 8.5, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0, 2, 0.5], "texture": "#3"}, + "up": {"uv": [8, 12.5, 10, 15.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [8, 12.5, 10, 15.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 14, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [0, 12.5, 1.5, 13.5], "texture": "#3"}, + "east": {"uv": [1, 12.5, 7, 13.5], "texture": "#3"}, + "south": {"uv": [6.5, 12.5, 8, 13.5], "texture": "#3"}, + "west": {"uv": [0, 13.5, 6, 14.5], "texture": "#3"}, + "up": {"uv": [0, 13.5, 6, 15], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 13.5, 6, 15], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [11, 0, 2], + "to": [14, 2, 14], + "faces": { + "north": {"uv": [0, 13.5, 1.5, 12.5], "texture": "#3"}, + "east": {"uv": [1, 13.5, 7, 12.5], "texture": "#3"}, + "south": {"uv": [6.5, 13.5, 8, 12.5], "texture": "#3"}, + "west": {"uv": [0, 14.5, 6, 13.5], "texture": "#3"}, + "up": {"uv": [6, 13.5, 0, 15], "rotation": 270, "texture": "#3"}, + "down": {"uv": [6, 13.5, 0, 15], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 14, 2], + "to": [5, 16, 14], + "faces": { + "north": {"uv": [1.5, 12.5, 0, 13.5], "texture": "#3"}, + "east": {"uv": [6, 13.5, 0, 14.5], "texture": "#3"}, + "south": {"uv": [8, 12.5, 6.5, 13.5], "texture": "#3"}, + "west": {"uv": [7, 12.5, 1, 13.5], "texture": "#3"}, + "up": {"uv": [0, 15, 6, 13.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 15, 6, 13.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [2, 0, 2], + "to": [5, 2, 14], + "faces": { + "north": {"uv": [1.5, 13.5, 0, 12.5], "texture": "#3"}, + "east": {"uv": [6, 14.5, 0, 13.5], "texture": "#3"}, + "south": {"uv": [8, 13.5, 6.5, 12.5], "texture": "#3"}, + "west": {"uv": [7, 13.5, 1, 12.5], "texture": "#3"}, + "up": {"uv": [6, 15, 0, 13.5], "rotation": 270, "texture": "#3"}, + "down": {"uv": [6, 15, 0, 13.5], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 0, 0], + "to": [11, 1, 4], + "faces": { + "north": {"uv": [8.5, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0.5, 8, 0], "texture": "#3"}, + "south": {"uv": [8.5, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0.5, 2, 0], "texture": "#3"}, + "up": {"uv": [10, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [10, 12.5, 8, 15.5], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Casing", + "from": [5, 1, 2], + "to": [11, 15, 14], + "faces": { + "up": {"uv": [2, 5, 14, 11], "rotation": 270, "texture": "#8"}, + "down": {"uv": [2, 5, 14, 11], "rotation": 270, "texture": "#8"} + } + } + ], + "groups": [ + { + "name": "horizontal_middle", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6] + }, + { + "name": "horizontal_start", + "origin": [8, 8, 8], + "children": [7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/vertical_end.json b/src/main/resources/assets/create/models/block/belt_casing/vertical_end.json deleted file mode 100644 index d158fadc8..000000000 --- a/src/main/resources/assets/create/models/block/belt_casing/vertical_end.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_comment": "Vertical belts cannot have casings at the moment", - "textures": {}, - "elements": [] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/vertical_middle.json b/src/main/resources/assets/create/models/block/belt_casing/vertical_middle.json deleted file mode 100644 index d158fadc8..000000000 --- a/src/main/resources/assets/create/models/block/belt_casing/vertical_middle.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_comment": "Vertical belts cannot have casings at the moment", - "textures": {}, - "elements": [] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/vertical_pulley.json b/src/main/resources/assets/create/models/block/belt_casing/vertical_pulley.json deleted file mode 100644 index d158fadc8..000000000 --- a/src/main/resources/assets/create/models/block/belt_casing/vertical_pulley.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_comment": "Vertical belts cannot have casings at the moment", - "textures": {}, - "elements": [] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_casing/vertical_start.json b/src/main/resources/assets/create/models/block/belt_casing/vertical_start.json deleted file mode 100644 index d158fadc8..000000000 --- a/src/main/resources/assets/create/models/block/belt_casing/vertical_start.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_comment": "Vertical belts cannot have casings at the moment", - "textures": {}, - "elements": [] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json new file mode 100644 index 000000000..769dac047 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json @@ -0,0 +1,240 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, -3, 0], + "to": [16, 0, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [8, 13.5, 9, 15], "texture": "#4"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [0, -3, 0], + "to": [2, 0, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "east": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "south": {"uv": [16, 13.5, 15, 15], "texture": "#4"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [14, 0, 0], + "to": [16, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [8, 5.5, 9, 13.5], "texture": "#4"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [0, 0, 0], + "to": [2, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [16, 5.5, 15, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2"} + } + }, + { + "name": "Top", + "from": [2, 10, 0], + "to": [14, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 0]}, + "faces": { + "north": {"uv": [9, 5.5, 15, 8.5], "texture": "#4"}, + "south": {"uv": [9, 5.5, 15, 8.5], "texture": "#4"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2"}, + "down": {"uv": [2, 0, 14, 6], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [15, -5, 0], + "to": [16, -3, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [8, 15, 8.5, 16], "texture": "#4"}, + "east": {"uv": [5, 15, 8, 16], "texture": "#4"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#4"} + } + }, + { + "name": "LeftBottom", + "from": [0, -5, 0], + "to": [1, -3, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, + "faces": { + "north": {"uv": [15.5, 15, 16, 16], "texture": "#4"}, + "east": {"uv": [8, 15, 5, 16], "texture": "#4"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#4"} + } + }, + { + "name": "BackExtension", + "from": [2, -2, 10], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [9, 8, 11, 16], "texture": "#3"}, + "south": {"uv": [0, 0.5, 8, 6.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 8, 11, 16], "texture": "#3"}, + "up": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "MidExtension", + "from": [1, -2, 6], + "to": [15, 15, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "north": {"uv": [0, 7.5, 7, 16], "texture": "#3"}, + "east": {"uv": [7, 7.5, 9, 16], "rotation": 180, "texture": "#3"}, + "south": {"uv": [0, 0, 8.5, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 7.5, 9, 16], "rotation": 180, "texture": "#3"}, + "up": {"uv": [11, 9, 13, 16], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "BackBottom", + "from": [3.9, -3, 16], + "to": [12.1, 7, 26], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -5, 17]}, + "faces": { + "east": {"uv": [9.5, 11, 14.5, 16], "rotation": 270, "texture": "#4"}, + "south": {"uv": [1.5, 10, 6.5, 14], "rotation": 90, "texture": "#4"}, + "west": {"uv": [9.5, 11, 14.5, 16], "rotation": 270, "texture": "#4"}, + "up": {"uv": [2.5, 10, 7.5, 14], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 10, 5, 14], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Back", + "from": [2.9, -4.1, 14], + "to": [13.1, 13.1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [5, 0, 6.5, 8.5], "texture": "#4"}, + "south": {"uv": [0, 0, 5, 8.5], "texture": "#4"}, + "west": {"uv": [5, 0, 6.5, 8.5], "texture": "#4"}, + "up": {"uv": [0, 8.5, 5, 10], "texture": "#4"}, + "down": {"uv": [0, 8.5, 5, 10], "texture": "#4"} + } + }, + { + "name": "RearBackPlate", + "from": [1, -5, 5], + "to": [15, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [1, 13, 15, 16], "texture": "#particle"}, + "south": {"uv": [0.5, 14.5, 7.5, 16], "texture": "#4"}, + "up": {"uv": [1, 5, 15, 16], "texture": "#particle"} + } + }, + { + "name": "BackPlateLeft", + "from": [15, -5, 6], + "to": [16, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [0, 14.5, 5, 16], "texture": "#4"}, + "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#4"}, + "up": {"uv": [0, 14.5, 5.5, 15], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "BackPlateLeft", + "from": [0, -5, 6], + "to": [1, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#4"}, + "west": {"uv": [5, 14.5, 0, 16], "texture": "#4"}, + "up": {"uv": [0, 15, 5.5, 14.5], "rotation": 270, "texture": "#4"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "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] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [7, 8] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [9, 10, 11, 12, 13] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json new file mode 100644 index 000000000..ee59d4be2 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json @@ -0,0 +1,241 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, -3, 8], + "to": [16, 0, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [8, 13.5, 9, 15], "texture": "#4"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [0, -3, 8], + "to": [2, 0, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "east": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "south": {"uv": [16, 13.5, 15, 15], "texture": "#4"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [14, 0, 8], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [8, 5.5, 9, 13.5], "texture": "#4"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [0, 0, 8], + "to": [2, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [16, 5.5, 15, 13.5], "texture": "#4"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2"} + } + }, + { + "name": "Top", + "from": [2, 10, 8], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 8]}, + "faces": { + "north": {"uv": [9, 5.5, 15, 8.5], "texture": "#4"}, + "south": {"uv": [9, 5.5, 15, 8.5], "texture": "#4"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2"}, + "down": {"uv": [2, 0, 14, 6], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [15, -5, 8], + "to": [16, -3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [8, 15, 8.5, 16], "texture": "#4"}, + "east": {"uv": [5, 15, 8, 16], "texture": "#4"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#4"} + } + }, + { + "name": "LeftBottom", + "from": [0, -5, 8], + "to": [1, -3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [15.5, 15, 16, 16], "texture": "#4"}, + "east": {"uv": [8, 15, 5, 16], "texture": "#4"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#4"} + } + }, + { + "name": "BackExtension", + "from": [2, -2, 12], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [9, 8, 11, 16], "texture": "#3"}, + "south": {"uv": [0, 0.5, 8, 6.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 8, 11, 16], "texture": "#3"}, + "up": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "MidExtension", + "from": [1, -2, 11], + "to": [15, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [0, 7.5, 7, 16], "texture": "#3"}, + "east": {"uv": [7, 7.5, 9, 16], "rotation": 180, "texture": "#3"}, + "south": {"uv": [0, 0, 8.5, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 7.5, 9, 16], "rotation": 180, "texture": "#3"}, + "up": {"uv": [11, 9, 13, 16], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "BackBottom", + "from": [3.9, -5, 16], + "to": [12.1, 5, 26], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -5, 17]}, + "faces": { + "north": {"uv": [1.5, 10, 6.5, 14], "rotation": 90, "texture": "#4"}, + "east": {"uv": [9.5, 11, 14.5, 16], "rotation": 270, "texture": "#4"}, + "south": {"uv": [1.5, 10, 6.5, 14], "rotation": 90, "texture": "#4"}, + "west": {"uv": [9.5, 11, 14.5, 16], "rotation": 270, "texture": "#4"}, + "up": {"uv": [2.5, 10, 7.5, 14], "rotation": 270, "texture": "#4"}, + "down": {"uv": [1, 10, 6, 14], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Back", + "from": [2.9, -4.1, 16], + "to": [13.1, 13.1, 19], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [5, 0, 6.5, 8.5], "texture": "#4"}, + "south": {"uv": [0, 0, 5, 8.5], "texture": "#4"}, + "west": {"uv": [5, 0, 6.5, 8.5], "texture": "#4"}, + "up": {"uv": [0, 8.5, 5, 10], "texture": "#4"}, + "down": {"uv": [0, 8.5, 5, 10], "texture": "#4"} + } + }, + { + "name": "RearBackPlate", + "from": [1, -5, 10], + "to": [15, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [1, 13, 15, 16], "texture": "#particle"}, + "south": {"uv": [0.5, 14.5, 7.5, 16], "texture": "#4"}, + "up": {"uv": [1, 10, 15, 16], "texture": "#particle"} + } + }, + { + "name": "BackPlateLeft", + "from": [15, -5, 14], + "to": [16, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [0, 14.5, 1, 16], "texture": "#4"}, + "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#4"}, + "up": {"uv": [0, 14.5, 1, 15], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "BackPlateLeft", + "from": [0, -5, 14], + "to": [1, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#4"}, + "west": {"uv": [1, 14.5, 0, 16], "texture": "#4"}, + "up": {"uv": [0, 15, 1, 14.5], "rotation": 270, "texture": "#4"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "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] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [7, 8] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [9, 10, 11, 12, 13] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/flap.json b/src/main/resources/assets/create/models/block/belt_funnel/flap.json new file mode 100644 index 000000000..328a8a1f5 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/flap.json @@ -0,0 +1,21 @@ +{ + "textures": { + "4": "create:block/brass_funnel_plating" + }, + "elements": [ + { + "name": "F4", + "from": [11, -3, 9], + "to": [14, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-24.5, -7.5, 9]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}, + "east": {"uv": [6.5, 0, 7, 6.5], "texture": "#4"}, + "south": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}, + "west": {"uv": [7.5, 0, 8, 6.5], "texture": "#4"}, + "up": {"uv": [6.5, 0, 8, 0.5], "rotation": 180, "texture": "#4"}, + "down": {"uv": [6.5, 6, 8, 6.5], "rotation": 180, "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_pulley.json b/src/main/resources/assets/create/models/block/belt_pulley.json index 9ed34cdb1..df86f499c 100644 --- a/src/main/resources/assets/create/models/block/belt_pulley.json +++ b/src/main/resources/assets/create/models/block/belt_pulley.json @@ -1,54 +1,75 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "particle": "block/dark_oak_log", - "0": "create:block/axis", - "1": "create:block/axis_top", - "2": "block/dark_oak_log", - "3": "block/dark_oak_log" - }, - "elements": [ - { - "name": "Axis", - "from": [ 6.0, 0.0, 6.0 ], - "to": [ 10.0, 16.0, 10.0 ], - "shade": false, - "faces": { - "north": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, - "east": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, - "south": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, - "west": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, - "up": { "texture": "#1", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, - "down": { "texture": "#1", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } - } - }, - { - "name": "Pulley", - "from": [ 5.0, 2.0, 5.0 ], - "to": [ 11.0, 14.0, 11.0 ], - "faces": { - "north": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 14.0 ] }, - "east": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 14.0 ] }, - "south": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 14.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 14.0 ] }, - "up": { "texture": "#3", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, - "down": { "texture": "#3", "uv": [ 5.0, 5.0, 11.0, 11.0 ] } - } - }, - { - "name": "Pulley2", - "from": [ 5.0, 2.5000000074505806, 5.0 ], - "to": [ 11.0, 13.50000000745058, 11.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 13.0 ] }, - "east": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 13.0 ] }, - "south": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 13.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 2.0, 11.0, 13.0 ] }, - "up": { "texture": "#3", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, - "down": { "texture": "#3", "uv": [ 5.0, 5.0, 11.0, 11.0 ] } - } - } - ] + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "2": "block/dark_oak_log", + "3": "block/dark_oak_log_top", + "particle": "block/dark_oak_log" + }, + "elements": [ + { + "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"} + } + }, + { + "name": "Pulley", + "from": [4, 2, 5], + "to": [8, 14, 11], + "faces": { + "north": {"uv": [5, 2, 9, 14], "texture": "#2"}, + "south": {"uv": [5, 2, 9, 14], "texture": "#2"}, + "west": {"uv": [5, 2, 11, 14], "texture": "#2"}, + "up": {"uv": [0, 5, 4, 11], "texture": "#3"}, + "down": {"uv": [0, 5, 4, 11], "texture": "#3"} + } + }, + { + "name": "Pulley", + "from": [8, 2, 5], + "to": [12, 14, 11], + "faces": { + "north": {"uv": [5, 2, 9, 14], "texture": "#2"}, + "east": {"uv": [5, 2, 11, 14], "texture": "#2"}, + "south": {"uv": [5, 2, 9, 14], "texture": "#2"}, + "up": {"uv": [12, 5, 16, 11], "texture": "#3"}, + "down": {"uv": [12, 5, 16, 11], "texture": "#3"} + } + }, + { + "name": "Pulley", + "from": [5, 2, 4], + "to": [11, 14, 5], + "faces": { + "north": {"uv": [5, 2, 11, 14], "texture": "#2"}, + "east": {"uv": [5, 2, 6, 14], "texture": "#2"}, + "west": {"uv": [5, 2, 6, 14], "texture": "#2"}, + "up": {"uv": [8, 15, 14, 16], "texture": "#3"}, + "down": {"uv": [6, 15, 12, 16], "texture": "#3"} + } + }, + { + "name": "Pulley", + "from": [5, 2, 11], + "to": [11, 14, 12], + "faces": { + "east": {"uv": [6, 2, 5, 14], "texture": "#2"}, + "south": {"uv": [11, 2, 5, 14], "texture": "#2"}, + "west": {"uv": [6, 2, 5, 14], "texture": "#2"}, + "up": {"uv": [3, 1, 9, 0], "texture": "#3"}, + "down": {"uv": [4, 1, 10, 0], "texture": "#3"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/cross.json b/src/main/resources/assets/create/models/block/belt_tunnel/cross.json index 81c29b76d..8e83eda53 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/cross.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/cross.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 6], "texture": "#0"}, "south": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 6], "texture": "#0"}, - "up": {"uv": [0.5, 3.5, 3.5, 4], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.75, 4, 3.5, 4.5], "texture": "#0"} } }, @@ -26,8 +27,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { - "up": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#1"} } }, { @@ -40,7 +41,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 0.5, 4], "texture": "#0"} + "up": {"uv": [14, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -53,7 +54,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 0.5, 4], "texture": "#0"} + "up": {"uv": [14, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -66,7 +67,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [3.5, 3.5, 4, 4], "texture": "#0"} + "up": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#1"} } }, { @@ -79,7 +80,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [3.5, 3.5, 4, 4], "texture": "#0"} + "up": {"uv": [0, 14, 2, 16], "rotation": 180, "texture": "#1"} } }, { @@ -138,7 +139,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -150,7 +151,7 @@ "faces": { "north": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "south": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [0.5, 3.5, 3.5, 4], "texture": "#0"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "texture": "#0"} } }, @@ -162,7 +163,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/flap.json b/src/main/resources/assets/create/models/block/belt_tunnel/flap.json index b1b1e371e..17626fed4 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/flap.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/flap.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "particle": "create:block/brass_tunnel" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/fullshade.json b/src/main/resources/assets/create/models/block/belt_tunnel/fullshade.json index 2deeb5bfa..ac691ace7 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/fullshade.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/fullshade.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [12, 8.25, 16, 13], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -25,8 +26,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { - "up": {"uv": [8.5, 0.25, 11.5, 3.25], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [12.5, 0.25, 15.5, 3.25], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12.5, 0.25, 15.5, 3.25], "rotation": 180, "texture": "#0"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [12, 8.25, 16, 13], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -74,7 +75,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -86,7 +87,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/halfshade.json b/src/main/resources/assets/create/models/block/belt_tunnel/halfshade.json index bdc3759ca..80896ef75 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/halfshade.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/halfshade.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [8, 3.5, 12, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -26,7 +27,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { "up": {"uv": [8.5, 0.25, 11.5, 3.25], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "down": {"uv": [8.5, 0.25, 11.5, 3.25], "rotation": 270, "texture": "#0"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [8, 3.5, 12, 8.25], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -74,7 +75,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -86,7 +87,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/indicator.json b/src/main/resources/assets/create/models/block/belt_tunnel/indicator.json deleted file mode 100644 index 1558c2d43..000000000 --- a/src/main/resources/assets/create/models/block/belt_tunnel/indicator.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" - }, - "elements": [ - { - "from": [6, 10, 16], - "to": [10, 14, 17], - "faces": { - "north": {"uv": [4.75, 0, 5.75, 1], "texture": "#0"}, - "east": {"uv": [5.5, 0, 5.75, 1], "texture": "#0"}, - "south": {"uv": [4.75, 0, 5.75, 1], "texture": "#0"}, - "west": {"uv": [4.75, 0, 5, 1], "texture": "#0"}, - "up": {"uv": [4.75, 0, 5, 1], "rotation": 270, "texture": "#0"}, - "down": {"uv": [4.75, 0, 5, 1], "rotation": 90, "texture": "#0"} - } - } - ] -} \ No newline at end of file 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 dc73dabf0..9ff7c583a 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 @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -25,8 +26,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { - "up": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#1"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -74,7 +75,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -86,7 +87,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } }, diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/straight.json b/src/main/resources/assets/create/models/block/belt_tunnel/straight.json index 027b65eb7..ad748b321 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/straight.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/straight.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel_top" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -25,8 +26,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { - "up": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#1"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -74,7 +75,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -86,7 +87,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/t_left.json b/src/main/resources/assets/create/models/block/belt_tunnel/t_left.json index fbb3568b4..09187e938 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/t_left.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/t_left.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -25,8 +26,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { - "up": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#1"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 0.5, 4], "texture": "#0"} + "up": {"uv": [14, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -52,7 +53,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [3.5, 3.5, 4, 4], "texture": "#0"} + "up": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#1"} } }, { @@ -99,7 +100,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -111,7 +112,7 @@ "faces": { "north": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "south": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [0.5, 3.5, 3.5, 4], "texture": "#0"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "texture": "#0"} } }, @@ -123,7 +124,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/t_right.json b/src/main/resources/assets/create/models/block/belt_tunnel/t_right.json index 85bb96bcf..070464014 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/t_right.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/t_right.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -25,8 +26,8 @@ "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [9, -24, 8]}, "faces": { - "up": {"uv": [0.5, 0.5, 3.5, 3.5], "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 90, "texture": "#0"} + "up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#1"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [7.5, 3.5, 8, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 0.5, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 2, 16], "rotation": 180, "texture": "#1"} } }, { @@ -52,7 +53,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [4, 3.5, 4.5, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [3.5, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [14, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -99,7 +100,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 90, "texture": "#0"} } }, @@ -111,7 +112,7 @@ "faces": { "north": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "south": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0.5, 3.5, 3.5, 4], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 180, "texture": "#0"} } }, @@ -123,7 +124,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 90, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/window.json b/src/main/resources/assets/create/models/block/belt_tunnel/window.json index dda810dce..3fd4275f9 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/window.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/window.json @@ -2,8 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/belt_tunnel", - "particle": "create:block/belt_tunnel" + "0": "create:block/brass_tunnel", + "1": "create:block/brass_tunnel_top", + "particle": "create:block/brass_tunnel" }, "elements": [ { @@ -16,7 +17,7 @@ "east": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, "south": {"uv": [12, 3.5, 16, 8.25], "texture": "#0"}, "west": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, - "up": {"uv": [0, 3.5, 4, 4], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"} } }, { @@ -26,7 +27,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [7, -24, 8]}, "faces": { "up": {"uv": [8.5, 0.25, 11.5, 3.25], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 0.5, 3.5, 3.5], "rotation": 270, "texture": "#0"} + "down": {"uv": [8.5, 0.25, 11.5, 3.25], "rotation": 270, "texture": "#0"} } }, { @@ -39,7 +40,7 @@ "east": {"uv": [0, 4, 0.5, 8.75], "texture": "#0"}, "south": {"uv": [12, 3.5, 16, 8.25], "texture": "#0"}, "west": {"uv": [3.5, 4, 4, 8.75], "texture": "#0"}, - "up": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"} } }, { @@ -74,7 +75,7 @@ "faces": { "east": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, "west": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, - "up": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 5.5, 3.5, 6], "rotation": 270, "texture": "#0"} } }, @@ -86,7 +87,7 @@ "faces": { "east": {"uv": [0.5, 4, 3.5, 6], "texture": "#0"}, "west": {"uv": [0.5, 6, 3.5, 8], "texture": "#0"}, - "up": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, "down": {"uv": [0.5, 4, 3.5, 4.5], "rotation": 270, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/chute/block.json b/src/main/resources/assets/create/models/block/chute/block.json new file mode 100644 index 000000000..d1bb640b4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block.json @@ -0,0 +1,121 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [3, 8, 1], + "to": [13, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, -3]}, + "faces": { + "north": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "texture": "#13"} + } + }, + { + "from": [3, 8, 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, 4], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "rotation": 180, "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [1, 8, 1], + "to": [3, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [14.5, 0, 15.5, 4], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "south": {"uv": [8.5, 0, 9.5, 4], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "texture": "#13"}, + "down": {"uv": [0, 0, 1, 7], "texture": "#13"} + } + }, + { + "from": [13, 8, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 16, 7]}, + "faces": { + "north": {"uv": [8.5, 0, 9.5, 4], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "south": {"uv": [14.5, 0, 15.5, 4], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "rotation": 180, "texture": "#13"}, + "down": {"uv": [0, 0, 1, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [13, 0, 2], + "to": [14, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [9, 4, 9.5, 8], "texture": "#13"}, + "east": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "south": {"uv": [14.5, 4, 15, 8], "texture": "#13"}, + "west": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [2, 0, 2], + "to": [3, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [14.5, 4, 15, 8], "texture": "#13"}, + "east": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "south": {"uv": [9, 4, 9.5, 8], "texture": "#13"}, + "west": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [3, 0, 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, 8], "texture": "#13"}, + "down": {"uv": [9.5, 7.5, 14.5, 8], "texture": "#13"} + } + }, + { + "from": [3, 0, 2], + "to": [13, 8, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9]}, + "faces": { + "north": {"uv": [9.5, 4, 14.5, 8], "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"} + } + } + ], + "groups": [ + { + "name": "ChuteTop", + "origin": [9, 16, -7], + "children": [0, 1, 2, 3] + }, + { + "name": "ChuteBase", + "origin": [8, 8, -7], + "children": [4, 5, 6, 7] + }, 8] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chute/block_diagonal.json b/src/main/resources/assets/create/models/block/chute/block_diagonal.json new file mode 100644 index 000000000..7f7428bce --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal.json @@ -0,0 +1,152 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/chute_diagonal", + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [2, 8, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [9, 4, 15, 8], "rotation": 180, "texture": "#13"}, + "east": {"uv": [9, 4, 15, 8], "rotation": 180, "texture": "#13"}, + "south": {"uv": [9, 4, 15, 8], "rotation": 180, "texture": "#13"}, + "west": {"uv": [9, 4, 15, 8], "rotation": 180, "texture": "#13"}, + "up": {"uv": [5, 10, 11, 16], "texture": "#2"}, + "down": {"uv": [9, 11, 15, 15], "texture": "#13"} + } + }, + { + "from": [2, 5.5, 2], + "to": [14, 8, 14], + "faces": { + "north": {"uv": [9, 10.5, 15, 14.5], "rotation": 180, "texture": "#13"}, + "east": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "south": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "west": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "up": {"uv": [9, 9.5, 15, 15.5], "texture": "#13"}, + "down": {"uv": [9, 11, 15, 15], "texture": "#13"} + } + }, + { + "from": [1.9, -12, 7.9], + "to": [14.1, 10.666, 14.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 10, 11, 16], "rotation": 270, "texture": "#2"}, + "east": {"uv": [13, 11, 16, 0], "texture": "#2"}, + "south": {"uv": [0, 10, 11, 16], "rotation": 270, "texture": "#2"}, + "west": {"uv": [13, 0, 16, 11], "rotation": 180, "texture": "#2"}, + "up": {"uv": [5, 10, 11, 13], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [3, 13, 3], + "to": [13, 14, 13], + "faces": { + "up": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [1.1, -12, 1.9], + "to": [14.9, 10.666, 8.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 11, 3], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 11, 3], "rotation": 90, "texture": "#2"}, + "up": {"uv": [8.5, 0, 15.5, 3], "rotation": 180, "texture": "#13"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 24, -24], + "children": [0] + }, + { + "name": "alt_block_diagonal_start", + "origin": [8, 8, 8], + "children": [ + { + "name": "group", + "origin": [8, 56, -56], + "children": [1] + }, + { + "name": "alt_block_diagonal_straight", + "origin": [8, 8, 8], + "children": [ + { + "name": "group", + "origin": [8, 8, -8], + "children": [2] + }, + { + "name": "group", + "origin": [8, 8, -8], + "children": [] + } + ] + }, 3] + }, + { + "name": "alt_block_diagonal_straight", + "origin": [8, 8, 8], + "children": [ + { + "name": "group", + "origin": [8, 8, -8], + "children": [4] + }, + { + "name": "group", + "origin": [8, 8, -8], + "children": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chute/block_diagonal_start.json b/src/main/resources/assets/create/models/block/chute/block_diagonal_start.json new file mode 100644 index 000000000..8b53f63c6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal_start.json @@ -0,0 +1,156 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/chute_diagonal", + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [3, 8, 13], + "to": [13, 16, 15], + "faces": { + "north": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "rotation": 180, "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [3, 8, 1], + "to": [13, 16, 3], + "faces": { + "north": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "texture": "#13"} + } + }, + { + "from": [13, 8, 1], + "to": [15, 16, 15], + "faces": { + "north": {"uv": [8.5, 0, 9.5, 4], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "south": {"uv": [14.5, 0, 15.5, 4], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "rotation": 180, "texture": "#13"}, + "down": {"uv": [0, 0, 1, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [1, 8, 1], + "to": [3, 16, 15], + "faces": { + "north": {"uv": [14.5, 0, 15.5, 4], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "south": {"uv": [8.5, 0, 9.5, 4], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "texture": "#13"}, + "down": {"uv": [0, 0, 1, 7], "texture": "#13"} + } + }, + { + "from": [2, 5.5, 2], + "to": [14, 8, 14], + "faces": { + "north": {"uv": [9, 10.5, 15, 14.5], "rotation": 180, "texture": "#13"}, + "east": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "south": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "west": {"uv": [14.25, 5, 15.5, 11], "rotation": 270, "texture": "#2"}, + "up": {"uv": [9, 9.5, 15, 15.5], "texture": "#13"}, + "down": {"uv": [9, 11, 15, 15], "texture": "#13"} + } + }, + { + "from": [1.9, -12, 7.9], + "to": [14.1, 10.666, 14.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 10, 11, 16], "rotation": 270, "texture": "#2"}, + "east": {"uv": [13, 11, 16, 0], "texture": "#2"}, + "south": {"uv": [0, 10, 11, 16], "rotation": 270, "texture": "#2"}, + "west": {"uv": [13, 0, 16, 11], "rotation": 180, "texture": "#2"}, + "up": {"uv": [5, 10, 11, 13], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [1.1, -12, 1.9], + "to": [14.9, 8.666, 8.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 10, 3], "rotation": 270, "texture": "#2"}, + "south": {"uv": [1, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "west": {"uv": [1, 0, 11, 3], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [3, 13, 3], + "to": [13, 14, 13], + "faces": { + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "rotation": 180, "texture": "#13"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 56, -56], + "children": [0, 1, 2, 3, 4] + }, + { + "name": "alt_block_diagonal_straight", + "origin": [8, 8, 8], + "children": [ + { + "name": "group", + "origin": [8, 8, -8], + "children": [5, 6] + }, + { + "name": "group", + "origin": [8, 8, -8], + "children": [] + } + ] + }, 7] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chute/block_diagonal_straight.json b/src/main/resources/assets/create/models/block/chute/block_diagonal_straight.json new file mode 100644 index 000000000..d6d05dd68 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal_straight.json @@ -0,0 +1,82 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/chute_diagonal", + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [1.9, -12, 7.9], + "to": [14.1, 10.666, 14.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 10, 9, 16], "rotation": 90, "texture": "#13"}, + "east": {"uv": [13, 11, 16, 0], "texture": "#2"}, + "south": {"uv": [0, 10, 11, 16], "rotation": 270, "texture": "#2"}, + "west": {"uv": [13, 0, 16, 11], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [1.1, -12, 1.9], + "to": [14.9, 10.666, 8.1], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 11, 3], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 3, 11, 10], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 11, 3], "rotation": 90, "texture": "#2"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 8, -8], + "children": [0, 1] + }, + { + "name": "group", + "origin": [8, 8, -8], + "children": [] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chute/block_windowed.json b/src/main/resources/assets/create/models/block/chute/block_windowed.json new file mode 100644 index 000000000..fecf23214 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_windowed.json @@ -0,0 +1,303 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [13, 13, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [8.5, 0, 9.5, 1.5], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 1.5], "texture": "#13"}, + "south": {"uv": [14.5, 0, 15.5, 1.5], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 1.5], "texture": "#13"}, + "up": {"uv": [6, 0, 7, 7], "texture": "#13"}, + "down": {"uv": [6, 0, 7, 7], "texture": "#13"} + } + }, + { + "from": [3, 13, 13], + "to": [13, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [9.5, 0, 14.5, 1.5], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 1.5], "texture": "#13"}, + "up": {"uv": [1, 6, 6, 7], "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "texture": "#13"} + } + }, + { + "from": [12, 8, 13], + "to": [13, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, 9]}, + "faces": { + "north": {"uv": [9.5, 1.5, 10, 4], "texture": "#13"}, + "east": {"uv": [9, 0, 16, 4], "texture": "#13"}, + "south": {"uv": [14, 1.5, 14.5, 4], "texture": "#13"}, + "west": {"uv": [13, 1.5, 14, 4], "texture": "#13"}, + "down": {"uv": [5.5, 0, 6, 1], "texture": "#13"} + } + }, + { + "from": [12, 8, 1], + "to": [13, 13, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, 7]}, + "faces": { + "north": {"uv": [9.5, 1.5, 10, 4], "texture": "#13"}, + "east": {"uv": [16, 0, 9, 4], "texture": "#13"}, + "south": {"uv": [10, 1.5, 9.5, 4], "texture": "#13"}, + "west": {"uv": [14, 1.5, 13, 4], "texture": "#13"}, + "down": {"uv": [5.5, 1, 6, 0], "texture": "#13"} + } + }, + { + "from": [13, 8, 12], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, 9]}, + "faces": { + "north": {"uv": [10, 1.5, 11, 4], "texture": "#13"}, + "east": {"uv": [8.5, 1.5, 10, 4], "texture": "#13"}, + "south": {"uv": [14.5, 1.5, 15.5, 4], "texture": "#13"}, + "west": {"uv": [14, 1.5, 15.5, 4], "texture": "#13"}, + "up": {"uv": [1, 6, 6, 7], "texture": "#13"}, + "down": {"uv": [6, 0, 7, 1.5], "texture": "#13"} + } + }, + { + "from": [13, 8, 1], + "to": [15, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, 7]}, + "faces": { + "north": {"uv": [8.5, 1.5, 9.5, 4], "texture": "#13"}, + "east": {"uv": [14, 1.5, 15.5, 4], "texture": "#13"}, + "south": {"uv": [13, 1.5, 14, 4], "texture": "#13"}, + "west": {"uv": [15.5, 1.5, 14, 4], "texture": "#13"}, + "up": {"uv": [1, 7, 6, 6], "texture": "#13"}, + "down": {"uv": [6, 1.5, 7, 0], "texture": "#13"} + } + }, + { + "from": [1, 13, 1], + "to": [3, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 16, 7]}, + "faces": { + "north": {"uv": [14.5, 0, 15.5, 1.5], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 1.5], "texture": "#13"}, + "south": {"uv": [8.5, 0, 9.5, 1.5], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 1.5], "texture": "#13"}, + "up": {"uv": [6, 0, 7, 7], "rotation": 180, "texture": "#13"}, + "down": {"uv": [6, 0, 7, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [3, 13, 1], + "to": [13, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 16, 7]}, + "faces": { + "north": {"uv": [9.5, 0, 14.5, 1.5], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 1.5], "texture": "#13"}, + "up": {"uv": [1, 6, 6, 7], "rotation": 180, "texture": "#13"}, + "down": {"uv": [1, 6, 6, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [3, 8, 1], + "to": [4, 13, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 16, 7]}, + "faces": { + "north": {"uv": [14, 1.5, 14.5, 4], "texture": "#13"}, + "east": {"uv": [13, 1.5, 14, 4], "texture": "#13"}, + "south": {"uv": [9.5, 1.5, 10, 4], "texture": "#13"}, + "west": {"uv": [9, 0, 16, 4], "texture": "#13"}, + "down": {"uv": [5.5, 0, 6, 1], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [3, 8, 13], + "to": [4, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 16, 9]}, + "faces": { + "north": {"uv": [10, 1.5, 9.5, 4], "texture": "#13"}, + "east": {"uv": [14, 1.5, 13, 4], "texture": "#13"}, + "south": {"uv": [9.5, 1.5, 10, 4], "texture": "#13"}, + "west": {"uv": [16, 0, 9, 4], "texture": "#13"}, + "down": {"uv": [5.5, 1, 6, 0], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [1, 8, 1], + "to": [3, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 16, 7]}, + "faces": { + "north": {"uv": [14.5, 1.5, 15.5, 4], "texture": "#13"}, + "east": {"uv": [14, 1.5, 15.5, 4], "texture": "#13"}, + "south": {"uv": [10, 1.5, 11, 4], "texture": "#13"}, + "west": {"uv": [8.5, 1.5, 10, 4], "texture": "#13"}, + "up": {"uv": [1, 6, 6, 7], "rotation": 180, "texture": "#13"}, + "down": {"uv": [6, 0, 7, 1.5], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [1, 8, 12], + "to": [3, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 16, 9]}, + "faces": { + "north": {"uv": [13, 1.5, 14, 4], "texture": "#13"}, + "east": {"uv": [15.5, 1.5, 14, 4], "texture": "#13"}, + "south": {"uv": [8.5, 1.5, 9.5, 4], "texture": "#13"}, + "west": {"uv": [14, 1.5, 15.5, 4], "texture": "#13"}, + "up": {"uv": [1, 7, 6, 6], "rotation": 180, "texture": "#13"}, + "down": {"uv": [6, 1.5, 7, 0], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [13, 0, 2], + "to": [14, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [0, 9.5, 0.5, 13.5], "texture": "#13"}, + "east": {"uv": [0, 9.5, 6, 13.5], "texture": "#13"}, + "south": {"uv": [5.5, 9.5, 6, 13.5], "texture": "#13"}, + "west": {"uv": [0, 9.5, 6, 13.5], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [2, 0, 2], + "to": [3, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [5.5, 9.5, 6, 13.5], "texture": "#13"}, + "east": {"uv": [0, 9.5, 6, 13.5], "texture": "#13"}, + "south": {"uv": [0, 9.5, 0.5, 13.5], "texture": "#13"}, + "west": {"uv": [0, 9.5, 6, 13.5], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [3, 0, 13], + "to": [13, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 20]}, + "faces": { + "north": {"uv": [0.5, 9.5, 5.5, 13.5], "texture": "#13"}, + "south": {"uv": [0.5, 9.5, 5.5, 13.5], "texture": "#13"}, + "down": {"uv": [9.5, 7.5, 14.5, 8], "texture": "#13"} + } + }, + { + "from": [3, 0, 2], + "to": [13, 8, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9]}, + "faces": { + "north": {"uv": [0.5, 9.5, 5.5, 13.5], "texture": "#13"}, + "south": {"uv": [0.5, 9.5, 5.5, 13.5], "texture": "#13"}, + "down": {"uv": [9.5, 7.5, 14.5, 8], "texture": "#13"} + } + }, + { + "from": [2, 8, 2], + "to": [14, 13, 3], + "faces": { + "north": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "east": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "south": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "west": {"uv": [0, 7, 6, 9.5], "texture": "#13"} + } + }, + { + "from": [13, 8, 2], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "east": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "south": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "west": {"uv": [0, 7, 6, 9.5], "texture": "#13"} + } + }, + { + "from": [2, 8, 13], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "east": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "south": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "west": {"uv": [0, 7, 6, 9.5], "texture": "#13"} + } + }, + { + "from": [2, 8, 2], + "to": [3, 13, 14], + "faces": { + "north": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "east": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "south": {"uv": [0, 7, 6, 9.5], "texture": "#13"}, + "west": {"uv": [0, 7, 6, 9.5], "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"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "ChuteTop", + "origin": [9, 16, -7], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + }, + { + "name": "ChuteBase", + "origin": [8, 8, -7], + "children": [12, 13, 14, 15] + }, + { + "name": "windows", + "origin": [8, 8, 8], + "children": [16, 17, 18, 19] + }, 20] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chute_funnel/block.json b/src/main/resources/assets/create/models/block/chute_funnel/block.json new file mode 100644 index 000000000..43a769f49 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute_funnel/block.json @@ -0,0 +1,248 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_push", + "4": "create:block/brass_funnel_plating", + "13": "create:block/chute", + "particle": "create:block/brass_block", + "3_particle": "#particle", + "1_2": "create:block/brass_funnel_back" + }, + "elements": [ + { + "name": "RightWall", + "from": [0, 0, 2], + "to": [2, 16, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 10]}, + "faces": { + "north": {"uv": [14, 0, 16, 16], "texture": "#3_particle"}, + "east": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#3_particle"}, + "west": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 0, 2, 6], "texture": "#3"}, + "down": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "LeftWall", + "from": [14, 0, 2], + "to": [16, 16, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 10]}, + "faces": { + "north": {"uv": [0, 0, 2, 16], "texture": "#3_particle"}, + "east": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [14, 0, 16, 16], "texture": "#3_particle"}, + "west": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#3"}, + "down": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "Top", + "from": [2, 14, 2], + "to": [14, 16, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 10]}, + "faces": { + "north": {"uv": [2, 0, 14, 2], "texture": "#3_particle"}, + "south": {"uv": [2, 0, 14, 2], "texture": "#3_particle"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "Top", + "from": [2, 0, 2], + "to": [14, 2, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 10]}, + "faces": { + "north": {"uv": [2, 14, 14, 16], "texture": "#3_particle"}, + "south": {"uv": [2, 14, 14, 16], "texture": "#3_particle"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "F5", + "from": [11, 1.5, 3], + "to": [14, 14.5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 9.5]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"} + } + }, + { + "name": "F6", + "from": [5, 1.5, 3], + "to": [8, 14.5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9.5]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"} + } + }, + { + "name": "F6", + "from": [8, 1.5, 3], + "to": [11, 14.5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 9.5]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"} + } + }, + { + "name": "F7", + "from": [2, 1.5, 3], + "to": [5, 14.5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9.5]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"} + } + }, + { + "name": "BackExtension", + "from": [2, 2, 10], + "to": [14, 14, 14], + "faces": { + "east": {"uv": [13, 10, 15, 16], "texture": "#1_2"}, + "south": {"uv": [9, 0.5, 15, 6.5], "texture": "#1_2"}, + "west": {"uv": [13, 10, 15, 16], "rotation": 180, "texture": "#1_2"}, + "up": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#1_2"}, + "down": {"uv": [13, 10, 15, 16], "rotation": 90, "texture": "#1_2"} + } + }, + { + "name": "MidExtension", + "from": [1, 1, 7], + "to": [15, 15, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]}, + "faces": { + "north": {"uv": [0, 9, 7, 16], "texture": "#1_2"}, + "east": {"uv": [11, 9, 13, 16], "rotation": 180, "texture": "#1_2"}, + "south": {"uv": [8.5, 0, 15.5, 7], "texture": "#1_2"}, + "west": {"uv": [11, 9, 13, 16], "texture": "#1_2"}, + "up": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#1_2"}, + "down": {"uv": [11, 9, 13, 16], "rotation": 270, "texture": "#1_2"} + } + }, + { + "name": "Back", + "from": [3, 3, 14], + "to": [13, 13, 18], + "faces": { + "east": {"uv": [9.5, 9, 14.5, 11], "rotation": 90, "texture": "#4"}, + "south": {"uv": [9.5, 11, 14.5, 16], "texture": "#4"}, + "west": {"uv": [9.5, 9, 14.5, 11], "rotation": 270, "texture": "#4"}, + "up": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "down": {"uv": [9.5, 9, 14.5, 11], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "Back", + "from": [1.1, 1.1, -3.1], + "to": [14.9, 14.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#13"}, + "east": {"uv": [0, 13.5, 7, 16], "rotation": 90, "texture": "#13"}, + "west": {"uv": [0, 13.5, 7, 16], "rotation": 270, "texture": "#13"}, + "up": {"uv": [0, 13.5, 7, 16], "texture": "#13"}, + "down": {"uv": [0, 13.5, 7, 16], "rotation": 180, "texture": "#13"} + } + }, + { + "name": "Back", + "from": [2.1, 1.1, -6.7], + "to": [13.9, 4.9, -2.9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -54]}, + "faces": { + "north": {"uv": [9, 6, 15, 8], "texture": "#13"}, + "east": {"uv": [11, 6, 13, 8], "texture": "#13"}, + "south": {"uv": [0, 0, 7, 7], "texture": "#13"}, + "west": {"uv": [11, 6, 13, 8], "texture": "#13"}, + "up": {"uv": [8.5, 1, 15.5, 3], "rotation": 180, "texture": "#13"}, + "down": {"uv": [9, 4.5, 15, 6.5], "texture": "#13"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, + { + "name": "Flap", + "origin": [8, 8, 8], + "children": [4, 5, 6, 7] + } + ] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [8, 9] + }, + { + "name": "DELETABLEEXTENSION", + "origin": [9, -4, 8], + "children": [] + }, + { + "name": "DELETABLEEXTESNIONMID", + "origin": [35, 12, 4], + "children": [] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [10, 11] + } + ] + }, 12] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/depot/block.json b/src/main/resources/assets/create/models/block/depot/block.json new file mode 100644 index 000000000..85bde5e9f --- /dev/null +++ b/src/main/resources/assets/create/models/block/depot/block.json @@ -0,0 +1,37 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/depot_side", + "2": "create:block/depot_top", + "3": "create:block/andesite_casing", + "particle": "create:block/andesite_casing" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 11, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 10.5, 0.5]}, + "faces": { + "north": {"uv": [0, 5, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 5, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 5, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 5, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + } + }, + { + "from": [1, 11, 1], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, -2, 9]}, + "faces": { + "north": {"uv": [1, 14, 15, 16], "texture": "#2"}, + "east": {"uv": [1, 14, 15, 16], "texture": "#2"}, + "south": {"uv": [1, 14, 15, 16], "texture": "#2"}, + "west": {"uv": [1, 14, 15, 16], "texture": "#2"}, + "up": {"uv": [1, 0, 15, 14], "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block.json b/src/main/resources/assets/create/models/block/funnel/block.json new file mode 100644 index 000000000..c9dab296d --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block.json @@ -0,0 +1,211 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "RightWall", + "from": [0, 10, 0], + "to": [2, 16, 16], + "faces": { + "north": {"uv": [14, 0, 16, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "up": {"uv": [14, 0, 16, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#particle"} + } + }, + { + "name": "LeftWall", + "from": [14, 10, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 2, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "south": {"uv": [14, 0, 16, 6], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#particle"} + } + }, + { + "name": "Top", + "from": [2, 10, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "south": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [2, 0, 14, 2], "texture": "#particle"} + } + }, + { + "name": "Top", + "from": [2, 10, 0], + "to": [14, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "south": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "up": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [2, 14, 14, 16], "texture": "#particle"} + } + }, + { + "name": "F4", + "from": [11, 14, 1.5], + "to": [14, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F5", + "from": [5, 14, 1.5], + "to": [8, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F5", + "from": [8, 14, 1.5], + "to": [11, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F6", + "from": [2, 14, 1.5], + "to": [5, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "BackExtension", + "from": [2, 2, 2], + "to": [14, 6, 14], + "faces": { + "north": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "east": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "south": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "west": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "down": {"uv": [9, 0.5, 15, 6.5], "texture": "#2"} + } + }, + { + "name": "MidExtension", + "from": [1, 6, 1], + "to": [15, 10, 15], + "faces": { + "north": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "east": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "south": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "west": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 9, 7, 16], "rotation": 180, "texture": "#2"}, + "down": {"uv": [8.5, 0, 15.5, 7], "texture": "#2"} + } + }, + { + "name": "Back", + "from": [3.1, -1.9, 3.1], + "to": [12.9, 2, 12.9], + "faces": { + "north": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "east": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "south": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "west": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "down": {"uv": [9.5, 11, 14.5, 16], "texture": "#4"} + } + } + ], + "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.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [0, 90, 0] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 1.5, 0], + "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, + { + "name": "Flap", + "origin": [8, 8, 8], + "children": [4, 5, 6, 7] + } + ] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [8, 9] + }, + { + "name": "DELETABLEEXTENSION", + "origin": [9, -4, 8], + "children": [] + }, + { + "name": "DELETABLEEXTESNIONMID", + "origin": [35, 12, 4], + "children": [] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [10] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/horizontal.json b/src/main/resources/assets/create/models/block/funnel/horizontal.json deleted file mode 100644 index 630a512ea..000000000 --- a/src/main/resources/assets/create/models/block/funnel/horizontal.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "block/dark_oak_log_top", - "4": "create:block/extractor", - "brass_casing": "create:block/brass_casing", - "belt_funnel": "create:block/belt_funnel", - "package_funnel_horizontal": "create:block/funnel_horizontal", - "particle": "#package_funnel_horizontal" - }, - "elements": [ - { - "name": "Cube", - "from": [1, 1, 0], - "to": [15, 2, 3], - "faces": { - "north": {"uv": [1, 14, 15, 15], "texture": "#3"}, - "east": {"uv": [0, 12, 1, 15], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 13, 14, 14], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [0, 12, 1, 15], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 12, 14, 15], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 14, 15], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [1.1, 1.1, -1], - "to": [14.9, 2, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [1, 14, 15, 15], "texture": "#3"}, - "east": {"uv": [0, 15, 1, 16], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 13, 14, 14], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [0, 15, 1, 16], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 12, 14, 13], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 15, 14, 16], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [11, 14, 0], - "to": [15, 15, 3], - "faces": { - "north": {"uv": [11, 1, 15, 2], "texture": "#3"}, - "east": {"uv": [13, 12, 14, 15], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [10, 0, 14, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 12, 14, 15], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 12, 4, 15], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 15], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [11, 14, -1], - "to": [14.9, 14.9, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [11, 1, 15, 2], "texture": "#3"}, - "east": {"uv": [13, 15, 14, 16], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [10, 0, 14, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 12, 14, 13], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 15, 4, 16], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 13], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [1, 14, 0], - "to": [5, 15, 3], - "faces": { - "north": {"uv": [1, 1, 5, 2], "texture": "#3"}, - "east": {"uv": [13, 12, 14, 15], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 0, 4, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 12, 14, 15], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [10, 12, 14, 15], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 15], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [1.1, 14, -1], - "to": [5, 14.9, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [1, 1, 5, 2], "texture": "#3"}, - "east": {"uv": [13, 12, 14, 13], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 0, 4, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 15, 14, 16], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [10, 15, 14, 16], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 13], "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [1, 2, 0], - "to": [2, 14, 3], - "faces": { - "north": {"uv": [14, 2, 15, 14], "texture": "#3"}, - "east": {"uv": [1, 12, 13, 15], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 1, 1, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 12, 13, 15], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [1.1, 2, -1], - "to": [2, 14, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [14, 2, 15, 14], "texture": "#3"}, - "east": {"uv": [1, 12, 13, 13], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [0, 1, 1, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 15, 13, 16], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [14, 2, 0], - "to": [15, 14, 3], - "faces": { - "north": {"uv": [1, 2, 2, 14], "texture": "#3"}, - "east": {"uv": [1, 12, 13, 15], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [13, 1, 14, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 12, 13, 15], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Cube", - "from": [14, 2, -1], - "to": [14.9, 14, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [1, 2, 2, 14], "texture": "#3"}, - "east": {"uv": [1, 15, 13, 16], "rotation": 270, "texture": "#belt_funnel"}, - "south": {"uv": [13, 1, 14, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 12, 13, 13], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Inner", - "from": [2, 2, -1], - "to": [14, 14, 2], - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#3"}, - "east": {"uv": [12, 2, 16, 14], "texture": "#3"}, - "south": {"uv": [1, 1, 13, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [0, 2, 4, 14], "texture": "#3"}, - "up": {"uv": [2, 0, 14, 4], "texture": "#3"}, - "down": {"uv": [2, 12, 14, 16], "texture": "#3"} - } - }, - { - "name": "Inner", - "from": [2.1, 2.1, -2], - "to": [13.9, 13.9, -1], - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#brass_casing"}, - "east": {"uv": [12, 2, 13, 14], "texture": "#3"}, - "west": {"uv": [0, 2, 1, 14], "texture": "#3"}, - "up": {"uv": [2, 0, 14, 1], "texture": "#3"}, - "down": {"uv": [2, 12, 14, 13], "texture": "#3"} - } - }, - { - "name": "Filter", - "from": [5, 12, 0], - "to": [11, 16, 3], - "faces": { - "north": {"uv": [6, 8, 12, 12], "texture": "#4"}, - "east": {"uv": [3, 0, 6, 4], "rotation": 180, "texture": "#4"}, - "south": {"uv": [6, 8, 12, 12], "texture": "#4"}, - "west": {"uv": [3, 0, 6, 4], "texture": "#4"}, - "up": {"uv": [6, 8, 12, 11], "texture": "#4"}, - "down": {"uv": [6, 8, 12, 11], "texture": "#4"} - } - }, - { - "name": "Filter", - "from": [5, 14, -1], - "to": [11, 14.9, 0], - "faces": { - "north": {"uv": [6, 8, 12, 9], "texture": "#4"}, - "east": {"uv": [2, 0, 3, 1], "rotation": 180, "texture": "#4"}, - "south": {"uv": [6, 8, 12, 9], "texture": "#4"}, - "west": {"uv": [2, 0, 3, 1], "texture": "#4"}, - "up": {"uv": [6, 8, 12, 9], "texture": "#4"}, - "down": {"uv": [6, 8, 12, 9], "texture": "#4"} - } - } - ], - "display": { - "ground": { - "translation": [0, 3, 2], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.6, -1, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, -7], - "scale": [0.625, 0.625, 0.625] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/horizontal_belt.json b/src/main/resources/assets/create/models/block/funnel/horizontal_belt.json deleted file mode 100644 index 5ae900fb7..000000000 --- a/src/main/resources/assets/create/models/block/funnel/horizontal_belt.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "2": "create:block/extractor", - "particle": "create:block/belt_funnel", - "belt_funnel": "create:block/belt_funnel", - "brass_casing": "create:block/brass_casing" - }, - "elements": [ - { - "name": "Bottom", - "from": [3, -4.1, -1], - "to": [13, -3.1, 5], - "faces": { - "north": {"uv": [0, 11, 10, 12], "texture": "#belt_funnel"}, - "east": {"uv": [10, 11, 16, 12], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [0, 11, 10, 12], "texture": "#belt_funnel"}, - "west": {"uv": [10, 11, 16, 12], "texture": "#belt_funnel"}, - "up": {"uv": [10, 0, 16, 13], "rotation": 90, "texture": "#belt_funnel"}, - "down": {"uv": [10, 1, 16, 11], "rotation": 270, "texture": "#belt_funnel"} - } - }, - { - "name": "Top", - "from": [3, 7, -1], - "to": [13, 8, 5], - "faces": { - "north": {"uv": [0, 0, 10, 1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 0, 16, 1], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [0, 0, 10, 1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 0, 16, 1], "texture": "#belt_funnel"}, - "up": {"uv": [10, 1, 16, 11], "rotation": 90, "texture": "#belt_funnel"}, - "down": {"uv": [10, 0, 16, 13], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Side", - "from": [3, -3.1, -1], - "to": [4, 7, 5], - "faces": { - "north": {"uv": [9, 1, 10, 11.1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"}, - "south": {"uv": [0, 1, 1, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"} - } - }, - { - "name": "Center", - "from": [4, -3.1, -1], - "to": [12, 7, 4], - "faces": { - "north": {"uv": [4, 3, 12, 13.1], "texture": "#brass_casing"}, - "east": {"uv": [9, 3, 10, 9], "rotation": 90, "texture": "#belt_funnel"}, - "south": {"uv": [1, 1, 9, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [0, 2, 1, 8], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Top", - "from": [5, 8, 0], - "to": [11, 9, 5], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0]}, - "faces": { - "north": {"uv": [6, 8, 12, 9], "texture": "#2"}, - "east": {"uv": [11, 1, 16, 2], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [6, 9, 12, 10], "texture": "#2"}, - "west": {"uv": [11, 3, 16, 4], "texture": "#belt_funnel"}, - "up": {"uv": [6, 10, 12, 15], "texture": "#2"}, - "down": {"uv": [1, 8, 9, 13], "texture": "#belt_funnel"} - } - }, - { - "name": "Ramp", - "from": [3.9, -3.1, -7.1], - "to": [12.1, 4, -1], - "rotation": {"angle": 0, "axis": "x", "origin": [8, -4, -1]}, - "faces": { - "north": {"uv": [4, 0, 12.2, 7.1], "rotation": 180, "texture": "#brass_casing"}, - "east": {"uv": [2, 9, 8, 16], "texture": "#brass_casing"}, - "west": {"uv": [8, 9, 14, 16], "texture": "#brass_casing"}, - "up": {"uv": [4, 5, 12.2, 11], "rotation": 180, "texture": "#brass_casing"}, - "down": {"uv": [4, 5, 12.2, 11], "texture": "#brass_casing"} - } - }, - { - "name": "Ramp", - "from": [3.9, 4, -9.1], - "to": [12.1, 7.1, -1], - "rotation": {"angle": 0, "axis": "x", "origin": [8, -4, -1]}, - "faces": { - "north": {"uv": [4, 0, 12.2, 3], "texture": "#brass_casing"}, - "east": {"uv": [4, 0, 12, 3], "texture": "#brass_casing"}, - "west": {"uv": [4, 0, 12, 3], "texture": "#brass_casing"}, - "up": {"uv": [4, 4, 12, 12], "rotation": 180, "texture": "#brass_casing"}, - "down": {"uv": [4, 5, 12.2, 13], "texture": "#brass_casing"} - } - }, - { - "name": "Side", - "from": [12, -3.1, -1], - "to": [13, 7, 5], - "faces": { - "north": {"uv": [0, 1, 1, 11.1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 1, 16, 11], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [9, 1, 10, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [-0.5, 3.25, 2.25], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [-0.5, 3.25, 2.25], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, -55, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, -55, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 0, 2.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, 1.75, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 3.5, -4.5], - "scale": [0.5, 0.5, 0.5] - } - } -} \ 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 86da5a656..e6d6c804e 100644 --- a/src/main/resources/assets/create/models/block/funnel/item.json +++ b/src/main/resources/assets/create/models/block/funnel/item.json @@ -1,118 +1,208 @@ { "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "2": "create:block/extractor", - "particle": "create:block/belt_funnel", - "belt_funnel": "create:block/belt_funnel", - "brass_casing": "create:block/brass_casing" + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel", + "4": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" }, "elements": [ { - "name": "Bottom", - "from": [3, -4.1, -1], - "to": [13, -3.1, 5], + "name": "RightWall", + "from": [0, 10, 0], + "to": [2, 16, 16], "faces": { - "north": {"uv": [0, 11, 10, 12], "texture": "#belt_funnel"}, - "east": {"uv": [10, 11, 16, 12], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [0, 11, 10, 12], "texture": "#belt_funnel"}, - "west": {"uv": [10, 11, 16, 12], "texture": "#belt_funnel"}, - "up": {"uv": [10, 0, 16, 13], "rotation": 90, "texture": "#belt_funnel"}, - "down": {"uv": [10, 1, 16, 11], "rotation": 270, "texture": "#belt_funnel"} + "north": {"uv": [14, 0, 16, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "up": {"uv": [14, 0, 16, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#particle"} + } + }, + { + "name": "LeftWall", + "from": [14, 10, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 2, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "south": {"uv": [14, 0, 16, 6], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#3"}, + "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#particle"} } }, { "name": "Top", - "from": [3, 7, -1], - "to": [13, 8, 5], + "from": [2, 10, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 10, 1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 0, 16, 1], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [0, 0, 10, 1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 0, 16, 1], "texture": "#belt_funnel"}, - "up": {"uv": [10, 1, 16, 11], "rotation": 90, "texture": "#belt_funnel"}, - "down": {"uv": [10, 0, 16, 13], "rotation": 90, "texture": "#belt_funnel"} - } - }, - { - "name": "Side", - "from": [3, -3.1, -1], - "to": [4, 7, 5], - "faces": { - "north": {"uv": [9, 1, 10, 11.1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"}, - "south": {"uv": [0, 1, 1, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"} - } - }, - { - "name": "Center", - "from": [4, -3.1, -1], - "to": [12, 7, 4], - "faces": { - "north": {"uv": [4, 3, 12, 13.1], "texture": "#brass_casing"}, - "east": {"uv": [9, 3, 10, 9], "rotation": 90, "texture": "#belt_funnel"}, - "south": {"uv": [1, 1, 9, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [0, 2, 1, 8], "rotation": 90, "texture": "#belt_funnel"} + "north": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "south": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [2, 0, 14, 2], "texture": "#particle"} } }, { "name": "Top", - "from": [5, 8, 0], - "to": [11, 9, 5], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0]}, + "from": [2, 10, 0], + "to": [14, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, "faces": { - "north": {"uv": [6, 8, 12, 9], "texture": "#2"}, - "east": {"uv": [11, 1, 16, 2], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [6, 9, 12, 10], "texture": "#2"}, - "west": {"uv": [11, 3, 16, 4], "texture": "#belt_funnel"}, - "up": {"uv": [6, 10, 12, 15], "texture": "#2"}, - "down": {"uv": [1, 8, 9, 13], "texture": "#belt_funnel"} + "north": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "south": {"uv": [2, 0, 14, 6], "texture": "#3"}, + "up": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#particle"}, + "down": {"uv": [2, 14, 14, 16], "texture": "#particle"} } }, { - "name": "Side", - "from": [12, -3.1, -1], - "to": [13, 7, 5], + "name": "F4", + "from": [11, 14, 1.5], + "to": [14, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, "faces": { - "north": {"uv": [0, 1, 1, 11.1], "texture": "#belt_funnel"}, - "east": {"uv": [10, 1, 16, 11], "rotation": 180, "texture": "#belt_funnel"}, - "south": {"uv": [9, 1, 10, 11.1], "texture": "#belt_funnel"}, - "west": {"uv": [10, 1, 16, 11], "texture": "#belt_funnel"} + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F5", + "from": [5, 14, 1.5], + "to": [8, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F5", + "from": [8, 14, 1.5], + "to": [11, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "F6", + "from": [2, 14, 1.5], + "to": [5, 15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "faces": { + "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "BackExtension", + "from": [2, 2, 2], + "to": [14, 6, 14], + "faces": { + "north": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "east": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "south": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "west": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#2"}, + "down": {"uv": [9, 0.5, 15, 6.5], "texture": "#2"} + } + }, + { + "name": "MidExtension", + "from": [1, 6, 1], + "to": [15, 10, 15], + "faces": { + "north": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "east": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "south": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "west": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 9, 7, 16], "rotation": 180, "texture": "#2"}, + "down": {"uv": [8.5, 0, 15.5, 7], "texture": "#2"} + } + }, + { + "name": "Back", + "from": [3, -2, 3], + "to": [13, 2, 13], + "faces": { + "north": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "east": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "south": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "west": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"}, + "down": {"uv": [9.5, 11, 14.5, 16], "texture": "#4"} } } ], "display": { "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [-0.5, 3.25, 2.25], + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [-0.5, 3.25, 2.25], + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { - "rotation": [0, -55, 0], + "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { - "rotation": [0, -55, 0], + "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { - "translation": [0, 0, 2.25], + "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, 1.75, 0], + "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, + "head": { + "rotation": [0, 90, 0] + }, "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 3.5, -4.5], "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, + { + "name": "Flap", + "origin": [8, 8, 8], + "children": [4, 5, 6, 7] + } + ] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [8, 9] + }, + { + "name": "DELETABLEEXTENSION", + "origin": [9, -4, 8], + "children": [] + }, + { + "name": "DELETABLEEXTESNIONMID", + "origin": [35, 12, 4], + "children": [] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [10] + } + ] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/vertical.json b/src/main/resources/assets/create/models/block/funnel/vertical.json deleted file mode 100644 index d5de931ce..000000000 --- a/src/main/resources/assets/create/models/block/funnel/vertical.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/funnel/horizontal", - "textures": { - "particle": "create:block/funnel_vertical", - "package_funnel_horizontal": "create:block/funnel_vertical" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_in.json b/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_in.json new file mode 100644 index 000000000..7996d1e8a --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_in.json @@ -0,0 +1,31 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/marker_flag" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [1, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "north": {"uv": [1, 0, 2, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#4"}, + "south": {"uv": [1, 0, 2, 16], "texture": "#4"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#4"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#4"} + } + }, + { + "from": [0.4, 7.5, 1], + "to": [0.4, 15.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "east": {"uv": [16, 0, 8, 8], "texture": "#4", "tintindex": 0}, + "west": {"uv": [8, 0, 16, 8], "texture": "#4", "tintindex": 0} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_out.json b/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_out.json new file mode 100644 index 000000000..6dae60cdb --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_arm/flag/long_out.json @@ -0,0 +1,31 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/marker_flag" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [1, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "north": {"uv": [1, 0, 2, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#4"}, + "south": {"uv": [1, 0, 2, 16], "texture": "#4"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#4"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#4"} + } + }, + { + "from": [0.4, 7.5, 1], + "to": [0.4, 15.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "east": {"uv": [16, 8, 8, 16], "texture": "#4", "tintindex": 0}, + "west": {"uv": [8, 8, 16, 16], "texture": "#4", "tintindex": 0} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_in.json b/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_in.json new file mode 100644 index 000000000..84f72eb0c --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_in.json @@ -0,0 +1,31 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/marker_flag" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [1, 8, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "north": {"uv": [1, 8, 2, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#4"}, + "south": {"uv": [1, 0, 2, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 1, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#4"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#4"} + } + }, + { + "from": [0.4, -0.5, 1], + "to": [0.4, 7.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "east": {"uv": [16, 0, 8, 8], "texture": "#4", "tintindex": 0}, + "west": {"uv": [8, 0, 16, 8], "texture": "#4", "tintindex": 0} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_out.json b/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_out.json new file mode 100644 index 000000000..24223d31a --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_arm/flag/short_out.json @@ -0,0 +1,31 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/marker_flag" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [1, 8, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "north": {"uv": [1, 8, 2, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#4"}, + "south": {"uv": [1, 0, 2, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 1, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#4"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#4"} + } + }, + { + "from": [0.4, -0.5, 1], + "to": [0.4, 7.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -3, 10]}, + "faces": { + "east": {"uv": [16, 8, 8, 16], "texture": "#4", "tintindex": 0}, + "west": {"uv": [8, 8, 16, 16], "texture": "#4", "tintindex": 0} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json new file mode 100644 index 000000000..ccf249c2c --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block.json @@ -0,0 +1,82 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/brass_gearbox", + "2": "create:block/packager_top", + "3": "create:block/crafter_top", + "5": "create:block/brass_casing", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "HudTop", + "from": [0, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "name": "HudBottom", + "from": [0, 0, 0], + "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -6, 8]}, + "faces": { + "north": {"uv": [0, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 14, 16, 16], "texture": "#3"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 14, 16, 16], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#5"} + } + }, + { + "name": "HudLeft", + "from": [14, 2, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -4, 8]}, + "faces": { + "north": {"uv": [0, 2, 2, 14], "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#3"}, + "south": {"uv": [14, 2, 16, 14], "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "name": "HudCenter", + "from": [2, 2, 1], + "to": [14, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -4, 8]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#1"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#1"} + } + }, + { + "name": "HudRight", + "from": [0, 2, 0], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-22, -4, 8]}, + "faces": { + "north": {"uv": [14, 2, 16, 14], "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#1"}, + "south": {"uv": [0, 2, 2, 14], "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "hud", + "origin": [-22, -4, 8], + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/item.json b/src/main/resources/assets/create/models/block/packager/item.json new file mode 100644 index 000000000..7d29349c2 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/item.json @@ -0,0 +1,169 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "1": "create:block/brass_gearbox", + "2": "create:block/packager_top", + "3": "create:block/crafter_top", + "5": "create:block/brass_casing", + "6": "create:block/sealer", + "particle": "create:block/axis", + "1_1": "create:block/axis_top" + }, + "elements": [ + { + "name": "Axis", + "from": [6, 6, 0], + "to": [10, 10, 16], + "shade": false, + "faces": { + "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"}, + "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [6, 6, 10, 10], "texture": "#1_1"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "HudTop", + "from": [0, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "name": "HudBottom", + "from": [0, 0, 0], + "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -6, 8]}, + "faces": { + "north": {"uv": [0, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 14, 16, 16], "texture": "#3"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 14, 16, 16], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#5"} + } + }, + { + "name": "HudLeft", + "from": [14, 2, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -4, 8]}, + "faces": { + "north": {"uv": [0, 2, 2, 14], "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#3"}, + "south": {"uv": [14, 2, 16, 14], "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "name": "HudCenter", + "from": [2, 2, 1], + "to": [14, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, -4, 8]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#1"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#1"} + } + }, + { + "name": "HudRight", + "from": [0, 2, 0], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-22, -4, 8]}, + "faces": { + "north": {"uv": [14, 2, 16, 14], "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#1"}, + "south": {"uv": [0, 2, 2, 14], "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#3"} + } + }, + { + "name": "SealerKnob", + "from": [5, 25.15, 5], + "to": [11, 27.15, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 33.15, 8]}, + "faces": { + "north": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "east": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "south": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "west": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "up": {"uv": [13, 1, 16, 4], "texture": "#6"}, + "down": {"uv": [13, 4, 16, 5], "texture": "#6"} + } + }, + { + "name": "Sealer", + "from": [2, 15.15, 2], + "to": [14, 25.15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 25.15, 8]}, + "faces": { + "north": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "east": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "south": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "west": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "up": {"uv": [10, 5, 16, 11], "texture": "#6"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "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.75, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "translation": [0, -1.75, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [0] + }, + { + "name": "hud", + "origin": [-22, -4, 8], + "children": [1, 2, 3, 4, 5] + }, + { + "name": "group", + "origin": [-8, 25.15, 8], + "children": [6, 7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/sealer.json b/src/main/resources/assets/create/models/block/packager/sealer.json new file mode 100644 index 000000000..e0527d1d2 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/sealer.json @@ -0,0 +1,53 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "6": "create:block/sealer", + "particle": "create:block/sealer" + }, + "elements": [ + { + "name": "SealerKnob", + "from": [5, 25.15, 5], + "to": [11, 27.15, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 33.15, 8]}, + "faces": { + "north": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "east": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "south": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "west": {"uv": [13, 4, 16, 5], "texture": "#6"}, + "up": {"uv": [13, 1, 16, 4], "texture": "#6"} + } + }, + { + "name": "Sealer", + "from": [2, 15.15, 2], + "to": [14, 25.15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [-8, 25.15, 8]}, + "faces": { + "north": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "east": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "south": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "west": {"uv": [10, 11, 16, 16], "texture": "#6"}, + "up": {"uv": [10, 5, 16, 11], "texture": "#6"} + } + } + ], + "groups": [ + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + }, + { + "name": "hud", + "origin": [-22, -4, 8], + "children": [] + }, + { + "name": "Sealer", + "origin": [-8, 25.15, 8], + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/andesite_casing_belt.png b/src/main/resources/assets/create/textures/block/andesite_casing_belt.png new file mode 100644 index 000000000..f8b25b8c7 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_casing_belt.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel.png b/src/main/resources/assets/create/textures/block/andesite_funnel.png new file mode 100644 index 000000000..9d4f35ea9 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_back.png b/src/main/resources/assets/create/textures/block/andesite_funnel_back.png new file mode 100644 index 000000000..0cf540404 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel_back.png differ 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 new file mode 100644 index 000000000..2d24fe731 Binary files /dev/null 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 new file mode 100644 index 000000000..4207c9e96 Binary files /dev/null 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 new file mode 100644 index 000000000..e9648ef74 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_tunnel.png b/src/main/resources/assets/create/textures/block/andesite_tunnel.png new file mode 100644 index 000000000..3e3042ec0 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_tunnel.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_tunnel_top.png b/src/main/resources/assets/create/textures/block/andesite_tunnel_top.png new file mode 100644 index 000000000..606dabda8 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_tunnel_top.png differ diff --git a/src/main/resources/assets/create/textures/block/axis_top.png b/src/main/resources/assets/create/textures/block/axis_top.png index cf1eea2b7..ad458051e 100644 Binary files a/src/main/resources/assets/create/textures/block/axis_top.png and b/src/main/resources/assets/create/textures/block/axis_top.png differ diff --git a/src/main/resources/assets/create/textures/block/belt.png b/src/main/resources/assets/create/textures/block/belt.png index daede5a4f..68b626dd1 100644 Binary files a/src/main/resources/assets/create/textures/block/belt.png and b/src/main/resources/assets/create/textures/block/belt.png differ diff --git a/src/main/resources/assets/create/textures/block/belt_animated.png b/src/main/resources/assets/create/textures/block/belt_animated.png index 225ff7dcc..28b236d4b 100644 Binary files a/src/main/resources/assets/create/textures/block/belt_animated.png and b/src/main/resources/assets/create/textures/block/belt_animated.png differ diff --git a/src/main/resources/assets/create/textures/block/belt_funnel.png b/src/main/resources/assets/create/textures/block/belt_funnel.png deleted file mode 100644 index 6b998cc57..000000000 Binary files a/src/main/resources/assets/create/textures/block/belt_funnel.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/belt_support_side.png b/src/main/resources/assets/create/textures/block/belt_support_side.png deleted file mode 100644 index f3d919354..000000000 Binary files a/src/main/resources/assets/create/textures/block/belt_support_side.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/belt_tunnel.png b/src/main/resources/assets/create/textures/block/belt_tunnel.png deleted file mode 100644 index e4272a45f..000000000 Binary files a/src/main/resources/assets/create/textures/block/belt_tunnel.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/brass_casing_belt.png b/src/main/resources/assets/create/textures/block/brass_casing_belt.png new file mode 100644 index 000000000..b916b9e74 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_casing_belt.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel.png b/src/main/resources/assets/create/textures/block/brass_funnel.png new file mode 100644 index 000000000..cd380a8b9 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_back.png b/src/main/resources/assets/create/textures/block/brass_funnel_back.png new file mode 100644 index 000000000..4723126a0 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_back.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 new file mode 100644 index 000000000..c65e8626c Binary files /dev/null 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_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_powered.png new file mode 100644 index 000000000..eb51c22fe Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_powered.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 new file mode 100644 index 000000000..dbb3fab83 Binary files /dev/null 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_pull_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_pull_powered.png new file mode 100644 index 000000000..cb757e00f Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_pull_powered.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 new file mode 100644 index 000000000..4e31e327f Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png new file mode 100644 index 000000000..203afe626 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_tunnel.png b/src/main/resources/assets/create/textures/block/brass_tunnel.png new file mode 100644 index 000000000..acc1814cd Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_tunnel.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_tunnel_top.png b/src/main/resources/assets/create/textures/block/brass_tunnel_top.png new file mode 100644 index 000000000..508d6c0aa Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_tunnel_top.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_tunnel_top_connected.png b/src/main/resources/assets/create/textures/block/brass_tunnel_top_connected.png new file mode 100644 index 000000000..deeb28a42 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_tunnel_top_connected.png differ diff --git a/src/main/resources/assets/create/textures/block/chute.png b/src/main/resources/assets/create/textures/block/chute.png new file mode 100644 index 000000000..a6d6bcf57 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/chute.png differ diff --git a/src/main/resources/assets/create/textures/block/chute_diagonal.png b/src/main/resources/assets/create/textures/block/chute_diagonal.png new file mode 100644 index 000000000..dd9f8ff3e Binary files /dev/null and b/src/main/resources/assets/create/textures/block/chute_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/depot_side.png b/src/main/resources/assets/create/textures/block/depot_side.png new file mode 100644 index 000000000..eea606e2a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/depot_side.png differ diff --git a/src/main/resources/assets/create/textures/block/depot_top.png b/src/main/resources/assets/create/textures/block/depot_top.png new file mode 100644 index 000000000..c8e7c40da Binary files /dev/null and b/src/main/resources/assets/create/textures/block/depot_top.png differ diff --git a/src/main/resources/assets/create/textures/block/funnel_horizontal.png b/src/main/resources/assets/create/textures/block/funnel_horizontal.png deleted file mode 100644 index 90f2019bc..000000000 Binary files a/src/main/resources/assets/create/textures/block/funnel_horizontal.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/funnel_vertical.png b/src/main/resources/assets/create/textures/block/funnel_vertical.png deleted file mode 100644 index 25726f403..000000000 Binary files a/src/main/resources/assets/create/textures/block/funnel_vertical.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/marker_flag.png b/src/main/resources/assets/create/textures/block/marker_flag.png new file mode 100644 index 000000000..0970405a3 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/marker_flag.png differ diff --git a/src/main/resources/assets/create/textures/block/packager_top.png b/src/main/resources/assets/create/textures/block/packager_top.png new file mode 100644 index 000000000..8c3265bd1 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/packager_top.png differ diff --git a/src/main/resources/assets/create/textures/block/sealer.png b/src/main/resources/assets/create/textures/block/sealer.png new file mode 100644 index 000000000..82289c490 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/sealer.png differ diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/aspen_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/aspen_log.json new file mode 100644 index 000000000..d9a202bb3 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/aspen_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:aspen_log" + } + ], + "results": [ + { + "item": "atmospheric:stripped_aspen_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/grimwood_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/grimwood_log.json new file mode 100644 index 000000000..8f888461c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/grimwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:grimwood_log" + } + ], + "results": [ + { + "item": "atmospheric:stripped_grimwood_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/kousa_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/kousa_log.json new file mode 100644 index 000000000..ecad3012c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/kousa_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:kousa_log" + } + ], + "results": [ + { + "item": "atmospheric:stripped_kousa_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/rosewood_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/rosewood_log.json new file mode 100644 index 000000000..d56aa855e --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/rosewood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:rosewood_log" + } + ], + "results": [ + { + "item": "atmospheric:stripped_rosewood_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_aspen_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_aspen_log.json new file mode 100644 index 000000000..5f72d093b --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_aspen_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:stripped_aspen_log" + } + ], + "results": [ + { + "item": "atmospheric:aspen_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_grimwood_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_grimwood_log.json new file mode 100644 index 000000000..861940bad --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_grimwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:stripped_grimwood_log" + } + ], + "results": [ + { + "item": "atmospheric:grimwood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_kousa_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_kousa_log.json new file mode 100644 index 000000000..c6cf8fae3 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_kousa_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:stripped_kousa_log" + } + ], + "results": [ + { + "item": "atmospheric:kousa_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_rosewood_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_rosewood_log.json new file mode 100644 index 000000000..e8e3b4902 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_rosewood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:stripped_rosewood_log" + } + ], + "results": [ + { + "item": "atmospheric:rosewood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_yucca_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_yucca_log.json new file mode 100644 index 000000000..2a0c23af8 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/stripped_yucca_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:stripped_yucca_log" + } + ], + "results": [ + { + "item": "atmospheric:yucca_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/cutting/yucca_log.json b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/yucca_log.json new file mode 100644 index 000000000..45f33c335 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/cutting/yucca_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "atmospheric:yucca_log" + } + ], + "results": [ + { + "item": "atmospheric:stripped_yucca_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/milling/gilia.json b/src/main/resources/data/create/recipes/compat/atmospheric/milling/gilia.json new file mode 100644 index 000000000..12d375350 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/milling/gilia.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "atmospheric:gilia" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 2 + }, + { + "item": "minecraft:magenta_dye", + "count": 2, + "chance": 0.1 + }, + { + "item": "minecraft:pink_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/milling/hot_monkey_brush.json b/src/main/resources/data/create/recipes/compat/atmospheric/milling/hot_monkey_brush.json new file mode 100644 index 000000000..56c097784 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/milling/hot_monkey_brush.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "atmospheric:monkey_brush" + } + ], + "results": [ + { + "item": "minecraft:orange_dye", + "count": 2 + }, + { + "item": "minecraft:red_dye", + "count": 1, + "chance": 0.05 + }, + { + "item": "minecraft:yellow_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/milling/scalding_monkey_brush.json b/src/main/resources/data/create/recipes/compat/atmospheric/milling/scalding_monkey_brush.json new file mode 100644 index 000000000..171991b0d --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/milling/scalding_monkey_brush.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "atmospheric:scalding_monkey_brush" + } + ], + "results": [ + { + "item": "minecraft:red_dye", + "count": 2 + }, + { + "item": "minecraft:red_dye", + "count": 2, + "chance": 0.1 + }, + { + "item": "minecraft:orange_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/milling/warm_monkey_brush.json b/src/main/resources/data/create/recipes/compat/atmospheric/milling/warm_monkey_brush.json new file mode 100644 index 000000000..9f0451a84 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/milling/warm_monkey_brush.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "atmospheric:warm_monkey_brush" + } + ], + "results": [ + { + "item": "minecraft:yellow_dye", + "count": 2 + }, + { + "item": "minecraft:yellow_dye", + "count": 2, + "chance": 0.1 + }, + { + "item": "minecraft:orange_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/milling/yucca_flower.json b/src/main/resources/data/create/recipes/compat/atmospheric/milling/yucca_flower.json new file mode 100644 index 000000000..2dad00a71 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/milling/yucca_flower.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "atmospheric:yucca_flower" + } + ], + "results": [ + { + "item": "minecraft:light_gray_dye", + "count": 2 + }, + { + "item": "minecraft:white_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/splashing/arid_sand.json b/src/main/resources/data/create/recipes/compat/atmospheric/splashing/arid_sand.json new file mode 100644 index 000000000..4c4da1935 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/splashing/arid_sand.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:splashing", + "ingredients": [ + { + "item": "atmospheric:arid_sand" + } + ], + "results": [ + { + "item": "minecraft:clay_ball", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:quartz", + "count": 1, + "chance": 0.15 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/atmospheric/splashing/red_arid_sand.json b/src/main/resources/data/create/recipes/compat/atmospheric/splashing/red_arid_sand.json new file mode 100644 index 000000000..b8b10cb6f --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/atmospheric/splashing/red_arid_sand.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "atmospheric" + } + ], + "type": "create:splashing", + "ingredients": [ + { + "item": "atmospheric:red_arid_sand" + } + ], + "results": [ + { + "item": "minecraft:gold_nugget", + "count": 4, + "chance": 0.125 + }, + { + "item": "atmospheric:aloe_kernels", + "count": 1, + "chance": 0.05 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/autumnity/cutting/maple_log.json b/src/main/resources/data/create/recipes/compat/autumnity/cutting/maple_log.json new file mode 100644 index 000000000..55c8871ab --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/autumnity/cutting/maple_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "autumnity" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "autumnity:maple_log" + } + ], + "results": [ + { + "item": "autumnity:stripped_maple_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/autumnity/cutting/stripped_maple_log.json b/src/main/resources/data/create/recipes/compat/autumnity/cutting/stripped_maple_log.json new file mode 100644 index 000000000..18a07715c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/autumnity/cutting/stripped_maple_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "autumnity" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "autumnity:stripped_maple_log" + } + ], + "results": [ + { + "item": "autumnity:maple_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/autumnity/milling/autumn_crocus.json b/src/main/resources/data/create/recipes/compat/autumnity/milling/autumn_crocus.json new file mode 100644 index 000000000..16e48a60e --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/autumnity/milling/autumn_crocus.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "autumnity" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "autumnity:autumn_crocus" + } + ], + "results": [ + { + "item": "minecraft:magenta_dye", + "count": 2 + }, + { + "item": "minecraft:pink_dye", + "count": 2, + "chance": 0.1 + }, + { + "item": "minecraft:purple_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/cutting/stripped_wisteria_log.json b/src/main/resources/data/create/recipes/compat/bloomful/cutting/stripped_wisteria_log.json new file mode 100644 index 000000000..f939c1e5b --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/cutting/stripped_wisteria_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "bloomful:stripped_wisteria_log" + } + ], + "results": [ + { + "item": "bloomful:wisteria_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/cutting/wisteria_log.json b/src/main/resources/data/create/recipes/compat/bloomful/cutting/wisteria_log.json new file mode 100644 index 000000000..9150a9d19 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/cutting/wisteria_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "bloomful:wisteria_log" + } + ], + "results": [ + { + "item": "bloomful:stripped_wisteria_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/milling/blue_delphinium.json b/src/main/resources/data/create/recipes/compat/bloomful/milling/blue_delphinium.json new file mode 100644 index 000000000..cf9f2d4bd --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/milling/blue_delphinium.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "bloomful:blue_delphinium" + } + ], + "results": [ + { + "item": "minecraft:blue_dye", + "count": 3 + }, + { + "item": "minecraft:blue_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/milling/pink_delphinium.json b/src/main/resources/data/create/recipes/compat/bloomful/milling/pink_delphinium.json new file mode 100644 index 000000000..dc9ef9ea8 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/milling/pink_delphinium.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "bloomful:pink_delphinium" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 3 + }, + { + "item": "minecraft:pink_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/milling/purple_delphinium.json b/src/main/resources/data/create/recipes/compat/bloomful/milling/purple_delphinium.json new file mode 100644 index 000000000..7bb4493c5 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/milling/purple_delphinium.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "bloomful:purple_delphinium" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 3 + }, + { + "item": "minecraft:purple_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bloomful/milling/white_delphinium.json b/src/main/resources/data/create/recipes/compat/bloomful/milling/white_delphinium.json new file mode 100644 index 000000000..4c97705a9 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/bloomful/milling/white_delphinium.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "bloomful" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "bloomful:white_delphinium" + } + ], + "results": [ + { + "item": "minecraft:white_dye", + "count": 3 + }, + { + "item": "minecraft:white_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/blue_hydrangea.json b/src/main/resources/data/create/recipes/compat/bop/milling/blue_hydrangea.json similarity index 94% rename from src/main/resources/data/create/recipes/compat/bop/crushing/blue_hydrangea.json rename to src/main/resources/data/create/recipes/compat/bop/milling/blue_hydrangea.json index 9f05f6e63..dc8a739d0 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/blue_hydrangea.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/blue_hydrangea.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/burning_blossom.json b/src/main/resources/data/create/recipes/compat/bop/milling/burning_blossom.json similarity index 93% rename from src/main/resources/data/create/recipes/compat/bop/crushing/burning_blossom.json rename to src/main/resources/data/create/recipes/compat/bop/milling/burning_blossom.json index 0b51a06de..ca7e76467 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/burning_blossom.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/burning_blossom.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/glowflower.json b/src/main/resources/data/create/recipes/compat/bop/milling/glowflower.json similarity index 93% rename from src/main/resources/data/create/recipes/compat/bop/crushing/glowflower.json rename to src/main/resources/data/create/recipes/compat/bop/milling/glowflower.json index fbf9d8627..18bc7c8fc 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/glowflower.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/glowflower.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/goldenrod.json b/src/main/resources/data/create/recipes/compat/bop/milling/goldenrod.json similarity index 94% rename from src/main/resources/data/create/recipes/compat/bop/crushing/goldenrod.json rename to src/main/resources/data/create/recipes/compat/bop/milling/goldenrod.json index 8897ea8cb..0015eb4b1 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/goldenrod.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/goldenrod.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/lavender.json b/src/main/resources/data/create/recipes/compat/bop/milling/lavender.json similarity index 93% rename from src/main/resources/data/create/recipes/compat/bop/crushing/lavender.json rename to src/main/resources/data/create/recipes/compat/bop/milling/lavender.json index c0cd7c2ef..ca78ef140 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/lavender.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/lavender.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/orange_cosmos.json b/src/main/resources/data/create/recipes/compat/bop/milling/orange_cosmos.json similarity index 93% rename from src/main/resources/data/create/recipes/compat/bop/crushing/orange_cosmos.json rename to src/main/resources/data/create/recipes/compat/bop/milling/orange_cosmos.json index d4b691325..ef2dad2eb 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/orange_cosmos.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/orange_cosmos.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/pink_daffodil.json b/src/main/resources/data/create/recipes/compat/bop/milling/pink_daffodil.json similarity index 94% rename from src/main/resources/data/create/recipes/compat/bop/crushing/pink_daffodil.json rename to src/main/resources/data/create/recipes/compat/bop/milling/pink_daffodil.json index e3f68edfd..19afb0324 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/pink_daffodil.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/pink_daffodil.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/pink_hibiscus.json b/src/main/resources/data/create/recipes/compat/bop/milling/pink_hibiscus.json similarity index 94% rename from src/main/resources/data/create/recipes/compat/bop/crushing/pink_hibiscus.json rename to src/main/resources/data/create/recipes/compat/bop/milling/pink_hibiscus.json index 1624966ad..b9257f8f4 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/pink_hibiscus.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/pink_hibiscus.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/rose.json b/src/main/resources/data/create/recipes/compat/bop/milling/rose.json similarity index 92% rename from src/main/resources/data/create/recipes/compat/bop/crushing/rose.json rename to src/main/resources/data/create/recipes/compat/bop/milling/rose.json index 8815d0f40..fc91888e2 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/rose.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/rose.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/violet.json b/src/main/resources/data/create/recipes/compat/bop/milling/violet.json similarity index 91% rename from src/main/resources/data/create/recipes/compat/bop/crushing/violet.json rename to src/main/resources/data/create/recipes/compat/bop/milling/violet.json index 4156f63e4..2d7d0f7a1 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/violet.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/violet.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/wildflower.json b/src/main/resources/data/create/recipes/compat/bop/milling/wildflower.json similarity index 93% rename from src/main/resources/data/create/recipes/compat/bop/crushing/wildflower.json rename to src/main/resources/data/create/recipes/compat/bop/milling/wildflower.json index 77c634155..41c84b806 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/wildflower.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/wildflower.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/bop/crushing/wilted_lily.json b/src/main/resources/data/create/recipes/compat/bop/milling/wilted_lily.json similarity index 91% rename from src/main/resources/data/create/recipes/compat/bop/crushing/wilted_lily.json rename to src/main/resources/data/create/recipes/compat/bop/milling/wilted_lily.json index 1b8ed361b..ed14ddc1a 100644 --- a/src/main/resources/data/create/recipes/compat/bop/crushing/wilted_lily.json +++ b/src/main/resources/data/create/recipes/compat/bop/milling/wilted_lily.json @@ -5,7 +5,7 @@ "modid": "biomesoplenty" } ], - "type": "create:crushing", + "type": "create:milling", "group": "minecraft:misc", "ingredients": [ { diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/black_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/black_petal.json new file mode 100644 index 000000000..3da3edec6 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/black_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/black" + } + ], + "results": [ + { + "item": "botania:black_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/blue_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/blue_petal.json new file mode 100644 index 000000000..6cc6348a7 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/blue_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/blue" + } + ], + "results": [ + { + "item": "botania:blue_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/brown_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/brown_petal.json new file mode 100644 index 000000000..9bca30a30 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/brown_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/brown" + } + ], + "results": [ + { + "item": "botania:brown_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/cyan_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/cyan_petal.json new file mode 100644 index 000000000..17ac50f42 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/cyan_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/cyan" + } + ], + "results": [ + { + "item": "botania:cyan_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/gray_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/gray_petal.json new file mode 100644 index 000000000..d50727dbf --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/gray_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/gray" + } + ], + "results": [ + { + "item": "botania:gray_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/green_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/green_petal.json new file mode 100644 index 000000000..11ab451db --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/green_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/green" + } + ], + "results": [ + { + "item": "botania:green_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/light_blue_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/light_blue_petal.json new file mode 100644 index 000000000..86ccd140b --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/light_blue_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/light_blue" + } + ], + "results": [ + { + "item": "botania:light_blue_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/light_gray_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/light_gray_petal.json new file mode 100644 index 000000000..28b9da970 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/light_gray_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/light_gray" + } + ], + "results": [ + { + "item": "botania:light_gray_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/lime_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/lime_petal.json new file mode 100644 index 000000000..8aa80c9e3 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/lime_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/lime" + } + ], + "results": [ + { + "item": "botania:lime_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/magenta_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/magenta_petal.json new file mode 100644 index 000000000..a24f5e296 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/magenta_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/magenta" + } + ], + "results": [ + { + "item": "botania:magenta_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/orange_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/orange_petal.json new file mode 100644 index 000000000..6bd37d5d7 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/orange_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/orange" + } + ], + "results": [ + { + "item": "botania:orange_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/pink_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/pink_petal.json new file mode 100644 index 000000000..60c3fce1a --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/pink_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/pink" + } + ], + "results": [ + { + "item": "botania:pink_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/purple_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/purple_petal.json new file mode 100644 index 000000000..606697da0 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/purple_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/purple" + } + ], + "results": [ + { + "item": "botania:purple_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/red_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/red_petal.json new file mode 100644 index 000000000..62b4b7af3 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/red_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/red" + } + ], + "results": [ + { + "item": "botania:red_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/white_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/white_petal.json new file mode 100644 index 000000000..602602a72 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/white_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/white" + } + ], + "results": [ + { + "item": "botania:white_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/botania/milling/yellow_petal.json b/src/main/resources/data/create/recipes/compat/botania/milling/yellow_petal.json new file mode 100644 index 000000000..8041f0451 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/botania/milling/yellow_petal.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "botania" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "botania:petals/yellow" + } + ], + "results": [ + { + "item": "botania:yellow_dye", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bird_of_paradise.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bird_of_paradise.json new file mode 100644 index 000000000..5edf6abea --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bird_of_paradise.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:bird_of_paradise" + } + ], + "results": [ + { + "item": "minecraft:orange_dye", + "count": 3 + }, + { + "item": "minecraft:blue_dye", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:red_dye", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bluebell.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bluebell.json new file mode 100644 index 000000000..b049cbc96 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/bluebell.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:bluebell" + } + ], + "results": [ + { + "item": "minecraft:blue_dye", + "count": 2 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/cartwheel.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/cartwheel.json new file mode 100644 index 000000000..169193092 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/cartwheel.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:cartwheel" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 2 + }, + { + "item": "minecraft:orange_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/columbine.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/columbine.json new file mode 100644 index 000000000..f5988729e --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/columbine.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:columbine" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 2 + }, + { + "item": "minecraft:white_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/dianthus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/dianthus.json new file mode 100644 index 000000000..48c05d143 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/dianthus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:jolyce" + } + ], + "results": [ + { + "item": "minecraft:green_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/magenta_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/magenta_hibiscus.json new file mode 100644 index 000000000..9e00cf80c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/magenta_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:magenta_hibiscus" + } + ], + "results": [ + { + "item": "minecraft:magenta_dye", + "count": 2 + }, + { + "item": "minecraft:magenta_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/orange_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/orange_hibiscus.json new file mode 100644 index 000000000..6cc0c4ac3 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/orange_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:orange_hibiscus" + } + ], + "results": [ + { + "item": "minecraft:orange_dye", + "count": 2 + }, + { + "item": "minecraft:orange_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_clover.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_clover.json new file mode 100644 index 000000000..c8753a417 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_clover.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:pink_clover" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 2 + }, + { + "item": "minecraft:lime_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_hibiscus.json new file mode 100644 index 000000000..fa8c4c473 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/pink_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:pink_hibiscus" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 2 + }, + { + "item": "minecraft:pink_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/purple_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/purple_hibiscus.json new file mode 100644 index 000000000..91ac754a7 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/purple_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:purple_hibiscus" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 2 + }, + { + "item": "minecraft:purple_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/red_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/red_hibiscus.json new file mode 100644 index 000000000..5b50d8189 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/red_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:red_hibiscus" + } + ], + "results": [ + { + "item": "minecraft:red_dye", + "count": 2 + }, + { + "item": "minecraft:red_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/violet.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/violet.json new file mode 100644 index 000000000..fea46a464 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/violet.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:violet" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 2 + }, + { + "item": "minecraft:purple_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/white_clover.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/white_clover.json new file mode 100644 index 000000000..7c9a228b2 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/white_clover.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:white_clover" + } + ], + "results": [ + { + "item": "minecraft:white_dye", + "count": 2 + }, + { + "item": "minecraft:lime_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/yellow_hibiscus.json b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/yellow_hibiscus.json new file mode 100644 index 000000000..f2ce4cead --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/buzzier_bees/milling/yellow_hibiscus.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "buzzierbees" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "buzzierbees:daybloom" + } + ], + "results": [ + { + "item": "minecraft:yellow_dye", + "count": 2 + }, + { + "item": "minecraft:yellow_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/druidcraft/cutting/darkwood_log.json b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/darkwood_log.json new file mode 100644 index 000000000..cefdf5e0a --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/darkwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "druidcraft" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "druidcraft:darkwood_log" + } + ], + "results": [ + { + "item": "druidcraft:stripped_darkwood_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/druidcraft/cutting/elder_log.json b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/elder_log.json new file mode 100644 index 000000000..2fde05a0c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/elder_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "druidcraft" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "druidcraft:elder_log" + } + ], + "results": [ + { + "item": "druidcraft:stripped_elder_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_darkwood_log.json b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_darkwood_log.json new file mode 100644 index 000000000..6d3244f85 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_darkwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "druidcraft" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "druidcraft:stripped_darkwood_log" + } + ], + "results": [ + { + "item": "druidcraft:darkwood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_elder_log.json b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_elder_log.json new file mode 100644 index 000000000..e5a2c5084 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/druidcraft/cutting/stripped_elder_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "druidcraft" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "druidcraft:stripped_elder_log" + } + ], + "results": [ + { + "item": "druidcraft:elder_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/druidcraft/milling/lavender.json b/src/main/resources/data/create/recipes/compat/druidcraft/milling/lavender.json new file mode 100644 index 000000000..9b5847bda --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/druidcraft/milling/lavender.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "druidcraft" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "druidcraft:lavender" + } + ], + "results": [ + { + "item": "minecraft:purple_dye", + "count": 2 + }, + { + "item": "minecraft:purple_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem.json b/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem.json new file mode 100644 index 000000000..f35e9a56c --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "endergetic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "endergetic:poise_stem" + } + ], + "results": [ + { + "item": "endergetic:poise_stem_stripped", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem_stripped.json b/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem_stripped.json new file mode 100644 index 000000000..cf2c86efb --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/endergetic/cutting/poise_stem_stripped.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "endergetic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "endergetic:poise_stem_stripped" + } + ], + "results": [ + { + "item": "endergetic:poise_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/aspen_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/aspen_log.json new file mode 100644 index 000000000..f0f35da28 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/aspen_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:aspen_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_aspen_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/baobab_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/baobab_log.json new file mode 100644 index 000000000..02808f5ee --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/baobab_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:baobab_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_baobab_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/cottonwood_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/cottonwood_log.json new file mode 100644 index 000000000..fee2fb61f --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/cottonwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:cottonwood_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_cottonwood_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/fir_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/fir_log.json new file mode 100644 index 000000000..b133abd81 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/fir_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:fir_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_fir_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/juniper_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/juniper_log.json new file mode 100644 index 000000000..a9fda021b --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/juniper_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:juniper_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_juniper_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/mangrove_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/mangrove_log.json new file mode 100644 index 000000000..fc77c21cc --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/mangrove_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:mangrove_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_mangrove_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/maple_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/maple_log.json new file mode 100644 index 000000000..d9297cf33 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/maple_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:maple_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_maple_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/palm_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/palm_log.json new file mode 100644 index 000000000..aeefb2a88 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/palm_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:palm_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_palm_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/pine_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/pine_log.json new file mode 100644 index 000000000..fb27f4696 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/pine_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:pine_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_pine_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/redwood_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/redwood_log.json new file mode 100644 index 000000000..960514664 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/redwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:redwood_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_redwood_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_aspen_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_aspen_log.json new file mode 100644 index 000000000..2679b5538 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_aspen_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_aspen_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:aspen_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_baobab_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_baobab_log.json new file mode 100644 index 000000000..1f5799d13 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_baobab_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_baobab_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:baobab_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_cottonwood_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_cottonwood_log.json new file mode 100644 index 000000000..8dd22e6bb --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_cottonwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_cottonwood_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:cottonwood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_fir_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_fir_log.json new file mode 100644 index 000000000..f84e6acc1 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_fir_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_fir_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:fir_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_juniper_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_juniper_log.json new file mode 100644 index 000000000..24b6e1d3a --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_juniper_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_juniper_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:juniper_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_mangrove_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_mangrove_log.json new file mode 100644 index 000000000..a7e11054b --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_mangrove_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_mangrove_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:mangrove_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_maple_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_maple_log.json new file mode 100644 index 000000000..c82ebf136 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_maple_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_maple_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:maple_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_palm_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_palm_log.json new file mode 100644 index 000000000..a6299ce69 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_palm_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_palm_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:palm_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_pine_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_pine_log.json new file mode 100644 index 000000000..2ca583202 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_pine_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_pine_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:pine_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_redwood_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_redwood_log.json new file mode 100644 index 000000000..b37f06e20 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_redwood_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_redwood_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:redwood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_willow_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_willow_log.json new file mode 100644 index 000000000..66b6aa646 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/stripped_willow_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:stripped_willow_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:willow_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/willow_log.json b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/willow_log.json new file mode 100644 index 000000000..dc9b00bde --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/projectvibrantjourneys/cutting/willow_log.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "projectvibrantjourneys" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "projectvibrantjourneys:willow_log" + } + ], + "results": [ + { + "item": "projectvibrantjourneys:stripped_willow_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/stripped_willow_log.json b/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/stripped_willow_log.json new file mode 100644 index 000000000..943443551 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/stripped_willow_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "swampexpansion" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "swampexpansion:stripped_willow_log" + } + ], + "results": [ + { + "item": "swampexpansion:willow_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/willow_log.json b/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/willow_log.json new file mode 100644 index 000000000..5c8b56b8f --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/swampexpansion/cutting/willow_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "swampexpansion" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "swampexpansion:willow_log" + } + ], + "results": [ + { + "item": "swampexpansion:stripped_willow_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/driftwood_log.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/driftwood_log.json new file mode 100644 index 000000000..5aaea6a61 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/driftwood_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "upgrade_aquatic:driftwood_log" + } + ], + "results": [ + { + "item": "upgrade_aquatic:driftwood_log_stripped", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/river_log.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/river_log.json new file mode 100644 index 000000000..18e44da83 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/river_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "upgrade_aquatic:river_log" + } + ], + "results": [ + { + "item": "upgrade_aquatic:stripped_river_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_driftwood_log.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_driftwood_log.json new file mode 100644 index 000000000..b118469de --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_driftwood_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "upgrade_aquatic:driftwood_log_stripped" + } + ], + "results": [ + { + "item": "upgrade_aquatic:driftwood_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_river_log.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_river_log.json new file mode 100644 index 000000000..faae38dff --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/cutting/stripped_river_log.json @@ -0,0 +1,21 @@ +{ +"conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:cutting", + "ingredients": [ + { + "item": "upgrade_aquatic:stripped_river_log" + } + ], + "results": [ + { + "item": "upgrade_aquatic:river_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/flowering_rush.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/flowering_rush.json new file mode 100644 index 000000000..3f8a63e24 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/flowering_rush.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "upgrade_aquatic:flowering_rush" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 3 + }, + { + "item": "minecraft:pink_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_pink.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_pink.json new file mode 100644 index 000000000..934880856 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_pink.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "upgrade_aquatic:searocket_pink" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_white.json b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_white.json new file mode 100644 index 000000000..8dcec4210 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/upgrade_aquatic/milling/searocket_white.json @@ -0,0 +1,26 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "upgrade_aquatic" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "upgrade_aquatic:searocket_white" + } + ], + "results": [ + { + "item": "minecraft:white_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_tunnel.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_tunnel.json deleted file mode 100644 index c428b7c2b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_tunnel.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "BBB", - "PAP" - ], - "key": { - "A": { - "item": "minecraft:dried_kelp" - }, - "P": { - "tag": "forge:plates/brass" - }, - "B": { - "tag": "forge:ingots/brass" - } - }, - "result": { - "item": "create:belt_tunnel", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/extractor.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/extractor.json deleted file mode 100644 index 793f07cb7..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/extractor.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "tag": "forge:plates/brass" - }, - "B": { - "item": "create:electron_tube" - }, - "C": { - "item": "minecraft:dried_kelp" - }, - "I": { - "tag": "minecraft:planks" - } - }, - "result": { - "item": "create:extractor", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/funnel.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/funnel.json deleted file mode 100644 index db043947f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/funnel.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - "ICI" - ], - "key": { - "S": { - "tag": "forge:plates/brass" - }, - "B": { - "item": "create:electron_tube" - }, - "C": { - "item": "minecraft:dried_kelp" - }, - "I": { - "tag": "minecraft:planks" - } - }, - "result": { - "item": "create:funnel", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/transposer.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/transposer.json deleted file mode 100644 index 463850124..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/transposer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SP" - ], - "key": { - "P": { - "item": "create:funnel" - }, - "S": { - "item": "create:extractor" - } - }, - "result": { - "item": "create:transposer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/linked_extractor.json b/src/main/resources/data/create/recipes/crafting_shapeless/linked_extractor.json deleted file mode 100644 index f87471657..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/linked_extractor.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "create:extractor" - }, - { - "item": "minecraft:redstone_torch" - } - ], - "result": { - "item": "create:linked_extractor", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/linked_transposer.json b/src/main/resources/data/create/recipes/crafting_shapeless/linked_transposer.json deleted file mode 100644 index 6f652f61d..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/linked_transposer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "create:transposer" - }, - { - "item": "minecraft:redstone_torch" - } - ], - "result": { - "item": "create:linked_transposer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/transposer.json b/src/main/resources/data/create/recipes/crafting_shapeless/transposer.json deleted file mode 100644 index a2ed2f45f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/transposer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "create:linked_transposer" - } - ], - "result": { - "item": "create:transposer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/tags/blocks/brittle.json b/src/main/resources/data/create/tags/blocks/brittle.json new file mode 100644 index 000000000..4308e5b7c --- /dev/null +++ b/src/main/resources/data/create/tags/blocks/brittle.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:doors", + "minecraft:flower_pot", + "minecraft:bell" + ], + "optional": [ + + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/tags/blocks/non_movable.json b/src/main/resources/data/create/tags/blocks/non_movable.json new file mode 100644 index 000000000..974dda4c5 --- /dev/null +++ b/src/main/resources/data/create/tags/blocks/non_movable.json @@ -0,0 +1,19 @@ +{ + "replace": false, + "values": [ + "minecraft:obsidian" + ], + "optional": [ + "immersiveengineering:connector_lv", + "immersiveengineering:connector_lv_relay", + "immersiveengineering:connector_mv", + "immersiveengineering:connector_mv_relay", + "immersiveengineering:connector_hv", + "immersiveengineering:connector_hv_relay", + "immersiveengineering:connector_bundled", + "immersiveengineering:connector_structural", + "immersiveengineering:connector_redstone", + "immersiveengineering:connector_probe", + "immersiveengineering:breaker_switch" + ] +} \ No newline at end of file