diff --git a/build.gradle b/build.gradle index 9b123c007..bf686d076 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ archivesBaseName = 'create' sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' minecraft { - mappings channel: 'snapshot', version: '20200722-mixed-1.16.1' + mappings channel: 'snapshot', version: '20200920-mixed-1.16.3' accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { @@ -107,14 +107,14 @@ configurations { dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - def registrate = "com.tterrag.registrate:Registrate:MC${minecraft_version}-${registrate_version}" + def registrate = "com.tterrag.registrate:Registrate:MC1.16.2-${registrate_version}" implementation fg.deobf(registrate) shade registrate // compile against the JEI API but do not include it at runtime - compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}:api") + compileOnly fg.deobf("mezz.jei:jei-1.16.2:${jei_version}:api") // at runtime, use the full JEI jar - runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") + runtimeOnly fg.deobf("mezz.jei:jei-1.16.2:${jei_version}") // i'll leave this here commented for easier testing //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") diff --git a/gradle.properties b/gradle.properties index d621ce308..70b10e22f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,12 +5,12 @@ org.gradle.daemon=false # mod version info mod_version=0.3 -minecraft_version=1.16.1 -forge_version=32.0.70 +minecraft_version=1.16.3 +forge_version=34.0.9 # dependency versions -registrate_version=1.0.0-beta.1 -jei_version=7.0.0.6 +registrate_version=1.0.0-beta.6 +jei_version=7.3.2.27 # curseforge information projectId=328085 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 9af7474d5..870f56f0e 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5,18 +5,17 @@ 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 +0a172dea0746027be3676e87271615f1307245a6 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 +11908c2f8603e61bec88010bc6d0890e6339c6b1 assets/create/blockstates/andesite_funnel.json 398922758a6219544e5b85c91c9cf8a543b437e5 assets/create/blockstates/andesite_pillar.json 1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json f9fa6aa530eb0891a74eadfbebc663172a57147a assets/create/blockstates/basin.json @@ -25,12 +24,11 @@ f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json -0626725f70103a55dabcda6f87ca943279d45793 assets/create/blockstates/blaze_heater.json +923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.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 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json @@ -41,7 +39,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 +b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json 4947c261310445fa55b92038326ac82967d192dd assets/create/blockstates/clockwork_bearing.json 1f33834c685e3243882acfe20183fe64dfa872be assets/create/blockstates/clutch.json e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json @@ -49,6 +47,7 @@ f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block. cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json 3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json dc76bca1fdd41c8e6ada27fd59a2b73d7adc9596 assets/create/blockstates/copper_shingles.json +ecf4a72411870bfdbf8a59469b114cd77621c343 assets/create/blockstates/copper_tiles.json 3df0d5d5170a2f6cbab0f8a9bc8f2d64229589af assets/create/blockstates/creative_crate.json f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json @@ -90,8 +89,8 @@ f63a5816d4bfe643aa098d03c3b54462dd06fe19 assets/create/blockstates/dolomite_cobb f179202e59e449157f89efc37229b03bbfd391d7 assets/create/blockstates/dolomite_pillar.json 7b1c40891b07c8f3238537625d9e25c8627e7333 assets/create/blockstates/encased_belt.json 7b2b836649e729feafa60972bf95e3afb2143131 assets/create/blockstates/encased_fan.json -db1777f0eff1eb6987b569aee513656ae889ae75 assets/create/blockstates/encased_shaft.json -1442ff1a0e404f99263ba99d734da1dfed03d4e3 assets/create/blockstates/extractor.json +656813b75dd3b901bf34f24df785e4b0fbe11aa6 assets/create/blockstates/encased_fluid_pipe.json +e157d7f67b08493b71d7ffea8d622f4a64dbc155 assets/create/blockstates/encased_shaft.json a774e815376a67e2a2de44e39af0a1a0b4406932 assets/create/blockstates/fancy_andesite_bricks.json 180be26a75834cf9cdb881f969f77906e91cc36a assets/create/blockstates/fancy_andesite_bricks_slab.json d5d7762b80952052d0a7adf3081967cac3f3ba6c assets/create/blockstates/fancy_andesite_bricks_stairs.json @@ -128,7 +127,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -3df164be441c87d6f869b34b5ab48b6822892ad6 assets/create/blockstates/fluid_pipe.json +fe9169716dd21a81a3710a89f0a9b7ea4dcd4d51 assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json ac00d40e1ef50a37041c0481afa1a23a14dea78e assets/create/blockstates/framed_glass.json @@ -146,6 +145,7 @@ a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobble a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json 9c48e311be8b959bfb98e16ffaa358210ac8b9dd assets/create/blockstates/gearbox.json f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json +93f8bdc22d9a5e04268964e35e4285c8cbf2b89d assets/create/blockstates/glass_fluid_pipe.json 87661d61e1645ef5ad4ea34f1c0fa31f139ea431 assets/create/blockstates/granite_bricks.json d7f4cf7be7e9a3895840d9288245c52cbe25f0bd assets/create/blockstates/granite_bricks_slab.json ec51efc72eb6b16c5f99399b4cb6284665d5be99 assets/create/blockstates/granite_bricks_stairs.json @@ -187,8 +187,6 @@ e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bri 17c5a6c1dd094c9201ed90fdcebde620a8a39900 assets/create/blockstates/limestone_cobblestone_wall.json b7506b862d13b3f915c60d38bb7a20afc935f70a assets/create/blockstates/limestone_pillar.json 69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json -c793ab3aa6cf09d8d6d4136757629689f0365771 assets/create/blockstates/linked_extractor.json -c5422866667331f1d5cf6753c0889747ee02762b assets/create/blockstates/linked_transposer.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json 3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json @@ -231,7 +229,6 @@ 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 @@ -300,10 +297,11 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json -4bb26546ac954604a0317b059f2c36a1123772cb assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json +b76ed5f6d271349b2509708c11e713bb299a57b6 assets/create/blockstates/refined_radiance_casing.json 1eac804cba08aebb5f4646758ae1ef9b32e01365 assets/create/blockstates/reinforced_rail.json e2990fe70ad5d10437a376e70e167d1856277cc1 assets/create/blockstates/rope.json e14d5f7252105934295b4e156ec0e6d62d3d6b1c assets/create/blockstates/rope_pulley.json @@ -322,8 +320,10 @@ b6e50f46a02f833f2f2bafa8585a909b6da5e229 assets/create/blockstates/scoria_cobble 46641fdbc6bdc05829153bc28efb90cae26a51f8 assets/create/blockstates/scoria_pillar.json 89e10f35b93b5c72dd235eb79e5fc6f3655027a1 assets/create/blockstates/secondary_linear_chassis.json 81931eb1027dfb42ba4b2186185a4c0a36e0dbe4 assets/create/blockstates/sequenced_gearshift.json +c4c3613ad353e721e7109628aa06ab0664d0862b assets/create/blockstates/shadow_steel_casing.json 79ae6d86a829b9ce82fce68a6377d3810fcfcb10 assets/create/blockstates/shaft.json e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.json +1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json 8d7dfa60630a8b4bae4e8eca5c66e1cfa34dda1f assets/create/blockstates/spruce_window_pane.json 3d93eabbb327aecc526beae9c62283f1d43eb710 assets/create/blockstates/sticky_mechanical_piston.json @@ -331,14 +331,9 @@ f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_swi e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json 8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json -e122bf687d991dd2d7a05670039da7937f96ca05 assets/create/blockstates/transposer.json a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.json -d45450255fd7a64cfd2bd8856fd4cff01a49cc8d assets/create/blockstates/vertical_extractor.json 69dfe8afaa8eb6105dae9f76ab8b7847bf90b8c6 assets/create/blockstates/vertical_framed_glass.json c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets/create/blockstates/vertical_framed_glass_pane.json -0ecc57db2487ed6b370b9cc43d2a873c61d7c37e assets/create/blockstates/vertical_linked_extractor.json -751b99625aca1b4122a0333bfaf93325d37eb003 assets/create/blockstates/vertical_linked_transposer.json -02199afb5b6ebcbc8e11567df05f39eface39e39 assets/create/blockstates/vertical_transposer.json d995547bcd71603ba7378d8998098e462030bfd0 assets/create/blockstates/water_wheel.json f182669f7547964f9f2ef67916568556870def7b assets/create/blockstates/weathered_limestone.json 27e6740834c0f673acc3531371512daa6dcab025 assets/create/blockstates/weathered_limestone_bricks.json @@ -354,17 +349,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 -8701a4473878ef76b77b853b7b5ee0e1570e35b5 assets/create/lang/en_ud.json -28b0c222c3bc23ade20b30acbeba4dff45b8aac6 assets/create/lang/en_us.json -99cfc3bf44135741f3cab754126c7b9020ca6afd assets/create/lang/unfinished/de_de.json -5eaf282418b78d3b642489f12d1d4e39a84c8158 assets/create/lang/unfinished/fr_fr.json -d8a9050112ff115115035e5af996cf67d1c7857f assets/create/lang/unfinished/it_it.json -52d6a899466025fafd1235486e8a142acd650827 assets/create/lang/unfinished/ja_jp.json -67249a783b7bdb3306b2616fa05675f446930cb9 assets/create/lang/unfinished/ko_kr.json -49d048a89d98ec8e15f91155f466f06634656e28 assets/create/lang/unfinished/nl_nl.json -c88f1d0814ddd3c8a7925372ea9d5f5677b2abe8 assets/create/lang/unfinished/pt_br.json -76c6a11afca6c102194f2b32a4e84c83d73e741c assets/create/lang/unfinished/ru_ru.json -e49755abda2b5df4c1a83fc058cf2693940259d1 assets/create/lang/unfinished/zh_cn.json +c87674f2935327f78657f1bb44b3b10b6697a548 assets/create/lang/en_ud.json +62a4c9e5454fd6e899495c95d6fddd020d472bc7 assets/create/lang/en_us.json +42081320880e3248cc1e7e667d38bb3be682790a assets/create/lang/unfinished/de_de.json +8fc3d8467436b5dd9221b0ed72b1a64bf83d0767 assets/create/lang/unfinished/fr_fr.json +a5125e0ca8bb93c7c4f11d49a80a155a7ea14b16 assets/create/lang/unfinished/it_it.json +b173b6500f8a675e266864310ab8e205721dbe12 assets/create/lang/unfinished/ja_jp.json +1af8e96a3129f8aac458b75eff69378a0cc9dd7d assets/create/lang/unfinished/ko_kr.json +343a4455ca0f29b2ae6ac439030c0dfde0e4c59b assets/create/lang/unfinished/nl_nl.json +d7bd8d85e3b8def1b4fe72da0a43845d1bb61c1c assets/create/lang/unfinished/pt_br.json +6e7fdb53ae3121e5575021bb224d1bfbe257c38b assets/create/lang/unfinished/ru_ru.json +1a3e1309d92024445dae821d25168dab74ff5cdd 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 @@ -387,10 +382,14 @@ 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 +4b8c1db868de612ae6a49d9133db700ac6a3d688 assets/create/models/block/andesite_belt_funnel_pull_extended.json +eb7f1bfcd856bf302cb24dda09994ceef280fca2 assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json +d5d7c62b16aa3cfb279b4e3100f910c1782b5846 assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json +2d228eae550d573f4cad06ed6f6d51e4975fdde6 assets/create/models/block/andesite_belt_funnel_pull_retracted.json +2a3b929e3c24f70a0842b9ce56c175c4383e2598 assets/create/models/block/andesite_belt_funnel_push_extended.json +56a4d2e099fb285fd04ef095ced3bd7046835711 assets/create/models/block/andesite_belt_funnel_push_powered_extended.json +8a73d43517d64f873896631fbe7fccd085e1603a assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json +aff112cb4ca73f3b1f71e98ccd984ee286da2930 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 @@ -400,8 +399,6 @@ f1ba5c40d5e580d3c46d2eeab37b59263d0b0904 assets/create/models/block/andesite_bel 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 @@ -410,7 +407,8 @@ 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 +51e851b15870c0922cfbe911ef1a2f22062969f3 assets/create/models/block/andesite_funnel.json +f28da6703691f1b08cfb49208f0f7bb0c5ca816d assets/create/models/block/andesite_funnel_powered.json b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json 75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json @@ -441,22 +439,18 @@ 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 +24dff9a8d22c9a88286d2b7d08384ac9f281a512 assets/create/models/block/brass_belt_funnel_pull_extended.json +c9c5f53c9d4f6cf6f509452e91cab1ba5b57f807 assets/create/models/block/brass_belt_funnel_pull_powered_extended.json +addcf821a2348c0985bf9a72229355cfab818069 assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json +332c7b8bf2feb635290b05788b61ead0b2cc813a assets/create/models/block/brass_belt_funnel_pull_retracted.json +094a5aedd53295aaa9b78deedf7899f9875dc5d8 assets/create/models/block/brass_belt_funnel_push_extended.json +44d2cf63398e5e4c39f43412a00d7f0213d8703c assets/create/models/block/brass_belt_funnel_push_powered_extended.json +07eb19291e5c6108e9e25f57f512747bc48352dd assets/create/models/block/brass_belt_funnel_push_powered_retracted.json +6ff63956c71363f198588aca3fd849ad4e0c8863 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 +838e7ab4c0c9d89eacfa078daf64995e505db896 assets/create/models/block/brass_funnel.json +6099ba0366065d15d3b2821474850a1ae85485ea assets/create/models/block/brass_funnel_powered.json 520087db8d479c66f85f3483af813fb668f27503 assets/create/models/block/brass_tunnel/cross.json 347ed67bf3426e323354e2d959fc9563dc7eeecd assets/create/models/block/brass_tunnel/straight.json a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json @@ -541,6 +535,7 @@ cc6d9300cd26f2323c653dbcc61b7a885be8fa3b assets/create/models/block/dolomite_cob a101974d906487326dc38916f828d12a278a49ae assets/create/models/block/dolomite_cobblestone_wall_post.json 9c497140dfe73abe1964479eaf1af8f1892de290 assets/create/models/block/dolomite_cobblestone_wall_side.json 999a7cd79a9dc80c47fd6103b65f006b55187402 assets/create/models/block/dolomite_pillar.json +1a8bac1e97a2a6c3cc362081568d2a7fce815ad5 assets/create/models/block/encased_fluid_pipe.json 17dae5fdc1a551d8ab1ab8a68cabf7a8c3848d86 assets/create/models/block/fancy_andesite_bricks.json cfb2cd84a1cbd9226a77ebc1f6c29e8eaa9c577f assets/create/models/block/fancy_andesite_bricks_slab.json 8ee27601996ab577991b6a0f7e9df27db0282cad assets/create/models/block/fancy_andesite_bricks_slab_top.json @@ -782,6 +777,14 @@ b4987ed1fbd44719e59cf911d606b964d51a734c assets/create/models/block/oxidized/cop c9f722cd27fb18239f796eb1fa11a73e5339005a assets/create/models/block/oxidized/copper_shingles_5.json 4df00795cde9497a0910584c6a53b62bfb18fef1 assets/create/models/block/oxidized/copper_shingles_6.json 712f8b01330a1aeff2efce5ac1ec2fdd84b622c7 assets/create/models/block/oxidized/copper_shingles_7.json +d23868f342aa1d821c2971f16b62915d24f257cd assets/create/models/block/oxidized/copper_tiles_0.json +14d893f509073bc0ee6b8a487d1ec4457f717e7a assets/create/models/block/oxidized/copper_tiles_1.json +9d531696a9e989ab090f653d50152fcdf0b8519f assets/create/models/block/oxidized/copper_tiles_2.json +84129b54eb4484c59ad5f3b95b5dea4130a934bc assets/create/models/block/oxidized/copper_tiles_3.json +0e4b39cd5d14470ee9055c3332d3c930d985e075 assets/create/models/block/oxidized/copper_tiles_4.json +c3f2f3574f33ea87c8c32a88c60b386b2ce5c59e assets/create/models/block/oxidized/copper_tiles_5.json +1bdc82a5d6deecaa6e62986bfa4d83ed80cad269 assets/create/models/block/oxidized/copper_tiles_6.json +4ba81cdb32477181225521b13de34b5cb81d3ab1 assets/create/models/block/oxidized/copper_tiles_7.json 081d87f990e01211789e9d0dc43acfceb6982aaa assets/create/models/block/paved_andesite.json 30b9aafb43ecfffcbffdf0aa19b5243e38065ff4 assets/create/models/block/paved_andesite_covered.json ab78afb3c487976c2dc5dcefa12153fd4a064ca8 assets/create/models/block/paved_andesite_slab.json @@ -932,6 +935,7 @@ a9885a3f69e3e2a2812c33bafd9140fcc5cc7c25 assets/create/models/block/radial_chass 522f4733118d6fba172696e9478c8f9fe88b236e assets/create/models/block/radial_chassis_side_z.json bffca231a146a6ac49e028f3790cdcbf375e98b0 assets/create/models/block/radial_chassis_side_z_sticky.json 12d4f4119b994c5d71c96ab3aa09beb89dad1e10 assets/create/models/block/red_seat.json +c4bb40ed2bddabff154a34f4eff7a485bf6488a0 assets/create/models/block/refined_radiance_casing.json c145d8e0d7f8f41afa80b9727a107b2ad2f0c3c9 assets/create/models/block/scoria.json 59c6f6a4ffe43485244a8561d7e8341f796e268b assets/create/models/block/scoria_bricks.json d86ca38a0c1bac89e545916c59f23f6f0c9f7d7a assets/create/models/block/scoria_bricks_slab.json @@ -954,6 +958,7 @@ de66b504054f37eca6e5eeee6245fb8f9db2e1bf assets/create/models/block/scoria_cobbl fbe57e52b0234c2c379d82d6cc425d6ce9492454 assets/create/models/block/secondary_linear_chassis_bottom.json e439d642f3c2049dce444b7b4bea8532eb22699c assets/create/models/block/secondary_linear_chassis_top.json 5fc7d8839c6de9363d22fd22be7f440aab853121 assets/create/models/block/secondary_linear_chassis_top_bottom.json +3020d66d33996dd4b203905a54538d3dd5f01330 assets/create/models/block/shadow_steel_casing.json 3fc9a7ae552095d0f45f8e632e2bf04d1378946f assets/create/models/block/spruce_window.json f39904a8a73a25e440d6a35fad931f8ce7ef165e assets/create/models/block/spruce_window_pane_noside.json 7446e12a5ba91c008b17fd70484468caa36500b9 assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1018,7 +1023,7 @@ 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 +7490819e7e5445019b6b8cb2538f12a5b6717a46 assets/create/models/item/andesite_funnel.json 75b8b00c2418b9660d35a7fabd0774925cf1c02f assets/create/models/item/andesite_pillar.json c0e35daccfb398947532e9499d6bda963387cd9c assets/create/models/item/andesite_tunnel.json bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets/create/models/item/basin.json @@ -1027,11 +1032,11 @@ bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets/create/models/item/basin.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 -fa2761dc44857eb840a94df869de66a91988f0da assets/create/models/item/blaze_heater.json +80a6e8b00709fe0521aca5b789ae17485ed9c56d assets/create/models/item/blaze_burner.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 +099961ca4a75b6ecfddd1db6dd29909276759f3b 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 @@ -1056,6 +1061,7 @@ c5bcfba46f5824654dedaa2c5d5f42deb29e3baf assets/create/models/item/copper_ingot. 51be7da59368681522de870f1e09036dac55aa77 assets/create/models/item/copper_ore.json 200ef8378a9c014571c414433d4aef73a204dc01 assets/create/models/item/copper_sheet.json d7cb2f7bac8fae893fc5179af8140786a908f3f5 assets/create/models/item/copper_shingles.json +f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles.json 4e9126b349d55c65aa5407f05700579e52101c1f assets/create/models/item/crafter_slot_cover.json 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json @@ -1103,12 +1109,11 @@ be7de1e1529fb2a2e842204136520a760676d4e9 assets/create/models/item/dolomite_cobb e974cd23a5456baef8b634f2d21fd8c3822931ab assets/create/models/item/dolomite_pillar.json 82b73fafdb8bf4f0706012d5baab44cd0e1aa7bc assets/create/models/item/dough.json 36139f3de5fc9e57cb96f2d2daad108bc0635b7b assets/create/models/item/electron_tube.json +971be8e52e8dfef50c8329be83f9c5d5ea869279 assets/create/models/item/empty_blaze_burner.json 3bbf9f6b33ef075fb2e1d20d58a6169e2e942314 assets/create/models/item/empty_schematic.json f2d6b88c3174de01e16da555236727efc33b490c assets/create/models/item/encased_belt.json 250bd0716cc1f04b03892ab74eb0b3a0f32a6158 assets/create/models/item/encased_fan.json -e0f9ad7e7d790e9e21a38fa57395fd3ff892359b assets/create/models/item/encased_shaft.json 68833e2a7836c73776551565783a1d175b715c66 assets/create/models/item/extendo_grip.json -956646df2a75ed651eabb403a3f9e1024538cd56 assets/create/models/item/extractor.json efcbd30ad7a7658c02a3dc3de5fa0f21d7f49b54 assets/create/models/item/fancy_andesite_bricks.json 7ccd312084128c356307c7ca6e52c65d0a18907b assets/create/models/item/fancy_andesite_bricks_slab.json c8eee9d8df7af227eba051e4b9a7e48a79e682df assets/create/models/item/fancy_andesite_bricks_stairs.json @@ -1212,8 +1217,6 @@ ebdf23b99b7895e347c29057c8070a6e16e56beb assets/create/models/item/limestone_cob 8cd46904fd9709377d514e0faf9150ca317f6a9f assets/create/models/item/limestone_cobblestone_wall.json 8065de871ad2fbaed711735561b8ed91a2ce0004 assets/create/models/item/limestone_pillar.json d245aa4994ff197b1ffeb7980d05f96bd20cdeb3 assets/create/models/item/linear_chassis.json -eb0053df13e362e0a05be65252944f0c94eab3db assets/create/models/item/linked_extractor.json -0242f25a8eb02b25f8b03344a1dfaf9ad0ab192c assets/create/models/item/linked_transposer.json d912be3e87f2beaa8e22747f867739139667241b assets/create/models/item/magenta_seat.json 932facf4bf93b471e8630f4132a4284a9f4d0d39 assets/create/models/item/mechanical_arm.json 49dcc373c33f6fc3760add10eb51bd96cd4fd028 assets/create/models/item/mechanical_bearing.json @@ -1228,6 +1231,7 @@ f8d0d4b2a890ea7a69ab0c390947b48fe0478d3f assets/create/models/item/mechanical_pi bca99d467ec8ead10124becb60ac24b39be83de4 assets/create/models/item/mechanical_saw.json 0eb5726c8c0de462f432411c210d6132b2c446a4 assets/create/models/item/millstone.json 1134bc8ecdfefe5d30ee4973c37aa9a349c368b4 assets/create/models/item/minecart_contraption.json +5f44acb8a784611c17913ddf64fb4098b3a8aee9 assets/create/models/item/minecart_coupling.json dc43c88dc8ae1f425e1c10f422b09d97719af5bc assets/create/models/item/mossy_andesite.json 4ce9aabf9fa9e9e6af6b4339291e635708bdbcdf assets/create/models/item/mossy_dark_scoria.json d084f03d068d0b8c3b7c4d00014c168f61836770 assets/create/models/item/mossy_diorite.json @@ -1255,7 +1259,6 @@ 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 @@ -1332,6 +1335,7 @@ ba99e2fdb64892f4f479a8ac51c226cb5f71f659 assets/create/models/item/red_sand_pape b9a4ac219a27e60a82f55129f2df5ae6183981e2 assets/create/models/item/redstone_contact.json 52e561abeb954d0349e640566de92ef80ccbf919 assets/create/models/item/redstone_link.json d9dd4546f4f4c6ed5fef66de9d272d469db4e81f assets/create/models/item/refined_radiance.json +ef52b3734a47e96c5f83d60da73110e925737933 assets/create/models/item/refined_radiance_casing.json 901f7ad587dd07c9494d95bf7f08f93bb20db774 assets/create/models/item/reinforced_rail.json 6daff6b82b33374d7add65e352e05ecb2fd9ebdd assets/create/models/item/rope_pulley.json fc54acc37695f21ef650c8310110407647e9a023 assets/create/models/item/rose_quartz.json @@ -1354,8 +1358,10 @@ b0061419cf7b7bd2dd548ff00ee28f1227ee2663 assets/create/models/item/scoria_cobble 083b9fc316cef1d24ea20f06a6aaa4cb52f1ef94 assets/create/models/item/secondary_linear_chassis.json 0df94333da5700f01dcf4ffa46e3f3bf26bb8cf7 assets/create/models/item/sequenced_gearshift.json da72ccdc893fbdd3efa9c22143b88eb756c20e44 assets/create/models/item/shadow_steel.json +081326d6666cfcfe34c45c1b74bfceba0b01ae6e assets/create/models/item/shadow_steel_casing.json 106ae694f7e03a218c37003dca8291b1d39b3c55 assets/create/models/item/shaft.json d6fb0d38b1b5bcc199b52ac8889eaecd167f6725 assets/create/models/item/speedometer.json +b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window.json 5f622bca8386b8dd077310647e39ac3abb80c6a1 assets/create/models/item/spruce_window_pane.json 891abc24593d53d282773eca5534065056d89b4c assets/create/models/item/sticky_mechanical_piston.json @@ -1364,7 +1370,6 @@ bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer. 29d571a061e3addf92ee51bfc55d96edc3a517a5 assets/create/models/item/super_glue.json b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.json 8a2a81a8cbc52b6021e57107d79a32f73b82d8fe assets/create/models/item/tiled_glass_pane.json -a9f6592275a4c8592e3c88a95fbe88bd93de67c6 assets/create/models/item/transposer.json c081317f106a2b04700aafde12c57445844c20ab assets/create/models/item/tree_fertilizer.json fb24881c4e92bbb7ffa54a71e0af6b1c66d84829 assets/create/models/item/turntable.json 32f49b724af10c8d7e2ed5a3c82280e83b75f789 assets/create/models/item/vertical_framed_glass.json @@ -1422,9 +1427,163 @@ e4e3c1bd7ecf501b40cffc26d8ad145ab4e89118 data/create/advancements/deployer.json a135eec618e448f440d9f42cc7a3e6c63fc45a71 data/create/advancements/overstressed.json 72025d8bf73ab8096c29f12d0c8d9a346f09cd64 data/create/advancements/polished_rose_quartz.json 1e3cd82e36fd4bcd053d652a0eead4458ed7f315 data/create/advancements/press.json -b2782692d27ffb105e3167174cebe1ebdd4a9867 data/create/advancements/recipes/create.base/brass_block.json -df6f220e693f5256bb3df8d6c7769bc931820ae5 data/create/advancements/recipes/create.base/copper_block.json -82280c50b78dd7e8c179cb8e8f0c074b26ec9586 data/create/advancements/recipes/create.base/zinc_block.json +e525d8eda8d0aac6791ae935ed4f3f75cc521460 data/create/advancements/recipes/building_blocks/smelting/glass_from_framed_glass.json +295c5a61d6f175a65d25e19cbd7ca90d3b4a93b2 data/create/advancements/recipes/building_blocks/smelting/glass_from_horizontal_framed_glass.json +d192e3f2185ad3cd8cd64f639dd6395aaec89563 data/create/advancements/recipes/building_blocks/smelting/glass_from_tiled_glass.json +98fe15c805f1d228f1db6a2b35426ef01e9747a8 data/create/advancements/recipes/building_blocks/smelting/glass_from_vertical_framed_glass.json +9db50289b778cbcdfd9cd8589361924a0f1bebad data/create/advancements/recipes/create.base/blasting/brass_ingot_from_crushed.json +9b7a18a8697ef7ea09538909df640af53d0b6ca7 data/create/advancements/recipes/create.base/blasting/copper_ingot_from_crushed.json +c368cadffa9177fefb9e92ff4453b40bc8dd670d data/create/advancements/recipes/create.base/blasting/copper_ingot_from_ore.json +8fffce2a5c5dd88d52e3b006fa92fb18cf2f1571 data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json +4bb60ef5e186f12a9d52e61319db8c78300c64ab data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json +dd487f98c411f1ff22cb7fc208b8cc24b27deb2f data/create/advancements/recipes/create.base/crafting/appliances/dough.json +51cdcf168087f47e4458eed7543d227da1ee5ca0 data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json +eba09a9ca1c5c249517da9b3a883479fd6480ac6 data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json +0479fa3c10130c799269c40df6b18deb3a3d8331 data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json +d531f87f425d199aee4777a588c1cd6cab6f5173 data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json +2eef3201017af03f6a2f0f015645e3ff5e25d9c1 data/create/advancements/recipes/create.base/crafting/curiosities/wand_of_symmetry.json +d97d96e1b2ddd25df15fe1ef1c3d084f15bb9789 data/create/advancements/recipes/create.base/crafting/kinetics/adjustable_pulley.json +92416ced6ede6965fd728e1c7336bb05a3e41ea2 data/create/advancements/recipes/create.base/crafting/kinetics/analog_lever.json +2105b4f1fd9a170a100efc083a794fdb9e068924 data/create/advancements/recipes/create.base/crafting/kinetics/attribute_filter.json +bec8c280b717306f87050b08a418feab53be71cb data/create/advancements/recipes/create.base/crafting/kinetics/basin.json +5af08853632fb5970fe542b3ecbde0ad16d64714 data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json +80d87f1dde60adb5334e0cff25a9f0b7f67c1526 data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json +771e2fc2f3be2867f6d83af8030ed321c0b8ab8d data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json +ffbe212a442084b0688bbee82ad71c482c9b032c data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json +2cc2a11839ad826340fcc7bca1aa1a4d92953b96 data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json +0a49cc7cb958c64de1dd35b0acd30070d6a0d81d data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json +3d16de97e9821ea473d6fc8b22026cca9e9e172b data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json +5a53f4229ce56608207d430c7f87ee44f8d41f6f data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json +d3ca638ffbca177b4970f046f6c42770e757e33e data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json +1afaa6917411aa5c9fb1355588b481552bb0e3f8 data/create/advancements/recipes/create.base/crafting/kinetics/chute.json +a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json +403fd0da8ee42a52234e544cf532e454fb80137b data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json +5bbaac432fce5435c8c3df56ec81d31a0b76a4ee data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json +7b80f6b25e1e21e9545120592bc1a3561ee49603 data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json +7f55c18bdf5eafe2be65c7afb46ec40777f1aed8 data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json +44cf4c0a792e8742a030c82f92a529ade059b475 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json +80dc8151d0b9dff01a8a2abf6b84057c9ef5b908 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json +9698f2e43c3edcf6bdc31f4b893cdaee2298476c data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json +9840f103d4094b04ebf8c1ffbe154e5698dd4d25 data/create/advancements/recipes/create.base/crafting/kinetics/depot.json +81a3fe7e87c26767e3be6f97ea1de50f1cd74b65 data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json +08c833bb2ec2ae34b124def2cd6a91f0bab88989 data/create/advancements/recipes/create.base/crafting/kinetics/encased_belt.json +3a9aef30af8d9694548da236fe3129c16dba4883 data/create/advancements/recipes/create.base/crafting/kinetics/encased_fan.json +40bbc4d9df2911721a58481f68a6bd8cfcfbeb98 data/create/advancements/recipes/create.base/crafting/kinetics/filter.json +11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json +a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json +dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json +8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json +94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json +1609e317d4dcd830be7356301f6685d71d87d34c data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json +585378d03f5ae23e43a587468d183951e3fa58a9 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json +f0a0c371c6851a5418b4b9480797677c8e871372 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json +72194ca0c9820e8b098534007df7f2b2d3813af6 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json +2ba23f019a110a3e035a49e56ee8156fc11d74c0 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json +dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json +a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json +eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json +571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json +e72a9e36ee72b838d83dee29129085c9717bd1c0 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json +b670caaa6822ba7d9dc59ab4b6f21ab7d1ab2482 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json +471b41b1beb16be7885b32e3ab5e37e835888ed3 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json +7621220bcda54b559156a5dfb047de3429f1d4d2 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json +4375ad2e70aa1311d86093983b4342fcc25fa3f8 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json +88cf153c96c72c6945f4de7c11523bfd82905e61 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json +bf36904e7e691a150379561fb6f945123ebd3978 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json +da90875fb845ee952ca2cb71f96b8de4f6420c21 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json +3264bf9c4adeea21b250c65a78a7ef9c15fa9720 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json +d096f7343b42827c4832bf6c68e7d0135e21c8a9 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json +8e8bb7aa8da72913a69bc4792cfc61f8cf827386 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json +b2845089f6356957e048df29ea75c9f5e64d5a44 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_harvester.json +732393f6b853ea602eb2cba08c89aa028c43e6d6 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_mixer.json +6408111deb177f429d3bbee36ac96e9d7d7446c4 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_piston.json +3338358e5aaa9a8d10a6e2a55765a8839b0a7976 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_plough.json +02cfc8c25c2977292dba992542c83666d9123e95 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json +750d93013709081b7eaca5a5b9122ab51ab31d02 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json +f5ea782327d2353dd0e484b15536b7c19987a32b data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json +5a107ee1772727b66414c8d143b77833f3a92f0f data/create/advancements/recipes/create.base/crafting/kinetics/millstone.json +d38e8ff9dd33558227678d69393b57a360caa28e data/create/advancements/recipes/create.base/crafting/kinetics/mysterious_cuckoo_clock.json +afeb2a152697b68bc953986d6886cbe527c6d2b5 data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json +ccd49c33260333ba850d0b843c4913cb6371eee9 data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json +0556cca38a52f819e7f786ffbf284d5ef3364d0a data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json +460240d4e8437b35c24262c5724884ae213e1b9c data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json +ca21e2192a2fea0f112764f96c928d337762158b data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json +960d03f13b383fca0d9b7d3a2885da346d97c4ef data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json +02258b70f1db3d91f0ccb5a5ffd362349f8f359d data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json +d2a430820a87c24104729eede57628c6a92b277e data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json +8eb1319984a8bf9502d8fddb717b11a1ee082f39 data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json +f80c4cf0e9c649609a8e615d2eefc603cec316cf data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json +f639481c8e1485019bf120463e67811b6d2d8ef9 data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json +038e18d0815e7de55fc8fcb5fe7127cdad62210f data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json +74522fbb454832fc0eefa5f52b82b7d7d4e9b7fb data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json +48e29ec1b301bf4857db06913ee340f49d61cdf9 data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json +b463cf9343f8d08b8ed3e87f46a19facadd657b0 data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json +191213ef824e7b73d66bb3aecc3115306b445e5a data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json +cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json +e8a5d924ccf30b6eae4b9ec0a8040e31f0eb165b data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json +90ff137eb1533695d9d17296ed180c0a88ddd891 data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json +44867af16ec6d960268747effcd578ab55e3a366 data/create/advancements/recipes/create.base/crafting/kinetics/spout.json +3859abc8839e92b01461d3e9ef853a4934c3256b data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json +9a4dad31370d9e71308afe5c3f9349b67f749635 data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json +f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json +07ec7b627bdb049f52dddcce021cec0ad44b0049 data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json +89401c0a6dffa62dbffdbb63986f580a4878402e data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json +4ab6ae87b6c3a29c0c2966dad2fa335a39fafe78 data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json +7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json +37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json +856760c4b120f7b29a94dd22fe04d62df061d409 data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json +ddbe7ae23f48dcaee3ad44a0e597c24380b51682 data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json +14c1cac4545f544a78bfd80cf7dd6355794c6679 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json +e8c2001863d9819d2a2c1fddeda41a4f126a5c09 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json +afc74c4dda92c4976703a1c488182188c3482839 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json +146d55f3c5c9247c9992278873c6b8be890d733f data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json +4793d335955c9d6c293e1358dc227eac93a5fe61 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json +bbcf2a888e12c41aedf7b44a1b0d92b7b9fe853b data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json +b53ed0a286512d2695caf0430433483bdeeeef95 data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json +678bdd68437274edf4630af1440525764be35dc6 data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json +66dbb3486c5d38d309dd480e3f2ab0eb5ff9e559 data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json +2127c0f1d822cc88a24d98ebb9eead9de5837ffe data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json +b9b0a8bfff61a89149d4fcadf679f753385212d0 data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json +9951f2d35f7444c98c022142119b18b1289ca734 data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json +76d4c5f04d0a3e6817127a828594388b18f210c4 data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json +0cc729835600e391b006fe844a201f419341366a data/create/advancements/recipes/create.base/crafting/logistics/redstone_contact.json +24a00abe5c747b3c8864872c4c0c50d872f219a1 data/create/advancements/recipes/create.base/crafting/logistics/redstone_link.json +457c46bb12bdab067bee969bdb3e7e23a63cf198 data/create/advancements/recipes/create.base/crafting/logistics/stockpile_switch.json +8e137e9ad4870708d4c015400f91d78cb37b4a92 data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy.json +6ad84f6f8b4ef85e67ebcc68c5326a22b59bc81a data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy_from_zinc.json +458c6ca109fd9b19c4c88c45c4999e17ce7d9bde data/create/advancements/recipes/create.base/crafting/materials/andesite_casing.json +73c85a126d708fd5475cd20336b6c6c02a881a7c data/create/advancements/recipes/create.base/crafting/materials/brass_block_from_compacting.json +37691ebd182e09b5c41fbeeb15ca31fda0cf8ca9 data/create/advancements/recipes/create.base/crafting/materials/brass_casing.json +5988ec4b2f6f23540403d051b8d72c886ac500ea data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_compacting.json +3bbbc8b0870d10a347de37e8c1d83da130573d4c data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_decompacting.json +1028a4265a415ac9ee0df23d507f73e79633bb85 data/create/advancements/recipes/create.base/crafting/materials/brass_nugget_from_decompacting.json +306fe4831bc8a26b5100935fa4b3a45680de034e data/create/advancements/recipes/create.base/crafting/materials/copper_block_from_compacting.json +596ec015f9115023cd304241e70ed812671d614f data/create/advancements/recipes/create.base/crafting/materials/copper_casing.json +cbca07cff63614282dd6fc512db781b45c626b95 data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_compacting.json +8682826cf603dce940a6ea345deeb57d6f8ba552 data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_decompacting.json +b4edb60599e83b03b811e9675b7a0aa5bcb19445 data/create/advancements/recipes/create.base/crafting/materials/copper_nugget_from_decompacting.json +453fb9564d6e989cc5ff05e4451fd5457dcff853 data/create/advancements/recipes/create.base/crafting/materials/electron_tube.json +849e8d68c1e3eb13ffb61dd4a301fb4e02aafef9 data/create/advancements/recipes/create.base/crafting/materials/red_sand_paper.json +c0551eec8a74c6fdcf92bde757d3919d9cd37bf0 data/create/advancements/recipes/create.base/crafting/materials/refined_radiance_casing.json +d24639eff6d17ddcb618dc8f0a1c9e8b9ddb8e44 data/create/advancements/recipes/create.base/crafting/materials/rose_quartz.json +b783ee0bca4eafd0ae70fdb11e489560947d7873 data/create/advancements/recipes/create.base/crafting/materials/sand_paper.json +9b698dd97d1f43aa5d1874fe9fd8039caafed4e6 data/create/advancements/recipes/create.base/crafting/materials/shadow_steel_casing.json +ff3e6df704b33e7fe2e18113d66227482c6ebf4e data/create/advancements/recipes/create.base/crafting/materials/zinc_block_from_compacting.json +ce2444d6f2d299ce05931985312f887a4d643113 data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_compacting.json +9c12703f801e35bf2b54f68a7145b8b40d999b81 data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_decompacting.json +f05015221ce44ea3460a35a109f9fb3187c99eb6 data/create/advancements/recipes/create.base/crafting/materials/zinc_nugget_from_decompacting.json +ae3abb1234ff2bb373ddb660e2df99e4fb2fffbd data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles.json +71214eeda01bb62bb7da30fb9ba428afaf5cb8b1 data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles_from_tiles.json +0b21adcf249e97d4257f5614323eb7cbc3277c35 data/create/advancements/recipes/create.base/crafting/palettes/copper_tiles.json +4f43eda1ee2fec4a88a270fa0bde76231bf45881 data/create/advancements/recipes/create.base/crafting/schematics/empty_schematic.json +403de5e01d5f572d16d3de3ba42f24ee76d0d9d3 data/create/advancements/recipes/create.base/crafting/schematics/schematic_and_quill.json +25ba269db29f030757c53fb1772615c247da3c1e data/create/advancements/recipes/create.base/crafting/schematics/schematic_table.json +da116aef3364263674f94aa84eeefda64f3b49fc data/create/advancements/recipes/create.base/crafting/schematics/schematicannon.json +890cba273d0f5d5cb753dc8e8e27a8a5e4cbebca data/create/advancements/recipes/create.base/smelting/brass_ingot_from_crushed.json +2b7693b9eb1c8b9e34a8aa2d08bcf0e2083883b8 data/create/advancements/recipes/create.base/smelting/copper_ingot_from_crushed.json +3dc1433ffd2a3b5520ed7728ad7dadc560c39d98 data/create/advancements/recipes/create.base/smelting/copper_ingot_from_ore.json +f2e1b12251a989b895642694054fabaad99094e4 data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_crushed.json +16e52ba04279bcf803c5f6be46550ba5d81be1a3 data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_ore.json 909345eb2f5541a2be592a52800319a8765ca345 data/create/advancements/recipes/create.palettes/acacia_window.json 73f99cd857b056da5e19ff8304a4f5eeacc4f8cd data/create/advancements/recipes/create.palettes/acacia_window_pane.json 06479f24d7b2655ee590b5314861a3c9c422ebbe data/create/advancements/recipes/create.palettes/andesite_bricks_from_andesite_stonecutting.json @@ -1451,6 +1610,7 @@ c31a4d1eacc892a0248315270a12c0b49f5edc63 data/create/advancements/recipes/create 4474c65e52362492fccc901b55773648b2714819 data/create/advancements/recipes/create.palettes/chiseled_limestone_from_limestone_stonecutting.json b873bd961cd865866a6f5035bee583a400073a3c data/create/advancements/recipes/create.palettes/chiseled_scoria_from_scoria_stonecutting.json 0ace6bef40eab8e365959e529a16cd04d15adfe6 data/create/advancements/recipes/create.palettes/chiseled_weathered_limestone_from_weathered_limestone_stonecutting.json +b4651c8202331483e82b28b04edc6cd97e62ad1d data/create/advancements/recipes/create.palettes/crafting/palettes/dark_scoria.json 25991d5667252d551e02c4fbbfa27ebf4353d28d data/create/advancements/recipes/create.palettes/dark_oak_window.json 4819383b1a7885b4401fdc25955d2c51f75b6236 data/create/advancements/recipes/create.palettes/dark_oak_window_pane.json ebd6413d530325eef6fcf42a0ee0ac840c1f7366 data/create/advancements/recipes/create.palettes/dark_scoria_bricks_from_dark_scoria_stonecutting.json @@ -1776,6 +1936,10 @@ a43d45efa0fb0d3eaace93c18d80a14d4dcddf38 data/create/advancements/recipes/create e340721aa78f260c2666214aa149241a37de216e data/create/advancements/recipes/create.palettes/scoria_cobblestone_wall_from_scoria_cobblestone_stonecutting.json 53cc5b006a19158e04094308accb66a7c35d2b26 data/create/advancements/recipes/create.palettes/scoria_pillar.json 53712a9ae59976dece952bea7ecaf73b679448f0 data/create/advancements/recipes/create.palettes/scoria_pillar_from_scoria_stonecutting.json +6b148def2f8789f9ff1d41bb71ab3608438a7207 data/create/advancements/recipes/create.palettes/smelting/dolomite.json +070720cc271767b26ad51fa089b4cf2a64d309be data/create/advancements/recipes/create.palettes/smelting/gabbro.json +9a2901f6b918468b0034a8942178d6f3c82aeb6e data/create/advancements/recipes/create.palettes/smelting/limestone.json +c8fb5d555eacec479af4fa6b9042656f1fe49a2e data/create/advancements/recipes/create.palettes/smelting/scoria.json 459538728b06d4c72d7e65d8f7c98a75a48f3a52 data/create/advancements/recipes/create.palettes/spruce_window.json 6aaf96cdaa845b63ab67ba4b968ea4d811e2fef5 data/create/advancements/recipes/create.palettes/spruce_window_pane.json ab0cacba05f8def9cc91b993d464c297babf6fc3 data/create/advancements/recipes/create.palettes/tiled_glass_from_glass_colorless_stonecutting.json @@ -1798,6 +1962,20 @@ b77c5aecd0b6dd37a0c69431ab7a4a40fe0770eb data/create/advancements/recipes/create e548127075559307b767b802f4809ed52eedd543 data/create/advancements/recipes/create.palettes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json 23ba836640a4d543db6f1cb72cc86a6543fe2fbe data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json 9790a16fd56e47cb5abbfad4062672303c224d9f data/create/advancements/recipes/create.palettes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json +e00155bcd00f50750e2cc4d6aa30c2f2d6e62922 data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json +bf9131527df4ad259b5a509753ba66417d764da2 data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json +1b1517afa209c8db70eade588f4f08039c4d6b72 data/create/advancements/recipes/decorations/smelting/glass_pane_from_tiled_glass_pane.json +71f2e99c69a6ca1c9752355a2801c932d5266451 data/create/advancements/recipes/decorations/smelting/glass_pane_from_vertical_framed_glass_pane.json +d7755c3882f6e59bedd81c8395416df62b271337 data/create/advancements/recipes/food/campfire_cooking/bread.json +ecfec2e105e00a9bd7f28e9228660ee00b0749b5 data/create/advancements/recipes/food/smelting/bread.json +795700a15d24438ba83cd1888393a32ab884d34d data/create/advancements/recipes/food/smoking/bread.json +b2bf6f04c1090e761d899fb6c16c91c6e71dad1d data/create/advancements/recipes/misc/blasting/gold_ingot_from_crushed.json +808e5f83586c280c44e02f95902ca85f085bfa0d data/create/advancements/recipes/misc/blasting/iron_ingot_from_crushed.json +cc2fb476dcd5ba27b56b7f9fd2ebb9ef142cdc60 data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json +ea72626febe23b0c8c6e03518a9486ce94c88b12 data/create/advancements/recipes/misc/smelting/gold_ingot_from_crushed.json +3b6f22b5731000f48963044fb2ac6f9af6f9a883 data/create/advancements/recipes/misc/smelting/iron_ingot_from_crushed.json +c8a2f6594042a3205e675349ccef97873a9e91b2 data/create/advancements/recipes/transportation/crafting/kinetics/furnace_minecart_from_contraption_cart.json +e35aa0e435dc3640c78c4687dd7130fe62c55ea3 data/create/advancements/recipes/transportation/crafting/kinetics/minecart_from_contraption_cart.json e0b9edc5e59647e7dd99be17369b263dadf407d4 data/create/advancements/refined_radiance.json fc12b590ab8f5ac901db21c67ba3850f157e1421 data/create/advancements/root.json 8529fc7919b6a3240ede2bb8043906bb72fb7f9e data/create/advancements/shadow_end.json @@ -1823,7 +2001,6 @@ b67ea51eaed1e847317829636cbf5967522e73d1 data/create/loot_tables/blocks/andesite 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 @@ -1837,12 +2014,11 @@ c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.jso 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 -798ef290b388dee758df3e779b4b1c9289955f7b data/create/loot_tables/blocks/blaze_heater.json +a2313c9b7d114396fca3c86a740d23fce3873679 data/create/loot_tables/blocks/blaze_burner.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 @@ -1861,6 +2037,7 @@ f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_b 5a65a18ea787130ac7b8f5652bfa5ed187446649 data/create/loot_tables/blocks/copper_casing.json 31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json a5a7ba88a1d38da83b37bbe842dc7cc0544f37be data/create/loot_tables/blocks/copper_shingles.json +c013613df278f6e8b4c9dad5f16e0ec6c3e992e3 data/create/loot_tables/blocks/copper_tiles.json b160899aa785dc54d8c6cc095337f70b81f3e44f data/create/loot_tables/blocks/creative_crate.json d8f2f8921b9200b1d9476a77ee1be32c25308ac3 data/create/loot_tables/blocks/creative_motor.json c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json @@ -1902,8 +2079,8 @@ d5fc5b3dc612cd748117e9d8b0ecda76e73f4514 data/create/loot_tables/blocks/dolomite 6121c99e6e037dda9022af3a414aee444467ac1b data/create/loot_tables/blocks/dolomite_pillar.json 503a93787537b46f462d32b0382c3396f42bb1f6 data/create/loot_tables/blocks/encased_belt.json 9055d82b983b673e1638d17b712b9fcd1f5a52e6 data/create/loot_tables/blocks/encased_fan.json -b3849bece65e13128fdeb033b156cf6615bc72f8 data/create/loot_tables/blocks/encased_shaft.json -5a47c1535c866184b4ffca65763f5676f319e0aa data/create/loot_tables/blocks/extractor.json +c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/encased_fluid_pipe.json +b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/encased_shaft.json ddfc4764a6039d771e03af815ac4493da80d2e6b data/create/loot_tables/blocks/fancy_andesite_bricks.json 31f2e6932505c68b28e92221a37144f69161c376 data/create/loot_tables/blocks/fancy_andesite_bricks_slab.json 413c8bb80954679796cd9d18f808c28a7bdbe681 data/create/loot_tables/blocks/fancy_andesite_bricks_stairs.json @@ -1958,6 +2135,7 @@ ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_c e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json 5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json +c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/glass_fluid_pipe.json 74371bc2b516ad9742ca081d82dc1b7f642e25b4 data/create/loot_tables/blocks/granite_bricks.json 29f2cbc04f898bb8ff48055a7e43ded85e635bf9 data/create/loot_tables/blocks/granite_bricks_slab.json 6b2c74992f261df4f539ff65919e2f4a58b146ec data/create/loot_tables/blocks/granite_bricks_stairs.json @@ -1999,8 +2177,6 @@ cb315814960850b5080598b89ee94c833b5048f7 data/create/loot_tables/blocks/limeston 92fb16606f289ad33860270d098fad2522b24e09 data/create/loot_tables/blocks/limestone_cobblestone_wall.json 371115e5ceb08c07a9ab2371509960c31e0baa8a data/create/loot_tables/blocks/limestone_pillar.json aa751d2e8a7889907c08c4bec6f6ca266230b6d7 data/create/loot_tables/blocks/linear_chassis.json -dac789cf53b00eed34308848b5e267b7ccec090c data/create/loot_tables/blocks/linked_extractor.json -7af5a13c9e10903b11732fbc01ae3299328216f0 data/create/loot_tables/blocks/linked_transposer.json 9e5e017cd3b4f544f487a5ca22ef610a4addc8ec data/create/loot_tables/blocks/magenta_seat.json e64c32da44b7e92dbef36fcb448c42b9bd9ae47c data/create/loot_tables/blocks/mechanical_arm.json 90ddf7b5c3b61758a4ad12a1e6ef16fe6ebf7794 data/create/loot_tables/blocks/mechanical_bearing.json @@ -2043,7 +2219,6 @@ 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 @@ -2116,6 +2291,7 @@ d7f6caa568e6508177a644fb78dc18ce26c9b2c0 data/create/loot_tables/blocks/purple_s 71b0fa3b174efe94a2a735ab2426c376c0ef674a data/create/loot_tables/blocks/red_seat.json f5907a694206facc01f61f3428f72488486761c7 data/create/loot_tables/blocks/redstone_contact.json 886a0c1386fb12104b736a15689030aaff771270 data/create/loot_tables/blocks/redstone_link.json +5569a01114939be4b09cc1414e33d7211d7aada3 data/create/loot_tables/blocks/refined_radiance_casing.json 97c945de837a6360c0ab7e1371f16ebc1645f6ea data/create/loot_tables/blocks/reinforced_rail.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/rope.json cecaac07bd275bb1ae9e302f0bf44b581e74105d data/create/loot_tables/blocks/rope_pulley.json @@ -2134,8 +2310,10 @@ d2139e9daa55c09cd262b15c980d65c554347e45 data/create/loot_tables/blocks/scoria_c 82fb40738f53892571ad83789ff45315e887c811 data/create/loot_tables/blocks/scoria_pillar.json f70c5b7e7da7abffc82e3d1828499799883bbe85 data/create/loot_tables/blocks/secondary_linear_chassis.json e4f6dccb8bce21b5214c1d8cfb440fc0ba4159d7 data/create/loot_tables/blocks/sequenced_gearshift.json +49f6b51c0618aa0c0133dc1f034ff6c031318cac data/create/loot_tables/blocks/shadow_steel_casing.json b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/shaft.json 70b6e82e9198d3910877e62c2eab86d46ca27089 data/create/loot_tables/blocks/speedometer.json +f6c497d625de67ea9377e840208b1be539d13b73 data/create/loot_tables/blocks/spout.json a23a1e332c9ba84474e3c0588e8a0857afe346e0 data/create/loot_tables/blocks/spruce_window.json 3ee2350936ea82fef716bc58e4cd088a384616f0 data/create/loot_tables/blocks/spruce_window_pane.json 8d2970acd61b96844a4308d87e858b1612d5862e data/create/loot_tables/blocks/sticky_mechanical_piston.json @@ -2143,14 +2321,9 @@ ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpil 3479775008a256bc35f98b31655975f7d5c836b2 data/create/loot_tables/blocks/stressometer.json 05e843ca6eb5e299bf41de123977a1045c120ad4 data/create/loot_tables/blocks/tiled_glass.json e999969f05d2625e61757aa82092d232b99f6e0a data/create/loot_tables/blocks/tiled_glass_pane.json -b201436ae6d2ad5a7d47dca0ee8c7016b4c28fa5 data/create/loot_tables/blocks/transposer.json 7b66ad2c48449bafd0cdbd086ac41218cb73a814 data/create/loot_tables/blocks/turntable.json -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 -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 2883c63ceb1273009dbf91cb0693756cadf79a1a data/create/loot_tables/blocks/water_wheel.json 611d6195db52c074de484ec52d7ac9eb96b4ff10 data/create/loot_tables/blocks/weathered_limestone.json c1f379baad36a20fc767be094db10480a0378184 data/create/loot_tables/blocks/weathered_limestone_bricks.json @@ -2186,14 +2359,217 @@ a961cdd11e807bc4658bbdba6c278801b5981234 data/create/recipes/andesite_pillar.jso dcdad7a04838ef202b42f84a15243e3d2472b14e data/create/recipes/andesite_pillar_from_andesite_stonecutting.json 2b291b77860254b7ba8500cf2199a04ca1fca7b5 data/create/recipes/birch_window.json 288d80210f7efb4664e2e9c9d9111049863e5f60 data/create/recipes/birch_window_pane.json -d5c30af1052332ff3ef6d837ca2bf51c51e14c8d data/create/recipes/brass_block.json +adb384440f91411692689707d5c767c1065ac06c data/create/recipes/blasting/brass_ingot_from_crushed.json +c21420fbf2080dba5f95bdc9a19743ba09e1f1c9 data/create/recipes/blasting/copper_ingot_from_crushed.json +c6f0509618f703f1a48313e46d934bd862096699 data/create/recipes/blasting/copper_ingot_from_ore.json +d9021504be855cd2d4d91503a82b84233052adb0 data/create/recipes/blasting/gold_ingot_from_crushed.json +69cda0f54c47cd44c296608cc379db855602410f data/create/recipes/blasting/iron_ingot_from_crushed.json +70b58fa5ee4ca088f5cd9d4bce2853b1bbf98780 data/create/recipes/blasting/zinc_ingot_from_crushed.json +397a2b5d5d3b072066c3d7a9546769560e4674a3 data/create/recipes/blasting/zinc_ingot_from_ore.json +339bcf4a9c4e7b36c15970aa671af8620703b23e data/create/recipes/campfire_cooking/bread.json 8851b4a339f22bed4da120c3e34d1f32120d0d66 data/create/recipes/chiseled_dark_scoria_from_dark_scoria_stonecutting.json 66937d62734328f4bff6254e6755b3490d4dfa16 data/create/recipes/chiseled_dolomite_from_dolomite_stonecutting.json 74f565a44400c4abd7b5d6073830b9b46dd71fc6 data/create/recipes/chiseled_gabbro_from_gabbro_stonecutting.json c323b106e88b7de77fea71ff12494abdbb818d15 data/create/recipes/chiseled_limestone_from_limestone_stonecutting.json da9a919b476954c1de34826aa7706bf6056a8f12 data/create/recipes/chiseled_scoria_from_scoria_stonecutting.json 09faa4ddcf9f3907dcdb3ab3e8b68c1deb2486e5 data/create/recipes/chiseled_weathered_limestone_from_weathered_limestone_stonecutting.json -386c52f0aad6e2239f31dc85f7e745b47230846b data/create/recipes/copper_block.json +19526da3a59fc136654ff1bc93c0251581f397a9 data/create/recipes/crafting/appliances/dough.json +7b5f863dda3d05a79cb85943a178eba0bd8a7dc7 data/create/recipes/crafting/appliances/slime_ball.json +b159ba84428eee6ef6e23df1766f2a18f2c8a63e data/create/recipes/crafting/appliances/tree_fertilizer.json +8c00fe124ea516511f00a89bcf9e63a6d1fa47e4 data/create/recipes/crafting/curiosities/deforester.json +87a4a5ec53a0f8e125dfdbd77906a418a9b83d9c data/create/recipes/crafting/curiosities/handheld_blockzapper.json +660e92da2b1b6698b1c0df74bd74a56a25fb3eca data/create/recipes/crafting/curiosities/minecart_coupling.json +fcbc04d0a7eaf820a74bc7e4736a4a581e0a9dff data/create/recipes/crafting/curiosities/wand_of_symmetry.json +696df0fe5f8e29220ea15527f8c119c39b418819 data/create/recipes/crafting/kinetics/adjustable_pulley.json +88de51b451469698665b7319e5b9cfb9a87ae3e0 data/create/recipes/crafting/kinetics/analog_lever.json +6912101930aae627820783c27358dcf2ff4016aa data/create/recipes/crafting/kinetics/attribute_filter.json +059d12526529b2896ed583555373afa31839a0de data/create/recipes/crafting/kinetics/basin.json +dcf98e667d321fb4bd9fa6dfec7927a84cdbd5d6 data/create/recipes/crafting/kinetics/belt_connector.json +1123903a11b13448b61cf8f8a5dc2e8013d39ac0 data/create/recipes/crafting/kinetics/black_seat.json +a6243a671bf852a6f92e1927e234ecf23b1c903d data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json +0b747fc291b86fa14f86569160d56a48a15c69d3 data/create/recipes/crafting/kinetics/blue_seat.json +30240bae036699b8c9404893983cb7b70332159e data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json +23fe800a45e81a08eb0aa732c5cb52e4e8ebfe86 data/create/recipes/crafting/kinetics/brass_hand.json +c50077a130bc43cd3659faa02ce95789399478b2 data/create/recipes/crafting/kinetics/brown_seat.json +a3c99b38fc8896c9971a5e9dcbae747786ff610d data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json +860796dce8756c4cd234f18bbe52108f3b2254c2 data/create/recipes/crafting/kinetics/cart_assembler.json +3bc3510b64e576d68b19f4ceb5d9bd6591dbcf6c data/create/recipes/crafting/kinetics/chute.json +a80e3eabbeba2931d0d58dd9492018a0d78da8b5 data/create/recipes/crafting/kinetics/clockwork_bearing.json +501ad764d087b40ce36f3d4256b0d5ee25b2081e data/create/recipes/crafting/kinetics/clutch.json +e46bcc6778ff5118252fe6371ef817ae1302253a data/create/recipes/crafting/kinetics/cogwheel.json +59db5170cec390fe6c20a27d6154deebe044580c data/create/recipes/crafting/kinetics/crafter_slot_cover.json +cc2ab4b619aa55c03db18b67a62e12b6089e7019 data/create/recipes/crafting/kinetics/cuckoo_clock.json +f11892864a26c4ba79eb46d890a1a4bd96a1ad93 data/create/recipes/crafting/kinetics/cyan_seat.json +8c35fd379244f72f73e1be6115ed8f5f5484f599 data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json +ad1c3ce1e98b8483512bdd754f2e5930c7b3ae85 data/create/recipes/crafting/kinetics/deployer.json +be86df1c4d7af14bc5dcfe044d07c03b6c6d2a75 data/create/recipes/crafting/kinetics/depot.json +9c5d30f25a130d591b924c50e5c83e3b787c2758 data/create/recipes/crafting/kinetics/empty_blaze_burner.json +860f9c4aa677d2354bcf5fe3e6d28cc7cf56dd06 data/create/recipes/crafting/kinetics/encased_belt.json +e416a453316cc6a2f68795b0ab9c91a842d72510 data/create/recipes/crafting/kinetics/encased_fan.json +0dd0cc11eaa6789fc612af3231ed247893852178 data/create/recipes/crafting/kinetics/filter.json +30ae02825e54c0cc07be8f4decf9d432e7d61ba2 data/create/recipes/crafting/kinetics/fluid_pipe.json +86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json +84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json +5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json +b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json +4d4124b4f1df38d892cb19da19c6464522d3e37d data/create/recipes/crafting/kinetics/gearshift.json +5b07af1b09125f874500c3fb140efda90061a19e data/create/recipes/crafting/kinetics/goggles.json +beb7715310352988d5a58d1b39c62f02544795f8 data/create/recipes/crafting/kinetics/gray_seat.json +14e8927183f91c09a2d96fd68d1a722d192b29e8 data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json +9899501f18e7f3452d4ab4bf658079ab414aa176 data/create/recipes/crafting/kinetics/green_seat.json +6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json +9af4b862db77034f61d2d35e45db00f8dda6dc4b data/create/recipes/crafting/kinetics/hand_crank.json +237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json +a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json +958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json +9531407075ad027e01063aeabc40ae3e4c100df3 data/create/recipes/crafting/kinetics/light_gray_seat.json +fb66f55b31a60f2168d3b9e80a56ecadebb1db75 data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json +3e18f619a50c1e5fabd6d3acc6d029e4cfec661f data/create/recipes/crafting/kinetics/lime_seat.json +d214afbd44e580f5fd1ebb4f16f07ffe34d87cba data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json +61332f88f51bbd465ee0da879e706b994710d949 data/create/recipes/crafting/kinetics/linear_chassis.json +9bf76daab65d048a135d70db522989ebc77ccaf1 data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json +d7d96071874a87edf7bbdcf7a462f95a130d2991 data/create/recipes/crafting/kinetics/magenta_seat.json +5836881feef8fa8b18e4cceb9c3a9a2748b8cf3a data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json +946389078db31de69a7dc4fec5feebddf48dcfc3 data/create/recipes/crafting/kinetics/mechanical_bearing.json +a5c7aad0d86cbb66b8688d295e62547da4a2ce0f data/create/recipes/crafting/kinetics/mechanical_crafter.json +4372830100d39c4a89ff397a62b01940e1a28cb3 data/create/recipes/crafting/kinetics/mechanical_drill.json +0972ab663a9f51ffc63463ee7329efe516321fbb data/create/recipes/crafting/kinetics/mechanical_harvester.json +431fd34eae60e5af6afd0f9a7afb6cb513d828b2 data/create/recipes/crafting/kinetics/mechanical_mixer.json +ac9003ad3320fe2009c1793a3c6e86bdf20ca832 data/create/recipes/crafting/kinetics/mechanical_piston.json +8a2f9068d6fab81f46699f897e619461ca89e38f data/create/recipes/crafting/kinetics/mechanical_plough.json +ce8e269907aae5549cea04141bd231f4a20e6453 data/create/recipes/crafting/kinetics/mechanical_press.json +5a685078d3c9d7dbe68080b7b6f2a44fc41582c5 data/create/recipes/crafting/kinetics/mechanical_pump.json +ce28bcb47a379976d4a1bdfcfd1cdd0bae0bcdae data/create/recipes/crafting/kinetics/mechanical_saw.json +58d9046e61eae40958181388186a35dc07cc9a59 data/create/recipes/crafting/kinetics/millstone.json +13fa2887d3c988973c9222ce5e2e3dd0d9bd8374 data/create/recipes/crafting/kinetics/minecart_from_contraption_cart.json +be4c7fdb0ba1e9ee6d3dcf200dc2718ad83ec8fb data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json +6b1b626394d7269a6861a836992ccdb344b6e7dd data/create/recipes/crafting/kinetics/nozzle.json +9c41cd91a0716d591ed6d1b5128ec731b418850f data/create/recipes/crafting/kinetics/orange_seat.json +a8da214f0a521be1204b669f118348a142bc9a3d data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json +af871a02d363a619fff8e9dde753aa417b265a80 data/create/recipes/crafting/kinetics/pink_seat.json +840dc5aac716e3d1b79883e8db4bf56f2dc427f9 data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json +5399c3496a90bed9428c48fdd334ad4f763cbf9a data/create/recipes/crafting/kinetics/piston_extension_pole.json +16199a6729005a279854cb1838401f6e73bdebae data/create/recipes/crafting/kinetics/propeller.json +76ba751b65d312d1b34229d76fff2111b593091a data/create/recipes/crafting/kinetics/purple_seat.json +e6c462d64e1de9c7fca95f9c9a25b8d1575979da data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json +af84b939ced1c0254a27469f857f571afbadc4f6 data/create/recipes/crafting/kinetics/radial_chassis.json +1059f08b016e1c222f13bd9976d0fcd8fc982619 data/create/recipes/crafting/kinetics/red_seat.json +0827e86e4b5f9d7023ccc19922bcbbaefd5b42d8 data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json +af525e135eb927b64462120d201ecae7a7ec61ed data/create/recipes/crafting/kinetics/rope_pulley.json +e9f1597d40f62c2247b319303f375f0da271346f data/create/recipes/crafting/kinetics/rotation_speed_controller.json +66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json +a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/sequenced_gearshift.json +2e36438665bfb97265fd4e6ea85505970eae67fd data/create/recipes/crafting/kinetics/shaft.json +b1a74f0b51fa37ca1ed814266b3d69b8b7e69fa3 data/create/recipes/crafting/kinetics/speedometer.json +8d632845deeb723e1a56083536ee5f9d60de2fcb data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json +eea9d4066cd2fafef40b50b79323dcc603fa6388 data/create/recipes/crafting/kinetics/spout.json +3be40664acfd150d0617bc138dc2dd9d54a21b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json +af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json +21f885a674603367b67e1e993c175638cbda9ea3 data/create/recipes/crafting/kinetics/super_glue.json +8494f5fcd85a740fa0f0384e3522d8cdd905ce49 data/create/recipes/crafting/kinetics/turntable.json +057c889b0a306f44b8835c896663154ccd9ff12f data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json +4fb009b86a51b2e259bd1f73848803f6276dd820 data/create/recipes/crafting/kinetics/water_wheel.json +f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json +f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json +7e0d276cd56f04f35d02c25810bffdf8fc297fcd data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json +3ec8bb5660656f1c676035d8ba5460462c1d1865 data/create/recipes/crafting/kinetics/wrench.json +5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_seat.json +f055d233ac7ee9eac840a658afa01bedd793ff38 data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json +3f6f3a547dc06c9462da880360f29b49ac3f5e2a data/create/recipes/crafting/logistics/adjustable_crate.json +c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json +34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json +fc75c87159569cb6ee978e6d51b0c3b0f504b5de data/create/recipes/crafting/logistics/andesite_funnel.json +660e824ab6042c145f02ffcfe95a34c38f113e19 data/create/recipes/crafting/logistics/andesite_tunnel.json +95cc99c90cb146eb85023748c4230840a4e6568e data/create/recipes/crafting/logistics/belt_observer.json +9b4e74f9a950191134d978bf45c3339212677b0d data/create/recipes/crafting/logistics/brass_funnel.json +2ae06df0357c494b53db0ddf9655c60ef2022d0b data/create/recipes/crafting/logistics/brass_tunnel.json +a32ac53848862837f3044ff9c81ed62c1134fe4f data/create/recipes/crafting/logistics/powered_latch.json +660eb73bcc66c1528cbd4d4204ad6b771f4bd721 data/create/recipes/crafting/logistics/powered_toggle_latch.json +74b8a38d252cce564cc63db2ade41ed2d656d025 data/create/recipes/crafting/logistics/pulse_repeater.json +bb73dac60392f4811df033c3d1d3256df5e022af data/create/recipes/crafting/logistics/redstone_contact.json +bc511f7c225750743ae3e985502fa65beb1e7b8d data/create/recipes/crafting/logistics/redstone_link.json +10b16358664f2bb8a11589ef8ba3d69ee8d3b9fc data/create/recipes/crafting/logistics/stockpile_switch.json +0dc99b8a8c68d6a9250c3a1167ffb565be9622ec data/create/recipes/crafting/materials/andesite_alloy.json +8bb306454795fd6a2066152717c169e0e8aaf480 data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json +1e54883620660cb5562d8354de0e49bcca81e470 data/create/recipes/crafting/materials/andesite_casing.json +fa23f8ff9f43ed39a70a86d0c9080102d57d14b6 data/create/recipes/crafting/materials/brass_block_from_compacting.json +94bbe2869e4926d7b8df8a73f3cd41e86d0da6b0 data/create/recipes/crafting/materials/brass_casing.json +6a7d69e7e6abeb643f3158c575061e3edac01421 data/create/recipes/crafting/materials/brass_ingot_from_compacting.json +7e10c06f4d77b17efb03252801d9fe189de8aefe data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json +49c263368f8c02509332654c0ce97b7472d45cd3 data/create/recipes/crafting/materials/brass_nugget_from_decompacting.json +a51337920f2e261101179201c13dcb1b6ed28934 data/create/recipes/crafting/materials/copper_block_from_compacting.json +9ef75592334f5c72c889cdeb5280b6b9220b6d45 data/create/recipes/crafting/materials/copper_casing.json +67ce2cf2f99d053a3b36abaf8c466b2b58cca195 data/create/recipes/crafting/materials/copper_ingot_from_compacting.json +e0912ff39ab4e94f390b685ef873d6326a637abd data/create/recipes/crafting/materials/copper_ingot_from_decompacting.json +6fdd6922da25a4f7b50e0213b2203f6ae4c64784 data/create/recipes/crafting/materials/copper_nugget_from_decompacting.json +7cd3500890430496381cb56c432a233f78b21a25 data/create/recipes/crafting/materials/electron_tube.json +9c9e40ffd41ce46c65113080a92ff9b4f27e5fab data/create/recipes/crafting/materials/red_sand_paper.json +7ff4df8c25b7647463a88dfd5d750a5562d5015c data/create/recipes/crafting/materials/refined_radiance_casing.json +7eb292bc564de70227f4bf947050bcdbfc5a8d67 data/create/recipes/crafting/materials/rose_quartz.json +5ca47ec1bca9a5ce28aabd9868b74b71c829ca07 data/create/recipes/crafting/materials/sand_paper.json +12c6ce7a1d229575fefffc449907fd285a6acecd data/create/recipes/crafting/materials/shadow_steel_casing.json +e1ac783d1f8fd96a1dd1088cf736e95ee3f7b025 data/create/recipes/crafting/materials/zinc_block_from_compacting.json +06cc0ec46bc5a7d2e98dbd4ece82d451c5f79de9 data/create/recipes/crafting/materials/zinc_ingot_from_compacting.json +fe1d69b1e33d5748eb3c0ea732b8d67e2d612203 data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json +4b66d8769b6a7c5c294e2affd0dad4b3c70be62c data/create/recipes/crafting/materials/zinc_nugget_from_decompacting.json +83eb4279cce9bddd89afb939ee75d47e0aae7ceb data/create/recipes/crafting/palettes/copper_shingles.json +575e01de24b4a8327c6b140627096d6364707ec5 data/create/recipes/crafting/palettes/copper_shingles_from_tiles.json +48e6a00e9bddc8fd930278294d2cfe8fbf266b2d data/create/recipes/crafting/palettes/copper_tiles.json +fe95f8f5f15edb0a5ff8da5a4757c9f8910b51bd data/create/recipes/crafting/palettes/dark_scoria.json +0b7acc249bed992387aa9702a2c05836ecf584df data/create/recipes/crafting/schematics/empty_schematic.json +5c47ac2e2b596439a684126fef7265f13de2379b data/create/recipes/crafting/schematics/schematic_and_quill.json +9fb943be76c51a24aa9d8a09de5b7bd17b44ab08 data/create/recipes/crafting/schematics/schematic_table.json +1a810338ea15ab5ac2f37e87579c56f72b2b371b data/create/recipes/crafting/schematics/schematicannon.json +3da7a3cdb84f44e259b5399a94ddfbf94ebebd37 data/create/recipes/crushing/blaze_rod.json +5878767e89be5a522b8f28d6a2d7b2f8566cf0dd data/create/recipes/crushing/brass_block.json +b21b77e313728add68ed7daeb6bda1d12c06fc90 data/create/recipes/crushing/coal_ore.json +da4ed79975391ec9f263869936b84474f1f727d3 data/create/recipes/crushing/copper_block.json +2962c8c1cb899591a474ee675d8ee699de265f15 data/create/recipes/crushing/copper_ore.json +0c96aa34d8dbf5fdc122361b6f2b090db94dc886 data/create/recipes/crushing/diamond_horse_armor.json +47a6eacac7ea031fd65b6ee9d2a9163a0099af6b data/create/recipes/crushing/emerald_ore.json +5e3bd12462c94835f2707a683e68a9731fd7225d data/create/recipes/crushing/glowstone.json +9984f8c4279540cd930331a9606ed9ae92a19b9a data/create/recipes/crushing/gold_ore.json +55c0656723bd5a87089965651fe268b2d2956771 data/create/recipes/crushing/golden_horse_armor.json +49e96d7d2ff8e61f9d92dc9ccd92993fed839c7b data/create/recipes/crushing/gravel.json +060bb54f70c6551af1266aac99befe97ca7d6504 data/create/recipes/crushing/iron_horse_armor.json +bcd7e6c6c0ca248a034023bf8ab33bd461e2db17 data/create/recipes/crushing/iron_ore.json +21566e25e5d06bdb2634acc422457e63e458d041 data/create/recipes/crushing/lapis_ore.json +e870d049abc5cd5f389f70414c67e76ddc14060d data/create/recipes/crushing/leather_horse_armor.json +d73a0ed13112e001dad61d6ea66fd729c86e7b62 data/create/recipes/crushing/nether_quartz_ore.json +2b9b8e1ab81f47c4f7fb79a007aef214af12a342 data/create/recipes/crushing/nether_wart_block_no_quark.json +70116a5a9d1f93ae377e1526ca99582190cf2e3e data/create/recipes/crushing/nether_wart_block_quark.json +71397f0ae2e175181195b8b2894d108e0cdc3da7 data/create/recipes/crushing/obsidian.json +88d7ab3d6407010876e328f5f20a4ed9ddda7e3e data/create/recipes/crushing/prismarine_crystals.json +42299b3a0596c7743404496205854ac2324aedd7 data/create/recipes/crushing/redstone_ore.json +94589aa3171fcfda8eed76000d53a36ea6fd7e53 data/create/recipes/crushing/sand.json +dc4cf8b759f5eeee0ccfa6aaad204fbeea487b7f data/create/recipes/crushing/wool.json +967bea8eabac8fab8de547ddd6670230f400c111 data/create/recipes/crushing/zinc_block.json +fec666f3d9d40214411b3e13df957c430f748b38 data/create/recipes/crushing/zinc_ore.json +a6fcae05c9483516c0b05553dc9dc58aa24bcb3d data/create/recipes/cutting/acacia_log.json +dc45636779c05e3be6b9ab6348618c5bf4b6a935 data/create/recipes/cutting/acacia_wood.json +68687da80b9dc7ea69729b0e16d3e75efed8679a data/create/recipes/cutting/andesite_alloy.json +96128e5538ce36172271aeb5f13b9a96b23622e8 data/create/recipes/cutting/birch_log.json +3314272b66d99d64c6454a798d58a87cd7ce18bb data/create/recipes/cutting/birch_wood.json +a0c8189a002a80e3d68ed658b9adf69e98609458 data/create/recipes/cutting/dark_oak_log.json +f5ed40088993dd5ef09db74d154d02db0fefe772 data/create/recipes/cutting/dark_oak_wood.json +a695868ac8943924bcd375089995f909ef95d0a8 data/create/recipes/cutting/jungle_log.json +8de2bec42f36c8ed87b9eac957b09eb302f84b63 data/create/recipes/cutting/jungle_wood.json +7946211bb119a9ccdc192c72d57f7d732e9cac13 data/create/recipes/cutting/oak_log.json +f39da018c21b0b99b41cd25ecbadc75ee9d552c7 data/create/recipes/cutting/oak_wood.json +6abbe6463bb4da2fff1cabaefa92e043fdefdf88 data/create/recipes/cutting/spruce_log.json +cb5343fdcab4ab27335deef2988db7dc0c9ff7f2 data/create/recipes/cutting/spruce_wood.json +9f14b915695407155fdf806b1e5ecf91e0860c5b data/create/recipes/cutting/stripped_acacia_log.json +c7f0e3b7a46676ede1ed775ec8aa8b969e1fe598 data/create/recipes/cutting/stripped_acacia_wood.json +4c657d8ff753789853c8d705fb5ae01caeef5cc1 data/create/recipes/cutting/stripped_birch_log.json +53f47375955f65844c077c8bb06a9eeb67e0b53f data/create/recipes/cutting/stripped_birch_wood.json +9cab5363d43559823d4679da0a64a0a603983cb6 data/create/recipes/cutting/stripped_dark_oak_log.json +c63bc7d8a81b3499390de84fc49d726c9018896d data/create/recipes/cutting/stripped_dark_oak_wood.json +e923bfbc5d9b02e020693378723b4d55fc60f79a data/create/recipes/cutting/stripped_jungle_log.json +2dba1962f0a267d72444ec448432b81143fc42da data/create/recipes/cutting/stripped_jungle_wood.json +ff68462a712267db1f1124d37a4877217edd5c85 data/create/recipes/cutting/stripped_oak_log.json +84ffcff96d79f88012bceae0e346da6be4da9802 data/create/recipes/cutting/stripped_oak_wood.json +2b5f34ba42521004f999140056c997b07acde4e9 data/create/recipes/cutting/stripped_spruce_log.json +6c3776c4d4190dba4f70d1f6995715002b37b3a8 data/create/recipes/cutting/stripped_spruce_wood.json f2c317e03ac4d42fb631e1625607061e10c480fe data/create/recipes/dark_oak_window.json d9dbae6e237eb38e53a619a0f1b339fca7c59b4d data/create/recipes/dark_oak_window_pane.json 55596a590962e3ddd40949917661f0bd94408274 data/create/recipes/dark_scoria_bricks_from_dark_scoria_stonecutting.json @@ -2307,6 +2683,7 @@ bd355332d17adcb0460b1d43146ca288efb78395 data/create/recipes/fancy_weathered_lim d2ab9ce73636773165564506580f2ec13bd1fc50 data/create/recipes/fancy_weathered_limestone_bricks_stairs_from_fancy_weathered_limestone_bricks_stonecutting.json 36947f27d2b2e57b00440fd5acd06a7554e5a387 data/create/recipes/fancy_weathered_limestone_bricks_wall.json 1d0e41ca98e48073c72adf4077610c96e592f9a5 data/create/recipes/fancy_weathered_limestone_bricks_wall_from_fancy_weathered_limestone_bricks_stonecutting.json +3196d3eda9e67771e86e9af7026d4388765a8a73 data/create/recipes/filling/water_bottle.json 5b8bbde7f8b270ab75fac18d6858f2fadbc0efa3 data/create/recipes/framed_glass_from_glass_colorless_stonecutting.json d697de0c9b706ca4e18da7a2d769e7e5fe8d769d data/create/recipes/framed_glass_pane.json a0dae50faaa1b7142bb4309675e3084c68daa547 data/create/recipes/gabbro_bricks_from_gabbro_stonecutting.json @@ -2370,6 +2747,64 @@ bbf64f7eb3868e354756e57348493e2b1ae6b0d9 data/create/recipes/limestone_cobblesto 88fa2b1ab746d5e13a8afd6e7e7d80ad843e0016 data/create/recipes/limestone_cobblestone_wall_from_limestone_cobblestone_stonecutting.json 327bb8a6535b60bb65d0dda9d5205e988bc82526 data/create/recipes/limestone_pillar.json c2e15ac0c9109bad3face6d13efc32d7116b4c25 data/create/recipes/limestone_pillar_from_limestone_stonecutting.json +88173753ceaf121c5430bbf928a40e3c046dbfe0 data/create/recipes/mechanical_crafting/crushing_wheel.json +357cb3a50ebedcc347396c5cb26a04eb4bd96fea data/create/recipes/mechanical_crafting/extendo_grip.json +de7fea84434753873dfa2b929d9b5f5f86ac6a5c data/create/recipes/mechanical_crafting/flywheel.json +e491fd8a8873308270f9dc2a57ac8f2c70431dcc data/create/recipes/mechanical_crafting/furnace_engine.json +ce17f8ab6e051f45a12e55f1642ad1b8a0f8510f data/create/recipes/mechanical_crafting/integrated_circuit.json +fc380bc241f3233700e91fe2947e1a5d6c70e7db data/create/recipes/mechanical_crafting/mechanical_arm.json +23bd72789e7be894c4ee8927a171c721afcc2084 data/create/recipes/mechanical_crafting/nixie_tube.json +9d637c3c552840bd79ccfac57b1508e21146de49 data/create/recipes/milling/allium.json +7823440a3707ab2ea41d8dae214b11364a53e290 data/create/recipes/milling/andesite.json +ac3f1c92115a113a1ea7e5543c1e061e3d2a0b36 data/create/recipes/milling/azure_bluet.json +3f38c1025e0a1553e756fc494b03a39cff2a6b81 data/create/recipes/milling/blue_orchid.json +9386c7e1f9d69826965402af8cc7609d8285f0c8 data/create/recipes/milling/bone.json +72676ef5267d005b52b6d138cf68b5428da25b85 data/create/recipes/milling/bone_meal.json +1209f70f8f09af5a4cce67eb8e090c63981d675e data/create/recipes/milling/cactus.json +335f32092c32238daec5ab5914836e1a50baed36 data/create/recipes/milling/charcoal.json +b9b8d7a0ed2121ac4202b1cd23fc9a18da9f89fa data/create/recipes/milling/clay.json +915d00bb4518e9dd5bb35f5ccc41a974548f5e6a data/create/recipes/milling/coal.json +f585d39316e016a559b72e53770ff7ff9375e292 data/create/recipes/milling/cobblestone.json +d6d024c8fccd18a47a1b22962a20877d8f74dc94 data/create/recipes/milling/cocoa_beans.json +6e9e700b353471e9d5d4bf3ab2ae504c54f84cf7 data/create/recipes/milling/copper_ore.json +31da5a1a6cc6f6cf90bf091d968d8b6f8555b292 data/create/recipes/milling/cornflower.json +d8f48766699d10fe948f993c44e5f290354e6a03 data/create/recipes/milling/dandelion.json +4e486a45118b45d01a1aa277b56e05f600ae7524 data/create/recipes/milling/diorite.json +d6cb91af193f88f0861813094cd4dc2d9111b304 data/create/recipes/milling/fern.json +e4533cf74cf1a9422ecb50820dd9a393a7f327b8 data/create/recipes/milling/gold_ore.json +5b31ee99e30e920162e8fdabc4608ca828bf992d data/create/recipes/milling/granite.json +5fa9947eb9c423c19d824ab83700ced4fc80f7a3 data/create/recipes/milling/grass.json +d39af13f1110fbf80ac6d4ed6770153153e647b9 data/create/recipes/milling/gravel.json +fcac9030cdc13052d8cd006d27cf420fc2879375 data/create/recipes/milling/ink_sac.json +33aea07b98a40a5e122b407252cc1a85d7176626 data/create/recipes/milling/iron_ore.json +c6d91bc1b90d9baa022abf4eb15d3934a1dd298e data/create/recipes/milling/lapis_lazuli.json +121073a5d934ad220de8286185a398575ddbb5b1 data/create/recipes/milling/large_fern.json +83d11b3743864ecd59cdc1e6626a3118e5dc5cfc data/create/recipes/milling/lilac.json +efe625cb321255c3d7d2db626ff239722f774623 data/create/recipes/milling/lily_of_the_valley.json +e1218d6bf8f80461887de609f478b99facb1c5a2 data/create/recipes/milling/orange_tulip.json +b88646f1b4599b36920e0bff5829c372fddfa2b4 data/create/recipes/milling/oxeye_daisy.json +a600f9048060ef635fb84eea3facdb1918fbad73 data/create/recipes/milling/peony.json +e0be5c3c2d8bae1031de9291ee8434ef8f2608b0 data/create/recipes/milling/pink_tulip.json +e54acf873ebea2d97294ed8f609070e7395b463a data/create/recipes/milling/poppy.json +c8f76e426ff2d3df3c0ebe2f6c354ea5cfeb7b89 data/create/recipes/milling/red_tulip.json +bda581c2039f41f7d55527814a46903f10da7e05 data/create/recipes/milling/rose_bush.json +54be62a1bf098a370d315f79068ec326e4f4d6c2 data/create/recipes/milling/saddle.json +90cc7b8a945fb019cddb8fbfea1564f46614d69a data/create/recipes/milling/sand.json +b44e771a42b0630cd01b31cf4b9cf337e3e21041 data/create/recipes/milling/sugar_cane.json +ec53cd589fb96d126cbd85f7540fbb685310355a data/create/recipes/milling/sunflower.json +11cf0d26f667ac8749818fa3a5accbdb726a6356 data/create/recipes/milling/tall_grass.json +79797c0658f5dce82ee50a612627f47df33ce09e data/create/recipes/milling/terracotta.json +06703af2619170b21a2acd89e755826ad4bb2e5b data/create/recipes/milling/wheat.json +3f4e1adbbbdc1327e2f83d648918b4959a8cff2e data/create/recipes/milling/white_tulip.json +ca72436410265c33b1d8a2d9b634767df73efa6e data/create/recipes/milling/wither_rose.json +0137a135731a41d1d33e0c264decb03ee1582c4f data/create/recipes/milling/wool.json +28f37178b75fc4d63c4495c721fe2f0f011756cf data/create/recipes/milling/zinc_ore.json +8975bb125e09b68cc539c7b368fd7c6853657fd6 data/create/recipes/mixing/andesite_alloy.json +e7bfaa806d57573d060fac0a5e7a84f345b8bb85 data/create/recipes/mixing/andesite_alloy_from_zinc.json +3417f9399ce0fb32fc4bce94c772b40d780c9006 data/create/recipes/mixing/brass_ingot.json +76939e4d3e5b615ae21d14c0ff7b917a622bcf80 data/create/recipes/mixing/chromatic_compound.json +d9a3dff1288d675ab812eef1eb73cb27dcc71bd2 data/create/recipes/mixing/crushed_brass.json +00b165ea38d834c7955440e87062004a8182c3f8 data/create/recipes/mixing/gunpowder.json 1998c6f84f871d6da58ec29d729401d18f8f1aa1 data/create/recipes/mossy_andesite_from_andesite_stonecutting.json 89929d9cb11b5c589b2ecfa821c61add1ef7b62b data/create/recipes/mossy_dark_scoria_from_dark_scoria_stonecutting.json 4b8b1191dd3a21294293dc5ad237af89b849df28 data/create/recipes/mossy_diorite_from_diorite_stonecutting.json @@ -2455,7 +2890,7 @@ f2a140cbaddefd387fd94f0ce94df763a585dd4f data/create/recipes/paved_weathered_lim 9f02f552173ae1c85750bb16aa6bbbfb87a5a7f1 data/create/recipes/paved_weathered_limestone_stairs_from_paved_weathered_limestone_stonecutting.json cc4a5a893b10ffdfcc10085323d89d34a1b8f122 data/create/recipes/paved_weathered_limestone_wall.json d996f6505433a74cd8bdab04c0e0bac1b9a2da16 data/create/recipes/paved_weathered_limestone_wall_from_paved_weathered_limestone_stonecutting.json -57ead6c81e1cff1e8e2c4ebc5d0b5b00475b5ff8 data/create/recipes/polished_dark_scoria.json +c83e29f260eee9844c85995d45bedef6100cb91d data/create/recipes/polished_dark_scoria.json 753c85bfb84a5d31f9670478042321702a589dc8 data/create/recipes/polished_dark_scoria_from_dark_scoria_stonecutting.json d3c78c504672fec3316b206505c2cb5fc8daf822 data/create/recipes/polished_dark_scoria_slab.json bcc5a7325b7f7110e6b382e7ad60fc547222d3ad data/create/recipes/polished_dark_scoria_slab_from_polished_dark_scoria_stonecutting.json @@ -2463,7 +2898,7 @@ c7d7e5f39099a71482cdfbebe1ef2dfd508ae768 data/create/recipes/polished_dark_scori 364d77f01b380bbb0036810f6e0df09773ea8e1c data/create/recipes/polished_dark_scoria_stairs_from_polished_dark_scoria_stonecutting.json 396b6c97b5e7f608b293dee51be97717c3430bc4 data/create/recipes/polished_dark_scoria_wall.json 62b0769e0208831db822f6d2b986fff6aee60729 data/create/recipes/polished_dark_scoria_wall_from_polished_dark_scoria_stonecutting.json -50bf55ffedb9fb30b61fbd2921bc84377431aaa9 data/create/recipes/polished_dolomite.json +53930b3b32b076c9786e5c61d8cc7fe70a47fed7 data/create/recipes/polished_dolomite.json da91fd1ccaac64f7ef9737f3c773490d0c0b10d1 data/create/recipes/polished_dolomite_from_dolomite_stonecutting.json 75288e75b604eacfbc19cb51cb4d4759bdeaafa5 data/create/recipes/polished_dolomite_slab.json 9a89eaf5f00d8fb10297de61248f8d11dded8c4b data/create/recipes/polished_dolomite_slab_from_polished_dolomite_stonecutting.json @@ -2471,7 +2906,7 @@ da91fd1ccaac64f7ef9737f3c773490d0c0b10d1 data/create/recipes/polished_dolomite_f e2dce404e4bcde076615ed0d0cf6fab769d441d5 data/create/recipes/polished_dolomite_stairs_from_polished_dolomite_stonecutting.json 8f2f4643886d166609b198704dcadb5e87b6323e data/create/recipes/polished_dolomite_wall.json 3b5d553e408a8b6385932e2a8082fcb5bdead0d1 data/create/recipes/polished_dolomite_wall_from_polished_dolomite_stonecutting.json -238a2479668b611b3b3392973b86cb9270510744 data/create/recipes/polished_gabbro.json +d9d2b6f6f4c8223c4cfc6258ba9013463691d88c data/create/recipes/polished_gabbro.json ba3e1444b9d1804411cc9c7536c657806dc37c1d data/create/recipes/polished_gabbro_from_gabbro_stonecutting.json b7d29a29fde4868b4ceef1437e5d00975068bc58 data/create/recipes/polished_gabbro_slab.json f7a62c1edc74e54fc0c747f23d7da182d49ef7b6 data/create/recipes/polished_gabbro_slab_from_polished_gabbro_stonecutting.json @@ -2479,7 +2914,7 @@ f7a62c1edc74e54fc0c747f23d7da182d49ef7b6 data/create/recipes/polished_gabbro_sla 7df6fd466badaa3cef5e2ad0e78bbb3b6429805e data/create/recipes/polished_gabbro_stairs_from_polished_gabbro_stonecutting.json ec70334e13e05cff7e04e7dc6b23be273c235e50 data/create/recipes/polished_gabbro_wall.json 5176a8fe5a48592c7b487518a57c962c24e3e751 data/create/recipes/polished_gabbro_wall_from_polished_gabbro_stonecutting.json -1f62fa5bb5a7ea1a6005ea6df92a425dfd2e17d7 data/create/recipes/polished_limestone.json +bb7d651a6c79bd97390c7b1743c4fe58c9973c39 data/create/recipes/polished_limestone.json 0e88c98c9ef0d15523b23b00f8afde71d9d8e3e9 data/create/recipes/polished_limestone_from_limestone_stonecutting.json 135fd40e291c7cfdc73c14496654008da9dd797d data/create/recipes/polished_limestone_slab.json 4ce225832ab45daf6b5bc013c6f8762fdbe9ff0f data/create/recipes/polished_limestone_slab_from_polished_limestone_stonecutting.json @@ -2487,7 +2922,7 @@ fee3d0ec8d4f27d82acd5d0e3a2a142900e18be3 data/create/recipes/polished_limestone_ 6780c8bd8747ebb6db7e0adfc486ce00e7e2cf26 data/create/recipes/polished_limestone_stairs_from_polished_limestone_stonecutting.json 44b1f3873fe8150abbacab10ff3cc2033a01b4a0 data/create/recipes/polished_limestone_wall.json d68a27e463d31ba5eed19181c0335824601b9e68 data/create/recipes/polished_limestone_wall_from_polished_limestone_stonecutting.json -d6c9f925e5059eec29928a8c48a2986862bf1571 data/create/recipes/polished_scoria.json +300b9c979ac848fb6ae69eeb6e89c9e22056c562 data/create/recipes/polished_scoria.json 9d6926822ea6f2bb38ba55204278fe82fd453d16 data/create/recipes/polished_scoria_from_scoria_stonecutting.json 814efd67d3f061d0c0ba104993c868e075a4fd3e data/create/recipes/polished_scoria_slab.json 8696f262927ae55ce72af1a34cae68fd6ccc4050 data/create/recipes/polished_scoria_slab_from_polished_scoria_stonecutting.json @@ -2495,7 +2930,7 @@ efe648aa4fd0f22faa78c016dbe2d083462e1ad6 data/create/recipes/polished_scoria_sta ba6dd9ad0c69b088c1a9e33000bd5b9bcedb0ca0 data/create/recipes/polished_scoria_stairs_from_polished_scoria_stonecutting.json 8319042a131a9dcabae016009b807b91c491f8d3 data/create/recipes/polished_scoria_wall.json bc9a83e7793768723031ff14269e43c83687b9f3 data/create/recipes/polished_scoria_wall_from_polished_scoria_stonecutting.json -839a18a69ec2d1d5171fd830f5af05f92f58ef6d data/create/recipes/polished_weathered_limestone.json +31a0826653da3e752da8507a46b16dc17334693b data/create/recipes/polished_weathered_limestone.json 73b468de08f3e0542b7020129faff3a40b3fee67 data/create/recipes/polished_weathered_limestone_from_weathered_limestone_stonecutting.json c0924d72a856c3182b89996a6ceaffd56930c455 data/create/recipes/polished_weathered_limestone_slab.json 1f5503d22859a08eef824d33f6ed48335f66c423 data/create/recipes/polished_weathered_limestone_slab_from_polished_weathered_limestone_stonecutting.json @@ -2503,6 +2938,13 @@ d51106184083761635fa902c09c45436c414ddab data/create/recipes/polished_weathered_ 9d4382462376e85c2627b8150b09acd3b063e347 data/create/recipes/polished_weathered_limestone_stairs_from_polished_weathered_limestone_stonecutting.json 7dd58714cf8fc4614ae2e1c2981471da3a52f06c data/create/recipes/polished_weathered_limestone_wall.json eae06580a0a5f486cde35426716d50fcb3ba5bb3 data/create/recipes/polished_weathered_limestone_wall_from_polished_weathered_limestone_stonecutting.json +228d2002ec3da06f940d004b1f3c74fc33413fb6 data/create/recipes/pressing/brass_ingot.json +a07323c42c78815ebc756372a30bb8295abaf9a0 data/create/recipes/pressing/copper_ingot.json +b107b827c888a8349a937aebeed575b40e9cee9a data/create/recipes/pressing/gold_ingot.json +c2fd8639ed37034eabc821842d48385cb0918c3b data/create/recipes/pressing/iron_ingot.json +05b620a5cb6cf0a7ebe5e6183a061067fcccc191 data/create/recipes/pressing/lapis_block.json +91d12d892c2660f962b26b9dde020a5570c2c6e7 data/create/recipes/pressing/sugar_cane.json +9ebd1cc7dac1874c49a75e7709c3fea79853c087 data/create/recipes/sandpaper_polishing/rose_quartz.json d59c68621c78ff5d2c51be4440dea603480efed8 data/create/recipes/scoria_bricks_from_scoria_stonecutting.json a7a28cf77955c2b4ed3687205dd24162e461aa30 data/create/recipes/scoria_bricks_slab.json 0577ffde98e7a027b21c430cd71cdafdd3cee3a3 data/create/recipes/scoria_bricks_slab_from_scoria_bricks_stonecutting.json @@ -2519,6 +2961,59 @@ f7b7ff190929ae525297fecb3c116f32fc05fd88 data/create/recipes/scoria_cobblestone_ a9096822db9d12b6014d6d34e52de5821305c03f data/create/recipes/scoria_cobblestone_wall_from_scoria_cobblestone_stonecutting.json a513468ce4d55fe3b3919bd76ba2bd5b6fac4d4e data/create/recipes/scoria_pillar.json 2e0ecbd3619f080d0fc6fe48307c5a5bcc2e91b4 data/create/recipes/scoria_pillar_from_scoria_stonecutting.json +ae90f50589bc06b44765ac8cbb9fbdc2b58fdb32 data/create/recipes/smelting/brass_ingot_from_crushed.json +64cbf425effba00ff2e31d95cffc2be2e0191932 data/create/recipes/smelting/bread.json +68aae31e827e192e28e1f950b0bfdeb4ec1860c7 data/create/recipes/smelting/copper_ingot_from_crushed.json +7fab4012e343cc14137f02f2a051deb813ffacf6 data/create/recipes/smelting/copper_ingot_from_ore.json +c460e8e09340ff3f5b61cfd99137ea3a69de3079 data/create/recipes/smelting/dolomite.json +5cccc708796df044fdd4ed03a12b0432c75af971 data/create/recipes/smelting/gabbro.json +11857aff0104cce17a318e440b6b38cf414f7174 data/create/recipes/smelting/glass_from_framed_glass.json +8097d4c4c67188e48306b3bc26c95813bb66f970 data/create/recipes/smelting/glass_from_horizontal_framed_glass.json +4a370d04bc50fd081fbb33b3de029b92c2c6e9f3 data/create/recipes/smelting/glass_from_tiled_glass.json +28717c180696abf7f57c10b3ba424a4e492ec39e data/create/recipes/smelting/glass_from_vertical_framed_glass.json +daaa640dbfaa86685de636b89afe2fdd74cd0cf9 data/create/recipes/smelting/glass_pane_from_framed_glass_pane.json +3a9d729f22b603f9149d2da78e3eb66c4135a7e2 data/create/recipes/smelting/glass_pane_from_horizontal_framed_glass_pane.json +48bdeff8ca1ae7bf732fc870fb0fa294de56188a data/create/recipes/smelting/glass_pane_from_tiled_glass_pane.json +7035be7cce5a38c794d9cc872801329af81bac46 data/create/recipes/smelting/glass_pane_from_vertical_framed_glass_pane.json +b032c79090adad2262ae94609e0b3747327d51a2 data/create/recipes/smelting/gold_ingot_from_crushed.json +fe3e4c244c34aa6948243fabd6b42f04f80d4992 data/create/recipes/smelting/iron_ingot_from_crushed.json +bf0e5df5a88e583e39a4e14b006cbf33b99611e1 data/create/recipes/smelting/limestone.json +2c230522bb0946bde6a51442cb15c5efeea99b15 data/create/recipes/smelting/scoria.json +a5d23be4cc959eb47d84b210190abaafcf41f022 data/create/recipes/smelting/zinc_ingot_from_crushed.json +2d8e448bbe841871c5d9a022149c5f34fd5c0df1 data/create/recipes/smelting/zinc_ingot_from_ore.json +ce7c3c6e1da9d6684c9537d1a558423925d89f33 data/create/recipes/smoking/bread.json +60ee56b41a279124ff59724794c80da7e8cc81e4 data/create/recipes/splashing/black_concrete_powder.json +59ce20e3f4193a6e28cde2d46c008afe5d53c67f data/create/recipes/splashing/blue_concrete_powder.json +6d69b04151846675b5b9d1de3374f0168bcdc20b data/create/recipes/splashing/brown_concrete_powder.json +c22dc50b7c8dea74dae9018506989fa14a340796 data/create/recipes/splashing/crushed_brass.json +d43ec1edc4743dc5a3483c327dc010a12d81dbf5 data/create/recipes/splashing/crushed_copper_ore.json +a1112c785f4571c0a9900288081eb216c729a17b data/create/recipes/splashing/crushed_gold_ore.json +f3b03dd4532086a785d6bbc9de081ab8adf58146 data/create/recipes/splashing/crushed_iron_ore.json +d2d6137fd7a3155263cfffef45f760b99f26f26b data/create/recipes/splashing/crushed_zinc_ore.json +25796b0f832249cd3ffc8493daff534d783ec850 data/create/recipes/splashing/cyan_concrete_powder.json +0c0e987bb771868b34d04759f672cd4e1cd83c60 data/create/recipes/splashing/gravel.json +756857a8a3f931ba55056239664530849680b9a5 data/create/recipes/splashing/gray_concrete_powder.json +ab1a3e111e00ce7d6e6cf55a110eb843be040b17 data/create/recipes/splashing/green_concrete_powder.json +319c0423276eec8b5bdd2b3d7596b86eff113986 data/create/recipes/splashing/ice.json +fe3c9a2343a796c5e08e9d607b978563b9d9320a data/create/recipes/splashing/light_blue_concrete_powder.json +26f43d0f3d8381fd89c1d97b530aa56145bc5df5 data/create/recipes/splashing/light_gray_concrete_powder.json +11cd9b3d32db881c8ab435bb7f3fe0bf8233038b data/create/recipes/splashing/lime_concrete_powder.json +040e5de4d06e47c59a9cdbaf574ac51320201f2a data/create/recipes/splashing/limestone.json +b4a42622cd9363951984140e0afdb68e40efda3c data/create/recipes/splashing/magenta_concrete_powder.json +77a5ac46d93a6031d6c3827818d6e7baf11e155f data/create/recipes/splashing/magma_block.json +bd715561deaeac2afb11e5394679fc3b8b30eb7f data/create/recipes/splashing/orange_concrete_powder.json +dd7457da2124a93e8bdc4f68380378f945df12d9 data/create/recipes/splashing/pink_concrete_powder.json +f031372403ea35d5bc63b18a82ce84ff2d69f206 data/create/recipes/splashing/purple_concrete_powder.json +e7ff4602fd5444a2e3c8ddc20be9569d64e1746e data/create/recipes/splashing/red_concrete_powder.json +d0c652c4382e9213bb7d61380162a8d6c55d9d39 data/create/recipes/splashing/red_sand.json +43fe8ba65a79909e4b9ea985dea2861cba1e680b data/create/recipes/splashing/sand.json +e802591c68932b24f027c99281a51d8f13393bf8 data/create/recipes/splashing/soul_sand.json +4773a92dea2e3ba6cb529e097948d881b4d0988b data/create/recipes/splashing/stained_glass.json +1bc046f79c8e0660d11f7e6951b866cb74b9339b data/create/recipes/splashing/stained_glass_pane.json +a465629e286012f616ccf48305bbdd9e493b290a data/create/recipes/splashing/wheat_flour.json +8c995694c62035a84b6f993cf452811c577dc752 data/create/recipes/splashing/white_concrete_powder.json +53b0a123f52437842631ffdec05eebed8ba6c73a data/create/recipes/splashing/wool.json +224c91bcc2ff94054b62761f9fed3925d6b52cb7 data/create/recipes/splashing/yellow_concrete_powder.json 7a4e163767827fc8cef3646204c2f2bf0f8aac99 data/create/recipes/spruce_window.json 96d515ff0172dafa04d650ab69d68ed508e99e6f data/create/recipes/spruce_window_pane.json 1f689453146c7dd2d315e8b5fb5e7cdc0aaf0fa2 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -2541,12 +3036,15 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone 0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json 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 -4ace4302e3f0ee8ca063c150a046deab06c52710 data/create/tags/blocks/brittle.json -228290109dd691e508cad11547e30d30bf111c3f data/create/tags/blocks/fan_heaters.json -74ad330d6e347b339002a9d83be7061c1c91ae26 data/create/tags/blocks/fan_transparent.json +10bed57f3eb989a643eb3609f177e30536f07965 data/create/tags/blocks/brittle.json +246ee2ec4e778e38a362f319506564886d4e0e76 data/create/tags/blocks/fan_heaters.json +798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json +6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json +7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json +6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json +abbe5d7cc9d1705509257888154ed7ca23292586 data/create/tags/items/upright_on_belt.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json 81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.json 4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/blocks/ores/copper.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 index 750bc272b..369be6128 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json @@ -1,64 +1,124 @@ { "variants": { - "facing=north,pushing=false,shape=retracted": { + "facing=north,powered=false,pushing=false,shape=retracted": { "model": "create:block/andesite_belt_funnel_pull_retracted" }, - "facing=south,pushing=false,shape=retracted": { + "facing=south,powered=false,pushing=false,shape=retracted": { "model": "create:block/andesite_belt_funnel_pull_retracted", "y": 180 }, - "facing=west,pushing=false,shape=retracted": { + "facing=west,powered=false,pushing=false,shape=retracted": { "model": "create:block/andesite_belt_funnel_pull_retracted", "y": 270 }, - "facing=east,pushing=false,shape=retracted": { + "facing=east,powered=false,pushing=false,shape=retracted": { "model": "create:block/andesite_belt_funnel_pull_retracted", "y": 90 }, - "facing=north,pushing=true,shape=retracted": { + "facing=north,powered=true,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_powered_retracted" + }, + "facing=south,powered=true,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "y": 180 + }, + "facing=west,powered=true,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "y": 270 + }, + "facing=east,powered=true,pushing=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "y": 90 + }, + "facing=north,powered=false,pushing=true,shape=retracted": { "model": "create:block/andesite_belt_funnel_push_retracted" }, - "facing=south,pushing=true,shape=retracted": { + "facing=south,powered=false,pushing=true,shape=retracted": { "model": "create:block/andesite_belt_funnel_push_retracted", "y": 180 }, - "facing=west,pushing=true,shape=retracted": { + "facing=west,powered=false,pushing=true,shape=retracted": { "model": "create:block/andesite_belt_funnel_push_retracted", "y": 270 }, - "facing=east,pushing=true,shape=retracted": { + "facing=east,powered=false,pushing=true,shape=retracted": { "model": "create:block/andesite_belt_funnel_push_retracted", "y": 90 }, - "facing=north,pushing=false,shape=extended": { + "facing=north,powered=true,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_powered_retracted" + }, + "facing=south,powered=true,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "y": 180 + }, + "facing=west,powered=true,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "y": 270 + }, + "facing=east,powered=true,pushing=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "y": 90 + }, + "facing=north,powered=false,pushing=false,shape=extended": { "model": "create:block/andesite_belt_funnel_pull_extended" }, - "facing=south,pushing=false,shape=extended": { + "facing=south,powered=false,pushing=false,shape=extended": { "model": "create:block/andesite_belt_funnel_pull_extended", "y": 180 }, - "facing=west,pushing=false,shape=extended": { + "facing=west,powered=false,pushing=false,shape=extended": { "model": "create:block/andesite_belt_funnel_pull_extended", "y": 270 }, - "facing=east,pushing=false,shape=extended": { + "facing=east,powered=false,pushing=false,shape=extended": { "model": "create:block/andesite_belt_funnel_pull_extended", "y": 90 }, - "facing=north,pushing=true,shape=extended": { + "facing=north,powered=true,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_powered_extended" + }, + "facing=south,powered=true,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "y": 180 + }, + "facing=west,powered=true,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "y": 270 + }, + "facing=east,powered=true,pushing=false,shape=extended": { + "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "y": 90 + }, + "facing=north,powered=false,pushing=true,shape=extended": { "model": "create:block/andesite_belt_funnel_push_extended" }, - "facing=south,pushing=true,shape=extended": { + "facing=south,powered=false,pushing=true,shape=extended": { "model": "create:block/andesite_belt_funnel_push_extended", "y": 180 }, - "facing=west,pushing=true,shape=extended": { + "facing=west,powered=false,pushing=true,shape=extended": { "model": "create:block/andesite_belt_funnel_push_extended", "y": 270 }, - "facing=east,pushing=true,shape=extended": { + "facing=east,powered=false,pushing=true,shape=extended": { "model": "create:block/andesite_belt_funnel_push_extended", "y": 90 + }, + "facing=north,powered=true,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_powered_extended" + }, + "facing=south,powered=true,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_powered_extended", + "y": 180 + }, + "facing=west,powered=true,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_powered_extended", + "y": 270 + }, + "facing=east,powered=true,pushing=true,shape=extended": { + "model": "create:block/andesite_belt_funnel_push_powered_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 deleted file mode 100644 index cea68cada..000000000 --- a/src/generated/resources/assets/create/blockstates/andesite_chute_funnel.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "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 index 29e935e43..9056622b7 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_funnel.json @@ -1,30 +1,56 @@ { "variants": { - "facing=down": { + "facing=down,powered=false": { "model": "create:block/andesite_funnel", "x": 180 }, - "facing=up": { + "facing=up,powered=false": { "model": "create:block/andesite_funnel" }, - "facing=north": { + "facing=north,powered=false": { "model": "create:block/andesite_funnel", "x": 90 }, - "facing=south": { + "facing=south,powered=false": { "model": "create:block/andesite_funnel", "x": 90, "y": 180 }, - "facing=west": { + "facing=west,powered=false": { "model": "create:block/andesite_funnel", "x": 90, "y": 270 }, - "facing=east": { + "facing=east,powered=false": { "model": "create:block/andesite_funnel", "x": 90, "y": 90 + }, + "facing=down,powered=true": { + "model": "create:block/andesite_funnel_powered", + "x": 180 + }, + "facing=up,powered=true": { + "model": "create:block/andesite_funnel_powered" + }, + "facing=north,powered=true": { + "model": "create:block/andesite_funnel_powered", + "x": 90 + }, + "facing=south,powered=true": { + "model": "create:block/andesite_funnel_powered", + "x": 90, + "y": 180 + }, + "facing=west,powered=true": { + "model": "create:block/andesite_funnel_powered", + "x": 90, + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/andesite_funnel_powered", + "x": 90, + "y": 90 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blaze_burner.json b/src/generated/resources/assets/create/blockstates/blaze_burner.json new file mode 100644 index 000000000..076b83aae --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blaze_burner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/blaze_burner/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blaze_heater.json b/src/generated/resources/assets/create/blockstates/blaze_heater.json deleted file mode 100644 index ede37bfd8..000000000 --- a/src/generated/resources/assets/create/blockstates/blaze_heater.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/blaze_heater/block" - } - } -} \ 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 deleted file mode 100644 index 0e5f38388..000000000 --- a/src/generated/resources/assets/create/blockstates/brass_chute_funnel.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "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/chute.json b/src/generated/resources/assets/create/blockstates/chute.json index b976d52b6..3e82ef8a8 100644 --- a/src/generated/resources/assets/create/blockstates/chute.json +++ b/src/generated/resources/assets/create/blockstates/chute.json @@ -1,39 +1,39 @@ { "variants": { - "facing=down,shape=start": { - "model": "create:block/chute/block_windowed" + "facing=down,shape=intersection": { + "model": "create:block/chute/block_intersection" }, - "facing=north,shape=start": { - "model": "create:block/chute/block_diagonal_start", + "facing=north,shape=intersection": { + "model": "create:block/chute/block_diagonal_intersection", "y": 180 }, - "facing=south,shape=start": { - "model": "create:block/chute/block_diagonal_start" + "facing=south,shape=intersection": { + "model": "create:block/chute/block_diagonal_intersection" }, - "facing=west,shape=start": { - "model": "create:block/chute/block_diagonal_start", + "facing=west,shape=intersection": { + "model": "create:block/chute/block_diagonal_intersection", "y": 90 }, - "facing=east,shape=start": { - "model": "create:block/chute/block_diagonal_start", + "facing=east,shape=intersection": { + "model": "create:block/chute/block_diagonal_intersection", "y": 270 }, - "facing=down,shape=window_straight": { + "facing=down,shape=window": { "model": "create:block/chute/block_windowed" }, - "facing=north,shape=window_straight": { - "model": "create:block/chute/block_diagonal_straight", + "facing=north,shape=window": { + "model": "create:block/chute/block_diagonal", "y": 180 }, - "facing=south,shape=window_straight": { - "model": "create:block/chute/block_diagonal_straight" + "facing=south,shape=window": { + "model": "create:block/chute/block_diagonal" }, - "facing=west,shape=window_straight": { - "model": "create:block/chute/block_diagonal_straight", + "facing=west,shape=window": { + "model": "create:block/chute/block_diagonal", "y": 90 }, - "facing=east,shape=window_straight": { - "model": "create:block/chute/block_diagonal_straight", + "facing=east,shape=window": { + "model": "create:block/chute/block_diagonal", "y": 270 }, "facing=down,shape=normal": { diff --git a/src/generated/resources/assets/create/blockstates/copper_tiles.json b/src/generated/resources/assets/create/blockstates/copper_tiles.json new file mode 100644 index 000000000..74895de71 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/copper_tiles.json @@ -0,0 +1,28 @@ +{ + "variants": { + "oxidization=0": { + "model": "create:block/oxidized/copper_tiles_0" + }, + "oxidization=1": { + "model": "create:block/oxidized/copper_tiles_1" + }, + "oxidization=2": { + "model": "create:block/oxidized/copper_tiles_2" + }, + "oxidization=3": { + "model": "create:block/oxidized/copper_tiles_3" + }, + "oxidization=4": { + "model": "create:block/oxidized/copper_tiles_4" + }, + "oxidization=5": { + "model": "create:block/oxidized/copper_tiles_5" + }, + "oxidization=6": { + "model": "create:block/oxidized/copper_tiles_6" + }, + "oxidization=7": { + "model": "create:block/oxidized/copper_tiles_7" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/encased_fluid_pipe.json b/src/generated/resources/assets/create/blockstates/encased_fluid_pipe.json new file mode 100644 index 000000000..129e39baa --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/encased_fluid_pipe.json @@ -0,0 +1,17 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/encased_fluid_pipe", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "create:block/encased_fluid_pipe" + }, + "axis=z": { + "model": "create:block/encased_fluid_pipe", + "x": 90, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/encased_shaft.json b/src/generated/resources/assets/create/blockstates/encased_shaft.json index ae5973592..b630e5edf 100644 --- a/src/generated/resources/assets/create/blockstates/encased_shaft.json +++ b/src/generated/resources/assets/create/blockstates/encased_shaft.json @@ -1,15 +1,28 @@ { "variants": { - "axis=x": { - "model": "create:block/encased_shaft/block", + "axis=x,casing=andesite": { + "model": "create:block/encased_shaft/andesite", "x": 90, "y": 90 }, - "axis=y": { - "model": "create:block/encased_shaft/block" + "axis=y,casing=andesite": { + "model": "create:block/encased_shaft/andesite" }, - "axis=z": { - "model": "create:block/encased_shaft/block", + "axis=z,casing=andesite": { + "model": "create:block/encased_shaft/andesite", + "x": 90, + "y": 180 + }, + "axis=x,casing=brass": { + "model": "create:block/encased_shaft/brass", + "x": 90, + "y": 90 + }, + "axis=y,casing=brass": { + "model": "create:block/encased_shaft/brass" + }, + "axis=z,casing=brass": { + "model": "create:block/encased_shaft/brass", "x": 90, "y": 180 } diff --git a/src/generated/resources/assets/create/blockstates/extractor.json b/src/generated/resources/assets/create/blockstates/extractor.json deleted file mode 100644 index 54ff46fbc..000000000 --- a/src/generated/resources/assets/create/blockstates/extractor.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "variants": { - "facing=north,powered=false": { - "model": "create:block/extractor/horizontal" - }, - "facing=south,powered=false": { - "model": "create:block/extractor/horizontal", - "y": 180 - }, - "facing=west,powered=false": { - "model": "create:block/extractor/horizontal", - "y": 270 - }, - "facing=east,powered=false": { - "model": "create:block/extractor/horizontal", - "y": 90 - }, - "facing=north,powered=true": { - "model": "create:block/extractor/horizontal_powered" - }, - "facing=south,powered=true": { - "model": "create:block/extractor/horizontal_powered", - "y": 180 - }, - "facing=west,powered=true": { - "model": "create:block/extractor/horizontal_powered", - "y": 270 - }, - "facing=east,powered=true": { - "model": "create:block/extractor/horizontal_powered", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 44255c27a..3b646b920 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "up": "true", + "down": "false", "north": "true", - "south": "false", - "down": "false" + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "up": "true", + "down": "false", "north": "false", - "south": "true", - "down": "false" + "up": "true", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "up": "false", + "down": "true", "north": "true", - "south": "false", - "down": "true" + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "up": "false", + "down": "true", "north": "false", - "south": "true", - "down": "true" + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,10 +104,10 @@ }, { "when": { + "down": "true", + "north": "false", "up": "true", - "north": "false", - "south": "false", - "down": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -115,10 +115,10 @@ }, { "when": { + "down": "false", + "north": "false", "up": "true", - "north": "false", - "south": "false", - "down": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "up": "false", + "down": "true", "north": "false", - "south": "false", - "down": "true" + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "up": "false", + "down": "false", "north": "true", - "south": "true", - "down": "false" + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "up": "false", + "down": "false", "north": "true", - "south": "false", - "down": "false" + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "up": "false", + "down": "false", "north": "false", - "south": "true", - "down": "false" + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "up": "false", + "down": "false", "north": "false", - "south": "false", - "down": "false" + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -304,8 +304,8 @@ "when": { "west": "false", "east": "true", - "up": "true", - "down": "false" + "down": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -315,8 +315,8 @@ "when": { "west": "true", "east": "false", - "up": "true", - "down": "false" + "down": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -326,8 +326,8 @@ "when": { "west": "false", "east": "true", - "up": "false", - "down": "true" + "down": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -337,8 +337,8 @@ "when": { "west": "true", "east": "false", - "up": "false", - "down": "true" + "down": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -348,8 +348,8 @@ "when": { "west": "false", "east": "false", - "up": "true", - "down": "true" + "down": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -359,8 +359,8 @@ "when": { "west": "false", "east": "false", - "up": "true", - "down": "false" + "down": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -370,8 +370,8 @@ "when": { "west": "false", "east": "false", - "up": "false", - "down": "true" + "down": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -381,8 +381,8 @@ "when": { "west": "true", "east": "true", - "up": "false", - "down": "false" + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -392,8 +392,8 @@ "when": { "west": "false", "east": "true", - "up": "false", - "down": "false" + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -403,8 +403,8 @@ "when": { "west": "true", "east": "false", - "up": "false", - "down": "false" + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -414,8 +414,8 @@ "when": { "west": "false", "east": "false", - "up": "false", - "down": "false" + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/glass_fluid_pipe.json b/src/generated/resources/assets/create/blockstates/glass_fluid_pipe.json new file mode 100644 index 000000000..190223a77 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/glass_fluid_pipe.json @@ -0,0 +1,30 @@ +{ + "variants": { + "alt=false,axis=x": { + "model": "create:block/fluid_pipe/window", + "x": 90, + "y": 90 + }, + "alt=true,axis=x": { + "model": "create:block/fluid_pipe/window_alt", + "x": 90, + "y": 90 + }, + "alt=false,axis=y": { + "model": "create:block/fluid_pipe/window" + }, + "alt=true,axis=y": { + "model": "create:block/fluid_pipe/window_alt" + }, + "alt=false,axis=z": { + "model": "create:block/fluid_pipe/window", + "x": 90, + "y": 180 + }, + "alt=true,axis=z": { + "model": "create:block/fluid_pipe/window_alt", + "x": 90, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/linked_extractor.json b/src/generated/resources/assets/create/blockstates/linked_extractor.json deleted file mode 100644 index 98ae3be24..000000000 --- a/src/generated/resources/assets/create/blockstates/linked_extractor.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "variants": { - "facing=north,powered=false": { - "model": "create:block/extractor/horizontal_linked" - }, - "facing=south,powered=false": { - "model": "create:block/extractor/horizontal_linked", - "y": 180 - }, - "facing=west,powered=false": { - "model": "create:block/extractor/horizontal_linked", - "y": 270 - }, - "facing=east,powered=false": { - "model": "create:block/extractor/horizontal_linked", - "y": 90 - }, - "facing=north,powered=true": { - "model": "create:block/extractor/horizontal_linked_powered" - }, - "facing=south,powered=true": { - "model": "create:block/extractor/horizontal_linked_powered", - "y": 180 - }, - "facing=west,powered=true": { - "model": "create:block/extractor/horizontal_linked_powered", - "y": 270 - }, - "facing=east,powered=true": { - "model": "create:block/extractor/horizontal_linked_powered", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/linked_transposer.json b/src/generated/resources/assets/create/blockstates/linked_transposer.json deleted file mode 100644 index 1d9f3dd92..000000000 --- a/src/generated/resources/assets/create/blockstates/linked_transposer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "variants": { - "facing=north,powered=false": { - "model": "create:block/transposer/horizontal_linked" - }, - "facing=south,powered=false": { - "model": "create:block/transposer/horizontal_linked", - "y": 180 - }, - "facing=west,powered=false": { - "model": "create:block/transposer/horizontal_linked", - "y": 270 - }, - "facing=east,powered=false": { - "model": "create:block/transposer/horizontal_linked", - "y": 90 - }, - "facing=north,powered=true": { - "model": "create:block/transposer/horizontal_linked_powered" - }, - "facing=south,powered=true": { - "model": "create:block/transposer/horizontal_linked_powered", - "y": 180 - }, - "facing=west,powered=true": { - "model": "create:block/transposer/horizontal_linked_powered", - "y": 270 - }, - "facing=east,powered=true": { - "model": "create:block/transposer/horizontal_linked_powered", - "y": 90 - } - } -} \ 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 deleted file mode 100644 index 6236aa5cd..000000000 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "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/refined_radiance_casing.json b/src/generated/resources/assets/create/blockstates/refined_radiance_casing.json new file mode 100644 index 000000000..b43052bac --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/refined_radiance_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/refined_radiance_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/shadow_steel_casing.json b/src/generated/resources/assets/create/blockstates/shadow_steel_casing.json new file mode 100644 index 000000000..9caf34364 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/shadow_steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/shadow_steel_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/spout.json b/src/generated/resources/assets/create/blockstates/spout.json new file mode 100644 index 000000000..a0bb1a940 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/spout.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/spout/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/transposer.json b/src/generated/resources/assets/create/blockstates/transposer.json deleted file mode 100644 index eb3395290..000000000 --- a/src/generated/resources/assets/create/blockstates/transposer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "variants": { - "facing=north,powered=false": { - "model": "create:block/transposer/block" - }, - "facing=south,powered=false": { - "model": "create:block/transposer/block", - "y": 180 - }, - "facing=west,powered=false": { - "model": "create:block/transposer/block", - "y": 270 - }, - "facing=east,powered=false": { - "model": "create:block/transposer/block", - "y": 90 - }, - "facing=north,powered=true": { - "model": "create:block/transposer/block_powered" - }, - "facing=south,powered=true": { - "model": "create:block/transposer/block_powered", - "y": 180 - }, - "facing=west,powered=true": { - "model": "create:block/transposer/block_powered", - "y": 270 - }, - "facing=east,powered=true": { - "model": "create:block/transposer/block_powered", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/vertical_extractor.json b/src/generated/resources/assets/create/blockstates/vertical_extractor.json deleted file mode 100644 index 3f3455bb7..000000000 --- a/src/generated/resources/assets/create/blockstates/vertical_extractor.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "variants": { - "facing=north,powered=false,upward=false": { - "model": "create:block/extractor/vertical" - }, - "facing=south,powered=false,upward=false": { - "model": "create:block/extractor/vertical", - "y": 180 - }, - "facing=west,powered=false,upward=false": { - "model": "create:block/extractor/vertical", - "y": 270 - }, - "facing=east,powered=false,upward=false": { - "model": "create:block/extractor/vertical", - "y": 90 - }, - "facing=north,powered=true,upward=false": { - "model": "create:block/extractor/vertical_powered" - }, - "facing=south,powered=true,upward=false": { - "model": "create:block/extractor/vertical_powered", - "y": 180 - }, - "facing=west,powered=true,upward=false": { - "model": "create:block/extractor/vertical_powered", - "y": 270 - }, - "facing=east,powered=true,upward=false": { - "model": "create:block/extractor/vertical_powered", - "y": 90 - }, - "facing=north,powered=false,upward=true": { - "model": "create:block/extractor/vertical", - "x": 180, - "y": 180 - }, - "facing=south,powered=false,upward=true": { - "model": "create:block/extractor/vertical", - "x": 180 - }, - "facing=west,powered=false,upward=true": { - "model": "create:block/extractor/vertical", - "x": 180, - "y": 90 - }, - "facing=east,powered=false,upward=true": { - "model": "create:block/extractor/vertical", - "x": 180, - "y": 270 - }, - "facing=north,powered=true,upward=true": { - "model": "create:block/extractor/vertical_powered", - "x": 180, - "y": 180 - }, - "facing=south,powered=true,upward=true": { - "model": "create:block/extractor/vertical_powered", - "x": 180 - }, - "facing=west,powered=true,upward=true": { - "model": "create:block/extractor/vertical_powered", - "x": 180, - "y": 90 - }, - "facing=east,powered=true,upward=true": { - "model": "create:block/extractor/vertical_powered", - "x": 180, - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/vertical_linked_extractor.json b/src/generated/resources/assets/create/blockstates/vertical_linked_extractor.json deleted file mode 100644 index 5175ae7bc..000000000 --- a/src/generated/resources/assets/create/blockstates/vertical_linked_extractor.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "variants": { - "facing=north,powered=false,upward=false": { - "model": "create:block/extractor/vertical_linked" - }, - "facing=south,powered=false,upward=false": { - "model": "create:block/extractor/vertical_linked", - "y": 180 - }, - "facing=west,powered=false,upward=false": { - "model": "create:block/extractor/vertical_linked", - "y": 270 - }, - "facing=east,powered=false,upward=false": { - "model": "create:block/extractor/vertical_linked", - "y": 90 - }, - "facing=north,powered=true,upward=false": { - "model": "create:block/extractor/vertical_linked_powered" - }, - "facing=south,powered=true,upward=false": { - "model": "create:block/extractor/vertical_linked_powered", - "y": 180 - }, - "facing=west,powered=true,upward=false": { - "model": "create:block/extractor/vertical_linked_powered", - "y": 270 - }, - "facing=east,powered=true,upward=false": { - "model": "create:block/extractor/vertical_linked_powered", - "y": 90 - }, - "facing=north,powered=false,upward=true": { - "model": "create:block/extractor/vertical_linked", - "x": 180, - "y": 180 - }, - "facing=south,powered=false,upward=true": { - "model": "create:block/extractor/vertical_linked", - "x": 180 - }, - "facing=west,powered=false,upward=true": { - "model": "create:block/extractor/vertical_linked", - "x": 180, - "y": 90 - }, - "facing=east,powered=false,upward=true": { - "model": "create:block/extractor/vertical_linked", - "x": 180, - "y": 270 - }, - "facing=north,powered=true,upward=true": { - "model": "create:block/extractor/vertical_linked_powered", - "x": 180, - "y": 180 - }, - "facing=south,powered=true,upward=true": { - "model": "create:block/extractor/vertical_linked_powered", - "x": 180 - }, - "facing=west,powered=true,upward=true": { - "model": "create:block/extractor/vertical_linked_powered", - "x": 180, - "y": 90 - }, - "facing=east,powered=true,upward=true": { - "model": "create:block/extractor/vertical_linked_powered", - "x": 180, - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/vertical_linked_transposer.json b/src/generated/resources/assets/create/blockstates/vertical_linked_transposer.json deleted file mode 100644 index a21f0e4a7..000000000 --- a/src/generated/resources/assets/create/blockstates/vertical_linked_transposer.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "variants": { - "facing=north,powered=false,upward=false": { - "model": "create:block/transposer/vertical_linked", - "x": 90, - "y": 180 - }, - "facing=south,powered=false,upward=false": { - "model": "create:block/transposer/vertical_linked", - "x": 90 - }, - "facing=west,powered=false,upward=false": { - "model": "create:block/transposer/vertical_linked", - "x": 90, - "y": 90 - }, - "facing=east,powered=false,upward=false": { - "model": "create:block/transposer/vertical_linked", - "x": 90, - "y": 270 - }, - "facing=north,powered=true,upward=false": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 90, - "y": 180 - }, - "facing=south,powered=true,upward=false": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 90 - }, - "facing=west,powered=true,upward=false": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 90, - "y": 90 - }, - "facing=east,powered=true,upward=false": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 90, - "y": 270 - }, - "facing=north,powered=false,upward=true": { - "model": "create:block/transposer/vertical_linked", - "x": 270 - }, - "facing=south,powered=false,upward=true": { - "model": "create:block/transposer/vertical_linked", - "x": 270, - "y": 180 - }, - "facing=west,powered=false,upward=true": { - "model": "create:block/transposer/vertical_linked", - "x": 270, - "y": 270 - }, - "facing=east,powered=false,upward=true": { - "model": "create:block/transposer/vertical_linked", - "x": 270, - "y": 90 - }, - "facing=north,powered=true,upward=true": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 270 - }, - "facing=south,powered=true,upward=true": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 270, - "y": 180 - }, - "facing=west,powered=true,upward=true": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 270, - "y": 270 - }, - "facing=east,powered=true,upward=true": { - "model": "create:block/transposer/vertical_linked_powered", - "x": 270, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/vertical_transposer.json b/src/generated/resources/assets/create/blockstates/vertical_transposer.json deleted file mode 100644 index c3f42fadb..000000000 --- a/src/generated/resources/assets/create/blockstates/vertical_transposer.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "variants": { - "facing=north,powered=false,upward=false": { - "model": "create:block/transposer/block", - "x": 90, - "y": 180 - }, - "facing=south,powered=false,upward=false": { - "model": "create:block/transposer/block", - "x": 90 - }, - "facing=west,powered=false,upward=false": { - "model": "create:block/transposer/block", - "x": 90, - "y": 90 - }, - "facing=east,powered=false,upward=false": { - "model": "create:block/transposer/block", - "x": 90, - "y": 270 - }, - "facing=north,powered=true,upward=false": { - "model": "create:block/transposer/block_powered", - "x": 90, - "y": 180 - }, - "facing=south,powered=true,upward=false": { - "model": "create:block/transposer/block_powered", - "x": 90 - }, - "facing=west,powered=true,upward=false": { - "model": "create:block/transposer/block_powered", - "x": 90, - "y": 90 - }, - "facing=east,powered=true,upward=false": { - "model": "create:block/transposer/block_powered", - "x": 90, - "y": 270 - }, - "facing=north,powered=false,upward=true": { - "model": "create:block/transposer/block", - "x": 270 - }, - "facing=south,powered=false,upward=true": { - "model": "create:block/transposer/block", - "x": 270, - "y": 180 - }, - "facing=west,powered=false,upward=true": { - "model": "create:block/transposer/block", - "x": 270, - "y": 270 - }, - "facing=east,powered=false,upward=true": { - "model": "create:block/transposer/block", - "x": 270, - "y": 90 - }, - "facing=north,powered=true,upward=true": { - "model": "create:block/transposer/block_powered", - "x": 270 - }, - "facing=south,powered=true,upward=true": { - "model": "create:block/transposer/block_powered", - "x": 270, - "y": 180 - }, - "facing=west,powered=true,upward=true": { - "model": "create:block/transposer/block_powered", - "x": 270, - "y": 270 - }, - "facing=east,powered=true,upward=true": { - "model": "create:block/transposer/block_powered", - "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 f114a594d..164f096ac 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -12,7 +12,6 @@ "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", @@ -26,12 +25,11 @@ "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.blaze_heater": "\u0279\u01DD\u0287\u0250\u01DDH \u01DDz\u0250\u05DF\u15FA", + "block.create.blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\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", @@ -50,6 +48,7 @@ "block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186", "block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186", "block.create.copper_shingles": "s\u01DD\u05DFbu\u0131\u0265S \u0279\u01DDddo\u0186", + "block.create.copper_tiles": "s\u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186", "block.create.creative_crate": "\u01DD\u0287\u0250\u0279\u0186 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.creative_motor": "\u0279o\u0287oW \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", @@ -91,8 +90,8 @@ "block.create.dolomite_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DD\u0287\u0131\u026Fo\u05DFo\u15E1", "block.create.encased_belt": "\u0287\u05DF\u01DD\u15FA p\u01DDs\u0250\u0254u\u018E", "block.create.encased_fan": "u\u0250\u2132 p\u01DDs\u0250\u0254u\u018E", + "block.create.encased_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 p\u01DDs\u0250\u0254u\u018E", "block.create.encased_shaft": "\u0287\u025F\u0250\u0265S p\u01DDs\u0250\u0254u\u018E", - "block.create.extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E", "block.create.fancy_andesite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132", "block.create.fancy_andesite_bricks_slab": "q\u0250\u05DFS s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132", "block.create.fancy_andesite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132", @@ -147,6 +146,7 @@ "block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141", "block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141", "block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141", + "block.create.glass_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 ss\u0250\u05DF\u2141", "block.create.granite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_bricks_slab": "q\u0250\u05DFS s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131u\u0250\u0279\u2141", @@ -188,8 +188,6 @@ "block.create.limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.linear_chassis": "s\u0131ss\u0250\u0265\u0186 \u0279\u0250\u01DDu\u0131\uA780", - "block.create.linked_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E p\u01DD\u029Eu\u0131\uA780", - "block.create.linked_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 p\u01DD\u029Eu\u0131\uA780", "block.create.magenta_seat": "\u0287\u0250\u01DDS \u0250\u0287u\u01DDb\u0250W", "block.create.mechanical_arm": "\u026F\u0279\u2C6F \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", "block.create.mechanical_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", @@ -232,7 +230,6 @@ "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", @@ -305,6 +302,7 @@ "block.create.red_seat": "\u0287\u0250\u01DDS p\u01DD\u1D1A", "block.create.redstone_contact": "\u0287\u0254\u0250\u0287uo\u0186 \u01DDuo\u0287sp\u01DD\u1D1A", "block.create.redstone_link": "\u029Eu\u0131\uA780 \u01DDuo\u0287sp\u01DD\u1D1A", + "block.create.refined_radiance_casing": "bu\u0131s\u0250\u0186 \u0287u\u0250\u0131p\u0250\u1D1A", "block.create.reinforced_rail": "\u05DF\u0131\u0250\u1D1A p\u01DD\u0254\u0279o\u025Fu\u0131\u01DD\u1D1A", "block.create.rope": "\u01DDdo\u1D1A", "block.create.rope_pulley": "\u028E\u01DD\u05DF\u05DFn\u0500 \u01DDdo\u1D1A", @@ -323,8 +321,10 @@ "block.create.scoria_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u0250\u0131\u0279o\u0254S", "block.create.secondary_linear_chassis": "s\u0131ss\u0250\u0265\u0186 \u0279\u0250\u01DDu\u0131\uA780 \u028E\u0279\u0250puo\u0254\u01DDS", "block.create.sequenced_gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141 p\u01DD\u0254u\u01DDnb\u01DDS", + "block.create.shadow_steel_casing": "bu\u0131s\u0250\u0186 \u028Dop\u0250\u0265S", "block.create.shaft": "\u0287\u025F\u0250\u0265S", "block.create.speedometer": "\u0279\u01DD\u0287\u01DD\u026Fop\u01DD\u01DDdS", + "block.create.spout": "\u0287nodS", "block.create.spruce_window": "\u028Dopu\u0131M \u01DD\u0254n\u0279dS", "block.create.spruce_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u0254n\u0279dS", "block.create.sticky_mechanical_piston": "uo\u0287s\u0131\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW \u028E\u029E\u0254\u0131\u0287S", @@ -332,14 +332,9 @@ "block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S", "block.create.tiled_glass": "ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.tiled_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", - "block.create.transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8", "block.create.turntable": "\u01DD\u05DFq\u0250\u0287u\u0279n\u27D8", - "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_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", "block.create.water_wheel": "\u05DF\u01DD\u01DD\u0265M \u0279\u01DD\u0287\u0250M", "block.create.weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weathered_limestone_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", @@ -379,6 +374,7 @@ "item.create.deforester": "\u0279\u01DD\u0287s\u01DD\u0279o\u025F\u01DD\u15E1", "item.create.dough": "\u0265bno\u15E1", "item.create.electron_tube": "\u01DDqn\u27D8 uo\u0279\u0287\u0254\u01DD\u05DF\u018E", + "item.create.empty_blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA \u028E\u0287d\u026F\u018E", "item.create.empty_schematic": "\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S \u028E\u0287d\u026F\u018E", "item.create.extendo_grip": "d\u0131\u0279\u2141 opu\u01DD\u0287x\u018E", "item.create.filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132", @@ -392,6 +388,7 @@ "item.create.iron_sheet": "\u0287\u01DD\u01DD\u0265S uo\u0279I", "item.create.lapis_sheet": "\u0287\u01DD\u01DD\u0265S s\u0131d\u0250\uA780", "item.create.minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", + "item.create.minecart_coupling": "bu\u0131\u05DFdno\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", "item.create.polished_rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A p\u01DD\u0265s\u0131\u05DFo\u0500", "item.create.powdered_obsidian": "u\u0250\u0131p\u0131sqO p\u01DD\u0279\u01DDp\u028Do\u0500", "item.create.propeller": "\u0279\u01DD\u05DF\u05DF\u01DDdo\u0279\u0500", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 247ee4ec8..9475d69b2 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -15,7 +15,6 @@ "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", @@ -29,12 +28,11 @@ "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", "block.create.black_seat": "Black Seat", - "block.create.blaze_heater": "Blaze Heater", + "block.create.blaze_burner": "Blaze Burner", "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", @@ -53,6 +51,7 @@ "block.create.copper_casing": "Copper Casing", "block.create.copper_ore": "Copper Ore", "block.create.copper_shingles": "Copper Shingles", + "block.create.copper_tiles": "Copper Tiles", "block.create.creative_crate": "Creative Crate", "block.create.creative_motor": "Creative Motor", "block.create.crushing_wheel": "Crushing Wheel", @@ -94,8 +93,8 @@ "block.create.dolomite_pillar": "Dolomite Pillar", "block.create.encased_belt": "Encased Belt", "block.create.encased_fan": "Encased Fan", + "block.create.encased_fluid_pipe": "Encased Fluid Pipe", "block.create.encased_shaft": "Encased Shaft", - "block.create.extractor": "Extractor", "block.create.fancy_andesite_bricks": "Fancy Andesite Bricks", "block.create.fancy_andesite_bricks_slab": "Fancy Andesite Bricks Slab", "block.create.fancy_andesite_bricks_stairs": "Fancy Andesite Bricks Stairs", @@ -150,6 +149,7 @@ "block.create.gabbro_pillar": "Gabbro Pillar", "block.create.gearbox": "Gearbox", "block.create.gearshift": "Gearshift", + "block.create.glass_fluid_pipe": "Glass Fluid Pipe", "block.create.granite_bricks": "Granite Bricks", "block.create.granite_bricks_slab": "Granite Bricks Slab", "block.create.granite_bricks_stairs": "Granite Bricks Stairs", @@ -191,8 +191,6 @@ "block.create.limestone_cobblestone_wall": "Limestone Cobblestone Wall", "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", - "block.create.linked_extractor": "Linked Extractor", - "block.create.linked_transposer": "Linked Transposer", "block.create.magenta_seat": "Magenta Seat", "block.create.mechanical_arm": "Mechanical Arm", "block.create.mechanical_bearing": "Mechanical Bearing", @@ -235,7 +233,6 @@ "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", @@ -308,6 +305,7 @@ "block.create.red_seat": "Red Seat", "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", + "block.create.refined_radiance_casing": "Radiant Casing", "block.create.reinforced_rail": "Reinforced Rail", "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", @@ -326,8 +324,10 @@ "block.create.scoria_pillar": "Scoria Pillar", "block.create.secondary_linear_chassis": "Secondary Linear Chassis", "block.create.sequenced_gearshift": "Sequenced Gearshift", + "block.create.shadow_steel_casing": "Shadow Casing", "block.create.shaft": "Shaft", "block.create.speedometer": "Speedometer", + "block.create.spout": "Spout", "block.create.spruce_window": "Spruce Window", "block.create.spruce_window_pane": "Spruce Window Pane", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", @@ -335,14 +335,9 @@ "block.create.stressometer": "Stressometer", "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", - "block.create.transposer": "Transposer", "block.create.turntable": "Turntable", - "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_linked_extractor": "Vertical Linked Extractor", - "block.create.vertical_linked_transposer": "Vertical Linked Transposer", - "block.create.vertical_transposer": "Vertical Transposer", "block.create.water_wheel": "Water Wheel", "block.create.weathered_limestone": "Weathered Limestone", "block.create.weathered_limestone_bricks": "Weathered Limestone Bricks", @@ -384,6 +379,7 @@ "item.create.deforester": "Deforester", "item.create.dough": "Dough", "item.create.electron_tube": "Electron Tube", + "item.create.empty_blaze_burner": "Empty Blaze Burner", "item.create.empty_schematic": "Empty Schematic", "item.create.extendo_grip": "Extendo Grip", "item.create.filter": "Filter", @@ -397,6 +393,7 @@ "item.create.iron_sheet": "Iron Sheet", "item.create.lapis_sheet": "Lapis Sheet", "item.create.minecart_contraption": "Minecart Contraption", + "item.create.minecart_coupling": "Minecart Coupling", "item.create.polished_rose_quartz": "Polished Rose Quartz", "item.create.powdered_obsidian": "Powdered Obsidian", "item.create.propeller": "Propeller", @@ -457,7 +454,7 @@ "advancement.create.electron_tube": "Beep boop", "advancement.create.electron_tube.desc": "Make some Electron Tubes, useful in crafting less primitive machinery.", "advancement.create.mechanical_saw": "Stationary Chopping", - "advancement.create.mechanical_saw.desc": "Place and power a Mechanical mechanical_saw", + "advancement.create.mechanical_saw.desc": "Place and power a Mechanical Saw", "advancement.create.basin": "Basin Operation", "advancement.create.basin.desc": "Place a basin and try throwing items into it.", "advancement.create.mixer": "Mixin' it Up", @@ -514,8 +511,8 @@ "death.attack.create.crush": "%1$s was processed by Crushing Wheels", "death.attack.create.fan_fire": "%1$s was burned to death by hot air", "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", - "death.attack.create.mechanical_drill": "%1$s was impaled by Mechanical mechanical_drill", - "death.attack.create.mechanical_saw": "%1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", @@ -532,7 +529,7 @@ "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", "create.recipe.packing": "Compacting", - "create.recipe.mechanical_sawing": "mechanical_sawing", + "create.recipe.mechanical_sawing": "Sawing", "create.recipe.mechanical_crafting": "Mechanical Crafting", "create.recipe.block_cutting": "Block Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", @@ -644,6 +641,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation", "create.logistics.filter": "Filter", + "create.logistics.recipe_filter": "Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -838,7 +836,23 @@ "create.tooltip.generationSpeed": "Generates at %1$s %2$s", "create.tooltip.analogStrength": "Analog Strength: %1$s/15", - "create.mechanical_mixer.min_ingredients": "Min. Ingredients", + "create.mechanical_arm.extract_from": "Take items from %1$s", + "create.mechanical_arm.deposit_to": "Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "Prefer First Target", + + "create.tunnel.selection_mode.split": "Split", + "create.tunnel.selection_mode.forced_split": "Forced Split", + "create.tunnel.selection_mode.round_robin": "Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "Prefer Nearest", + "create.tunnel.selection_mode.randomize": "Randomize", + "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", @@ -1267,24 +1281,6 @@ "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "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": "_Takes_ _Items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_.", - "block.create.extractor.tooltip.condition1": "When Powered by Redstone", - "block.create.extractor.tooltip.behaviour1": "_Pauses_ the Extractor.", - "block.create.extractor.tooltip.condition2": "Active Belt pulling", - "block.create.extractor.tooltip.behaviour2": "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-Click on Filter Space", - "block.create.extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.", - - "block.create.transposer.tooltip": "TRANSPOSER", - "block.create.transposer.tooltip.summary": "_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": "When Powered by Redstone", - "block.create.transposer.tooltip.behaviour1": "_Pauses_ the Transposer.", - "block.create.transposer.tooltip.condition2": "Active Belt pulling", - "block.create.transposer.tooltip.behaviour2": "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": "R-Click on Filter Space", - "block.create.transposer.tooltip.action1": "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": "DEPLOYER", "block.create.deployer.tooltip.summary": "_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": "When Rotated", @@ -1292,24 +1288,6 @@ "block.create.deployer.tooltip.condition2": "R-Clicked with Wrench", "block.create.deployer.tooltip.behaviour2": "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": "_Takes_ _items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", - "block.create.linked_extractor.tooltip.condition1": "When Redstone Link Active", - "block.create.linked_extractor.tooltip.behaviour1": "_Pauses_ the Extractor.", - "block.create.linked_extractor.tooltip.control1": "R-Click on Filter Space", - "block.create.linked_extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.", - "block.create.linked_extractor.tooltip.control2": "R-Click on Frequency Space", - "block.create.linked_extractor.tooltip.action2": "Assigns currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Extractor will pause.", - - "block.create.linked_transposer.tooltip": "LINKED TRANSPOSER", - "block.create.linked_transposer.tooltip.summary": "_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": "When Redstone Link Active", - "block.create.linked_transposer.tooltip.behaviour1": "_Pauses_ the Transposer.", - "block.create.linked_transposer.tooltip.control1": "R-Click on Filter Space", - "block.create.linked_transposer.tooltip.action1": "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": "R-Click on Frequency Space", - "block.create.linked_transposer.tooltip.action2": "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": "FUNNEL", "block.create.funnel.tooltip.summary": "_Collects_ _incoming_ _items_ and inserts them into the attached _Inventory_ if possible. Can collect items in the _world_ and items on a _belt_.", "block.create.funnel.tooltip.condition1": "Passive Belt pulling", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index e8795b6a1..2f46228b6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 809", + "_": "Missing Localizations: 804", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Bauplankanonenmacher", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Mahlwerkrad", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Dolomitsäule", "block.create.encased_belt": "Eingeschlossener Riemen", "block.create.encased_fan": "Eingeschlossener Propeller", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Getriebe", "block.create.gearshift": "Gangschaltung", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "Granitziegel", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Mechanisches Lager", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "Redstone-Kontakt", "block.create.redstone_link": "Redstone-Verbindung", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", @@ -327,8 +325,10 @@ "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.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Welle", "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben", @@ -336,14 +336,9 @@ "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", @@ -385,6 +380,7 @@ "item.create.deforester": "UNLOCALIZED: Deforester", "item.create.dough": "Teig", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Leerer Bauplan", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Filter", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "Eisenblech", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Propeller", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -516,7 +513,7 @@ "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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -533,7 +530,7 @@ "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_sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Blockpistole", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Filter", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -839,7 +837,23 @@ "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.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index a65280c05..820163344 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 412", + "_": "Missing Localizations: 428", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "Boîtier en cuivre", "block.create.copper_ore": "Minerai de cuivre", "block.create.copper_shingles": "Bardeaux de cuivre", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Créateur de schémacanon", "block.create.creative_motor": "Moteur", "block.create.crushing_wheel": "Roue de concassage", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Pillier de dolomie", "block.create.encased_belt": "Tapis roulant enfermé", "block.create.encased_fan": "Ventilateur enfermé", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Boîte à roue dentée", "block.create.gearshift": "Décaleur de rotation", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "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", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Roulement mécanique", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "redstone_contact Redstone", "block.create.redstone_link": "Liaison Redstone", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "Corde", "block.create.rope_pulley": "Poulie à corde", @@ -327,8 +325,10 @@ "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.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Arbre mécanique", "block.create.speedometer": "Compteur de vitesse", + "block.create.spout": "UNLOCALIZED: Spout", "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", @@ -336,14 +336,9 @@ "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", @@ -385,6 +380,7 @@ "item.create.deforester": "Déforesteur", "item.create.dough": "Pâte", "item.create.electron_tube": "Tube électronique", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Schéma vide", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Filtre", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "Plaque de Fer", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "Quartz rose poli", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Hélice", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Filtre", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -839,7 +837,23 @@ "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.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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é", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 33f8cd547..299ac1c3a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 396", + "_": "Missing Localizations: 412", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "Involucro di Rame", "block.create.copper_ore": "Rame Grezzo", "block.create.copper_shingles": "Tegole di Rame", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Creatore Cannoneschematico", "block.create.creative_motor": "Motore", "block.create.crushing_wheel": "Ruota di Frantumazione", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Pilastro di Dolomite", "block.create.encased_belt": "Nastro Incassato", "block.create.encased_fan": "Ventilatore incassato", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Riduttore", "block.create.gearshift": "Cambio", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "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", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Supporto Meccanico", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "Contatto Redstone", "block.create.redstone_link": "Collegamento Redstone", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "Corda", "block.create.rope_pulley": "Puleggia della Corda", @@ -327,8 +325,10 @@ "block.create.scoria_pillar": "Pilastro di Scoria", "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", "block.create.sequenced_gearshift": "Cambio Sequenziale", + "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Albero", "block.create.speedometer": "Tachimetro", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "Pistome Meccanico Appiccicoso", @@ -336,14 +336,9 @@ "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", @@ -385,6 +380,7 @@ "item.create.deforester": "Deforestatore", "item.create.dough": "Impasto", "item.create.electron_tube": "Valvola", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Schematica Vuota", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Filtro", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "Lamiera di Ferro", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "Quarzo Rosa Levigato", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Elica", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Filtro", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -839,7 +837,23 @@ "create.tooltip.generationSpeed": "Genera %1$s %2$s", "create.tooltip.analogStrength": "Forza Analogica: %1$s/15", - "create.mechanical_mixer.min_ingredients": "Ingredienti Min.", + "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index dc910a63d..4c339d77d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 391", + "_": "Missing Localizations: 407", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "銅ケーシング", "block.create.copper_ore": "銅鉱石", "block.create.copper_shingles": "銅のこけら板", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "概略図砲クリエティフィアー", "block.create.creative_motor": "モーター", "block.create.crushing_wheel": "破砕ホイール", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "苦灰石の柱", "block.create.encased_belt": "ケース入りベルト", "block.create.encased_fan": "ケース入りファン", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "花崗岩レンガ", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "メカニカルベアリング", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "レッドストーンコンタクト", "block.create.redstone_link": "レッドストーンリンク", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "ロープ", "block.create.rope_pulley": "ローププーリー", @@ -327,8 +325,10 @@ "block.create.scoria_pillar": "スコリアの柱", "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", "block.create.sequenced_gearshift": "シーケンスギアシフト", + "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "軸", "block.create.speedometer": "スピードメーター", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", @@ -336,14 +336,9 @@ "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": "風化した石灰岩レンガ", @@ -385,6 +380,7 @@ "item.create.deforester": "デフォレスター", "item.create.dough": "生地", "item.create.electron_tube": "電子管", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "空の概略図", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "フィルター", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "鉄板", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "プロペラ", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "フィルタ", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -839,7 +837,23 @@ "create.tooltip.generationSpeed": "%1$s %2$sを生成", "create.tooltip.analogStrength": "アナログ強度: %1$s/15", - "create.mechanical_mixer.min_ingredients": "最小 材料", + "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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": "回転したとき", @@ -1293,24 +1289,6 @@ "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": "パッシブベルト引っ張り", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index a13eeb763..fc1468e89 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 396", + "_": "Missing Localizations: 412", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "구리 케이스", "block.create.copper_ore": "구리 광석", "block.create.copper_shingles": "구리 판자", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "청사진 대포 지원기", "block.create.creative_motor": "모터", "block.create.crushing_wheel": "분쇄 휠", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "백운암 기둥", "block.create.encased_belt": "덮힌 벨트", "block.create.encased_fan": "덮힌 환풍기", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "기어박스", "block.create.gearshift": "기어쉬프트", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "화강암 벽돌", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "베어링", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "동형 감지기", "block.create.redstone_link": "레드스톤 링크", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "밧줄", "block.create.rope_pulley": "밧줄 도르래", @@ -327,8 +325,10 @@ "block.create.scoria_pillar": "스코리아 기둥", "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", "block.create.sequenced_gearshift": "순서 기어쉬프트", + "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "축", "block.create.speedometer": "속도 계측기", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", @@ -336,14 +336,9 @@ "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": "풍화된 석회암 벽돌", @@ -385,6 +380,7 @@ "item.create.deforester": "산림파괴자", "item.create.dough": "반죽", "item.create.electron_tube": "전지 튜브", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "빈 청사진", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "필터 틀", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "철 판", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "프로펠러", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "필터", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "주파수. #1", "create.logistics.secondFrequency": "주파수. #2", @@ -839,7 +837,23 @@ "create.tooltip.generationSpeed": "%1$s %2$s만큼 발전함", "create.tooltip.analogStrength": "레드스톤 출력: %1$s/15", - "create.mechanical_mixer.min_ingredients": "최소 재료 종류", + "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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": "회전될 때", @@ -1293,24 +1289,6 @@ "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": "움직이는 벨트위에 있을 때", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 5c76d94ae..a120cfccd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 746", + "_": "Missing Localizations: 742", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Bouwtekeningkannon Creatiefeerder", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Verpulveraar", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Dolomiet Pilaar", "block.create.encased_belt": "Omhulsde Transportband", "block.create.encased_fan": "Omhulsde Ventilator", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Versnellingsbak", "block.create.gearshift": "Versnellingspook", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "Granietstenen", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Mechanische Lager", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "Redstone redstone_contact", "block.create.redstone_link": "Redstone Brug", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", @@ -327,8 +325,10 @@ "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.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Drijfas", "block.create.speedometer": "Snelheidsmeter", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "Mechanische Zuiger", @@ -336,14 +336,9 @@ "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", @@ -385,6 +380,7 @@ "item.create.deforester": "Ontbosser", "item.create.dough": "Deeg", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Lege bouwtekening", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Filter", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "IJzeren Platen", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Propeller", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -516,7 +513,7 @@ "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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Filter", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -839,7 +837,23 @@ "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.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4472e40cc..f1753a13b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 816", + "_": "Missing Localizations: 811", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Criativador Esquemaannon", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Roda de Moer", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Pilar de Dolomite", "block.create.encased_belt": "Esteira Revestida", "block.create.encased_fan": "Ventilador Revestida", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Caixa de Transmissão", "block.create.gearshift": "Câmbio", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "Tijolos de Granito", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Rolamento Mecânico", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "Contato de Redstone", "block.create.redstone_link": "Conexão de Redstone", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", @@ -327,8 +325,10 @@ "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.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Eixo", "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spout": "UNLOCALIZED: Spout", "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", @@ -336,14 +336,9 @@ "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", @@ -385,6 +380,7 @@ "item.create.deforester": "UNLOCALIZED: Deforester", "item.create.dough": "Massa", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Esquema vazio", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Filtro", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "Placas de Ferro", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Hélice", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -516,7 +513,7 @@ "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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -533,7 +530,7 @@ "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_sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Filtros", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "UNLOCALIZED: Freq. #1", "create.logistics.secondFrequency": "UNLOCALIZED: Freq. #2", @@ -839,7 +837,23 @@ "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.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 72bf40dd8..4ea84c952 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 810", + "_": "Missing Localizations: 805", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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", @@ -30,12 +29,11 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "Креативный ящик", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Дробильное колесо", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "Доломитовая колонна", "block.create.encased_belt": "Ленточный привод", "block.create.encased_fan": "Вентилятор", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "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", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gearbox": "Муфта", "block.create.gearshift": "Реверсивная муфта", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "Гранитные кирпичи", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", @@ -192,8 +192,6 @@ "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.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Механический подшипник", @@ -236,7 +234,6 @@ "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", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "Контактное соединение", "block.create.redstone_link": "Сигнальное соединение", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", @@ -327,8 +325,10 @@ "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.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Вал", "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.sticky_mechanical_piston": "Липкий механический поршень", @@ -336,14 +336,9 @@ "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": "Кирпичи из обветренного известняка", @@ -385,6 +380,7 @@ "item.create.deforester": "UNLOCALIZED: Deforester", "item.create.dough": "Тесто", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "Пустая схема", "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", "item.create.filter": "Фильтр", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "Железная пластина", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Пропеллер", @@ -458,7 +455,7 @@ "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.mechanical_saw.desc": "UNLOCALIZED: Place and power a 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", @@ -516,7 +513,7 @@ "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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -533,7 +530,7 @@ "create.recipe.pressing": "Механический пресс", "create.recipe.mixing": "UNLOCALIZED: Mixing", "create.recipe.packing": "UNLOCALIZED: Compacting", - "create.recipe.mechanical_sawing": "UNLOCALIZED: mechanical_sawing", + "create.recipe.mechanical_sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Портативный размещатель блоков", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", "create.logistics.filter": "Фильтр", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "Част. #1", "create.logistics.secondFrequency": "Част. #2", @@ -839,7 +837,23 @@ "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.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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", @@ -1293,24 +1289,6 @@ "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", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 819593e4d..de1d2d829 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 72", + "_": "Missing Localizations: 92", "_": "->------------------------] Game Elements [------------------------<-", @@ -16,7 +16,6 @@ "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": "安山岩圆石楼梯", @@ -30,12 +29,11 @@ "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.blaze_heater": "UNLOCALIZED: Blaze Heater", + "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "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.brown_seat": "UNLOCALIZED: Brown Seat", @@ -54,6 +52,7 @@ "block.create.copper_casing": "铜机壳", "block.create.copper_ore": "铜矿石", "block.create.copper_shingles": "铜瓦", + "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.creative_crate": "创造板条箱", "block.create.creative_motor": "创造马达", "block.create.crushing_wheel": "粉碎轮", @@ -95,8 +94,8 @@ "block.create.dolomite_pillar": "竖纹白云岩", "block.create.encased_belt": "连携齿轮箱", "block.create.encased_fan": "鼓风机", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "block.create.encased_shaft": "齿轮箱", - "block.create.extractor": "提取器", "block.create.fancy_andesite_bricks": "方纹安山岩砖", "block.create.fancy_andesite_bricks_slab": "方纹安山岩砖台阶", "block.create.fancy_andesite_bricks_stairs": "方纹安山岩砖楼梯", @@ -151,6 +150,7 @@ "block.create.gabbro_pillar": "竖纹辉长岩", "block.create.gearbox": "十字齿轮箱", "block.create.gearshift": "红石齿轮箱", + "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.granite_bricks": "花岗岩砖", "block.create.granite_bricks_slab": "花岗岩砖台阶", "block.create.granite_bricks_stairs": "花岗岩砖楼梯", @@ -192,8 +192,6 @@ "block.create.limestone_cobblestone_wall": "石灰岩圆石墙", "block.create.limestone_pillar": "竖纹石灰岩", "block.create.linear_chassis": "机壳底盘", - "block.create.linked_extractor": "无线提取器", - "block.create.linked_transposer": "无线传输器", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "动力轴承", @@ -236,7 +234,6 @@ "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": "安山岩铺路石楼梯", @@ -309,6 +306,7 @@ "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.redstone_contact": "信号检测器", "block.create.redstone_link": "无限红石信号终端", + "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.rope": "绳索", "block.create.rope_pulley": "绳索滑轮", @@ -327,8 +325,10 @@ "block.create.scoria_pillar": "竖纹熔渣", "block.create.secondary_linear_chassis": "机壳底盘2号", "block.create.sequenced_gearshift": "可编程齿轮箱", + "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "传动杆", "block.create.speedometer": "速度表", + "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "云杉窗户", "block.create.spruce_window_pane": "云杉窗户板", "block.create.sticky_mechanical_piston": "粘性动力活塞", @@ -336,14 +336,9 @@ "block.create.stressometer": "应力表", "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗板", - "block.create.transposer": "传输器", "block.create.turntable": "转盘", - "block.create.vertical_extractor": "竖直提取器", "block.create.vertical_framed_glass": "竖直边框玻璃", "block.create.vertical_framed_glass_pane": "竖直边框玻璃板", - "block.create.vertical_linked_extractor": "竖直无限提取器", - "block.create.vertical_linked_transposer": "竖直无线传输器", - "block.create.vertical_transposer": "竖直传输器", "block.create.water_wheel": "水车", "block.create.weathered_limestone": "风化石灰岩", "block.create.weathered_limestone_bricks": "风化石灰岩砖", @@ -385,6 +380,7 @@ "item.create.deforester": "树林毁灭者", "item.create.dough": "面团", "item.create.electron_tube": "电子管", + "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", "item.create.empty_schematic": "空白蓝图", "item.create.extendo_grip": "伸缩机械手", "item.create.filter": "过滤器", @@ -398,6 +394,7 @@ "item.create.iron_sheet": "铁板", "item.create.lapis_sheet": "青金石板", "item.create.minecart_contraption": "装配过的矿车", + "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "磨制玫瑰石英", "item.create.powdered_obsidian": "黑曜石粉末", "item.create.propeller": "扇叶", @@ -645,6 +642,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "结构方向保持不变", "create.logistics.filter": "过滤器", + "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.firstFrequency": "频道. #1", "create.logistics.secondFrequency": "频道. #2", @@ -839,7 +837,23 @@ "create.tooltip.generationSpeed": "产生 %1$s %2$s", "create.tooltip.analogStrength": "调节强度: %1$s/15", - "create.mechanical_mixer.min_ingredients": "最少物品种类数", + "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", + "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + + "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", + "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", + "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", + "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", + "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1268,24 +1282,6 @@ "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": "被供能时", @@ -1293,24 +1289,6 @@ "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": "提取传送带物品", 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 index da858b2fc..f79ae5977 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/andesite_casing", + "particle": "block/polished_andesite", "2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", - "4": "create:block/andesite_funnel_plating" + "5": "create:block/andesite_funnel_tall", + "6": "create:block/andesite_funnel", + "7": "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_powered_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json new file mode 100644 index 000000000..4475b476b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "block/polished_andesite", + "2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "5": "create:block/andesite_funnel_tall_powered", + "6": "create:block/andesite_funnel_powered", + "7": "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_powered_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json new file mode 100644 index 000000000..4ade59fc5 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "block/polished_andesite", + "2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "5": "create:block/andesite_funnel_tall_powered", + "6": "create:block/andesite_funnel_powered", + "7": "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 index 67b96635e..f77372c76 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/andesite_casing", + "particle": "block/polished_andesite", "2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", - "4": "create:block/andesite_funnel_plating" + "5": "create:block/andesite_funnel_tall", + "6": "create:block/andesite_funnel", + "7": "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 index 105a02ccb..75b27092e 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/andesite_casing", + "particle": "block/polished_andesite", "2": "create:block/andesite_funnel_push", "3": "create:block/andesite_funnel_back", - "4": "create:block/andesite_funnel_plating" + "5": "create:block/andesite_funnel_tall", + "6": "create:block/andesite_funnel", + "7": "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_powered_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_extended.json new file mode 100644 index 000000000..9921a4309 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_extended.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/belt_funnel/block_extended", + "textures": { + "particle": "block/polished_andesite", + "2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "5": "create:block/andesite_funnel_tall_powered", + "6": "create:block/andesite_funnel_powered", + "7": "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_powered_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json new file mode 100644 index 000000000..38a2f735a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/belt_funnel/block_retracted", + "textures": { + "particle": "block/polished_andesite", + "2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "5": "create:block/andesite_funnel_tall_powered", + "6": "create:block/andesite_funnel_powered", + "7": "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 index 1284e8489..91e243db3 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/andesite_casing", + "particle": "block/polished_andesite", "2": "create:block/andesite_funnel_push", "3": "create:block/andesite_funnel_back", - "4": "create:block/andesite_funnel_plating" + "5": "create:block/andesite_funnel_tall", + "6": "create:block/andesite_funnel", + "7": "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 deleted file mode 100644 index 4561dbc7a..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_chute_funnel_pull.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 deleted file mode 100644 index 5e9dde5b1..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_chute_funnel_push.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 index d16aeb312..1161539b1 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel.json @@ -1,9 +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" + "0": "create:block/andesite_funnel_plating", + "1": "create:block/andesite_casing", + "2": "create:block/andesite_funnel", + "3": "create:block/andesite_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json new file mode 100644 index 000000000..a2a451715 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json @@ -0,0 +1,9 @@ +{ + "parent": "create:block/funnel/block", + "textures": { + "0": "create:block/andesite_funnel_plating", + "1": "create:block/andesite_casing", + "2": "create:block/andesite_funnel_powered", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json index 744a196ce..fadd65788 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/brass_casing", + "particle": "create:block/brass_block", "2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "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 index aa5aa7d49..5133a0a73 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/brass_casing", - "2": "create:block/brass_funnel_pull_powered", + "particle": "create:block/brass_block", + "2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall_powered", + "6": "create:block/brass_funnel_powered", + "7": "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 index 6bdee09e6..d64a5168c 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/brass_casing", - "2": "create:block/brass_funnel_pull_powered", + "particle": "create:block/brass_block", + "2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall_powered", + "6": "create:block/brass_funnel_powered", + "7": "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 index 8121dc133..b4e776036 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/brass_casing", + "particle": "create:block/brass_block", "2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "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 index a52556ff0..98a177099 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/brass_casing", + "particle": "create:block/brass_block", "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "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 index aa3f44366..455499d7f 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_extended", "textures": { - "particle": "create:block/brass_casing", - "2": "create:block/brass_funnel_push_powered", + "particle": "create:block/brass_block", + "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall_powered", + "6": "create:block/brass_funnel_powered", + "7": "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 index fc08d9de8..c5d444dd5 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/brass_casing", - "2": "create:block/brass_funnel_push_powered", + "particle": "create:block/brass_block", + "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall_powered", + "6": "create:block/brass_funnel_powered", + "7": "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 index 9dcab1608..4f23ee54f 100644 --- 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 @@ -1,9 +1,11 @@ { "parent": "create:block/belt_funnel/block_retracted", "textures": { - "particle": "create:block/brass_casing", + "particle": "create:block/brass_block", "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating" + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "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 deleted file mode 100644 index f5621e7c1..000000000 --- a/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 deleted file mode 100644 index 4905bfe91..000000000 --- a/src/generated/resources/assets/create/models/block/brass_chute_funnel_pull_powered.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 deleted file mode 100644 index c7fa3fa20..000000000 --- a/src/generated/resources/assets/create/models/block/brass_chute_funnel_push.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 deleted file mode 100644 index 549934816..000000000 --- a/src/generated/resources/assets/create/models/block/brass_chute_funnel_push_powered.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "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 index 959b75b9a..82a6b28f3 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel.json @@ -1,9 +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" + "0": "create:block/brass_funnel_plating", + "1": "create:block/brass_casing", + "2": "create:block/brass_funnel", + "3": "create:block/brass_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_powered.json index d1e5a5f36..6085c2466 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel_powered.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel_powered.json @@ -1,9 +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" + "0": "create:block/brass_funnel_plating", + "1": "create:block/brass_casing", + "2": "create:block/brass_funnel_powered", + "3": "create:block/brass_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/encased_fluid_pipe.json b/src/generated/resources/assets/create/models/block/encased_fluid_pipe.json new file mode 100644 index 000000000..a8aad1994 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/encased_fluid_pipe.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_column", + "textures": { + "side": "create:block/copper_casing", + "end": "create:block/encased_pipe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_0.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_0.json new file mode 100644 index 000000000..985bdda17 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_0.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_1.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_1.json new file mode 100644 index 000000000..d1e42e0aa --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_2.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_2.json new file mode 100644 index 000000000..2797d2042 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_3.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_3.json new file mode 100644 index 000000000..52ed6ae16 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_4.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_4.json new file mode 100644 index 000000000..1c687ae01 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_5.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_5.json new file mode 100644 index 000000000..31635b811 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_6.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_6.json new file mode 100644 index 000000000..ba3ee95fd --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_7.json b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_7.json new file mode 100644 index 000000000..8b860acd2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/oxidized/copper_tiles_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/oxidized/copper_tiles_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/refined_radiance_casing.json b/src/generated/resources/assets/create/models/block/refined_radiance_casing.json new file mode 100644 index 000000000..de2fbfba0 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/refined_radiance_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/refined_radiance_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/shadow_steel_casing.json b/src/generated/resources/assets/create/models/block/shadow_steel_casing.json new file mode 100644 index 000000000..17d607c17 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/shadow_steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/shadow_steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_funnel.json b/src/generated/resources/assets/create/models/item/andesite_funnel.json index b3601a41f..f0e8e8481 100644 --- a/src/generated/resources/assets/create/models/item/andesite_funnel.json +++ b/src/generated/resources/assets/create/models/item/andesite_funnel.json @@ -1,9 +1,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" + "0": "create:block/andesite_funnel_plating", + "1": "create:block/andesite_casing", + "2": "create:block/andesite_funnel", + "3": "create:block/andesite_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blaze_burner.json b/src/generated/resources/assets/create/models/item/blaze_burner.json new file mode 100644 index 000000000..79214d256 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/blaze_burner.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/blaze_burner/block_with_blaze" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blaze_heater.json b/src/generated/resources/assets/create/models/item/blaze_heater.json deleted file mode 100644 index 40a3c3428..000000000 --- a/src/generated/resources/assets/create/models/item/blaze_heater.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/blaze_heater/block" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_funnel.json b/src/generated/resources/assets/create/models/item/brass_funnel.json index 3e7642b35..82e8d4035 100644 --- a/src/generated/resources/assets/create/models/item/brass_funnel.json +++ b/src/generated/resources/assets/create/models/item/brass_funnel.json @@ -1,9 +1,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" + "0": "create:block/brass_funnel_plating", + "1": "create:block/brass_casing", + "2": "create:block/brass_funnel", + "3": "create:block/brass_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_tiles.json b/src/generated/resources/assets/create/models/item/copper_tiles.json new file mode 100644 index 000000000..943873f28 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/copper_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/oxidized/copper_tiles_0" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/empty_blaze_burner.json b/src/generated/resources/assets/create/models/item/empty_blaze_burner.json new file mode 100644 index 000000000..a1a7275c1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/empty_blaze_burner.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/blaze_burner/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/encased_shaft.json b/src/generated/resources/assets/create/models/item/encased_shaft.json deleted file mode 100644 index 479412d0e..000000000 --- a/src/generated/resources/assets/create/models/item/encased_shaft.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/encased_shaft/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/extractor.json b/src/generated/resources/assets/create/models/item/extractor.json deleted file mode 100644 index b1020a4b7..000000000 --- a/src/generated/resources/assets/create/models/item/extractor.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/extractor/horizontal" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/linked_extractor.json b/src/generated/resources/assets/create/models/item/linked_extractor.json deleted file mode 100644 index 496b86e3f..000000000 --- a/src/generated/resources/assets/create/models/item/linked_extractor.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/extractor/horizontal_linked" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/linked_transposer.json b/src/generated/resources/assets/create/models/item/linked_transposer.json deleted file mode 100644 index 6cee96fc1..000000000 --- a/src/generated/resources/assets/create/models/item/linked_transposer.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/transposer/horizontal_linked" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/minecart_coupling.json b/src/generated/resources/assets/create/models/item/minecart_coupling.json new file mode 100644 index 000000000..2f2f7a357 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/minecart_coupling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/minecart_coupling" + } +} \ 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 deleted file mode 100644 index 18467506e..000000000 --- a/src/generated/resources/assets/create/models/item/packager.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/packager/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/refined_radiance_casing.json b/src/generated/resources/assets/create/models/item/refined_radiance_casing.json new file mode 100644 index 000000000..46393f46b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/refined_radiance_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/refined_radiance_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/shadow_steel_casing.json b/src/generated/resources/assets/create/models/item/shadow_steel_casing.json new file mode 100644 index 000000000..3d0f22343 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/shadow_steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/shadow_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/spout.json b/src/generated/resources/assets/create/models/item/spout.json new file mode 100644 index 000000000..39d2503dc --- /dev/null +++ b/src/generated/resources/assets/create/models/item/spout.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/spout/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/transposer.json b/src/generated/resources/assets/create/models/item/transposer.json deleted file mode 100644 index 0fedb1b93..000000000 --- a/src/generated/resources/assets/create/models/item/transposer.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/transposer/block" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_framed_glass.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_framed_glass.json new file mode 100644 index 000000000..57ba85b42 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_framed_glass.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_from_framed_glass" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:framed_glass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_from_framed_glass" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_horizontal_framed_glass.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_horizontal_framed_glass.json new file mode 100644 index 000000000..ff70d5217 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_horizontal_framed_glass.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_from_horizontal_framed_glass" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:horizontal_framed_glass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_from_horizontal_framed_glass" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_tiled_glass.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_tiled_glass.json new file mode 100644 index 000000000..b7168a3e6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_tiled_glass.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_from_tiled_glass" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:tiled_glass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_from_tiled_glass" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_vertical_framed_glass.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_vertical_framed_glass.json new file mode 100644 index 000000000..fbdd5272a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/smelting/glass_from_vertical_framed_glass.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_from_vertical_framed_glass" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:vertical_framed_glass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_from_vertical_framed_glass" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/blasting/brass_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/brass_ingot_from_crushed.json new file mode 100644 index 000000000..410b71e13 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/brass_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/brass_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/brass_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_crushed.json new file mode 100644 index 000000000..e77c1492d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/copper_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_copper_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/copper_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_ore.json b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_ore.json new file mode 100644 index 000000000..3a12efed5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/copper_ingot_from_ore.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/copper_ingot_from_ore" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ores/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/copper_ingot_from_ore" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json new file mode 100644 index 000000000..fd559fe51 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/zinc_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_zinc_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/zinc_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json new file mode 100644 index 000000000..414b2ee11 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/zinc_ingot_from_ore" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ores/zinc" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/zinc_ingot_from_ore" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/dough.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/dough.json new file mode 100644 index 000000000..86779905d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/dough.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/appliances/dough" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:wheat_flour" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/appliances/dough" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json new file mode 100644 index 000000000..1460cf305 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/appliances/tree_fertilizer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:bone_meal" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/appliances/tree_fertilizer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json new file mode 100644 index 000000000..31d8dbe0f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/curiosities/deforester" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:refined_radiance" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/curiosities/deforester" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json new file mode 100644 index 000000000..737429783 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/curiosities/handheld_blockzapper" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:refined_radiance" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/curiosities/handheld_blockzapper" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json new file mode 100644 index 000000000..872339a55 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/curiosities/minecart_coupling" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/curiosities/minecart_coupling" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/wand_of_symmetry.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/wand_of_symmetry.json new file mode 100644 index 000000000..f5918fa59 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/wand_of_symmetry.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/curiosities/wand_of_symmetry" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:refined_radiance" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/curiosities/wand_of_symmetry" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/adjustable_pulley.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/adjustable_pulley.json new file mode 100644 index 000000000..bd3ef5755 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/adjustable_pulley.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/adjustable_pulley" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/adjustable_pulley" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/analog_lever.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/analog_lever.json new file mode 100644 index 000000000..bc41f412f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/analog_lever.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/analog_lever" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/analog_lever" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/attribute_filter.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/attribute_filter.json new file mode 100644 index 000000000..5b1c63f80 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/attribute_filter.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/attribute_filter" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/attribute_filter" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/basin.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/basin.json new file mode 100644 index 000000000..d3d5254a9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/basin.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/basin" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/basin" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json new file mode 100644 index 000000000..940d1e66b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/belt_connector" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/belt_connector" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json new file mode 100644 index 000000000..8b33d36c8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/black_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/black_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json new file mode 100644 index 000000000..bc08eddf1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/black_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/black_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json new file mode 100644 index 000000000..12b03d12c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/blue_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/blue_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json new file mode 100644 index 000000000..7542f5ed1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/blue_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/blue_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/brass_block.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json similarity index 76% rename from src/generated/resources/data/create/advancements/recipes/create.base/brass_block.json rename to src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json index be66d995f..e5820fd02 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.base/brass_block.json +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json @@ -2,11 +2,11 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "create:brass_block" + "create:crafting/kinetics/brass_hand" ] }, "criteria": { - "has_ingots_brass": { + "has_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -19,13 +19,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "create:brass_block" + "recipe": "create:crafting/kinetics/brass_hand" } } }, "requirements": [ [ - "has_ingots_brass", + "has_item", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json new file mode 100644 index 000000000..e9a468d07 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/brown_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/brown_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json new file mode 100644 index 000000000..c447060b5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/brown_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/brown_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json new file mode 100644 index 000000000..58d4e1f60 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/cart_assembler" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/cart_assembler" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/chute.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/chute.json new file mode 100644 index 000000000..b84c0238f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/chute.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/chute" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/chute" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json new file mode 100644 index 000000000..915720362 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/clockwork_bearing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/clockwork_bearing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json new file mode 100644 index 000000000..dc4233d60 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/clutch" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/clutch" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json new file mode 100644 index 000000000..9bac23b35 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/cogwheel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/cogwheel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json new file mode 100644 index 000000000..e62ac2d16 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/crafter_slot_cover" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:mechanical_crafter" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/crafter_slot_cover" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json new file mode 100644 index 000000000..75b3209d1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/cuckoo_clock" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/cuckoo_clock" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json new file mode 100644 index 000000000..33f80b748 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/cyan_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/cyan_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json new file mode 100644 index 000000000..44c2abd20 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/cyan_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/cyan_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json new file mode 100644 index 000000000..6e1b08c90 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/deployer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:electron_tube" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/deployer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/depot.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/depot.json new file mode 100644 index 000000000..ed24693db --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/depot.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/depot" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/depot" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json new file mode 100644 index 000000000..f65231625 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/empty_blaze_burner" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/empty_blaze_burner" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_belt.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_belt.json new file mode 100644 index 000000000..997177670 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_belt.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/encased_belt" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/encased_belt" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_fan.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_fan.json new file mode 100644 index 000000000..254e674ce --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/encased_fan.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/encased_fan" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/encased_fan" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/filter.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/filter.json new file mode 100644 index 000000000..36127869f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/filter.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/filter" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/filter" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/copper_block.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json similarity index 76% rename from src/generated/resources/data/create/advancements/recipes/create.base/copper_block.json rename to src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json index 4a7c13cc8..f4703e0d7 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.base/copper_block.json +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json @@ -2,11 +2,11 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "create:copper_block" + "create:crafting/kinetics/fluid_pipe" ] }, "criteria": { - "has_ingots_copper": { + "has_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -19,13 +19,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "create:copper_block" + "recipe": "create:crafting/kinetics/fluid_pipe" } } }, "requirements": [ [ - "has_ingots_copper", + "has_item", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json new file mode 100644 index 000000000..4fa9e9078 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/fluid_tank" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/fluid_tank" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json new file mode 100644 index 000000000..a90a76b6d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gearbox" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:cogwheel" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gearbox" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json new file mode 100644 index 000000000..a22051fca --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gearboxfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:vertical_gearbox" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gearboxfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json new file mode 100644 index 000000000..7f05dd1ef --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gearshift" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gearshift" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json new file mode 100644 index 000000000..c3769977b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/goggles" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/goggles" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json new file mode 100644 index 000000000..ce163d657 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gray_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gray_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json new file mode 100644 index 000000000..45425f867 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gray_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gray_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json new file mode 100644 index 000000000..bec63bbd5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/green_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/green_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json new file mode 100644 index 000000000..155141a47 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/green_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/green_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json new file mode 100644 index 000000000..950138e6b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/hand_crank" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/hand_crank" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json new file mode 100644 index 000000000..6eb279257 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/large_cogwheel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/large_cogwheel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json new file mode 100644 index 000000000..dd453757e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/light_blue_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/light_blue_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json new file mode 100644 index 000000000..247c9f705 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/light_blue_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/light_blue_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json new file mode 100644 index 000000000..cf106ea91 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/light_gray_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/light_gray_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json new file mode 100644 index 000000000..031031752 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/light_gray_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/light_gray_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json new file mode 100644 index 000000000..3bb7b2351 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/lime_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/lime_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json new file mode 100644 index 000000000..9847e3d68 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/lime_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/lime_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json new file mode 100644 index 000000000..4b407eeb8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/linear_chassis" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/linear_chassis" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json new file mode 100644 index 000000000..5c743bfea --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/linear_chassisfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:secondary_linear_chassis" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/linear_chassisfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json new file mode 100644 index 000000000..9fede11b2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/magenta_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/magenta_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json new file mode 100644 index 000000000..9ad0ba711 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/magenta_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/magenta_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json new file mode 100644 index 000000000..48659ec96 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_bearing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_bearing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json new file mode 100644 index 000000000..8e1b56912 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_crafter" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_crafter" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json new file mode 100644 index 000000000..ff0ca6c5f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_drill" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_drill" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_harvester.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_harvester.json new file mode 100644 index 000000000..ce9082be8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_harvester.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_harvester" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_harvester" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_mixer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_mixer.json new file mode 100644 index 000000000..10be909fe --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_mixer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_mixer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_mixer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_piston.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_piston.json new file mode 100644 index 000000000..cb7d41f62 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_piston.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_piston" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_piston" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_plough.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_plough.json new file mode 100644 index 000000000..0e325efed --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_plough.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_plough" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_plough" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json new file mode 100644 index 000000000..2989a2c45 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_press" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_press" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json new file mode 100644 index 000000000..739f21b8b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_pump" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_pump" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json new file mode 100644 index 000000000..7075156fc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mechanical_saw" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mechanical_saw" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/millstone.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/millstone.json new file mode 100644 index 000000000..5a3c3cd47 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/millstone.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/millstone" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/millstone" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mysterious_cuckoo_clock.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mysterious_cuckoo_clock.json new file mode 100644 index 000000000..c84de36a0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mysterious_cuckoo_clock.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/mysterious_cuckoo_clock" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:cuckoo_clock" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/mysterious_cuckoo_clock" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json new file mode 100644 index 000000000..7ed52dce6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/nozzle" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:encased_fan" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/nozzle" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json new file mode 100644 index 000000000..da6145b74 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/orange_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/orange_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json new file mode 100644 index 000000000..8fed16498 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/orange_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/orange_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json new file mode 100644 index 000000000..1881091f9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/pink_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/pink_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json new file mode 100644 index 000000000..51063b0e4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/pink_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/pink_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json new file mode 100644 index 000000000..90d079a23 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/piston_extension_pole" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/piston_extension_pole" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json new file mode 100644 index 000000000..e1302e947 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/propeller" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/propeller" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json new file mode 100644 index 000000000..3fdf3cb66 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/purple_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/purple_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json new file mode 100644 index 000000000..90e363ce7 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/purple_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/purple_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json new file mode 100644 index 000000000..c98a0269a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/radial_chassis" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/radial_chassis" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json new file mode 100644 index 000000000..fb6ce3f63 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/red_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/red_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json new file mode 100644 index 000000000..241b9ca0d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/red_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/red_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json new file mode 100644 index 000000000..18e1b7f63 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/rope_pulley" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/rope_pulley" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json new file mode 100644 index 000000000..84663da4e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/rotation_speed_controller" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/rotation_speed_controller" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json new file mode 100644 index 000000000..ea7429cb0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/secondary_linear_chassisfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:linear_chassis" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/secondary_linear_chassisfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json new file mode 100644 index 000000000..6a11ee4e5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/sequenced_gearshift" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/sequenced_gearshift" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json new file mode 100644 index 000000000..bedb0be0e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/shaft" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/shaft" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json new file mode 100644 index 000000000..666e65f86 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/speedometer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/speedometer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json new file mode 100644 index 000000000..d8b6f2aa0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/speedometerfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:stressometer" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/speedometerfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/spout.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/spout.json new file mode 100644 index 000000000..2129ec94f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/spout.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/spout" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/spout" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json new file mode 100644 index 000000000..d9e54a733 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/sticky_mechanical_piston" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/sticky_mechanical_piston" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json new file mode 100644 index 000000000..173e1a4ee --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/stressometerfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:speedometer" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/stressometerfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json new file mode 100644 index 000000000..6027a950d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/super_glue" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/super_glue" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json new file mode 100644 index 000000000..ba0f5449a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/turntable" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/turntable" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json new file mode 100644 index 000000000..e4116fd6f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/vertical_gearboxfrom_conversion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:gearbox" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/vertical_gearboxfrom_conversion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json new file mode 100644 index 000000000..ea79ab3f3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/water_wheel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/water_wheel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json new file mode 100644 index 000000000..f733a21ae --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/whisk" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/whisk" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json new file mode 100644 index 000000000..8c0d2ca84 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/white_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/white_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json new file mode 100644 index 000000000..a340aaddf --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/white_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/white_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json new file mode 100644 index 000000000..5efe4f99d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/wrench" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/wrench" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json new file mode 100644 index 000000000..c94918cee --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/yellow_seat" + ] + }, + "criteria": { + "has_wool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/yellow_seat" + } + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json new file mode 100644 index 000000000..e800461bd --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/yellow_seat_from_other_seat" + ] + }, + "criteria": { + "has_seat": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "create:seats" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/yellow_seat_from_other_seat" + } + } + }, + "requirements": [ + [ + "has_seat", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json new file mode 100644 index 000000000..842f64e5d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/adjustable_crate" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/adjustable_crate" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json new file mode 100644 index 000000000..72a52cf20 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/adjustable_pulse_repeater" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/adjustable_pulse_repeater" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json new file mode 100644 index 000000000..ede7f6671 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/adjustable_repeater" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/adjustable_repeater" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json new file mode 100644 index 000000000..2ac237ac1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/andesite_funnel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/andesite_funnel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json new file mode 100644 index 000000000..6d7ae3a09 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/andesite_tunnel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/andesite_tunnel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json new file mode 100644 index 000000000..9e9f647d0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/belt_observer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:belt_connector" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/belt_observer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json new file mode 100644 index 000000000..d75f4efd1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/brass_funnel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/brass_funnel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json new file mode 100644 index 000000000..b3b828e95 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/brass_tunnel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/brass_tunnel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json new file mode 100644 index 000000000..c08220645 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/powered_latch" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/powered_latch" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json new file mode 100644 index 000000000..e85619653 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/powered_toggle_latch" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/powered_toggle_latch" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json new file mode 100644 index 000000000..555126dbf --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/pulse_repeater" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/pulse_repeater" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_contact.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_contact.json new file mode 100644 index 000000000..a403d3928 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_contact.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/redstone_contact" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/redstone_contact" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_link.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_link.json new file mode 100644 index 000000000..cdc2d55a7 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/redstone_link.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/redstone_link" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/redstone_link" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/stockpile_switch.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/stockpile_switch.json new file mode 100644 index 000000000..1bdcdc4d8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/stockpile_switch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/logistics/stockpile_switch" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/logistics/stockpile_switch" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy.json new file mode 100644 index 000000000..0075e033a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/andesite_alloy" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/iron" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/andesite_alloy" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/zinc_block.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy_from_zinc.json similarity index 72% rename from src/generated/resources/data/create/advancements/recipes/create.base/zinc_block.json rename to src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy_from_zinc.json index d6035f242..355a2c166 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.base/zinc_block.json +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_alloy_from_zinc.json @@ -2,11 +2,11 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "create:zinc_block" + "create:crafting/materials/andesite_alloy_from_zinc" ] }, "criteria": { - "has_ingots_zinc": { + "has_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -19,13 +19,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "create:zinc_block" + "recipe": "create:crafting/materials/andesite_alloy_from_zinc" } } }, "requirements": [ [ - "has_ingots_zinc", + "has_item", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_casing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_casing.json new file mode 100644 index 000000000..c727d9a07 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/andesite_casing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/andesite_casing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/andesite_casing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_block_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_block_from_compacting.json new file mode 100644 index 000000000..c82f846bd --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_block_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/brass_block_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/brass_block_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_casing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_casing.json new file mode 100644 index 000000000..120f69022 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_casing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/brass_casing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/brass_casing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_compacting.json new file mode 100644 index 000000000..21bea3329 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/brass_ingot_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_nugget" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/brass_ingot_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_decompacting.json new file mode 100644 index 000000000..b35715dd9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_ingot_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/brass_ingot_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_block" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/brass_ingot_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_nugget_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_nugget_from_decompacting.json new file mode 100644 index 000000000..00497b458 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/brass_nugget_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/brass_nugget_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:brass_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/brass_nugget_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_block_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_block_from_compacting.json new file mode 100644 index 000000000..b86bc2e39 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_block_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/copper_block_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/copper_block_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_casing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_casing.json new file mode 100644 index 000000000..138691b87 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_casing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/copper_casing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/copper_casing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_compacting.json new file mode 100644 index 000000000..41e28bdf2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/copper_ingot_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_nugget" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/copper_ingot_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_decompacting.json new file mode 100644 index 000000000..65b697c08 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_ingot_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/copper_ingot_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_block" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/copper_ingot_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_nugget_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_nugget_from_decompacting.json new file mode 100644 index 000000000..30d5b839d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/copper_nugget_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/copper_nugget_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/copper_nugget_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/electron_tube.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/electron_tube.json new file mode 100644 index 000000000..b966d9ca1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/electron_tube.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/electron_tube" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:rose_quartz" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/electron_tube" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/red_sand_paper.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/red_sand_paper.json new file mode 100644 index 000000000..95ac881ef --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/red_sand_paper.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/red_sand_paper" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:paper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/red_sand_paper" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/refined_radiance_casing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/refined_radiance_casing.json new file mode 100644 index 000000000..6f617c359 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/refined_radiance_casing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/refined_radiance_casing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:refined_radiance" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/refined_radiance_casing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/rose_quartz.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/rose_quartz.json new file mode 100644 index 000000000..13a8323bd --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/rose_quartz.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/rose_quartz" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/rose_quartz" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/sand_paper.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/sand_paper.json new file mode 100644 index 000000000..1eb4e0ed6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/sand_paper.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/sand_paper" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:paper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/sand_paper" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/shadow_steel_casing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/shadow_steel_casing.json new file mode 100644 index 000000000..289a24a47 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/shadow_steel_casing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/shadow_steel_casing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:shadow_steel" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/shadow_steel_casing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_block_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_block_from_compacting.json new file mode 100644 index 000000000..590a4f8dc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_block_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/zinc_block_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:zinc_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/zinc_block_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_compacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_compacting.json new file mode 100644 index 000000000..91df3c122 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_compacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/zinc_ingot_from_compacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:zinc_nugget" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/zinc_ingot_from_compacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_decompacting.json new file mode 100644 index 000000000..d21e09664 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/zinc_ingot_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:zinc_block" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/zinc_ingot_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_nugget_from_decompacting.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_nugget_from_decompacting.json new file mode 100644 index 000000000..fba56500c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/materials/zinc_nugget_from_decompacting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/materials/zinc_nugget_from_decompacting" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:zinc_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/materials/zinc_nugget_from_decompacting" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles.json new file mode 100644 index 000000000..7f4e014ea --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/palettes/copper_shingles" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/palettes/copper_shingles" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles_from_tiles.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles_from_tiles.json new file mode 100644 index 000000000..31eab5581 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_shingles_from_tiles.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/palettes/copper_shingles_from_tiles" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/palettes/copper_shingles_from_tiles" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_tiles.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_tiles.json new file mode 100644 index 000000000..e4f05fb0a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/palettes/copper_tiles.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/palettes/copper_tiles" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:plates/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/palettes/copper_tiles" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/empty_schematic.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/empty_schematic.json new file mode 100644 index 000000000..47e1f61c6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/empty_schematic.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/schematics/empty_schematic" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:paper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/schematics/empty_schematic" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_and_quill.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_and_quill.json new file mode 100644 index 000000000..65b6bb5ca --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_and_quill.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/schematics/schematic_and_quill" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:paper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/schematics/schematic_and_quill" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_table.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_table.json new file mode 100644 index 000000000..99ceda704 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematic_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/schematics/schematic_table" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:empty_schematic" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/schematics/schematic_table" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematicannon.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematicannon.json new file mode 100644 index 000000000..884da6481 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/schematics/schematicannon.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/schematics/schematicannon" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:empty_schematic" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/schematics/schematicannon" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/smelting/brass_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/brass_ingot_from_crushed.json new file mode 100644 index 000000000..10f3b5b11 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/brass_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/brass_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_brass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/brass_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_crushed.json new file mode 100644 index 000000000..99ea3d964 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/copper_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_copper_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/copper_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_ore.json b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_ore.json new file mode 100644 index 000000000..ee4c33734 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/copper_ingot_from_ore.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/copper_ingot_from_ore" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ores/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/copper_ingot_from_ore" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_crushed.json new file mode 100644 index 000000000..aaa7a23c4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/zinc_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_zinc_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/zinc_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_ore.json b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_ore.json new file mode 100644 index 000000000..bacea3a86 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_ore.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/zinc_ingot_from_ore" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ores/zinc" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/zinc_ingot_from_ore" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/crafting/palettes/dark_scoria.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/crafting/palettes/dark_scoria.json new file mode 100644 index 000000000..1b2379477 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/crafting/palettes/dark_scoria.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/palettes/dark_scoria" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:scoria" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/palettes/dark_scoria" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/dolomite.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/dolomite.json new file mode 100644 index 000000000..1789ee64f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/dolomite.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/dolomite" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:diorite" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/dolomite" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/gabbro.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/gabbro.json new file mode 100644 index 000000000..f364a84f2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/gabbro.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/gabbro" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:granite" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/gabbro" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/limestone.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/limestone.json new file mode 100644 index 000000000..dbbdfcd80 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/limestone.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/limestone" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:limesand" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/limestone" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria.json new file mode 100644 index 000000000..5aa882539 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/scoria" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:soul_sand" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/scoria" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json new file mode 100644 index 000000000..5c1a39fe9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_pane_from_framed_glass_pane" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:framed_glass_pane" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_pane_from_framed_glass_pane" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json new file mode 100644 index 000000000..edd18841d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_pane_from_horizontal_framed_glass_pane" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:horizontal_framed_glass_pane" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_pane_from_horizontal_framed_glass_pane" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_tiled_glass_pane.json b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_tiled_glass_pane.json new file mode 100644 index 000000000..bb117c8aa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_tiled_glass_pane.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_pane_from_tiled_glass_pane" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:tiled_glass_pane" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_pane_from_tiled_glass_pane" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_vertical_framed_glass_pane.json b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_vertical_framed_glass_pane.json new file mode 100644 index 000000000..b34edadad --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/smelting/glass_pane_from_vertical_framed_glass_pane.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/glass_pane_from_vertical_framed_glass_pane" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:vertical_framed_glass_pane" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/glass_pane_from_vertical_framed_glass_pane" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/food/campfire_cooking/bread.json b/src/generated/resources/data/create/advancements/recipes/food/campfire_cooking/bread.json new file mode 100644 index 000000000..c414d426d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/food/campfire_cooking/bread.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:campfire_cooking/bread" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dough" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:campfire_cooking/bread" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/food/smelting/bread.json b/src/generated/resources/data/create/advancements/recipes/food/smelting/bread.json new file mode 100644 index 000000000..21c56fea7 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/food/smelting/bread.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/bread" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dough" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/bread" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/food/smoking/bread.json b/src/generated/resources/data/create/advancements/recipes/food/smoking/bread.json new file mode 100644 index 000000000..3fae48586 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/food/smoking/bread.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smoking/bread" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dough" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smoking/bread" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/blasting/gold_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/misc/blasting/gold_ingot_from_crushed.json new file mode 100644 index 000000000..754653b9e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/blasting/gold_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/gold_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_gold_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/gold_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/blasting/iron_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/misc/blasting/iron_ingot_from_crushed.json new file mode 100644 index 000000000..b37458b98 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/blasting/iron_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:blasting/iron_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_iron_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:blasting/iron_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json new file mode 100644 index 000000000..cca3322ad --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/appliances/slime_ball" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dough" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/appliances/slime_ball" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/smelting/gold_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/misc/smelting/gold_ingot_from_crushed.json new file mode 100644 index 000000000..aabdd6527 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/smelting/gold_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/gold_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_gold_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/gold_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/smelting/iron_ingot_from_crushed.json b/src/generated/resources/data/create/advancements/recipes/misc/smelting/iron_ingot_from_crushed.json new file mode 100644 index 000000000..c36df806d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/smelting/iron_ingot_from_crushed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/iron_ingot_from_crushed" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:crushed_iron_ore" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/iron_ingot_from_crushed" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/furnace_minecart_from_contraption_cart.json b/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/furnace_minecart_from_contraption_cart.json new file mode 100644 index 000000000..93f3b46e0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/furnace_minecart_from_contraption_cart.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/furnace_minecart_from_contraption_cart" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:cart_assembler" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/furnace_minecart_from_contraption_cart" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/minecart_from_contraption_cart.json b/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/minecart_from_contraption_cart.json new file mode 100644 index 000000000..e5bcfaca0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/transportation/crafting/kinetics/minecart_from_contraption_cart.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/minecart_from_contraption_cart" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:cart_assembler" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/minecart_from_contraption_cart" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blaze_burner.json b/src/generated/resources/data/create/loot_tables/blocks/blaze_burner.json new file mode 100644 index 000000000..5e359f9ca --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blaze_burner.json @@ -0,0 +1,90 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "condition": "minecraft:block_state_property", + "block": "create:blaze_burner", + "properties": { + "blaze": "none" + } + } + ], + "name": "create:empty_blaze_burner" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "condition": "minecraft:block_state_property", + "block": "create:blaze_burner", + "properties": { + "blaze": "smouldering" + } + } + ], + "name": "create:blaze_burner" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "condition": "minecraft:block_state_property", + "block": "create:blaze_burner", + "properties": { + "blaze": "fading" + } + } + ], + "name": "create:blaze_burner" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "condition": "minecraft:block_state_property", + "block": "create:blaze_burner", + "properties": { + "blaze": "kindled" + } + } + ], + "name": "create:blaze_burner" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "condition": "minecraft:block_state_property", + "block": "create:blaze_burner", + "properties": { + "blaze": "seething" + } + } + ], + "name": "create:blaze_burner" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blaze_heater.json b/src/generated/resources/data/create/loot_tables/blocks/copper_tiles.json similarity index 86% rename from src/generated/resources/data/create/loot_tables/blocks/blaze_heater.json rename to src/generated/resources/data/create/loot_tables/blocks/copper_tiles.json index 291dbd019..4fabc0d92 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/blaze_heater.json +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_tiles.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:blaze_heater" + "name": "create:copper_tiles" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/extractor.json b/src/generated/resources/data/create/loot_tables/blocks/encased_fluid_pipe.json similarity index 87% rename from src/generated/resources/data/create/loot_tables/blocks/extractor.json rename to src/generated/resources/data/create/loot_tables/blocks/encased_fluid_pipe.json index 3a44e834b..034fb50f5 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/extractor.json +++ b/src/generated/resources/data/create/loot_tables/blocks/encased_fluid_pipe.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:extractor" + "name": "create:fluid_pipe" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/encased_shaft.json b/src/generated/resources/data/create/loot_tables/blocks/encased_shaft.json index 46c9ae96a..84f976dfb 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/encased_shaft.json +++ b/src/generated/resources/data/create/loot_tables/blocks/encased_shaft.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:encased_shaft" + "name": "create:shaft" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/transposer.json b/src/generated/resources/data/create/loot_tables/blocks/glass_fluid_pipe.json similarity index 87% rename from src/generated/resources/data/create/loot_tables/blocks/transposer.json rename to src/generated/resources/data/create/loot_tables/blocks/glass_fluid_pipe.json index 846ecd381..034fb50f5 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/transposer.json +++ b/src/generated/resources/data/create/loot_tables/blocks/glass_fluid_pipe.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:transposer" + "name": "create:fluid_pipe" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/linked_extractor.json b/src/generated/resources/data/create/loot_tables/blocks/linked_extractor.json deleted file mode 100644 index 3faa7e519..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/linked_extractor.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:linked_extractor" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/linked_transposer.json b/src/generated/resources/data/create/loot_tables/blocks/linked_transposer.json deleted file mode 100644 index 31ecac893..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/linked_transposer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:linked_transposer" - } - ], - "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/refined_radiance_casing.json similarity index 83% rename from src/generated/resources/data/create/loot_tables/blocks/brass_chute_funnel.json rename to src/generated/resources/data/create/loot_tables/blocks/refined_radiance_casing.json index c23027b20..76ec447a2 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/brass_chute_funnel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/refined_radiance_casing.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:brass_funnel" + "name": "create:refined_radiance_casing" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json b/src/generated/resources/data/create/loot_tables/blocks/shadow_steel_casing.json similarity index 85% rename from src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json rename to src/generated/resources/data/create/loot_tables/blocks/shadow_steel_casing.json index c6403dc5a..d15ba3eac 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/andesite_chute_funnel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/shadow_steel_casing.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:andesite_funnel" + "name": "create:shadow_steel_casing" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/packager.json b/src/generated/resources/data/create/loot_tables/blocks/spout.json similarity index 88% rename from src/generated/resources/data/create/loot_tables/blocks/packager.json rename to src/generated/resources/data/create/loot_tables/blocks/spout.json index f3daac615..20323c8fd 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/packager.json +++ b/src/generated/resources/data/create/loot_tables/blocks/spout.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:packager" + "name": "create:spout" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/vertical_extractor.json b/src/generated/resources/data/create/loot_tables/blocks/vertical_extractor.json deleted file mode 100644 index 3a44e834b..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/vertical_extractor.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:extractor" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_extractor.json b/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_extractor.json deleted file mode 100644 index 3faa7e519..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_extractor.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:linked_extractor" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_transposer.json b/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_transposer.json deleted file mode 100644 index 31ecac893..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/vertical_linked_transposer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:linked_transposer" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/vertical_transposer.json b/src/generated/resources/data/create/loot_tables/blocks/vertical_transposer.json deleted file mode 100644 index 846ecd381..000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/vertical_transposer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "create:transposer" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/crushed_brass.json b/src/generated/resources/data/create/recipes/blasting/brass_ingot_from_crushed.json similarity index 87% rename from src/main/resources/data/create/recipes/blasting/crushed_brass.json rename to src/generated/resources/data/create/recipes/blasting/brass_ingot_from_crushed.json index 0c7d74367..ce5f6049b 100644 --- a/src/main/resources/data/create/recipes/blasting/crushed_brass.json +++ b/src/generated/resources/data/create/recipes/blasting/brass_ingot_from_crushed.json @@ -5,5 +5,5 @@ }, "result": "create:brass_ingot", "experience": 0.1, - "cookingtime": 50 + "cookingtime": 100 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/crushed_copper.json b/src/generated/resources/data/create/recipes/blasting/copper_ingot_from_crushed.json similarity index 88% rename from src/main/resources/data/create/recipes/blasting/crushed_copper.json rename to src/generated/resources/data/create/recipes/blasting/copper_ingot_from_crushed.json index 1aa09b8ae..6afa9b361 100644 --- a/src/main/resources/data/create/recipes/blasting/crushed_copper.json +++ b/src/generated/resources/data/create/recipes/blasting/copper_ingot_from_crushed.json @@ -5,5 +5,5 @@ }, "result": "create:copper_ingot", "experience": 0.1, - "cookingtime": 50 + "cookingtime": 100 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/copper_ore.json b/src/generated/resources/data/create/recipes/blasting/copper_ingot_from_ore.json similarity index 100% rename from src/main/resources/data/create/recipes/blasting/copper_ore.json rename to src/generated/resources/data/create/recipes/blasting/copper_ingot_from_ore.json diff --git a/src/main/resources/data/create/recipes/blasting/crushed_gold.json b/src/generated/resources/data/create/recipes/blasting/gold_ingot_from_crushed.json similarity index 87% rename from src/main/resources/data/create/recipes/blasting/crushed_gold.json rename to src/generated/resources/data/create/recipes/blasting/gold_ingot_from_crushed.json index 30d99b776..32f1a5e9e 100644 --- a/src/main/resources/data/create/recipes/blasting/crushed_gold.json +++ b/src/generated/resources/data/create/recipes/blasting/gold_ingot_from_crushed.json @@ -5,5 +5,5 @@ }, "result": "minecraft:gold_ingot", "experience": 0.1, - "cookingtime": 50 + "cookingtime": 100 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/crushed_iron.json b/src/generated/resources/data/create/recipes/blasting/iron_ingot_from_crushed.json similarity index 87% rename from src/main/resources/data/create/recipes/blasting/crushed_iron.json rename to src/generated/resources/data/create/recipes/blasting/iron_ingot_from_crushed.json index 81c3956e4..43c60447d 100644 --- a/src/main/resources/data/create/recipes/blasting/crushed_iron.json +++ b/src/generated/resources/data/create/recipes/blasting/iron_ingot_from_crushed.json @@ -5,5 +5,5 @@ }, "result": "minecraft:iron_ingot", "experience": 0.1, - "cookingtime": 50 + "cookingtime": 100 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/crushed_zinc.json b/src/generated/resources/data/create/recipes/blasting/zinc_ingot_from_crushed.json similarity index 87% rename from src/main/resources/data/create/recipes/blasting/crushed_zinc.json rename to src/generated/resources/data/create/recipes/blasting/zinc_ingot_from_crushed.json index 11420ef29..e23b0e03b 100644 --- a/src/main/resources/data/create/recipes/blasting/crushed_zinc.json +++ b/src/generated/resources/data/create/recipes/blasting/zinc_ingot_from_crushed.json @@ -5,5 +5,5 @@ }, "result": "create:zinc_ingot", "experience": 0.1, - "cookingtime": 50 + "cookingtime": 100 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blasting/zinc_ore.json b/src/generated/resources/data/create/recipes/blasting/zinc_ingot_from_ore.json similarity index 100% rename from src/main/resources/data/create/recipes/blasting/zinc_ore.json rename to src/generated/resources/data/create/recipes/blasting/zinc_ingot_from_ore.json diff --git a/src/generated/resources/data/create/recipes/campfire_cooking/bread.json b/src/generated/resources/data/create/recipes/campfire_cooking/bread.json new file mode 100644 index 000000000..0653a0ff4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/campfire_cooking/bread.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "create:dough" + }, + "result": "minecraft:bread", + "experience": 0.0, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/dough.json b/src/generated/resources/data/create/recipes/crafting/appliances/dough.json similarity index 81% rename from src/main/resources/data/create/recipes/crafting_shapeless/dough.json rename to src/generated/resources/data/create/recipes/crafting/appliances/dough.json index ae00b4545..31c314fde 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/dough.json +++ b/src/generated/resources/data/create/recipes/crafting/appliances/dough.json @@ -9,7 +9,6 @@ } ], "result": { - "item": "create:dough", - "count": 1 + "item": "create:dough" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/slime_ball.json b/src/generated/resources/data/create/recipes/crafting/appliances/slime_ball.json new file mode 100644 index 000000000..ec270b1fe --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/slime_ball.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:dough" + }, + { + "tag": "forge:dyes/lime" + } + ], + "result": { + "item": "minecraft:slime_ball" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/tree_fertilizer.json b/src/generated/resources/data/create/recipes/crafting/appliances/tree_fertilizer.json new file mode 100644 index 000000000..4e4c039db --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/tree_fertilizer.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "minecraft:small_flowers" + }, + { + "tag": "minecraft:small_flowers" + }, + [ + { + "item": "minecraft:horn_coral" + }, + { + "item": "minecraft:brain_coral" + }, + { + "item": "minecraft:tube_coral" + }, + { + "item": "minecraft:bubble_coral" + }, + { + "item": "minecraft:fire_coral" + } + ], + { + "item": "minecraft:bone_meal" + } + ], + "result": { + "item": "create:tree_fertilizer", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json b/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json new file mode 100644 index 000000000..de44f0a44 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "EG", + "EO", + " O" + ], + "key": { + "E": { + "item": "create:refined_radiance" + }, + "G": { + "item": "create:cogwheel" + }, + "O": { + "tag": "forge:obsidian" + } + }, + "result": { + "item": "create:deforester" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json b/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json new file mode 100644 index 000000000..02b7a8cd0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " E", + " O ", + "OA " + ], + "key": { + "E": { + "item": "create:refined_radiance" + }, + "A": { + "item": "create:andesite_alloy" + }, + "O": { + "tag": "forge:obsidian" + } + }, + "result": { + "item": "create:handheld_blockzapper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/minecart_coupling.json b/src/generated/resources/data/create/recipes/crafting/curiosities/minecart_coupling.json new file mode 100644 index 000000000..53c7a41cc --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/minecart_coupling.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " E", + " O ", + "E " + ], + "key": { + "E": { + "item": "create:andesite_alloy" + }, + "O": { + "tag": "forge:plates/iron" + } + }, + "result": { + "item": "create:minecart_coupling" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/wand_of_symmetry.json b/src/generated/resources/data/create/recipes/crafting/curiosities/wand_of_symmetry.json new file mode 100644 index 000000000..a0e140621 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/wand_of_symmetry.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " GE", + "LEG", + "OL " + ], + "key": { + "E": { + "item": "create:refined_radiance" + }, + "G": { + "tag": "forge:glass_panes/white" + }, + "O": { + "tag": "forge:obsidian" + }, + "L": { + "tag": "forge:ingots/brass" + } + }, + "result": { + "item": "create:wand_of_symmetry" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/adjustable_pulley.json b/src/generated/resources/data/create/recipes/crafting/kinetics/adjustable_pulley.json new file mode 100644 index 000000000..3a457f4ea --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/adjustable_pulley.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B", + "C" + ], + "key": { + "A": { + "item": "create:electron_tube" + }, + "B": { + "item": "create:encased_belt" + }, + "C": { + "item": "create:large_cogwheel" + } + }, + "result": { + "item": "create:adjustable_pulley" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/analog_lever.json b/src/generated/resources/data/create/recipes/crafting/kinetics/analog_lever.json new file mode 100644 index 000000000..9e6eb9eb2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/analog_lever.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "P", + "S" + ], + "key": { + "S": { + "item": "create:andesite_casing" + }, + "P": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "create:analog_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/attribute_filter.json b/src/generated/resources/data/create/recipes/crafting/kinetics/attribute_filter.json new file mode 100644 index 000000000..15bd0d895 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/attribute_filter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ASA" + ], + "key": { + "S": { + "tag": "minecraft:wool" + }, + "A": { + "tag": "forge:nuggets/copper" + } + }, + "result": { + "item": "create:attribute_filter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/basin.json b/src/generated/resources/data/create/recipes/crafting/kinetics/basin.json new file mode 100644 index 000000000..a04fbad14 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/basin.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A A", + "AAA" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:basin" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/belt_connector.json b/src/generated/resources/data/create/recipes/crafting/kinetics/belt_connector.json new file mode 100644 index 000000000..d4cd1715e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/belt_connector.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "DDD", + "DDD" + ], + "key": { + "D": { + "item": "minecraft:dried_kelp" + } + }, + "result": { + "item": "create:belt_connector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat.json new file mode 100644 index 000000000..0d1fc1377 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:black_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:black_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json new file mode 100644 index 000000000..22cc2ee46 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/black" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:black_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat.json new file mode 100644 index 000000000..d8e16e527 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:blue_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:blue_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json new file mode 100644 index 000000000..cb98a0313 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/blue" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:blue_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/brass_hand.json b/src/generated/resources/data/create/recipes/crafting/kinetics/brass_hand.json new file mode 100644 index 000000000..eb641b0dd --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/brass_hand.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " A ", + "BBB", + " B " + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "tag": "forge:plates/brass" + } + }, + "result": { + "item": "create:brass_hand" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat.json new file mode 100644 index 000000000..524540853 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:brown_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:brown_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json new file mode 100644 index 000000000..3c395ef26 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/brown" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:brown_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/cart_assembler.json b/src/generated/resources/data/create/recipes/crafting/kinetics/cart_assembler.json new file mode 100644 index 000000000..526200b14 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/cart_assembler.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " L ", + "CRC", + "L L" + ], + "key": { + "L": { + "tag": "minecraft:logs" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:cart_assembler" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/chute.json b/src/generated/resources/data/create/recipes/crafting/kinetics/chute.json new file mode 100644 index 000000000..9b272de35 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/chute.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "II", + "AA" + ], + "key": { + "A": { + "tag": "forge:plates/iron" + }, + "I": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:chute" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/clockwork_bearing.json b/src/generated/resources/data/create/recipes/crafting/kinetics/clockwork_bearing.json new file mode 100644 index 000000000..4f21392ea --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/clockwork_bearing.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "I": { + "item": "create:shaft" + }, + "S": { + "item": "create:electron_tube" + }, + "B": { + "item": "create:turntable" + }, + "C": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:clockwork_bearing" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/clutch.json b/src/generated/resources/data/create/recipes/crafting/kinetics/clutch.json new file mode 100644 index 000000000..b74ff3044 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/clutch.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " B " + ], + "key": { + "S": { + "item": "create:shaft" + }, + "B": { + "tag": "forge:dusts/redstone" + }, + "C": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:clutch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/cogwheel.json b/src/generated/resources/data/create/recipes/crafting/kinetics/cogwheel.json new file mode 100644 index 000000000..242eaf996 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/cogwheel.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SCS", + "SSS" + ], + "key": { + "S": { + "tag": "minecraft:wooden_buttons" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:cogwheel", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/crafter_slot_cover.json b/src/generated/resources/data/create/recipes/crafting/kinetics/crafter_slot_cover.json new file mode 100644 index 000000000..9a5178f17 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/crafter_slot_cover.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA" + ], + "key": { + "A": { + "tag": "forge:nuggets/brass" + } + }, + "result": { + "item": "create:crafter_slot_cover" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/cuckoo_clock.json b/src/generated/resources/data/create/recipes/crafting/kinetics/cuckoo_clock.json new file mode 100644 index 000000000..2e72ccd8d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/cuckoo_clock.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SAS", + "BPB" + ], + "key": { + "S": { + "tag": "minecraft:planks" + }, + "A": { + "item": "minecraft:clock" + }, + "B": { + "tag": "minecraft:logs" + }, + "P": { + "item": "create:cogwheel" + } + }, + "result": { + "item": "create:cuckoo_clock" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat.json new file mode 100644 index 000000000..95da2741e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:cyan_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:cyan_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json new file mode 100644 index 000000000..6cdcf3826 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/cyan" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:cyan_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/deployer.json b/src/generated/resources/data/create/recipes/crafting/kinetics/deployer.json new file mode 100644 index 000000000..abb71dae6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/deployer.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "I": { + "item": "create:brass_hand" + }, + "B": { + "item": "create:electron_tube" + }, + "S": { + "item": "create:cogwheel" + }, + "C": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:deployer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/depot.json b/src/generated/resources/data/create/recipes/crafting/kinetics/depot.json new file mode 100644 index 000000000..5c4648cc3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/depot.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "I" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "I": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:depot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/empty_blaze_burner.json b/src/generated/resources/data/create/recipes/crafting/kinetics/empty_blaze_burner.json new file mode 100644 index 000000000..16091c3c4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/empty_blaze_burner.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "II", + "AA" + ], + "key": { + "A": { + "item": "minecraft:iron_bars" + }, + "I": { + "tag": "forge:plates/iron" + } + }, + "result": { + "item": "create:empty_blaze_burner" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/encased_belt.json b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_belt.json new file mode 100644 index 000000000..7d2336778 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_belt.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "CBC", + " C " + ], + "key": { + "C": { + "item": "create:andesite_casing" + }, + "B": { + "item": "minecraft:dried_kelp" + } + }, + "result": { + "item": "create:encased_belt", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json new file mode 100644 index 000000000..467bb81a7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "RAR", + "BPB" + ], + "key": { + "S": { + "item": "create:shaft" + }, + "A": { + "item": "create:andesite_alloy" + }, + "R": { + "tag": "minecraft:planks" + }, + "B": { + "item": "minecraft:iron_bars" + }, + "P": { + "item": "create:propeller" + } + }, + "result": { + "item": "create:encased_fan" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/filter.json b/src/generated/resources/data/create/recipes/crafting/kinetics/filter.json new file mode 100644 index 000000000..ec8d840a8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/filter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ASA" + ], + "key": { + "S": { + "tag": "minecraft:wool" + }, + "A": { + "tag": "forge:nuggets/iron" + } + }, + "result": { + "item": "create:filter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_pipe.json b/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_pipe.json new file mode 100644 index 000000000..5c78c7b9d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_pipe.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SCS" + ], + "key": { + "S": { + "tag": "forge:plates/copper" + }, + "C": { + "tag": "forge:ingots/copper" + } + }, + "result": { + "item": "create:fluid_pipe", + "count": 16 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_tank.json b/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_tank.json new file mode 100644 index 000000000..d100d7ce8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/fluid_tank.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " B " + ], + "key": { + "B": { + "item": "create:copper_casing" + }, + "S": { + "tag": "forge:nuggets/copper" + }, + "C": { + "tag": "forge:glass" + } + }, + "result": { + "item": "create:fluid_tank", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json b/src/generated/resources/data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json new file mode 100644 index 000000000..63b6f28b7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:furnace_minecart_contraption" + } + ], + "result": { + "item": "minecraft:furnace_minecart" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gearbox.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gearbox.json new file mode 100644 index 000000000..2ebfd0c12 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gearbox.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "CBC", + " C " + ], + "key": { + "C": { + "item": "create:cogwheel" + }, + "B": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:gearbox" + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/extractor.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json similarity index 53% rename from src/main/resources/data/create/recipes/crafting_shapeless/extractor.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json index bfc99fe56..307ed1897 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/extractor.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json @@ -2,11 +2,10 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "item": "create:linked_extractor" + "item": "create:vertical_gearbox" } ], "result": { - "item": "create:extractor", - "count": 1 + "item": "create:gearbox" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gearshift.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gearshift.json new file mode 100644 index 000000000..0255f3d1e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gearshift.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " B " + ], + "key": { + "S": { + "item": "create:cogwheel" + }, + "B": { + "tag": "forge:dusts/redstone" + }, + "C": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:gearshift" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/goggles.json b/src/generated/resources/data/create/recipes/crafting/kinetics/goggles.json new file mode 100644 index 000000000..3f4f10144 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/goggles.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "GPG" + ], + "key": { + "G": { + "tag": "forge:glass" + }, + "P": { + "tag": "forge:plates/gold" + }, + "S": { + "tag": "forge:string" + } + }, + "result": { + "item": "create:goggles" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat.json new file mode 100644 index 000000000..288f7d995 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:gray_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:gray_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json new file mode 100644 index 000000000..e12a0bd21 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/gray" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:gray_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat.json new file mode 100644 index 000000000..0bd4c58cf --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:green_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json new file mode 100644 index 000000000..9184d9ad7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/green" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:green_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json b/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json new file mode 100644 index 000000000..b8aea7ca0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "CCC", + " S" + ], + "key": { + "S": { + "item": "create:andesite_alloy" + }, + "C": { + "tag": "minecraft:planks" + }, + "B": { + "tag": "forge:ingots/brass" + } + }, + "result": { + "item": "create:hand_crank" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/large_cogwheel.json b/src/generated/resources/data/create/recipes/crafting/kinetics/large_cogwheel.json new file mode 100644 index 000000000..05e4e3f46 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/large_cogwheel.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SDS", + "DCD", + "SDS" + ], + "key": { + "S": { + "tag": "minecraft:wooden_buttons" + }, + "C": { + "item": "create:andesite_alloy" + }, + "D": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "create:large_cogwheel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat.json new file mode 100644 index 000000000..3d826a2e5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:light_blue_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json new file mode 100644 index 000000000..2057239a0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/light_blue" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:light_blue_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat.json new file mode 100644 index 000000000..250b3465b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:light_gray_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:light_gray_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json new file mode 100644 index 000000000..f8ef5e09c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/light_gray" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:light_gray_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat.json new file mode 100644 index 000000000..c787ad26d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:lime_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:lime_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json new file mode 100644 index 000000000..77bf94c8a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/lime" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:lime_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassis.json b/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassis.json new file mode 100644 index 000000000..cbab28e46 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassis.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " P ", + "LLL", + " P " + ], + "key": { + "P": { + "item": "create:andesite_alloy" + }, + "L": { + "tag": "minecraft:logs" + } + }, + "result": { + "item": "create:linear_chassis", + "count": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json new file mode 100644 index 000000000..871534db0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:secondary_linear_chassis" + } + ], + "result": { + "item": "create:linear_chassis" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat.json new file mode 100644 index 000000000..2e36dc05c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:magenta_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:magenta_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json new file mode 100644 index 000000000..07a2fd9e3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/magenta" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:magenta_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_bearing.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_bearing.json new file mode 100644 index 000000000..2273703f8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_bearing.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "I": { + "item": "create:shaft" + }, + "S": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "create:turntable" + }, + "C": { + "item": "create:andesite_casing" + } + }, + "result": { + "item": "create:mechanical_bearing" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_crafter.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_crafter.json new file mode 100644 index 000000000..938064560 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_crafter.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " R " + ], + "key": { + "B": { + "item": "create:electron_tube" + }, + "R": { + "item": "minecraft:crafting_table" + }, + "C": { + "item": "create:brass_casing" + }, + "S": { + "item": "create:cogwheel" + } + }, + "result": { + "item": "create:mechanical_crafter", + "count": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_drill.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_drill.json new file mode 100644 index 000000000..31cbe3607 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_drill.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " A ", + "AIA", + " C " + ], + "key": { + "C": { + "item": "create:andesite_casing" + }, + "A": { + "item": "create:andesite_alloy" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "result": { + "item": "create:mechanical_drill" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_harvester.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_harvester.json new file mode 100644 index 000000000..b4bcc3750 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_harvester.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AIA", + "AIA", + " C " + ], + "key": { + "C": { + "item": "create:andesite_casing" + }, + "A": { + "item": "create:andesite_alloy" + }, + "I": { + "tag": "forge:plates/iron" + } + }, + "result": { + "item": "create:mechanical_harvester" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_mixer.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_mixer.json new file mode 100644 index 000000000..b5e8767c5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_mixer.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "S": { + "item": "create:cogwheel" + }, + "B": { + "item": "create:andesite_alloy" + }, + "C": { + "item": "create:andesite_casing" + }, + "I": { + "item": "create:whisk" + } + }, + "result": { + "item": "create:mechanical_mixer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_piston.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_piston.json new file mode 100644 index 000000000..e1d197c0b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_piston.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "B": { + "tag": "minecraft:planks" + }, + "S": { + "item": "create:cogwheel" + }, + "C": { + "item": "create:andesite_casing" + }, + "I": { + "item": "create:piston_extension_pole" + } + }, + "result": { + "item": "create:mechanical_piston" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_plough.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_plough.json new file mode 100644 index 000000000..370dc2691 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_plough.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "III", + "AAA", + " C " + ], + "key": { + "C": { + "item": "create:andesite_casing" + }, + "A": { + "item": "create:andesite_alloy" + }, + "I": { + "tag": "forge:plates/iron" + } + }, + "result": { + "item": "create:mechanical_plough" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_press.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_press.json new file mode 100644 index 000000000..b63759672 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_press.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "B": { + "item": "create:andesite_alloy" + }, + "S": { + "item": "create:cogwheel" + }, + "C": { + "item": "create:andesite_casing" + }, + "I": { + "tag": "forge:storage_blocks/iron" + } + }, + "result": { + "item": "create:mechanical_press" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_pump.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_pump.json new file mode 100644 index 000000000..8b7f9e5a4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_pump.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "P", + "S" + ], + "key": { + "P": { + "item": "create:cogwheel" + }, + "S": { + "item": "create:fluid_pipe" + } + }, + "result": { + "item": "create:mechanical_pump" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_saw.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_saw.json new file mode 100644 index 000000000..16f6666c5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_saw.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " A ", + "AIA", + " C " + ], + "key": { + "C": { + "item": "create:andesite_casing" + }, + "A": { + "tag": "forge:plates/iron" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "result": { + "item": "create:mechanical_saw" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/millstone.json b/src/generated/resources/data/create/recipes/crafting/kinetics/millstone.json new file mode 100644 index 000000000..65a8e8fe4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/millstone.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "B": { + "tag": "minecraft:planks" + }, + "S": { + "item": "create:andesite_alloy" + }, + "C": { + "item": "create:cogwheel" + }, + "I": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:millstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/minecart_from_contraption_cart.json b/src/generated/resources/data/create/recipes/crafting/kinetics/minecart_from_contraption_cart.json new file mode 100644 index 000000000..72e82750c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/minecart_from_contraption_cart.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:minecart_contraption" + } + ], + "result": { + "item": "minecraft:minecart" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json new file mode 100644 index 000000000..80ec9a30e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "CBC", + " C " + ], + "key": { + "C": { + "tag": "forge:gunpowder" + }, + "B": { + "item": "create:cuckoo_clock" + } + }, + "result": { + "item": "create:mysterious_cuckoo_clock" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/nozzle.json b/src/generated/resources/data/create/recipes/crafting/kinetics/nozzle.json new file mode 100644 index 000000000..232551353 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/nozzle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + " C ", + "SSS" + ], + "key": { + "S": { + "item": "create:andesite_alloy" + }, + "C": { + "tag": "minecraft:wool" + } + }, + "result": { + "item": "create:nozzle" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat.json new file mode 100644 index 000000000..6f9449a12 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:orange_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:orange_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json new file mode 100644 index 000000000..29c7f059d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/orange" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:orange_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat.json new file mode 100644 index 000000000..4cf047acf --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:pink_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:pink_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json new file mode 100644 index 000000000..c4031f9ca --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/pink" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:pink_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/piston_extension_pole.json b/src/generated/resources/data/create/recipes/crafting/kinetics/piston_extension_pole.json new file mode 100644 index 000000000..0fb54c604 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/piston_extension_pole.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "P", + "A", + "P" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "P": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "create:piston_extension_pole", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/propeller.json b/src/generated/resources/data/create/recipes/crafting/kinetics/propeller.json new file mode 100644 index 000000000..3e970781c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/propeller.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SCS", + " S " + ], + "key": { + "S": { + "tag": "forge:plates/iron" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:propeller" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat.json new file mode 100644 index 000000000..b813024fa --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:purple_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:purple_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json new file mode 100644 index 000000000..175400157 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/purple" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:purple_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/radial_chassis.json b/src/generated/resources/data/create/recipes/crafting/kinetics/radial_chassis.json new file mode 100644 index 000000000..d31508ad3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/radial_chassis.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " L ", + "PLP", + " L " + ], + "key": { + "P": { + "item": "create:andesite_alloy" + }, + "L": { + "tag": "minecraft:logs" + } + }, + "result": { + "item": "create:radial_chassis", + "count": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat.json new file mode 100644 index 000000000..738c7fc87 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:red_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:red_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json new file mode 100644 index 000000000..d7bc542a0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/red" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:red_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/rope_pulley.json b/src/generated/resources/data/create/recipes/crafting/kinetics/rope_pulley.json new file mode 100644 index 000000000..9bc8e30e3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/rope_pulley.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "S": { + "item": "create:shaft" + }, + "B": { + "item": "create:andesite_casing" + }, + "C": { + "tag": "minecraft:wool" + }, + "I": { + "tag": "forge:plates/iron" + } + }, + "result": { + "item": "create:rope_pulley" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json b/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json new file mode 100644 index 000000000..f25765247 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS" + ], + "key": { + "B": { + "item": "create:integrated_circuit" + }, + "C": { + "item": "create:brass_casing" + }, + "S": { + "item": "create:shaft" + } + }, + "result": { + "item": "create:rotation_speed_controller" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json new file mode 100644 index 000000000..7d08aa6a6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:linear_chassis" + } + ], + "result": { + "item": "create:secondary_linear_chassis" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sequenced_gearshift.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sequenced_gearshift.json new file mode 100644 index 000000000..6d01b38a4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/sequenced_gearshift.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCS", + " I " + ], + "key": { + "B": { + "item": "create:electron_tube" + }, + "S": { + "item": "create:cogwheel" + }, + "C": { + "item": "create:brass_casing" + }, + "I": { + "item": "minecraft:clock" + } + }, + "result": { + "item": "create:sequenced_gearshift" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/shaft.json b/src/generated/resources/data/create/recipes/crafting/kinetics/shaft.json new file mode 100644 index 000000000..5f15d3c0b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/shaft.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "A" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:shaft", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/speedometer.json b/src/generated/resources/data/create/recipes/crafting/kinetics/speedometer.json new file mode 100644 index 000000000..2bf70cab3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/speedometer.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "SAS" + ], + "key": { + "C": { + "item": "minecraft:compass" + }, + "A": { + "item": "create:andesite_casing" + }, + "S": { + "item": "create:shaft" + } + }, + "result": { + "item": "create:speedometer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json new file mode 100644 index 000000000..6a9bfe93c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:stressometer" + } + ], + "result": { + "item": "create:speedometer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/spout.json b/src/generated/resources/data/create/recipes/crafting/kinetics/spout.json new file mode 100644 index 000000000..a7db594f5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/spout.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "T", + "P", + "S" + ], + "key": { + "T": { + "item": "create:fluid_tank" + }, + "P": { + "item": "minecraft:dried_kelp" + }, + "S": { + "tag": "forge:nuggets/copper" + } + }, + "result": { + "item": "create:spout" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json new file mode 100644 index 000000000..5074ba11a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "S", + "P" + ], + "key": { + "S": { + "tag": "forge:slimeballs" + }, + "P": { + "item": "create:mechanical_piston" + } + }, + "result": { + "item": "create:sticky_mechanical_piston" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json new file mode 100644 index 000000000..4072276ce --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:speedometer" + } + ], + "result": { + "item": "create:stressometer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/super_glue.json b/src/generated/resources/data/create/recipes/crafting/kinetics/super_glue.json new file mode 100644 index 000000000..3c2ff87ae --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/super_glue.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AS", + "NA" + ], + "key": { + "A": { + "tag": "forge:slimeballs" + }, + "S": { + "tag": "forge:plates/iron" + }, + "N": { + "tag": "forge:nuggets/iron" + } + }, + "result": { + "item": "create:super_glue" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/turntable.json b/src/generated/resources/data/create/recipes/crafting/kinetics/turntable.json new file mode 100644 index 000000000..2d5421c9e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/turntable.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "P", + "S" + ], + "key": { + "S": { + "item": "create:shaft" + }, + "P": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:turntable" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json new file mode 100644 index 000000000..05e85752e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:gearbox" + } + ], + "result": { + "item": "create:vertical_gearbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/water_wheel.json b/src/generated/resources/data/create/recipes/crafting/kinetics/water_wheel.json new file mode 100644 index 000000000..9fa6560ee --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/water_wheel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SCS", + "SSS" + ], + "key": { + "S": { + "tag": "minecraft:wooden_slabs" + }, + "C": { + "item": "create:large_cogwheel" + } + }, + "result": { + "item": "create:water_wheel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/whisk.json b/src/generated/resources/data/create/recipes/crafting/kinetics/whisk.json new file mode 100644 index 000000000..403a90b73 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/whisk.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "SCS", + "SSS" + ], + "key": { + "S": { + "tag": "forge:plates/iron" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:whisk" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat.json new file mode 100644 index 000000000..d47cef67a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:white_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:white_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json new file mode 100644 index 000000000..65a0ae6df --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/white" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:white_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/wrench.json b/src/generated/resources/data/create/recipes/crafting/kinetics/wrench.json new file mode 100644 index 000000000..78651b166 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/wrench.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "GG", + "GP", + " S" + ], + "key": { + "G": { + "tag": "forge:plates/gold" + }, + "P": { + "item": "create:cogwheel" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "create:wrench" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat.json new file mode 100644 index 000000000..2c131df05 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:yellow_wool" + }, + "-": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "create:yellow_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json b/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json new file mode 100644 index 000000000..e215eb0da --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "-" + ], + "key": { + "#": { + "tag": "forge:dyes/yellow" + }, + "-": { + "tag": "create:seats" + } + }, + "result": { + "item": "create:yellow_seat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_crate.json b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_crate.json new file mode 100644 index 000000000..1556c9d1b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_crate.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "BBB", + "B B", + "BBB" + ], + "key": { + "B": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:adjustable_crate", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json new file mode 100644 index 000000000..5cac4ee57 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SP" + ], + "key": { + "S": { + "item": "create:pulse_repeater" + }, + "P": { + "item": "create:adjustable_repeater" + } + }, + "result": { + "item": "create:adjustable_pulse_repeater" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_repeater.json b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_repeater.json new file mode 100644 index 000000000..66a256aa8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/adjustable_repeater.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "RCT", + "SSS" + ], + "key": { + "T": { + "item": "minecraft:redstone_torch" + }, + "C": { + "item": "minecraft:clock" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "S": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:adjustable_repeater" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/andesite_funnel.json b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_funnel.json new file mode 100644 index 000000000..cbaab571d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_funnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AKA", + " K " + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "K": { + "item": "minecraft:dried_kelp" + } + }, + "result": { + "item": "create:andesite_funnel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/andesite_tunnel.json b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_tunnel.json new file mode 100644 index 000000000..74fd0bd69 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_tunnel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AA", + "KK" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "K": { + "item": "minecraft:dried_kelp" + } + }, + "result": { + "item": "create:andesite_tunnel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json b/src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json new file mode 100644 index 000000000..c802d8aaa --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "RCI", + " B " + ], + "key": { + "B": { + "item": "create:brass_casing" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "C": { + "item": "minecraft:observer" + } + }, + "result": { + "item": "create:belt_observer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brass_funnel.json b/src/generated/resources/data/create/recipes/crafting/logistics/brass_funnel.json new file mode 100644 index 000000000..cfbf4e054 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brass_funnel.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AEA", + " K " + ], + "key": { + "A": { + "tag": "forge:ingots/brass" + }, + "K": { + "item": "minecraft:dried_kelp" + }, + "E": { + "item": "create:electron_tube" + } + }, + "result": { + "item": "create:brass_funnel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brass_tunnel.json b/src/generated/resources/data/create/recipes/crafting/logistics/brass_tunnel.json new file mode 100644 index 000000000..8212d34ae --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brass_tunnel.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "E ", + "AA", + "KK" + ], + "key": { + "A": { + "tag": "forge:ingots/brass" + }, + "K": { + "item": "minecraft:dried_kelp" + }, + "E": { + "item": "create:electron_tube" + } + }, + "result": { + "item": "create:brass_tunnel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/powered_latch.json b/src/generated/resources/data/create/recipes/crafting/logistics/powered_latch.json new file mode 100644 index 000000000..047423da5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/powered_latch.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " T ", + "RCR", + "SSS" + ], + "key": { + "T": { + "item": "minecraft:redstone_torch" + }, + "C": { + "item": "minecraft:lever" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "S": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:powered_latch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/powered_toggle_latch.json b/src/generated/resources/data/create/recipes/crafting/logistics/powered_toggle_latch.json new file mode 100644 index 000000000..749e22fce --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/powered_toggle_latch.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " T ", + " C ", + "SSS" + ], + "key": { + "T": { + "item": "minecraft:redstone_torch" + }, + "C": { + "item": "minecraft:lever" + }, + "S": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:powered_toggle_latch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pulse_repeater.json b/src/generated/resources/data/create/recipes/crafting/logistics/pulse_repeater.json new file mode 100644 index 000000000..7c4461f17 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pulse_repeater.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "RRT", + "SSS" + ], + "key": { + "T": { + "item": "minecraft:redstone_torch" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "S": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:pulse_repeater" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_contact.json b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_contact.json new file mode 100644 index 000000000..840a75afe --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_contact.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "WDW", + " S ", + "WDW" + ], + "key": { + "W": { + "tag": "forge:dusts/redstone" + }, + "D": { + "item": "create:brass_casing" + }, + "S": { + "tag": "forge:ingots/iron" + } + }, + "result": { + "item": "create:redstone_contact", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json new file mode 100644 index 000000000..9b4ce64a3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C", + "SIS" + ], + "key": { + "C": { + "item": "minecraft:redstone_torch" + }, + "S": { + "tag": "forge:plates/brass" + }, + "I": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "create:redstone_link", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/stockpile_switch.json b/src/generated/resources/data/create/recipes/crafting/logistics/stockpile_switch.json new file mode 100644 index 000000000..5b0630ff5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stockpile_switch.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "RCI", + " B " + ], + "key": { + "B": { + "item": "create:brass_casing" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "C": { + "item": "minecraft:comparator" + } + }, + "result": { + "item": "create:stockpile_switch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy.json b/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy.json new file mode 100644 index 000000000..5997b2131 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "BA", + "AB" + ], + "key": { + "A": { + "item": "minecraft:andesite" + }, + "B": { + "tag": "forge:nuggets/iron" + } + }, + "result": { + "item": "create:andesite_alloy" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json b/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json new file mode 100644 index 000000000..9634c659b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "BA", + "AB" + ], + "key": { + "A": { + "item": "minecraft:andesite" + }, + "B": { + "tag": "forge:nuggets/zinc" + } + }, + "result": { + "item": "create:andesite_alloy" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/andesite_casing.json b/src/generated/resources/data/create/recipes/crafting/materials/andesite_casing.json new file mode 100644 index 000000000..3be156c26 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/andesite_casing.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "CSC", + "AAA" + ], + "key": { + "A": { + "tag": "minecraft:planks" + }, + "C": { + "item": "create:andesite_alloy" + }, + "S": { + "tag": "minecraft:logs" + } + }, + "result": { + "item": "create:andesite_casing", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/brass_block.json b/src/generated/resources/data/create/recipes/crafting/materials/brass_block_from_compacting.json similarity index 79% rename from src/generated/resources/data/create/recipes/brass_block.json rename to src/generated/resources/data/create/recipes/crafting/materials/brass_block_from_compacting.json index 2bcd2bfa3..2a8c26fd0 100644 --- a/src/generated/resources/data/create/recipes/brass_block.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/brass_block_from_compacting.json @@ -1,12 +1,12 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XXX", - "XXX", - "XXX" + "###", + "###", + "###" ], "key": { - "X": { + "#": { "tag": "forge:ingots/brass" } }, diff --git a/src/generated/resources/data/create/recipes/crafting/materials/brass_casing.json b/src/generated/resources/data/create/recipes/crafting/materials/brass_casing.json new file mode 100644 index 000000000..84f2ef071 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/brass_casing.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "CSC", + "AAA" + ], + "key": { + "A": { + "tag": "minecraft:planks" + }, + "C": { + "tag": "forge:plates/brass" + }, + "S": { + "tag": "minecraft:logs" + } + }, + "result": { + "item": "create:brass_casing", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/brass_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/brass_ingot_from_compacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shaped/materials/brass_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/brass_ingot_from_compacting.json diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/brass_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json similarity index 77% rename from src/main/resources/data/create/recipes/crafting_shapeless/brass_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json index 98071c6e8..eef2ba7cd 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/brass_ingot.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "item": "create:brass_block" + "tag": "forge:storage_blocks/brass" } ], "result": { diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/brass_nugget.json b/src/generated/resources/data/create/recipes/crafting/materials/brass_nugget_from_decompacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shapeless/brass_nugget.json rename to src/generated/resources/data/create/recipes/crafting/materials/brass_nugget_from_decompacting.json diff --git a/src/generated/resources/data/create/recipes/copper_block.json b/src/generated/resources/data/create/recipes/crafting/materials/copper_block_from_compacting.json similarity index 79% rename from src/generated/resources/data/create/recipes/copper_block.json rename to src/generated/resources/data/create/recipes/crafting/materials/copper_block_from_compacting.json index d248ac27d..1ef586c30 100644 --- a/src/generated/resources/data/create/recipes/copper_block.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/copper_block_from_compacting.json @@ -1,12 +1,12 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XXX", - "XXX", - "XXX" + "###", + "###", + "###" ], "key": { - "X": { + "#": { "tag": "forge:ingots/copper" } }, diff --git a/src/generated/resources/data/create/recipes/crafting/materials/copper_casing.json b/src/generated/resources/data/create/recipes/crafting/materials/copper_casing.json new file mode 100644 index 000000000..066726dce --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/copper_casing.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "CSC", + "AAA" + ], + "key": { + "A": { + "tag": "minecraft:planks" + }, + "C": { + "tag": "forge:plates/copper" + }, + "S": { + "tag": "minecraft:logs" + } + }, + "result": { + "item": "create:copper_casing", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/copper_ingot_from_compacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shaped/materials/copper_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/copper_ingot_from_compacting.json diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/copper_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/copper_ingot_from_decompacting.json similarity index 77% rename from src/main/resources/data/create/recipes/crafting_shapeless/copper_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/copper_ingot_from_decompacting.json index 6f983e09e..ade5608b9 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/copper_ingot.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/copper_ingot_from_decompacting.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "item": "create:copper_block" + "tag": "forge:storage_blocks/copper" } ], "result": { diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/copper_nugget.json b/src/generated/resources/data/create/recipes/crafting/materials/copper_nugget_from_decompacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shapeless/copper_nugget.json rename to src/generated/resources/data/create/recipes/crafting/materials/copper_nugget_from_decompacting.json diff --git a/src/generated/resources/data/create/recipes/crafting/materials/electron_tube.json b/src/generated/resources/data/create/recipes/crafting/materials/electron_tube.json new file mode 100644 index 000000000..6cc4b04b2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/electron_tube.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "L", + "R", + "N" + ], + "key": { + "L": { + "item": "create:polished_rose_quartz" + }, + "R": { + "item": "minecraft:redstone_torch" + }, + "N": { + "tag": "forge:nuggets/iron" + } + }, + "result": { + "item": "create:electron_tube" + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/red_sand_paper.json b/src/generated/resources/data/create/recipes/crafting/materials/red_sand_paper.json similarity index 76% rename from src/main/resources/data/create/recipes/crafting_shapeless/red_sand_paper.json rename to src/generated/resources/data/create/recipes/crafting/materials/red_sand_paper.json index db4c142a2..c0e22c4a7 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/red_sand_paper.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/red_sand_paper.json @@ -2,14 +2,13 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "tag": "forge:sand/red" + "item": "minecraft:paper" }, { - "item": "minecraft:paper" + "tag": "forge:sand/red" } ], "result": { - "item": "create:red_sand_paper", - "count": 1 + "item": "create:red_sand_paper" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/refined_radiance_casing.json b/src/generated/resources/data/create/recipes/crafting/materials/refined_radiance_casing.json new file mode 100644 index 000000000..fea94b570 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/refined_radiance_casing.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "CSC", + "AAA" + ], + "key": { + "A": { + "tag": "minecraft:planks" + }, + "C": { + "item": "create:refined_radiance" + }, + "S": { + "tag": "forge:glass/colorless" + } + }, + "result": { + "item": "create:refined_radiance_casing", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/rose_quartz.json b/src/generated/resources/data/create/recipes/crafting/materials/rose_quartz.json new file mode 100644 index 000000000..fb32d5013 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/rose_quartz.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:gems/quartz" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dusts/redstone" + } + ], + "result": { + "item": "create:rose_quartz" + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/sand_paper.json b/src/generated/resources/data/create/recipes/crafting/materials/sand_paper.json similarity index 78% rename from src/main/resources/data/create/recipes/crafting_shapeless/sand_paper.json rename to src/generated/resources/data/create/recipes/crafting/materials/sand_paper.json index b4ab613cb..945b1abd6 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/sand_paper.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/sand_paper.json @@ -2,14 +2,13 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "tag": "forge:sand/colorless" + "item": "minecraft:paper" }, { - "item": "minecraft:paper" + "tag": "forge:sand/colorless" } ], "result": { - "item": "create:sand_paper", - "count": 1 + "item": "create:sand_paper" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/shadow_steel_casing.json b/src/generated/resources/data/create/recipes/crafting/materials/shadow_steel_casing.json new file mode 100644 index 000000000..1357fa397 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/shadow_steel_casing.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "CSC", + "AAA" + ], + "key": { + "A": { + "tag": "minecraft:planks" + }, + "C": { + "item": "create:shadow_steel" + }, + "S": { + "tag": "forge:obsidian" + } + }, + "result": { + "item": "create:shadow_steel_casing", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/zinc_block.json b/src/generated/resources/data/create/recipes/crafting/materials/zinc_block_from_compacting.json similarity index 79% rename from src/generated/resources/data/create/recipes/zinc_block.json rename to src/generated/resources/data/create/recipes/crafting/materials/zinc_block_from_compacting.json index 70c956df3..b7ed61522 100644 --- a/src/generated/resources/data/create/recipes/zinc_block.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/zinc_block_from_compacting.json @@ -1,12 +1,12 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XXX", - "XXX", - "XXX" + "###", + "###", + "###" ], "key": { - "X": { + "#": { "tag": "forge:ingots/zinc" } }, diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/zinc_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/zinc_ingot_from_compacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shaped/materials/zinc_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/zinc_ingot_from_compacting.json diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/zinc_ingot.json b/src/generated/resources/data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json similarity index 78% rename from src/main/resources/data/create/recipes/crafting_shapeless/zinc_ingot.json rename to src/generated/resources/data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json index b894c4975..b609b8801 100644 --- a/src/main/resources/data/create/recipes/crafting_shapeless/zinc_ingot.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shapeless", "ingredients": [ { - "item": "create:zinc_block" + "tag": "forge:storage_blocks/zinc" } ], "result": { diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/zinc_nugget.json b/src/generated/resources/data/create/recipes/crafting/materials/zinc_nugget_from_decompacting.json similarity index 100% rename from src/main/resources/data/create/recipes/crafting_shapeless/zinc_nugget.json rename to src/generated/resources/data/create/recipes/crafting/materials/zinc_nugget_from_decompacting.json diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_shingles.json b/src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles.json similarity index 92% rename from src/main/resources/data/create/recipes/crafting_shaped/materials/copper_shingles.json rename to src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles.json index b1795c9fb..871a86fa0 100644 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_shingles.json +++ b/src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles.json @@ -11,6 +11,6 @@ }, "result": { "item": "create:copper_shingles", - "count": 8 + "count": 16 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles_from_tiles.json b/src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles_from_tiles.json new file mode 100644 index 000000000..697c492aa --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/palettes/copper_shingles_from_tiles.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:copper_tiles" + } + ], + "result": { + "item": "create:copper_shingles" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/palettes/copper_tiles.json b/src/generated/resources/data/create/recipes/crafting/palettes/copper_tiles.json new file mode 100644 index 000000000..068f867fc --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/palettes/copper_tiles.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:copper_shingles" + } + ], + "result": { + "item": "create:copper_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/palettes/dark_scoria.json b/src/generated/resources/data/create/recipes/crafting/palettes/dark_scoria.json new file mode 100644 index 000000000..8798bf31d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/palettes/dark_scoria.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#D#", + "###" + ], + "key": { + "#": { + "item": "create:scoria" + }, + "D": { + "tag": "forge:dyes/black" + } + }, + "result": { + "item": "create:dark_scoria", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/schematics/empty_schematic.json b/src/generated/resources/data/create/recipes/crafting/schematics/empty_schematic.json new file mode 100644 index 000000000..796802d8b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/schematics/empty_schematic.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "tag": "forge:dyes/light_blue" + } + ], + "result": { + "item": "create:empty_schematic" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/schematics/schematic_and_quill.json b/src/generated/resources/data/create/recipes/crafting/schematics/schematic_and_quill.json new file mode 100644 index 000000000..d43ec9ef3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/schematics/schematic_and_quill.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:empty_schematic" + }, + { + "tag": "forge:feathers" + } + ], + "result": { + "item": "create:schematic_and_quill" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/schematics/schematic_table.json b/src/generated/resources/data/create/recipes/crafting/schematics/schematic_table.json new file mode 100644 index 000000000..dfe75a1d8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/schematics/schematic_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "WWW", + " S ", + " S " + ], + "key": { + "W": { + "tag": "minecraft:wooden_slabs" + }, + "S": { + "item": "minecraft:smooth_stone" + } + }, + "result": { + "item": "create:schematic_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/schematics/schematicannon.json b/src/generated/resources/data/create/recipes/crafting/schematics/schematicannon.json new file mode 100644 index 000000000..7a720eee4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/schematics/schematicannon.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " C ", + "LDL", + "SIS" + ], + "key": { + "L": { + "tag": "minecraft:logs" + }, + "D": { + "item": "minecraft:dispenser" + }, + "C": { + "item": "minecraft:cauldron" + }, + "S": { + "item": "minecraft:smooth_stone" + }, + "I": { + "item": "minecraft:iron_block" + } + }, + "result": { + "item": "create:schematicannon" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/blaze_rod.json b/src/generated/resources/data/create/recipes/crushing/blaze_rod.json new file mode 100644 index 000000000..c87434bd6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/blaze_rod.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:blaze_rod" + } + ], + "results": [ + { + "item": "minecraft:blaze_powder", + "count": 3 + }, + { + "item": "minecraft:blaze_powder", + "count": 3, + "chance": 0.25 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/brass_block.json b/src/generated/resources/data/create/recipes/crushing/brass_block.json new file mode 100644 index 000000000..4e32f34ea --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/brass_block.json @@ -0,0 +1,15 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:storage_blocks/brass" + } + ], + "results": [ + { + "item": "create:crushed_brass", + "count": 5 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/coal_ore.json b/src/generated/resources/data/create/recipes/crushing/coal_ore.json new file mode 100644 index 000000000..a6b0e5e70 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/coal_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:coal_ore" + } + ], + "results": [ + { + "item": "minecraft:coal", + "count": 2 + }, + { + "item": "minecraft:coal", + "count": 2, + "chance": 0.5 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/copper_block.json b/src/generated/resources/data/create/recipes/crushing/copper_block.json new file mode 100644 index 000000000..7965a3dbb --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/copper_block.json @@ -0,0 +1,15 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:storage_blocks/copper" + } + ], + "results": [ + { + "item": "create:crushed_copper_ore", + "count": 5 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/copper_ore.json b/src/generated/resources/data/create/recipes/crushing/copper_ore.json new file mode 100644 index 000000000..acbbd3485 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/copper_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:ores/copper" + } + ], + "results": [ + { + "item": "create:crushed_copper_ore", + "count": 1 + }, + { + "item": "create:crushed_copper_ore", + "count": 2, + "chance": 0.3 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 350 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/diamond_horse_armor.json b/src/generated/resources/data/create/recipes/crushing/diamond_horse_armor.json new file mode 100644 index 000000000..b3c2ad2aa --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/diamond_horse_armor.json @@ -0,0 +1,30 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:diamond_horse_armor" + } + ], + "results": [ + { + "item": "minecraft:diamond", + "count": 1 + }, + { + "item": "minecraft:leather", + "count": 2, + "chance": 0.5 + }, + { + "item": "minecraft:diamond", + "count": 3, + "chance": 0.1 + }, + { + "item": "minecraft:string", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/emerald_ore.json b/src/generated/resources/data/create/recipes/crushing/emerald_ore.json new file mode 100644 index 000000000..04dcd5959 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/emerald_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:emerald_ore" + } + ], + "results": [ + { + "item": "minecraft:emerald", + "count": 2 + }, + { + "item": "minecraft:emerald", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 500 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/glowstone.json b/src/generated/resources/data/create/recipes/crushing/glowstone.json new file mode 100644 index 000000000..025f79b19 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/glowstone.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:glowstone" + } + ], + "results": [ + { + "item": "minecraft:glowstone_dust", + "count": 3 + }, + { + "item": "minecraft:glowstone_dust", + "count": 1, + "chance": 0.5 + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/gold_ore.json b/src/generated/resources/data/create/recipes/crushing/gold_ore.json new file mode 100644 index 000000000..2a11c9c9c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/gold_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:ores/gold" + } + ], + "results": [ + { + "item": "create:crushed_gold_ore", + "count": 1 + }, + { + "item": "create:crushed_gold_ore", + "count": 2, + "chance": 0.3 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/golden_horse_armor.json b/src/generated/resources/data/create/recipes/crushing/golden_horse_armor.json new file mode 100644 index 000000000..7bb9a3b8f --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/golden_horse_armor.json @@ -0,0 +1,35 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:golden_horse_armor" + } + ], + "results": [ + { + "item": "minecraft:gold_ingot", + "count": 2 + }, + { + "item": "minecraft:leather", + "count": 2, + "chance": 0.5 + }, + { + "item": "minecraft:gold_ingot", + "count": 2, + "chance": 0.5 + }, + { + "item": "minecraft:string", + "count": 2, + "chance": 0.25 + }, + { + "item": "minecraft:gold_nugget", + "count": 8, + "chance": 0.25 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/gravel.json b/src/generated/resources/data/create/recipes/crushing/gravel.json new file mode 100644 index 000000000..d3fa20f0b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/gravel.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:gravel" + } + ], + "results": [ + { + "item": "minecraft:sand", + "count": 1 + }, + { + "item": "minecraft:flint", + "count": 1, + "chance": 0.1 + }, + { + "item": "minecraft:clay_ball", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 250 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/iron_horse_armor.json b/src/generated/resources/data/create/recipes/crushing/iron_horse_armor.json new file mode 100644 index 000000000..c075b1c6b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/iron_horse_armor.json @@ -0,0 +1,35 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:iron_horse_armor" + } + ], + "results": [ + { + "item": "minecraft:iron_ingot", + "count": 2 + }, + { + "item": "minecraft:leather", + "count": 1, + "chance": 0.5 + }, + { + "item": "minecraft:iron_ingot", + "count": 1, + "chance": 0.5 + }, + { + "item": "minecraft:string", + "count": 2, + "chance": 0.25 + }, + { + "item": "minecraft:iron_nugget", + "count": 4, + "chance": 0.25 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/iron_ore.json b/src/generated/resources/data/create/recipes/crushing/iron_ore.json new file mode 100644 index 000000000..2cf448408 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/iron_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:ores/iron" + } + ], + "results": [ + { + "item": "create:crushed_iron_ore", + "count": 1 + }, + { + "item": "create:crushed_iron_ore", + "count": 2, + "chance": 0.3 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/lapis_ore.json b/src/generated/resources/data/create/recipes/crushing/lapis_ore.json new file mode 100644 index 000000000..4e4411dea --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/lapis_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:lapis_ore" + } + ], + "results": [ + { + "item": "minecraft:lapis_lazuli", + "count": 12 + }, + { + "item": "minecraft:lapis_lazuli", + "count": 8, + "chance": 0.25 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/leather_horse_armor.json b/src/generated/resources/data/create/recipes/crushing/leather_horse_armor.json new file mode 100644 index 000000000..b7ecff4d9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/leather_horse_armor.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:leather_horse_armor" + } + ], + "results": [ + { + "item": "minecraft:leather", + "count": 2 + }, + { + "item": "minecraft:leather", + "count": 2, + "chance": 0.5 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/nether_quartz_ore.json b/src/generated/resources/data/create/recipes/crushing/nether_quartz_ore.json new file mode 100644 index 000000000..382d7be3d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/nether_quartz_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:nether_quartz_ore" + } + ], + "results": [ + { + "item": "minecraft:quartz", + "count": 2 + }, + { + "item": "minecraft:quartz", + "count": 4, + "chance": 0.5 + }, + { + "item": "minecraft:netherrack", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 350 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/nether_wart_block_no_quark.json b/src/generated/resources/data/create/recipes/crushing/nether_wart_block_no_quark.json new file mode 100644 index 000000000..ee336d4b6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/nether_wart_block_no_quark.json @@ -0,0 +1,29 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:nether_wart_block" + } + ], + "results": [ + { + "item": "minecraft:nether_wart", + "count": 6 + }, + { + "item": "minecraft:nether_wart", + "count": 2, + "chance": 0.5 + } + ], + "processingTime": 150, + "conditions": [ + { + "value": { + "modid": "quark", + "type": "forge:mod_loaded" + }, + "type": "forge:not" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/nether_wart_block_quark.json b/src/generated/resources/data/create/recipes/crushing/nether_wart_block_quark.json new file mode 100644 index 000000000..080e4c3dc --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/nether_wart_block_quark.json @@ -0,0 +1,26 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:nether_wart_block" + } + ], + "results": [ + { + "item": "minecraft:nether_wart", + "count": 2 + }, + { + "item": "minecraft:nether_wart", + "count": 2, + "chance": 0.5 + } + ], + "processingTime": 150, + "conditions": [ + { + "modid": "quark", + "type": "forge:mod_loaded" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/obsidian.json b/src/generated/resources/data/create/recipes/crushing/obsidian.json new file mode 100644 index 000000000..178795c78 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/obsidian.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:obsidian" + } + ], + "results": [ + { + "item": "create:powdered_obsidian", + "count": 1 + }, + { + "item": "minecraft:obsidian", + "count": 1, + "chance": 0.75 + } + ], + "processingTime": 500 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json b/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json new file mode 100644 index 000000000..bedfb41c0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json @@ -0,0 +1,30 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:prismarine_crystals" + } + ], + "results": [ + { + "item": "minecraft:prismarine_shard", + "count": 2 + }, + { + "item": "minecraft:quartz", + "count": 2, + "chance": 0.75 + }, + { + "item": "minecraft:prismarine_shard", + "count": 2, + "chance": 0.25 + }, + { + "item": "minecraft:glowstone_dust", + "count": 2, + "chance": 0.1 + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/redstone_ore.json b/src/generated/resources/data/create/recipes/crushing/redstone_ore.json new file mode 100644 index 000000000..c84532867 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/redstone_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:redstone_ore" + } + ], + "results": [ + { + "item": "minecraft:redstone", + "count": 8 + }, + { + "item": "minecraft:redstone", + "count": 6, + "chance": 0.25 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/sand.json b/src/generated/resources/data/create/recipes/crushing/sand.json new file mode 100644 index 000000000..ac35f5312 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/sand.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:sand" + } + ], + "results": [ + { + "item": "create:limesand", + "count": 1 + }, + { + "item": "create:limesand", + "count": 1, + "chance": 0.5 + }, + { + "item": "minecraft:bone_meal", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/wool.json b/src/generated/resources/data/create/recipes/crushing/wool.json new file mode 100644 index 000000000..2c3145e2c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/wool.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "minecraft:wool" + } + ], + "results": [ + { + "item": "minecraft:string", + "count": 2 + }, + { + "item": "minecraft:string", + "count": 1, + "chance": 0.5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/zinc_block.json b/src/generated/resources/data/create/recipes/crushing/zinc_block.json new file mode 100644 index 000000000..b8122dc32 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/zinc_block.json @@ -0,0 +1,15 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:storage_blocks/zinc" + } + ], + "results": [ + { + "item": "create:crushed_zinc_ore", + "count": 5 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/zinc_ore.json b/src/generated/resources/data/create/recipes/crushing/zinc_ore.json new file mode 100644 index 000000000..e38a2b1c2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/zinc_ore.json @@ -0,0 +1,25 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "forge:ores/zinc" + } + ], + "results": [ + { + "item": "create:crushed_zinc_ore", + "count": 1 + }, + { + "item": "create:crushed_zinc_ore", + "count": 2, + "chance": 0.3 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 350 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/acacia_log.json b/src/generated/resources/data/create/recipes/cutting/acacia_log.json new file mode 100644 index 000000000..e97cddad1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/acacia_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:acacia_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_acacia_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/acacia_wood.json b/src/generated/resources/data/create/recipes/cutting/acacia_wood.json new file mode 100644 index 000000000..2646da134 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/acacia_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:acacia_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_acacia_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/andesite_alloy.json b/src/generated/resources/data/create/recipes/cutting/andesite_alloy.json new file mode 100644 index 000000000..e43f2d56a --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/andesite_alloy.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "create:andesite_alloy" + } + ], + "results": [ + { + "item": "create:shaft", + "count": 6 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/birch_log.json b/src/generated/resources/data/create/recipes/cutting/birch_log.json new file mode 100644 index 000000000..9d2e90d44 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/birch_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:birch_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_birch_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/birch_wood.json b/src/generated/resources/data/create/recipes/cutting/birch_wood.json new file mode 100644 index 000000000..b788eebb2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/birch_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:birch_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_birch_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json b/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json new file mode 100644 index 000000000..82dd4b22e --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:dark_oak_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_dark_oak_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json new file mode 100644 index 000000000..8c56dcf76 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:dark_oak_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_dark_oak_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/jungle_log.json b/src/generated/resources/data/create/recipes/cutting/jungle_log.json new file mode 100644 index 000000000..06925a237 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/jungle_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:jungle_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_jungle_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/jungle_wood.json b/src/generated/resources/data/create/recipes/cutting/jungle_wood.json new file mode 100644 index 000000000..ee2f67cb1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/jungle_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:jungle_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_jungle_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/oak_log.json b/src/generated/resources/data/create/recipes/cutting/oak_log.json new file mode 100644 index 000000000..d699bbcb3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/oak_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:oak_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_oak_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/oak_wood.json b/src/generated/resources/data/create/recipes/cutting/oak_wood.json new file mode 100644 index 000000000..275016a6d --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/oak_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:oak_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_oak_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/spruce_log.json b/src/generated/resources/data/create/recipes/cutting/spruce_log.json new file mode 100644 index 000000000..bef24e667 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/spruce_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:spruce_log" + } + ], + "results": [ + { + "item": "minecraft:stripped_spruce_log", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/spruce_wood.json b/src/generated/resources/data/create/recipes/cutting/spruce_wood.json new file mode 100644 index 000000000..4a7469621 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/spruce_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:spruce_wood" + } + ], + "results": [ + { + "item": "minecraft:stripped_spruce_wood", + "count": 1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json new file mode 100644 index 000000000..c04b56b51 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_acacia_log" + } + ], + "results": [ + { + "item": "minecraft:acacia_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json new file mode 100644 index 000000000..b13377f88 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_acacia_wood" + } + ], + "results": [ + { + "item": "minecraft:acacia_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json new file mode 100644 index 000000000..367c77dda --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_birch_log" + } + ], + "results": [ + { + "item": "minecraft:birch_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json new file mode 100644 index 000000000..e47607e25 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_birch_wood" + } + ], + "results": [ + { + "item": "minecraft:birch_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json new file mode 100644 index 000000000..926996581 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_dark_oak_log" + } + ], + "results": [ + { + "item": "minecraft:dark_oak_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json new file mode 100644 index 000000000..7df760eb5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_dark_oak_wood" + } + ], + "results": [ + { + "item": "minecraft:dark_oak_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json new file mode 100644 index 000000000..f4cfbdb15 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_jungle_log" + } + ], + "results": [ + { + "item": "minecraft:jungle_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json new file mode 100644 index 000000000..2cbc87f06 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_jungle_wood" + } + ], + "results": [ + { + "item": "minecraft:jungle_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json new file mode 100644 index 000000000..9fe00f52d --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_oak_log" + } + ], + "results": [ + { + "item": "minecraft:oak_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json new file mode 100644 index 000000000..c761dbfd7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_oak_wood" + } + ], + "results": [ + { + "item": "minecraft:oak_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json new file mode 100644 index 000000000..7bec71d4e --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_spruce_log" + } + ], + "results": [ + { + "item": "minecraft:spruce_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json new file mode 100644 index 000000000..45f30b64b --- /dev/null +++ b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json @@ -0,0 +1,15 @@ +{ + "type": "create:cutting", + "ingredients": [ + { + "item": "minecraft:stripped_spruce_wood" + } + ], + "results": [ + { + "item": "minecraft:spruce_planks", + "count": 5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/filling/water_bottle.json b/src/generated/resources/data/create/recipes/filling/water_bottle.json new file mode 100644 index 000000000..4f99990bd --- /dev/null +++ b/src/generated/resources/data/create/recipes/filling/water_bottle.json @@ -0,0 +1,21 @@ +{ + "type": "create:filling", + "ingredients": [ + { + "item": "minecraft:glass_bottle" + }, + { + "fluidTag": "minecraft:water", + "amount": 250 + } + ], + "results": [ + { + "item": "minecraft:potion", + "count": 1, + "nbt": { + "Potion": "minecraft:water" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json b/src/generated/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json new file mode 100644 index 000000000..a8c1170ec --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json @@ -0,0 +1,25 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + " AAA ", + "AAPAA", + "APSPA", + "AAPAA", + " AAA " + ], + "key": { + "P": { + "tag": "minecraft:planks" + }, + "S": { + "tag": "forge:stone" + }, + "A": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:crushing_wheel", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json b/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json new file mode 100644 index 000000000..37d2eeae5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json @@ -0,0 +1,27 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + " L ", + " R ", + "SSS", + "SSS", + " H " + ], + "key": { + "L": { + "tag": "forge:ingots/brass" + }, + "R": { + "item": "create:cogwheel" + }, + "H": { + "item": "create:brass_hand" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "create:extendo_grip" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/flywheel.json b/src/generated/resources/data/create/recipes/mechanical_crafting/flywheel.json new file mode 100644 index 000000000..010b2fbae --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/flywheel.json @@ -0,0 +1,19 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + " BBB", + "CB B", + " BBB" + ], + "key": { + "B": { + "tag": "forge:ingots/brass" + }, + "C": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:flywheel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/furnace_engine.json b/src/generated/resources/data/create/recipes/mechanical_crafting/furnace_engine.json new file mode 100644 index 000000000..45765aebe --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/furnace_engine.json @@ -0,0 +1,30 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + "PPB", + "PCI", + "PPB" + ], + "key": { + "P": { + "tag": "forge:plates/brass" + }, + "B": { + "tag": "forge:ingots/brass" + }, + "I": [ + { + "item": "minecraft:piston" + }, + { + "item": "minecraft:sticky_piston" + } + ], + "C": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:furnace_engine" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json b/src/generated/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json new file mode 100644 index 000000000..68a5323da --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json @@ -0,0 +1,25 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + " L ", + "RRQRR", + " CCC " + ], + "key": { + "L": { + "item": "create:lapis_sheet" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "Q": { + "item": "create:polished_rose_quartz" + }, + "C": { + "tag": "forge:nuggets/gold" + } + }, + "result": { + "item": "create:integrated_circuit" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/mechanical_arm.json b/src/generated/resources/data/create/recipes/mechanical_crafting/mechanical_arm.json new file mode 100644 index 000000000..64f639754 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/mechanical_arm.json @@ -0,0 +1,30 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + "LLA", + "L ", + "LL ", + " I ", + "RCR" + ], + "key": { + "L": { + "tag": "forge:plates/brass" + }, + "R": { + "item": "create:cogwheel" + }, + "I": { + "item": "create:integrated_circuit" + }, + "A": { + "item": "create:andesite_alloy" + }, + "C": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:mechanical_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/nixie_tube.json b/src/generated/resources/data/create/recipes/mechanical_crafting/nixie_tube.json new file mode 100644 index 000000000..cfbf22475 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/nixie_tube.json @@ -0,0 +1,17 @@ +{ + "type": "create:mechanical_crafting", + "pattern": [ + "EBE" + ], + "key": { + "E": { + "item": "create:electron_tube" + }, + "B": { + "item": "create:brass_casing" + } + }, + "result": { + "item": "create:nixie_tube" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/allium.json b/src/generated/resources/data/create/recipes/milling/allium.json new file mode 100644 index 000000000..9b2122fb5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/allium.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:allium" + } + ], + "results": [ + { + "item": "minecraft:magenta_dye", + "count": 2 + }, + { + "item": "minecraft:purple_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/generated/resources/data/create/recipes/milling/andesite.json b/src/generated/resources/data/create/recipes/milling/andesite.json new file mode 100644 index 000000000..b6407650b --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/andesite.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:andesite" + } + ], + "results": [ + { + "item": "minecraft:cobblestone", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/azure_bluet.json b/src/generated/resources/data/create/recipes/milling/azure_bluet.json new file mode 100644 index 000000000..0fd3c365a --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/azure_bluet.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:azure_bluet" + } + ], + "results": [ + { + "item": "minecraft:light_gray_dye", + "count": 2 + }, + { + "item": "minecraft:white_dye", + "count": 2, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/blue_orchid.json b/src/generated/resources/data/create/recipes/milling/blue_orchid.json new file mode 100644 index 000000000..c6a74e299 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/blue_orchid.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:blue_orchid" + } + ], + "results": [ + { + "item": "minecraft:light_blue_dye", + "count": 2 + }, + { + "item": "minecraft:light_gray_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/bone.json b/src/generated/resources/data/create/recipes/milling/bone.json new file mode 100644 index 000000000..4749558c9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/bone.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:bone" + } + ], + "results": [ + { + "item": "minecraft:bone_meal", + "count": 3 + }, + { + "item": "minecraft:white_dye", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:bone_meal", + "count": 3, + "chance": 0.25 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/bone_meal.json b/src/generated/resources/data/create/recipes/milling/bone_meal.json new file mode 100644 index 000000000..ff4066c57 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/bone_meal.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:bone_meal" + } + ], + "results": [ + { + "item": "minecraft:white_dye", + "count": 2 + }, + { + "item": "minecraft:light_gray_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 70 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/cactus.json b/src/generated/resources/data/create/recipes/milling/cactus.json new file mode 100644 index 000000000..3f827b13f --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/cactus.json @@ -0,0 +1,29 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:cactus" + } + ], + "results": [ + { + "item": "minecraft:green_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50, + "conditions": [ + { + "value": { + "modid": "quark", + "type": "forge:mod_loaded" + }, + "type": "forge:not" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/charcoal.json b/src/generated/resources/data/create/recipes/milling/charcoal.json new file mode 100644 index 000000000..e85668da1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/charcoal.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:charcoal" + } + ], + "results": [ + { + "item": "minecraft:black_dye", + "count": 1 + }, + { + "item": "minecraft:gray_dye", + "count": 2, + "chance": 0.1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/clay.json b/src/generated/resources/data/create/recipes/milling/clay.json new file mode 100644 index 000000000..fd2e6eb8e --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/clay.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:clay" + } + ], + "results": [ + { + "item": "minecraft:clay_ball", + "count": 3 + }, + { + "item": "minecraft:clay_ball", + "count": 1, + "chance": 0.5 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/coal.json b/src/generated/resources/data/create/recipes/milling/coal.json new file mode 100644 index 000000000..08fd5cba4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/coal.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:coal" + } + ], + "results": [ + { + "item": "minecraft:black_dye", + "count": 2 + }, + { + "item": "minecraft:gray_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/cobblestone.json b/src/generated/resources/data/create/recipes/milling/cobblestone.json new file mode 100644 index 000000000..73bddb47e --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/cobblestone.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:cobblestone" + } + ], + "results": [ + { + "item": "minecraft:gravel", + "count": 1 + } + ], + "processingTime": 250 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/cocoa_beans.json b/src/generated/resources/data/create/recipes/milling/cocoa_beans.json new file mode 100644 index 000000000..9bd6ff751 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/cocoa_beans.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:cocoa_beans" + } + ], + "results": [ + { + "item": "minecraft:brown_dye", + "count": 2 + }, + { + "item": "minecraft:brown_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 70 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/copper_ore.json b/src/generated/resources/data/create/recipes/milling/copper_ore.json new file mode 100644 index 000000000..8dd6ac2d7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/copper_ore.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ores/copper" + } + ], + "results": [ + { + "item": "create:crushed_copper_ore", + "count": 1 + } + ], + "processingTime": 350 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/cornflower.json b/src/generated/resources/data/create/recipes/milling/cornflower.json new file mode 100644 index 000000000..14802f13e --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/cornflower.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:cornflower" + } + ], + "results": [ + { + "item": "minecraft:blue_dye", + "count": 2 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/dandelion.json b/src/generated/resources/data/create/recipes/milling/dandelion.json new file mode 100644 index 000000000..7a075b62e --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/dandelion.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:dandelion" + } + ], + "results": [ + { + "item": "minecraft:yellow_dye", + "count": 2 + }, + { + "item": "minecraft:yellow_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/diorite.json b/src/generated/resources/data/create/recipes/milling/diorite.json new file mode 100644 index 000000000..03d738539 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/diorite.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:diorite" + } + ], + "results": [ + { + "item": "create:limesand", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/fern.json b/src/generated/resources/data/create/recipes/milling/fern.json new file mode 100644 index 000000000..61c0647c6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/fern.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:fern" + } + ], + "results": [ + { + "item": "minecraft:green_dye", + "count": 1 + }, + { + "item": "minecraft:wheat_seeds", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/gold_ore.json b/src/generated/resources/data/create/recipes/milling/gold_ore.json new file mode 100644 index 000000000..c4268cfd5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/gold_ore.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ores/gold" + } + ], + "results": [ + { + "item": "create:crushed_gold_ore", + "count": 1 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/granite.json b/src/generated/resources/data/create/recipes/milling/granite.json new file mode 100644 index 000000000..4deb8938a --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/granite.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:granite" + } + ], + "results": [ + { + "item": "minecraft:red_sand", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/grass.json b/src/generated/resources/data/create/recipes/milling/grass.json new file mode 100644 index 000000000..4296a29a4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/grass.json @@ -0,0 +1,16 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:grass" + } + ], + "results": [ + { + "item": "minecraft:wheat_seeds", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/gravel.json b/src/generated/resources/data/create/recipes/milling/gravel.json new file mode 100644 index 000000000..2f2936565 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/gravel.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:gravel" + } + ], + "results": [ + { + "item": "minecraft:flint", + "count": 1 + } + ], + "processingTime": 250 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/ink_sac.json b/src/generated/resources/data/create/recipes/milling/ink_sac.json new file mode 100644 index 000000000..80d8f92c4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/ink_sac.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:ink_sac" + } + ], + "results": [ + { + "item": "minecraft:black_dye", + "count": 2 + }, + { + "item": "minecraft:gray_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/iron_ore.json b/src/generated/resources/data/create/recipes/milling/iron_ore.json new file mode 100644 index 000000000..6cedea49f --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/iron_ore.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ores/iron" + } + ], + "results": [ + { + "item": "create:crushed_iron_ore", + "count": 1 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/lapis_lazuli.json b/src/generated/resources/data/create/recipes/milling/lapis_lazuli.json new file mode 100644 index 000000000..7e8dc7061 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/lapis_lazuli.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:lapis_lazuli" + } + ], + "results": [ + { + "item": "minecraft:blue_dye", + "count": 2 + }, + { + "item": "minecraft:blue_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/large_fern.json b/src/generated/resources/data/create/recipes/milling/large_fern.json new file mode 100644 index 000000000..820a2d3b4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/large_fern.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:large_fern" + } + ], + "results": [ + { + "item": "minecraft:green_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.5 + }, + { + "item": "minecraft:wheat_seeds", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/lilac.json b/src/generated/resources/data/create/recipes/milling/lilac.json new file mode 100644 index 000000000..e996dab47 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/lilac.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:lilac" + } + ], + "results": [ + { + "item": "minecraft:magenta_dye", + "count": 3 + }, + { + "item": "minecraft:magenta_dye", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:purple_dye", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/lily_of_the_valley.json b/src/generated/resources/data/create/recipes/milling/lily_of_the_valley.json new file mode 100644 index 000000000..75f5061a8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/lily_of_the_valley.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:lily_of_the_valley" + } + ], + "results": [ + { + "item": "minecraft:white_dye", + "count": 2 + }, + { + "item": "minecraft:lime_dye", + "count": 1, + "chance": 0.1 + }, + { + "item": "minecraft:white_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/orange_tulip.json b/src/generated/resources/data/create/recipes/milling/orange_tulip.json new file mode 100644 index 000000000..9bd63ec00 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/orange_tulip.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:orange_tulip" + } + ], + "results": [ + { + "item": "minecraft:orange_dye", + "count": 2 + }, + { + "item": "minecraft:lime_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/oxeye_daisy.json b/src/generated/resources/data/create/recipes/milling/oxeye_daisy.json new file mode 100644 index 000000000..b4bf83a33 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/oxeye_daisy.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:oxeye_daisy" + } + ], + "results": [ + { + "item": "minecraft:light_gray_dye", + "count": 2 + }, + { + "item": "minecraft:white_dye", + "count": 1, + "chance": 0.2 + }, + { + "item": "minecraft:yellow_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/peony.json b/src/generated/resources/data/create/recipes/milling/peony.json new file mode 100644 index 000000000..1c10dc7c1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/peony.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:peony" + } + ], + "results": [ + { + "item": "minecraft:pink_dye", + "count": 3 + }, + { + "item": "minecraft:magenta_dye", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:pink_dye", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/pink_tulip.json b/src/generated/resources/data/create/recipes/milling/pink_tulip.json new file mode 100644 index 000000000..8503ef5b6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/pink_tulip.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:pink_tulip" + } + ], + "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/generated/resources/data/create/recipes/milling/poppy.json b/src/generated/resources/data/create/recipes/milling/poppy.json new file mode 100644 index 000000000..49e044999 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/poppy.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:poppy" + } + ], + "results": [ + { + "item": "minecraft:red_dye", + "count": 2 + }, + { + "item": "minecraft:green_dye", + "count": 1, + "chance": 0.05 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/red_tulip.json b/src/generated/resources/data/create/recipes/milling/red_tulip.json new file mode 100644 index 000000000..0bfeae5a4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/red_tulip.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:red_tulip" + } + ], + "results": [ + { + "item": "minecraft:red_dye", + "count": 2 + }, + { + "item": "minecraft:lime_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/rose_bush.json b/src/generated/resources/data/create/recipes/milling/rose_bush.json new file mode 100644 index 000000000..cbb71a6db --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/rose_bush.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:rose_bush" + } + ], + "results": [ + { + "item": "minecraft:red_dye", + "count": 3 + }, + { + "item": "minecraft:green_dye", + "count": 2, + "chance": 0.05 + }, + { + "item": "minecraft:red_dye", + "count": 2, + "chance": 0.25 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/saddle.json b/src/generated/resources/data/create/recipes/milling/saddle.json new file mode 100644 index 000000000..65fa3d2ca --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/saddle.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:saddle" + } + ], + "results": [ + { + "item": "minecraft:leather", + "count": 2 + }, + { + "item": "minecraft:leather", + "count": 2, + "chance": 0.5 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/sand.json b/src/generated/resources/data/create/recipes/milling/sand.json new file mode 100644 index 000000000..ed73b0f46 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/sand.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:sand" + } + ], + "results": [ + { + "item": "create:limesand", + "count": 1 + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/sugar_cane.json b/src/generated/resources/data/create/recipes/milling/sugar_cane.json new file mode 100644 index 000000000..6c6447858 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/sugar_cane.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:sugar_cane" + } + ], + "results": [ + { + "item": "minecraft:sugar", + "count": 2 + }, + { + "item": "minecraft:sugar", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/sunflower.json b/src/generated/resources/data/create/recipes/milling/sunflower.json new file mode 100644 index 000000000..8152ef361 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/sunflower.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:sunflower" + } + ], + "results": [ + { + "item": "minecraft:yellow_dye", + "count": 3 + }, + { + "item": "minecraft:orange_dye", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:yellow_dye", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/tall_grass.json b/src/generated/resources/data/create/recipes/milling/tall_grass.json new file mode 100644 index 000000000..0a424d6b2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/tall_grass.json @@ -0,0 +1,16 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:tall_grass" + } + ], + "results": [ + { + "item": "minecraft:wheat_seeds", + "count": 1, + "chance": 0.5 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/terracotta.json b/src/generated/resources/data/create/recipes/milling/terracotta.json new file mode 100644 index 000000000..f6afd2d6c --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/terracotta.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:terracotta" + } + ], + "results": [ + { + "item": "minecraft:red_sand", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/wheat.json b/src/generated/resources/data/create/recipes/milling/wheat.json new file mode 100644 index 000000000..21a37e275 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/wheat.json @@ -0,0 +1,25 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:wheat" + } + ], + "results": [ + { + "item": "create:wheat_flour", + "count": 1 + }, + { + "item": "create:wheat_flour", + "count": 2, + "chance": 0.25 + }, + { + "item": "minecraft:wheat_seeds", + "count": 1, + "chance": 0.25 + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/white_tulip.json b/src/generated/resources/data/create/recipes/milling/white_tulip.json new file mode 100644 index 000000000..6a8161037 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/white_tulip.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:white_tulip" + } + ], + "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/generated/resources/data/create/recipes/milling/wither_rose.json b/src/generated/resources/data/create/recipes/milling/wither_rose.json new file mode 100644 index 000000000..36123474b --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/wither_rose.json @@ -0,0 +1,20 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:wither_rose" + } + ], + "results": [ + { + "item": "minecraft:black_dye", + "count": 2 + }, + { + "item": "minecraft:black_dye", + "count": 1, + "chance": 0.1 + } + ], + "processingTime": 50 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/wool.json b/src/generated/resources/data/create/recipes/milling/wool.json new file mode 100644 index 000000000..97a819e2b --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/wool.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "tag": "minecraft:wool" + } + ], + "results": [ + { + "item": "minecraft:string", + "count": 1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/zinc_ore.json b/src/generated/resources/data/create/recipes/milling/zinc_ore.json new file mode 100644 index 000000000..ffb5b29bb --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/zinc_ore.json @@ -0,0 +1,15 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ores/zinc" + } + ], + "results": [ + { + "item": "create:crushed_zinc_ore", + "count": 1 + } + ], + "processingTime": 350 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/andesite_alloy.json b/src/generated/resources/data/create/recipes/mixing/andesite_alloy.json new file mode 100644 index 000000000..8d1c20243 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/andesite_alloy.json @@ -0,0 +1,17 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "minecraft:andesite" + }, + { + "tag": "forge:nuggets/iron" + } + ], + "results": [ + { + "item": "create:andesite_alloy", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/andesite_alloy_from_zinc.json b/src/generated/resources/data/create/recipes/mixing/andesite_alloy_from_zinc.json new file mode 100644 index 000000000..dde956bfe --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/andesite_alloy_from_zinc.json @@ -0,0 +1,17 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "minecraft:andesite" + }, + { + "tag": "forge:nuggets/zinc" + } + ], + "results": [ + { + "item": "create:andesite_alloy", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/brass_ingot.json b/src/generated/resources/data/create/recipes/mixing/brass_ingot.json new file mode 100644 index 000000000..94183eb22 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/brass_ingot.json @@ -0,0 +1,18 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "tag": "forge:ingots/copper" + }, + { + "tag": "forge:ingots/zinc" + } + ], + "results": [ + { + "item": "create:brass_ingot", + "count": 2 + } + ], + "heatRequirement": "heated" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/chromatic_compound.json b/src/generated/resources/data/create/recipes/mixing/chromatic_compound.json new file mode 100644 index 000000000..a30ac51c3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/chromatic_compound.json @@ -0,0 +1,33 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "tag": "forge:dusts/glowstone" + }, + { + "tag": "forge:dusts/glowstone" + }, + { + "tag": "forge:dusts/glowstone" + }, + { + "item": "create:powdered_obsidian" + }, + { + "item": "create:powdered_obsidian" + }, + { + "item": "create:powdered_obsidian" + }, + { + "item": "create:polished_rose_quartz" + } + ], + "results": [ + { + "item": "create:chromatic_compound", + "count": 1 + } + ], + "heatRequirement": "superheated" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/crushed_brass.json b/src/generated/resources/data/create/recipes/mixing/crushed_brass.json new file mode 100644 index 000000000..7c1e34832 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/crushed_brass.json @@ -0,0 +1,18 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "create:crushed_copper_ore" + }, + { + "item": "create:crushed_zinc_ore" + } + ], + "results": [ + { + "item": "create:crushed_brass", + "count": 2 + } + ], + "heatRequirement": "heated" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/gunpowder.json b/src/generated/resources/data/create/recipes/mixing/gunpowder.json new file mode 100644 index 000000000..f098f05fb --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/gunpowder.json @@ -0,0 +1,21 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "tag": "minecraft:coals" + }, + { + "item": "create:crushed_zinc_ore" + }, + { + "item": "minecraft:gunpowder" + } + ], + "results": [ + { + "item": "minecraft:gunpowder", + "count": 2 + } + ], + "heatRequirement": "heated" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_dark_scoria.json b/src/generated/resources/data/create/recipes/polished_dark_scoria.json index e91539b0d..1dcca3f52 100644 --- a/src/generated/resources/data/create/recipes/polished_dark_scoria.json +++ b/src/generated/resources/data/create/recipes/polished_dark_scoria.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_dark_scoria" + "item": "create:polished_dark_scoria", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_dolomite.json b/src/generated/resources/data/create/recipes/polished_dolomite.json index 59e9329c2..16fbd2463 100644 --- a/src/generated/resources/data/create/recipes/polished_dolomite.json +++ b/src/generated/resources/data/create/recipes/polished_dolomite.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_dolomite" + "item": "create:polished_dolomite", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_gabbro.json b/src/generated/resources/data/create/recipes/polished_gabbro.json index 369d8fcd7..c9fb7b71a 100644 --- a/src/generated/resources/data/create/recipes/polished_gabbro.json +++ b/src/generated/resources/data/create/recipes/polished_gabbro.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_gabbro" + "item": "create:polished_gabbro", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_limestone.json b/src/generated/resources/data/create/recipes/polished_limestone.json index b88af12cd..e07df319b 100644 --- a/src/generated/resources/data/create/recipes/polished_limestone.json +++ b/src/generated/resources/data/create/recipes/polished_limestone.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_limestone" + "item": "create:polished_limestone", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_scoria.json b/src/generated/resources/data/create/recipes/polished_scoria.json index 580108c1d..796ad769a 100644 --- a/src/generated/resources/data/create/recipes/polished_scoria.json +++ b/src/generated/resources/data/create/recipes/polished_scoria.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_scoria" + "item": "create:polished_scoria", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_weathered_limestone.json b/src/generated/resources/data/create/recipes/polished_weathered_limestone.json index 1953c0216..3d29b1740 100644 --- a/src/generated/resources/data/create/recipes/polished_weathered_limestone.json +++ b/src/generated/resources/data/create/recipes/polished_weathered_limestone.json @@ -10,6 +10,7 @@ } }, "result": { - "item": "create:polished_weathered_limestone" + "item": "create:polished_weathered_limestone", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/brass_ingot.json b/src/generated/resources/data/create/recipes/pressing/brass_ingot.json new file mode 100644 index 000000000..5c499ec8a --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/brass_ingot.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "tag": "forge:ingots/brass" + } + ], + "results": [ + { + "item": "create:brass_sheet", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/copper_ingot.json b/src/generated/resources/data/create/recipes/pressing/copper_ingot.json new file mode 100644 index 000000000..02aef9044 --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/copper_ingot.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "tag": "forge:ingots/copper" + } + ], + "results": [ + { + "item": "create:copper_sheet", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/gold_ingot.json b/src/generated/resources/data/create/recipes/pressing/gold_ingot.json new file mode 100644 index 000000000..701617f27 --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/gold_ingot.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "tag": "forge:ingots/gold" + } + ], + "results": [ + { + "item": "create:golden_sheet", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/iron_ingot.json b/src/generated/resources/data/create/recipes/pressing/iron_ingot.json new file mode 100644 index 000000000..fd85bea05 --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/iron_ingot.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "tag": "forge:ingots/iron" + } + ], + "results": [ + { + "item": "create:iron_sheet", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/lapis_block.json b/src/generated/resources/data/create/recipes/pressing/lapis_block.json new file mode 100644 index 000000000..f68528d3f --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/lapis_block.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "item": "minecraft:lapis_block" + } + ], + "results": [ + { + "item": "create:lapis_sheet", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/sugar_cane.json b/src/generated/resources/data/create/recipes/pressing/sugar_cane.json new file mode 100644 index 000000000..87a604c77 --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/sugar_cane.json @@ -0,0 +1,14 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "item": "minecraft:sugar_cane" + } + ], + "results": [ + { + "item": "minecraft:paper", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json b/src/generated/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json new file mode 100644 index 000000000..2c25f2400 --- /dev/null +++ b/src/generated/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json @@ -0,0 +1,14 @@ +{ + "type": "create:sandpaper_polishing", + "ingredients": [ + { + "item": "create:rose_quartz" + } + ], + "results": [ + { + "item": "create:polished_rose_quartz", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/crushed_brass.json b/src/generated/resources/data/create/recipes/smelting/brass_ingot_from_crushed.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/crushed_brass.json rename to src/generated/resources/data/create/recipes/smelting/brass_ingot_from_crushed.json diff --git a/src/main/resources/data/create/recipes/smelting/dough.json b/src/generated/resources/data/create/recipes/smelting/bread.json similarity index 86% rename from src/main/resources/data/create/recipes/smelting/dough.json rename to src/generated/resources/data/create/recipes/smelting/bread.json index a47aab4f9..e2b86a2cd 100644 --- a/src/main/resources/data/create/recipes/smelting/dough.json +++ b/src/generated/resources/data/create/recipes/smelting/bread.json @@ -4,6 +4,6 @@ "item": "create:dough" }, "result": "minecraft:bread", - "experience": 0.1, + "experience": 0.0, "cookingtime": 200 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/crushed_copper.json b/src/generated/resources/data/create/recipes/smelting/copper_ingot_from_crushed.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/crushed_copper.json rename to src/generated/resources/data/create/recipes/smelting/copper_ingot_from_crushed.json diff --git a/src/main/resources/data/create/recipes/smelting/copper_ore.json b/src/generated/resources/data/create/recipes/smelting/copper_ingot_from_ore.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/copper_ore.json rename to src/generated/resources/data/create/recipes/smelting/copper_ingot_from_ore.json diff --git a/src/main/resources/data/create/recipes/smelting/diorite.json b/src/generated/resources/data/create/recipes/smelting/dolomite.json similarity index 87% rename from src/main/resources/data/create/recipes/smelting/diorite.json rename to src/generated/resources/data/create/recipes/smelting/dolomite.json index 69293fd2d..f55cf70fa 100644 --- a/src/main/resources/data/create/recipes/smelting/diorite.json +++ b/src/generated/resources/data/create/recipes/smelting/dolomite.json @@ -4,6 +4,6 @@ "item": "minecraft:diorite" }, "result": "create:dolomite", - "experience": 0.1, + "experience": 0.0, "cookingtime": 200 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/granite.json b/src/generated/resources/data/create/recipes/smelting/gabbro.json similarity index 86% rename from src/main/resources/data/create/recipes/smelting/granite.json rename to src/generated/resources/data/create/recipes/smelting/gabbro.json index ce234c181..ed24a25b2 100644 --- a/src/main/resources/data/create/recipes/smelting/granite.json +++ b/src/generated/resources/data/create/recipes/smelting/gabbro.json @@ -4,6 +4,6 @@ "item": "minecraft:granite" }, "result": "create:gabbro", - "experience": 0.1, + "experience": 0.0, "cookingtime": 200 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/framed_glass.json b/src/generated/resources/data/create/recipes/smelting/glass_from_framed_glass.json similarity index 75% rename from src/main/resources/data/create/recipes/smelting/framed_glass.json rename to src/generated/resources/data/create/recipes/smelting/glass_from_framed_glass.json index a503aa5f1..f6cb6353f 100644 --- a/src/main/resources/data/create/recipes/smelting/framed_glass.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_from_framed_glass.json @@ -4,5 +4,6 @@ "item": "create:framed_glass" }, "result": "minecraft:glass", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/horizontal_framed_glass.json b/src/generated/resources/data/create/recipes/smelting/glass_from_horizontal_framed_glass.json similarity index 76% rename from src/main/resources/data/create/recipes/smelting/horizontal_framed_glass.json rename to src/generated/resources/data/create/recipes/smelting/glass_from_horizontal_framed_glass.json index 5df3e2235..369112329 100644 --- a/src/main/resources/data/create/recipes/smelting/horizontal_framed_glass.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_from_horizontal_framed_glass.json @@ -4,5 +4,6 @@ "item": "create:horizontal_framed_glass" }, "result": "minecraft:glass", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/tiled_glass.json b/src/generated/resources/data/create/recipes/smelting/glass_from_tiled_glass.json similarity index 74% rename from src/main/resources/data/create/recipes/smelting/tiled_glass.json rename to src/generated/resources/data/create/recipes/smelting/glass_from_tiled_glass.json index 5fdc2abae..39fddc162 100644 --- a/src/main/resources/data/create/recipes/smelting/tiled_glass.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_from_tiled_glass.json @@ -4,5 +4,6 @@ "item": "create:tiled_glass" }, "result": "minecraft:glass", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/vertical_framed_glass.json b/src/generated/resources/data/create/recipes/smelting/glass_from_vertical_framed_glass.json similarity index 76% rename from src/main/resources/data/create/recipes/smelting/vertical_framed_glass.json rename to src/generated/resources/data/create/recipes/smelting/glass_from_vertical_framed_glass.json index 488e4cb14..a73177413 100644 --- a/src/main/resources/data/create/recipes/smelting/vertical_framed_glass.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_from_vertical_framed_glass.json @@ -4,5 +4,6 @@ "item": "create:vertical_framed_glass" }, "result": "minecraft:glass", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/framed_glass_pane.json b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_framed_glass_pane.json similarity index 76% rename from src/main/resources/data/create/recipes/smelting/framed_glass_pane.json rename to src/generated/resources/data/create/recipes/smelting/glass_pane_from_framed_glass_pane.json index 6a2246ca2..2ecc3af7e 100644 --- a/src/main/resources/data/create/recipes/smelting/framed_glass_pane.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_framed_glass_pane.json @@ -4,5 +4,6 @@ "item": "create:framed_glass_pane" }, "result": "minecraft:glass_pane", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/horizontal_framed_glass_pane.json b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_horizontal_framed_glass_pane.json similarity index 77% rename from src/main/resources/data/create/recipes/smelting/horizontal_framed_glass_pane.json rename to src/generated/resources/data/create/recipes/smelting/glass_pane_from_horizontal_framed_glass_pane.json index d69f7b19b..797d2114e 100644 --- a/src/main/resources/data/create/recipes/smelting/horizontal_framed_glass_pane.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_horizontal_framed_glass_pane.json @@ -4,5 +4,6 @@ "item": "create:horizontal_framed_glass_pane" }, "result": "minecraft:glass_pane", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/tiled_glass_pane.json b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_tiled_glass_pane.json similarity index 76% rename from src/main/resources/data/create/recipes/smelting/tiled_glass_pane.json rename to src/generated/resources/data/create/recipes/smelting/glass_pane_from_tiled_glass_pane.json index 3b4b8ced7..ea09f4499 100644 --- a/src/main/resources/data/create/recipes/smelting/tiled_glass_pane.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_tiled_glass_pane.json @@ -4,5 +4,6 @@ "item": "create:tiled_glass_pane" }, "result": "minecraft:glass_pane", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/vertical_framed_glass_pane.json b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_vertical_framed_glass_pane.json similarity index 77% rename from src/main/resources/data/create/recipes/smelting/vertical_framed_glass_pane.json rename to src/generated/resources/data/create/recipes/smelting/glass_pane_from_vertical_framed_glass_pane.json index e159d3dcb..fa5b4cadb 100644 --- a/src/main/resources/data/create/recipes/smelting/vertical_framed_glass_pane.json +++ b/src/generated/resources/data/create/recipes/smelting/glass_pane_from_vertical_framed_glass_pane.json @@ -4,5 +4,6 @@ "item": "create:vertical_framed_glass_pane" }, "result": "minecraft:glass_pane", - "cookingtime": 100 + "experience": 0.0, + "cookingtime": 50 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/crushed_gold.json b/src/generated/resources/data/create/recipes/smelting/gold_ingot_from_crushed.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/crushed_gold.json rename to src/generated/resources/data/create/recipes/smelting/gold_ingot_from_crushed.json diff --git a/src/main/resources/data/create/recipes/smelting/crushed_iron.json b/src/generated/resources/data/create/recipes/smelting/iron_ingot_from_crushed.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/crushed_iron.json rename to src/generated/resources/data/create/recipes/smelting/iron_ingot_from_crushed.json diff --git a/src/main/resources/data/create/recipes/smelting/limesand.json b/src/generated/resources/data/create/recipes/smelting/limestone.json similarity index 87% rename from src/main/resources/data/create/recipes/smelting/limesand.json rename to src/generated/resources/data/create/recipes/smelting/limestone.json index eee8c9c3c..c0628f433 100644 --- a/src/main/resources/data/create/recipes/smelting/limesand.json +++ b/src/generated/resources/data/create/recipes/smelting/limestone.json @@ -4,6 +4,6 @@ "item": "create:limesand" }, "result": "create:limestone", - "experience": 0.1, + "experience": 0.0, "cookingtime": 200 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/soul_sand.json b/src/generated/resources/data/create/recipes/smelting/scoria.json similarity index 87% rename from src/main/resources/data/create/recipes/smelting/soul_sand.json rename to src/generated/resources/data/create/recipes/smelting/scoria.json index 9ac77427b..7a6c3a7de 100644 --- a/src/main/resources/data/create/recipes/smelting/soul_sand.json +++ b/src/generated/resources/data/create/recipes/smelting/scoria.json @@ -4,6 +4,6 @@ "item": "minecraft:soul_sand" }, "result": "create:scoria", - "experience": 0.1, + "experience": 0.0, "cookingtime": 200 } \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/smelting/crushed_zinc.json b/src/generated/resources/data/create/recipes/smelting/zinc_ingot_from_crushed.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/crushed_zinc.json rename to src/generated/resources/data/create/recipes/smelting/zinc_ingot_from_crushed.json diff --git a/src/main/resources/data/create/recipes/smelting/zinc_ore.json b/src/generated/resources/data/create/recipes/smelting/zinc_ingot_from_ore.json similarity index 100% rename from src/main/resources/data/create/recipes/smelting/zinc_ore.json rename to src/generated/resources/data/create/recipes/smelting/zinc_ingot_from_ore.json diff --git a/src/generated/resources/data/create/recipes/smoking/bread.json b/src/generated/resources/data/create/recipes/smoking/bread.json new file mode 100644 index 000000000..e57547195 --- /dev/null +++ b/src/generated/resources/data/create/recipes/smoking/bread.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "create:dough" + }, + "result": "minecraft:bread", + "experience": 0.0, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/black_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/black_concrete_powder.json new file mode 100644 index 000000000..be410a1b9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/black_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:black_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:black_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/blue_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/blue_concrete_powder.json new file mode 100644 index 000000000..80be1c465 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/blue_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:blue_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:blue_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/brown_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/brown_concrete_powder.json new file mode 100644 index 000000000..63fadb792 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/brown_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:brown_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:brown_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/crushed_brass.json b/src/generated/resources/data/create/recipes/splashing/crushed_brass.json new file mode 100644 index 000000000..3f24c6c85 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/crushed_brass.json @@ -0,0 +1,19 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:crushed_brass" + } + ], + "results": [ + { + "item": "create:brass_nugget", + "count": 10 + }, + { + "item": "create:brass_nugget", + "count": 5, + "chance": 0.5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/crushed_copper_ore.json b/src/generated/resources/data/create/recipes/splashing/crushed_copper_ore.json new file mode 100644 index 000000000..070f8ea77 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/crushed_copper_ore.json @@ -0,0 +1,19 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:crushed_copper_ore" + } + ], + "results": [ + { + "item": "create:copper_nugget", + "count": 10 + }, + { + "item": "create:copper_nugget", + "count": 5, + "chance": 0.5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/crushed_gold_ore.json b/src/generated/resources/data/create/recipes/splashing/crushed_gold_ore.json new file mode 100644 index 000000000..d2791a774 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/crushed_gold_ore.json @@ -0,0 +1,19 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:crushed_gold_ore" + } + ], + "results": [ + { + "item": "minecraft:gold_nugget", + "count": 10 + }, + { + "item": "minecraft:gold_nugget", + "count": 5, + "chance": 0.5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/crushed_iron_ore.json b/src/generated/resources/data/create/recipes/splashing/crushed_iron_ore.json new file mode 100644 index 000000000..7a9e70631 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/crushed_iron_ore.json @@ -0,0 +1,19 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:crushed_iron_ore" + } + ], + "results": [ + { + "item": "minecraft:iron_nugget", + "count": 10 + }, + { + "item": "minecraft:iron_nugget", + "count": 5, + "chance": 0.5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/crushed_zinc_ore.json b/src/generated/resources/data/create/recipes/splashing/crushed_zinc_ore.json new file mode 100644 index 000000000..5796f6834 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/crushed_zinc_ore.json @@ -0,0 +1,19 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:crushed_zinc_ore" + } + ], + "results": [ + { + "item": "create:zinc_nugget", + "count": 10 + }, + { + "item": "create:zinc_nugget", + "count": 5, + "chance": 0.5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/cyan_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/cyan_concrete_powder.json new file mode 100644 index 000000000..f8815092e --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/cyan_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:cyan_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:cyan_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/gravel.json b/src/generated/resources/data/create/recipes/splashing/gravel.json new file mode 100644 index 000000000..0df5f9371 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/gravel.json @@ -0,0 +1,20 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:gravel" + } + ], + "results": [ + { + "item": "minecraft:flint", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:iron_nugget", + "count": 1, + "chance": 0.125 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/gray_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/gray_concrete_powder.json new file mode 100644 index 000000000..f57928364 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/gray_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:gray_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:gray_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/green_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/green_concrete_powder.json new file mode 100644 index 000000000..a5bfc4a8c --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/green_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:green_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:green_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/ice.json b/src/generated/resources/data/create/recipes/splashing/ice.json new file mode 100644 index 000000000..d5002d565 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/ice.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:ice" + } + ], + "results": [ + { + "item": "minecraft:packed_ice", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/light_blue_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/light_blue_concrete_powder.json new file mode 100644 index 000000000..cc226489d --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/light_blue_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:light_blue_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:light_blue_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/light_gray_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/light_gray_concrete_powder.json new file mode 100644 index 000000000..b99c4337a --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/light_gray_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:light_gray_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:light_gray_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/lime_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/lime_concrete_powder.json new file mode 100644 index 000000000..21439c2d7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/lime_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:lime_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:lime_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/limestone.json b/src/generated/resources/data/create/recipes/splashing/limestone.json new file mode 100644 index 000000000..c9ba671c0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/limestone.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:limestone" + } + ], + "results": [ + { + "item": "create:weathered_limestone", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/magenta_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/magenta_concrete_powder.json new file mode 100644 index 000000000..2fffbbde1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/magenta_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:magenta_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:magenta_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/magma_block.json b/src/generated/resources/data/create/recipes/splashing/magma_block.json new file mode 100644 index 000000000..42ea897a9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/magma_block.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:magma_block" + } + ], + "results": [ + { + "item": "minecraft:obsidian", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/orange_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/orange_concrete_powder.json new file mode 100644 index 000000000..3ecbb2ca2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/orange_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:orange_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:orange_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/pink_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/pink_concrete_powder.json new file mode 100644 index 000000000..095ad54c8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/pink_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:pink_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:pink_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/purple_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/purple_concrete_powder.json new file mode 100644 index 000000000..09bd18055 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/purple_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:purple_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:purple_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/red_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/red_concrete_powder.json new file mode 100644 index 000000000..d5ca0f3d8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/red_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:red_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:red_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/red_sand.json b/src/generated/resources/data/create/recipes/splashing/red_sand.json new file mode 100644 index 000000000..644d6b492 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/red_sand.json @@ -0,0 +1,20 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:red_sand" + } + ], + "results": [ + { + "item": "minecraft:gold_nugget", + "count": 3, + "chance": 0.125 + }, + { + "item": "minecraft:dead_bush", + "count": 1, + "chance": 0.05 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/sand.json b/src/generated/resources/data/create/recipes/splashing/sand.json new file mode 100644 index 000000000..32360453e --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/sand.json @@ -0,0 +1,15 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:sand" + } + ], + "results": [ + { + "item": "minecraft:clay_ball", + "count": 1, + "chance": 0.25 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/soul_sand.json b/src/generated/resources/data/create/recipes/splashing/soul_sand.json new file mode 100644 index 000000000..2e1fa5c37 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/soul_sand.json @@ -0,0 +1,20 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:soul_sand" + } + ], + "results": [ + { + "item": "minecraft:quartz", + "count": 4, + "chance": 0.125 + }, + { + "item": "minecraft:gold_nugget", + "count": 1, + "chance": 0.02 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/stained_glass.json b/src/generated/resources/data/create/recipes/splashing/stained_glass.json new file mode 100644 index 000000000..b2a019444 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/stained_glass.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "tag": "forge:stained_glass" + } + ], + "results": [ + { + "item": "minecraft:glass", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/stained_glass_pane.json b/src/generated/resources/data/create/recipes/splashing/stained_glass_pane.json new file mode 100644 index 000000000..8ced73dc7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/stained_glass_pane.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "tag": "forge:stained_glass_panes" + } + ], + "results": [ + { + "item": "minecraft:glass_pane", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/wheat_flour.json b/src/generated/resources/data/create/recipes/splashing/wheat_flour.json new file mode 100644 index 000000000..d7bd89482 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/wheat_flour.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:wheat_flour" + } + ], + "results": [ + { + "item": "create:dough", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/white_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/white_concrete_powder.json new file mode 100644 index 000000000..cdec48afa --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/white_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:white_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:white_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/wool.json b/src/generated/resources/data/create/recipes/splashing/wool.json new file mode 100644 index 000000000..2f50ff88f --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/wool.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "tag": "minecraft:wool" + } + ], + "results": [ + { + "item": "minecraft:white_wool", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/yellow_concrete_powder.json b/src/generated/resources/data/create/recipes/splashing/yellow_concrete_powder.json new file mode 100644 index 000000000..f7f60ad05 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/yellow_concrete_powder.json @@ -0,0 +1,14 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "minecraft:yellow_concrete_powder" + } + ], + "results": [ + { + "item": "minecraft:yellow_concrete", + "count": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json index 58314746e..ca0269645 100644 --- a/src/generated/resources/data/create/tags/blocks/brittle.json +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -7,10 +7,6 @@ "create:pulley_magnet", "create:furnace_engine", "create:redstone_link", - "create:extractor", - "create:vertical_extractor", - "create:linked_extractor", - "create:vertical_linked_extractor", "#minecraft:doors", "minecraft:flower_pot", "minecraft:bell" diff --git a/src/generated/resources/data/create/tags/blocks/fan_heaters.json b/src/generated/resources/data/create/tags/blocks/fan_heaters.json index 7d6b87f02..ef385188e 100644 --- a/src/generated/resources/data/create/tags/blocks/fan_heaters.json +++ b/src/generated/resources/data/create/tags/blocks/fan_heaters.json @@ -1,7 +1,7 @@ { "replace": false, "values": [ - "create:blaze_heater", + "create:blaze_burner", "minecraft:magma_block", "minecraft:campfire", "minecraft:lava", diff --git a/src/generated/resources/data/create/tags/blocks/fan_transparent.json b/src/generated/resources/data/create/tags/blocks/fan_transparent.json index 099a5f090..68f9d3c80 100644 --- a/src/generated/resources/data/create/tags/blocks/fan_transparent.json +++ b/src/generated/resources/data/create/tags/blocks/fan_transparent.json @@ -1,7 +1,7 @@ { "replace": false, "values": [ - "create:blaze_heater", + "create:blaze_burner", "#minecraft:fences", "minecraft:iron_bars" ] diff --git a/src/generated/resources/data/create/tags/blocks/seats.json b/src/generated/resources/data/create/tags/blocks/seats.json new file mode 100644 index 000000000..cbf0642b6 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/seats.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "create:white_seat", + "create:orange_seat", + "create:magenta_seat", + "create:light_blue_seat", + "create:yellow_seat", + "create:lime_seat", + "create:pink_seat", + "create:gray_seat", + "create:light_gray_seat", + "create:cyan_seat", + "create:purple_seat", + "create:blue_seat", + "create:brown_seat", + "create:green_seat", + "create:red_seat", + "create:black_seat" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/tags/blocks/windmill_sails.json b/src/generated/resources/data/create/tags/blocks/windmill_sails.json similarity index 100% rename from src/main/resources/data/create/tags/blocks/windmill_sails.json rename to src/generated/resources/data/create/tags/blocks/windmill_sails.json diff --git a/src/generated/resources/data/create/tags/items/seats.json b/src/generated/resources/data/create/tags/items/seats.json new file mode 100644 index 000000000..cbf0642b6 --- /dev/null +++ b/src/generated/resources/data/create/tags/items/seats.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "create:white_seat", + "create:orange_seat", + "create:magenta_seat", + "create:light_blue_seat", + "create:yellow_seat", + "create:lime_seat", + "create:pink_seat", + "create:gray_seat", + "create:light_gray_seat", + "create:cyan_seat", + "create:purple_seat", + "create:blue_seat", + "create:brown_seat", + "create:green_seat", + "create:red_seat", + "create:black_seat" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/upright_on_belt.json b/src/generated/resources/data/create/tags/items/upright_on_belt.json new file mode 100644 index 000000000..4db8308e8 --- /dev/null +++ b/src/generated/resources/data/create/tags/items/upright_on_belt.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:glass_bottle", + "minecraft:potion", + "minecraft:splash_potion", + "minecraft:lingering_potion" + ] +} \ 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 a9bed6b2a..471788239 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -9,8 +9,11 @@ import java.util.List; import java.util.Map; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour.AttachmentTypes; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; @@ -29,47 +32,28 @@ public class AllBlockPartials { public static final AllBlockPartials SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"), SCHEMATICANNON_PIPE = get("schematicannon/pipe"), - SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"), - SHAFT_HALF = get("shaft_half"), - - BELT_PULLEY = get("belt_pulley"), - BELT_START = get("belt/start"), - BELT_MIDDLE = get("belt/middle"), - BELT_END = get("belt/end"), - BELT_START_BOTTOM = get("belt/start_bottom"), - BELT_MIDDLE_BOTTOM = get("belt/middle_bottom"), - BELT_END_BOTTOM = get("belt/end_bottom"), - BELT_DIAGONAL_START = get("belt/diagonal_start"), - BELT_DIAGONAL_MIDDLE = get("belt/diagonal_middle"), + SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"), SHAFT_HALF = get("shaft_half"), + + BELT_PULLEY = get("belt_pulley"), BELT_START = get("belt/start"), BELT_MIDDLE = get("belt/middle"), + BELT_END = get("belt/end"), BELT_START_BOTTOM = get("belt/start_bottom"), + BELT_MIDDLE_BOTTOM = get("belt/middle_bottom"), BELT_END_BOTTOM = get("belt/end_bottom"), + BELT_DIAGONAL_START = get("belt/diagonal_start"), BELT_DIAGONAL_MIDDLE = get("belt/diagonal_middle"), BELT_DIAGONAL_END = get("belt/diagonal_end"), ENCASED_FAN_INNER = get("encased_fan/propeller"), HAND_CRANK_HANDLE = get("hand_crank/handle"), MECHANICAL_PRESS_HEAD = get("mechanical_press/head"), MECHANICAL_MIXER_POLE = get("mechanical_mixer/pole"), - MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), BLAZE_HEATER_BLAZE_ONE = get("blaze_heater/blaze/one"), - BLAZE_HEATER_BLAZE_TWO = get("blaze_heater/blaze/two"), - BLAZE_HEATER_BLAZE_THREE = get("blaze_heater/blaze/three"), - BLAZE_HEATER_BLAZE_FOUR = get("blaze_heater/blaze/four"), - MECHANICAL_CRAFTER_LID = get("mechanical_crafter/lid"), + MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), MECHANICAL_CRAFTER_LID = get("mechanical_crafter/lid"), MECHANICAL_CRAFTER_ARROW = get("mechanical_crafter/arrow"), MECHANICAL_CRAFTER_BELT_FRAME = get("mechanical_crafter/belt"), - MECHANICAL_CRAFTER_BELT = get("mechanical_crafter/belt_animated"), - GAUGE_DIAL = get("gauge/dial"), - GAUGE_INDICATOR = get("gauge/indicator"), - GAUGE_HEAD_SPEED = get("gauge/speedometer/head"), - GAUGE_HEAD_STRESS = get("gauge/stressometer/head"), - BEARING_TOP = get("bearing/top"), - DRILL_HEAD = get("mechanical_drill/head"), - HARVESTER_BLADE = get("mechanical_harvester/blade"), - DEPLOYER_POLE = get("deployer/pole"), - DEPLOYER_HAND_POINTING = get("deployer/hand_pointing"), - DEPLOYER_HAND_PUNCHING = get("deployer/hand_punching"), - DEPLOYER_HAND_HOLDING = get("deployer/hand_holding"), - ANALOG_LEVER_HANDLE = get("analog_lever/handle"), - ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), - BELT_FUNNEL_FLAP = get("belt_funnel/flap"), - BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), - FLEXPEATER_INDICATOR = get("diodes/indicator"), - FLYWHEEL = get("flywheel/wheel"), + MECHANICAL_CRAFTER_BELT = get("mechanical_crafter/belt_animated"), GAUGE_DIAL = get("gauge/dial"), + GAUGE_INDICATOR = get("gauge/indicator"), GAUGE_HEAD_SPEED = get("gauge/speedometer/head"), + GAUGE_HEAD_STRESS = get("gauge/stressometer/head"), BEARING_TOP = get("bearing/top"), + DRILL_HEAD = get("mechanical_drill/head"), HARVESTER_BLADE = get("mechanical_harvester/blade"), + DEPLOYER_POLE = get("deployer/pole"), DEPLOYER_HAND_POINTING = get("deployer/hand_pointing"), + DEPLOYER_HAND_PUNCHING = get("deployer/hand_punching"), DEPLOYER_HAND_HOLDING = get("deployer/hand_holding"), + ANALOG_LEVER_HANDLE = get("analog_lever/handle"), ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), + BELT_FUNNEL_FLAP = get("belt_funnel/flap"), BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), + FLEXPEATER_INDICATOR = get("diodes/indicator"), FLYWHEEL = get("flywheel/wheel"), FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), FLYWHEEL_LOWER_ROTATING = get("flywheel/lower_rotating_connector"), @@ -80,7 +64,7 @@ public class AllBlockPartials { CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"), CUCKOO_CREEPER = get("cuckoo_clock/creeper"), ROPE_COIL = get("rope_pulley/rope_coil"), 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"), + MILLSTONE_COG = get("millstone/inner"), SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), @@ -94,9 +78,18 @@ public class AllBlockPartials { 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"); + FLUID_PIPE_CASING = get("fluid_pipe/casing"), - public static final Map PIPE_RIMS = map(); + SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), + + COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), + COUPLING_RING = getEntity("minecart_coupling/ring"), + COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") + + ; + + public static final Map> PIPE_ATTACHMENTS = map(); + public static final Map BLAZES = map(); static { populateMaps(); @@ -110,8 +103,20 @@ public class AllBlockPartials { private AllBlockPartials() {} private static void populateMaps() { - for (Direction d : Iterate.directions) { - PIPE_RIMS.put(d, get("fluid_pipe/rim/" + d.getString())); + for (AttachmentTypes type : AttachmentTypes.values()) { + if (!type.hasModel()) + continue; + Map map = map(); + for (Direction d : Iterate.directions) { + String asId = Lang.asId(type.name()); + map.put(d, get("fluid_pipe/" + asId + "/" + Lang.asId(d.getString()))); + } + PIPE_ATTACHMENTS.put(type, map); + } + for (HeatLevel heat : HeatLevel.values()) { + if (heat == HeatLevel.NONE) + continue; + BLAZES.put(heat, get("blaze_burner/blaze/" + heat.getString())); } } @@ -119,6 +124,13 @@ public class AllBlockPartials { return new HashMap<>(); } + private static AllBlockPartials getEntity(String path) { + AllBlockPartials partials = new AllBlockPartials(); + partials.modelLocation = new ResourceLocation(Create.ID, "entity/" + path); + all.add(partials); + return partials; + } + private static AllBlockPartials get(String path) { AllBlockPartials partials = new AllBlockPartials(); partials.modelLocation = new ResourceLocation(Create.ID, "block/" + path); diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 26928ba90..6f5a8db2d 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1,21 +1,28 @@ package com.simibubi.create; -import static com.simibubi.create.AllTags.forgeItemTag; +import static com.simibubi.create.AllMovementBehaviours.addMovementBehaviour; import static com.simibubi.create.AllTags.tagBlockAndItem; import static com.simibubi.create.content.AllSections.SCHEMATICS; +import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; import static com.simibubi.create.foundation.data.BlockStateGen.oxidizedBlockstate; import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel; import com.simibubi.create.AllTags.AllBlockTags; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.base.CasingBlock; import com.simibubi.create.content.contraptions.components.actors.DrillBlock; +import com.simibubi.create.content.contraptions.components.actors.DrillMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock; +import com.simibubi.create.content.contraptions.components.actors.HarvesterMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.PloughBlock; +import com.simibubi.create.content.contraptions.components.actors.PloughMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; +import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; +import com.simibubi.create.content.contraptions.components.actors.SeatMovementBehaviour; import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock; import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; @@ -23,6 +30,7 @@ import com.simibubi.create.content.contraptions.components.crank.HandCrankBlock; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelBlock; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; +import com.simibubi.create.content.contraptions.components.deployer.DeployerMovementBehaviour; import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock; import com.simibubi.create.content.contraptions.components.fan.NozzleBlock; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock; @@ -51,16 +59,19 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pul import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock; import com.simibubi.create.content.contraptions.components.turntable.TurntableBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; -import com.simibubi.create.content.contraptions.fluids.FluidPipeBlock; -import com.simibubi.create.content.contraptions.fluids.FluidPipeModel; -import com.simibubi.create.content.contraptions.fluids.FluidTankBlock; -import com.simibubi.create.content.contraptions.fluids.FluidTankGenerator; -import com.simibubi.create.content.contraptions.fluids.FluidTankItem; -import com.simibubi.create.content.contraptions.fluids.FluidTankModel; +import com.simibubi.create.content.contraptions.fluids.PipeAttachmentModel; import com.simibubi.create.content.contraptions.fluids.PumpBlock; +import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.GlassFluidPipeBlock; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankItem; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankModel; import com.simibubi.create.content.contraptions.processing.BasinBlock; -import com.simibubi.create.content.contraptions.processing.HeaterBlock; -import com.simibubi.create.content.contraptions.processing.HeaterBlockItem; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator; @@ -97,32 +108,24 @@ import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock; import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterGenerator; import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock; import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator; -import com.simibubi.create.content.logistics.block.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.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.funnel.FunnelMovementBehaviour; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; -import com.simibubi.create.content.logistics.block.packager.PackagerBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; +import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour; import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator; import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerator; import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock; -import com.simibubi.create.content.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; @@ -133,20 +136,25 @@ import com.simibubi.create.foundation.data.BuilderTransformers; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.ModelGen; import com.simibubi.create.foundation.data.SharedProperties; +import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.worldgen.OxidizingBlock; -import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.AbstractBlock; +import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.criterion.MinMaxBounds; +import net.minecraft.advancements.criterion.EntityPredicate.AndPredicate; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.SoundType; import net.minecraft.block.material.MaterialColor; import net.minecraft.client.renderer.RenderType; +import net.minecraft.data.ShapedRecipeBuilder; 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.tags.ItemTags; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.common.ToolType; @@ -215,9 +223,10 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(AbstractBlock.Properties::nonOpaque) .transform(StressConfigDefaults.setNoImpact()) - .blockstate(BlockStateGen.axisBlockProvider(true)) - .item() - .transform(customItemModel()) + .blockstate((c, p) -> axisBlock(c, p, blockState -> p.models() + .getExistingFile(p.modLoc("block/encased_shaft/" + blockState.get(EncasedShaftBlock.CASING) + .getString())))) + .loot((p, b) -> p.registerDropping(b, SHAFT.get())) .register(); public static final BlockEntry GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new) @@ -404,15 +413,18 @@ public class AllBlocks { .simpleItem() .register(); - public static final BlockEntry HEATER = REGISTRATE.block("blaze_heater", HeaterBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.lightLevel($ -> 12)) - .addLayer(() -> RenderType::getCutoutMipped) - .tag(AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.FAN_HEATERS.tag) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .item(HeaterBlockItem::new) - .build() - .register(); + public static final BlockEntry BLAZE_BURNER = + REGISTRATE.block("blaze_burner", BlazeBurnerBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.luminance($ -> 12)) + .addLayer(() -> RenderType::getCutoutMipped) + .tag(AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.FAN_HEATERS.tag) + .loot((lt, block) -> lt.registerLootTable(block, BlazeBurnerBlock.buildLootTable())) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item(BlazeBurnerBlockItem::withBlaze) + .model(AssetLookup.customItemModel("blaze_burner", "block_with_blaze")) + .build() + .register(); public static final BlockEntry DEPOT = REGISTRATE.block("depot", DepotBlock::new) .initialProperties(SharedProperties::stone) @@ -450,14 +462,34 @@ public class AllBlocks { public static final BlockEntry FLUID_PIPE = REGISTRATE.block("fluid_pipe", FluidPipeBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate(BlockStateGen.pipe()) - .onRegister(CreateRegistrate.blockModel(() -> FluidPipeModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) .item() .transform(customItemModel()) .register(); + public static final BlockEntry ENCASED_FLUID_PIPE = + REGISTRATE.block("encased_fluid_pipe", EncasedPipeBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, state -> p.models() + .cubeColumn(c.getName(), p.modLoc("block/copper_casing"), p.modLoc("block/encased_pipe")))) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .loot((p, b) -> p.registerDropping(b, FLUID_PIPE.get())) + .register(); + + public static final BlockEntry GLASS_FLUID_PIPE = + REGISTRATE.block("glass_fluid_pipe", GlassFluidPipeBlock::new) + .initialProperties(SharedProperties::softMetal) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, s -> p.models() + .getExistingFile(p.modLoc("block/fluid_pipe/window" + (s.get(GlassFluidPipeBlock.ALT) ? "_alt" : ""))))) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .loot((p, b) -> p.registerDropping(b, FLUID_PIPE.get())) + .register(); + public static final BlockEntry MECHANICAL_PUMP = REGISTRATE.block("mechanical_pump", PumpBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(true)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) .transform(StressConfigDefaults.setImpact(4.0)) .item() .transform(customItemModel()) @@ -474,6 +506,14 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry SPOUT = REGISTRATE.block("spout", SpoutBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) + .addLayer(() -> RenderType::getCutoutMipped) + .item() + .transform(customItemModel()) + .register(); + // Contraptions public static final BlockEntry MECHANICAL_PISTON = @@ -603,6 +643,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .blockstate(BlockStateGen.directionalBlockProvider(true)) .transform(StressConfigDefaults.setImpact(4.0)) + .onRegister(addMovementBehaviour(new DrillMovementBehaviour())) .item() .transform(customItemModel()) .register(); @@ -611,6 +652,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .blockstate(new SawGenerator()::generate) .transform(StressConfigDefaults.setImpact(4.0)) + .onRegister(addMovementBehaviour(new SawMovementBehaviour())) .addLayer(() -> RenderType::getCutoutMipped) .item() .model((c, p) -> p.blockItem(() -> c.getEntry() @@ -622,6 +664,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .blockstate(BlockStateGen.directionalAxisBlockProvider()) .transform(StressConfigDefaults.setImpact(4.0)) + .onRegister(addMovementBehaviour(new DeployerMovementBehaviour())) .item() .transform(customItemModel()) .register(); @@ -629,6 +672,7 @@ public class AllBlocks { public static final BlockEntry PORTABLE_STORAGE_INTERFACE = REGISTRATE.block("portable_storage_interface", PortableStorageInterfaceBlock::new) .initialProperties(SharedProperties::stone) +// .onRegister(addMovementBehaviour(new StorageInterfaceMovement())) .blockstate(BlockStateGen.directionalBlockProvider(false)) .simpleItem() .register(); @@ -636,6 +680,7 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_HARVESTER = REGISTRATE.block("mechanical_harvester", HarvesterBlock::new) .initialProperties(SharedProperties::stone) + .onRegister(addMovementBehaviour(new HarvesterMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .addLayer(() -> RenderType::getCutoutMipped) .item() @@ -645,22 +690,54 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PLOUGH = REGISTRATE.block("mechanical_plough", PloughBlock::new) .initialProperties(SharedProperties::stone) + .onRegister(addMovementBehaviour(new PloughMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(false)) .simpleItem() .register(); static { for (DyeColor colour : DyeColor.values()) { - String colourName = colour.name(); + String colourName = colour.getString(); + SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) .initialProperties(SharedProperties::wooden) + .onRegister(addMovementBehaviour(movementBehaviour)) .blockstate((c, p) -> { p.simpleBlock(c.get(), p.models() .withExistingParent(colourName + "_seat", p.modLoc("block/seat")) .texture("1", p.modLoc("block/seat/top_" + colourName)) .texture("2", p.modLoc("block/seat/side_" + colourName))); }) - .simpleItem() + .recipe((c, p) -> { + ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getWoolOfDye(colour)) + .key('-', ItemTags.WOODEN_SLABS) + .addCriterion("has_wool", + new InventoryChangeTrigger.Instance(AndPredicate.EMPTY, MinMaxBounds.IntBound.UNBOUNDED, + MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED, + new ItemPredicate[] { ItemPredicate.Builder.create() + .tag(ItemTags.WOOL) + .build() })) + .build(p, Create.asResource("crafting/kinetics/" + c.getName())); + ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getTagOfDye(colour)) + .key('-', AllItemTags.SEATS.tag) + .addCriterion("has_seat", + new InventoryChangeTrigger.Instance(AndPredicate.EMPTY, MinMaxBounds.IntBound.UNBOUNDED, + MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED, + new ItemPredicate[] { ItemPredicate.Builder.create() + .tag(AllItemTags.SEATS.tag) + .build() })) + .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); + }) + .tag(AllBlockTags.SEATS.tag) + .item() + .tag(AllItemTags.SEATS.tag) + .build() .register(); } } @@ -677,6 +754,19 @@ public class AllBlocks { .transform(BuilderTransformers.casing(AllSpriteShifts.COPPER_CASING)) .register(); + public static final BlockEntry SHADOW_STEEL_CASING = + REGISTRATE.block("shadow_steel_casing", CasingBlock::new) + .transform(BuilderTransformers.casing(AllSpriteShifts.SHADOW_STEEL_CASING)) + .lang("Shadow Casing") + .register(); + + public static final BlockEntry REFINED_RADIANCE_CASING = + REGISTRATE.block("refined_radiance_casing", CasingBlock::new) + .transform(BuilderTransformers.casing(AllSpriteShifts.REFINED_RADIANCE_CASING)) + .properties(p -> p.luminance($ -> 12)) + .lang("Radiant Casing") + .register(); + public static final BlockEntry MECHANICAL_CRAFTER = REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new) .initialProperties(SharedProperties::softMetal) @@ -748,40 +838,28 @@ public class AllBlocks { public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .initialProperties(SharedProperties::stone) + .onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite())) .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) + .blockstate(new BeltFunnelGenerator("andesite", new ResourceLocation("block/polished_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) + .onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass())) .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) + .blockstate(new BeltFunnelGenerator("brass", Create.asResource("block/brass_block"))::generate) .loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get())) .register(); @@ -799,30 +877,20 @@ public class AllBlocks { public static final BlockEntry REDSTONE_CONTACT = REGISTRATE.block("redstone_contact", RedstoneContactBlock::new) .initialProperties(SharedProperties::stone) + .onRegister(addMovementBehaviour(new ContactMovementBehaviour())) .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) .item() .transform(customItemModel("_", "block")) .register(); - 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) + public static final BlockEntry BELT_OBSERVER = + REGISTRATE.block("belt_observer", BeltObserverBlock::new) + .initialProperties(SharedProperties::stone) + .blockstate(BlockStateGen.beltObserver()) .item() - .transform(customItemModel("_", "transmitter")) + .transform(customItemModel()) .register(); - public static final BlockEntry NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.lightLevel($ -> 5)) - .blockstate(new NixieTubeGenerator()::generate) - .addLayer(() -> RenderType::getTranslucent) - .item() - .transform(customItemModel()) - .register(); - public static final BlockEntry STOCKPILE_SWITCH = REGISTRATE.block("stockpile_switch", StockpileSwitchBlock::new) .initialProperties(SharedProperties::stone) @@ -841,92 +909,23 @@ public class AllBlocks { .transform(BuilderTransformers.crate("creative")) .register(); - public static final BlockEntry BELT_OBSERVER = - REGISTRATE.block("belt_observer", BeltObserverBlock::new) - .initialProperties(SharedProperties::stone) - .blockstate(BlockStateGen.beltObserver()) - .item() - .transform(customItemModel()) - .register(); - - public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) + public static final BlockEntry NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new) .initialProperties(SharedProperties::softMetal) - .transform(StressConfigDefaults.setImpact(4.0)) - .properties(AbstractBlock.Properties::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())) + .properties(p -> p.luminance($ -> 5)) + .blockstate(new NixieTubeGenerator()::generate) + .addLayer(() -> RenderType::getTranslucent) .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")) - .register(); - - public static final BlockEntry VERTICAL_EXTRACTOR = - REGISTRATE.block("vertical_extractor", ExtractorBlock.Vertical::new) - .initialProperties(SharedProperties::softMetal) + public static final BlockEntry REDSTONE_LINK = + REGISTRATE.block("redstone_link", RedstoneLinkBlock::new) + .initialProperties(SharedProperties::wooden) .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"))) - .item() - .transform(customItemModel("extractor", "horizontal_linked")) - .register(); - - 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())) + .blockstate(new RedstoneLinkGenerator()::generate) .addLayer(() -> RenderType::getCutoutMipped) - .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)) - .item() - .transform(customItemModel("_", "block")) - .register(); - - public static final BlockEntry VERTICAL_TRANSPOSER = - REGISTRATE.block("vertical_transposer", TransposerBlock.Vertical::new) - .initialProperties(SharedProperties::softMetal) - .blockstate(new VerticalTransposerGenerator(false)::generate) - .loot((p, b) -> p.registerDropping(b, TRANSPOSER.get())) - .register(); - - public static final BlockEntry LINKED_TRANSPOSER = - REGISTRATE.block("linked_transposer", LinkedTransposerBlock::new) - .initialProperties(SharedProperties::softMetal) - .addLayer(() -> RenderType::getCutoutMipped) - .blockstate( - (c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, "transposer/horizontal_linked"), 180)) .item() - .transform(customItemModel("transposer", "horizontal_linked")) - .register(); - - public static final BlockEntry VERTICAL_LINKED_TRANSPOSER = - REGISTRATE.block("vertical_linked_transposer", LinkedTransposerBlock.Vertical::new) - .initialProperties(SharedProperties::softMetal) - .blockstate(new VerticalTransposerGenerator(true)::generate) - .loot((p, b) -> p.registerDropping(b, LINKED_TRANSPOSER.get())) - .addLayer(() -> RenderType::getCutoutMipped) + .transform(customItemModel("_", "transmitter")) .register(); public static final BlockEntry ANALOG_LEVER = @@ -999,7 +998,8 @@ public class AllBlocks { public static final BlockEntry ZINC_ORE = REGISTRATE.block("zinc_ore", Block::new) .initialProperties(() -> Blocks.GOLD_BLOCK) .properties(p -> p.harvestLevel(2) - .harvestTool(ToolType.PICKAXE)) + .harvestTool(ToolType.PICKAXE) + .sound(SoundType.STONE)) .transform(tagBlockAndItem("ores/zinc")) .build() .register(); @@ -1009,7 +1009,6 @@ public class AllBlocks { .initialProperties(() -> Blocks.IRON_BLOCK) .transform(tagBlockAndItem("storage_blocks/copper")) .transform(oxidizedItemModel()) - .recipe((ctx, prov) -> prov.square(DataIngredient.tag(forgeItemTag("ingots/copper")), ctx, false)) .transform(oxidizedBlockstate()) .register(); @@ -1021,11 +1020,18 @@ public class AllBlocks { .transform(oxidizedBlockstate()) .register(); + public static final BlockEntry COPPER_TILES = + REGISTRATE.block("copper_tiles", p -> new OxidizingBlock(p, 1 / 32f)) + .initialProperties(() -> Blocks.IRON_BLOCK) + .item() + .transform(oxidizedItemModel()) + .transform(oxidizedBlockstate()) + .register(); + 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 = @@ -1033,7 +1039,6 @@ public class AllBlocks { .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 c6fe73b6c..610db4685 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -13,7 +13,9 @@ import static com.simibubi.create.content.AllSections.SCHEMATICS; 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.components.structureMovement.train.MinecartCouplingItem; import com.simibubi.create.content.contraptions.goggles.GogglesItem; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem; import com.simibubi.create.content.contraptions.relays.gearbox.VerticalGearboxItem; import com.simibubi.create.content.contraptions.wrench.WrenchItem; @@ -122,9 +124,18 @@ public class AllItems { .model(AssetLookup.customItemModel("gearbox", "item_vertical")) .register(); + public static final ItemEntry EMPTY_BLAZE_BURNER = + REGISTRATE.item("empty_blaze_burner", BlazeBurnerBlockItem::empty) + .model(AssetLookup.customItemModel("blaze_burner", "block")) + .register(); + public static final ItemEntry SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new) .register(); + public static final ItemEntry MINECART_COUPLING = + REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) + .register(); + public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) .register(); diff --git a/src/main/java/com/simibubi/create/AllMovementBehaviours.java b/src/main/java/com/simibubi/create/AllMovementBehaviours.java new file mode 100644 index 000000000..cf86e8ccb --- /dev/null +++ b/src/main/java/com/simibubi/create/AllMovementBehaviours.java @@ -0,0 +1,58 @@ +package com.simibubi.create; + +import java.util.HashMap; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.components.actors.BellMovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.CampfireMovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.dispenser.DispenserMovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.dispenser.DropperMovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.tterrag.registrate.util.nullness.NonNullConsumer; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.util.ResourceLocation; + +public class AllMovementBehaviours { + private static final HashMap movementBehaviours = new HashMap<>(); + + public static void addMovementBehaviour(ResourceLocation resourceLocation, MovementBehaviour movementBehaviour) { + if (movementBehaviours.containsKey(resourceLocation)) + Create.logger.warn("Movement behaviour for " + resourceLocation.toString() + " was overridden"); + movementBehaviours.put(resourceLocation, movementBehaviour); + } + + public static void addMovementBehaviour(Block block, MovementBehaviour movementBehaviour) { + addMovementBehaviour(block.getRegistryName(), movementBehaviour); + } + + @Nullable + public static MovementBehaviour getMovementBehaviour(ResourceLocation resourceLocation) { + return movementBehaviours.getOrDefault(resourceLocation, null); + } + + @Nullable + public static MovementBehaviour getMovementBehaviour(Block block) { + return getMovementBehaviour(block.getRegistryName()); + } + + public static boolean hasMovementBehaviour(Block block) { + return movementBehaviours.containsKey(block.getRegistryName()); + } + + public static NonNullConsumer addMovementBehaviour( + MovementBehaviour movementBehaviour) { + return b -> addMovementBehaviour(b.getRegistryName(), movementBehaviour); + } + + static void register() { + addMovementBehaviour(Blocks.BELL, new BellMovementBehaviour()); + addMovementBehaviour(Blocks.CAMPFIRE, new CampfireMovementBehaviour()); + + DispenserMovementBehaviour.gatherMovedDispenseItemBehaviours(); + addMovementBehaviour(Blocks.DISPENSER, new DispenserMovementBehaviour()); + addMovementBehaviour(Blocks.DROPPER, new DropperMovementBehaviour()); + } +} diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 387933851..d583ef7aa 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -3,6 +3,7 @@ package com.simibubi.create; import java.util.function.Supplier; import com.simibubi.create.content.contraptions.particle.AirFlowParticleData; +import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.contraptions.particle.CubeParticle; import com.simibubi.create.content.contraptions.particle.CubeParticleData; import com.simibubi.create.content.contraptions.particle.HeaterParticleData; @@ -26,6 +27,7 @@ public enum AllParticleTypes { ROTATION_INDICATOR(RotationIndicatorParticleData::new), AIR_FLOW(AirFlowParticleData::new), + AIR(AirParticleData::new), HEATER_PARTICLE(HeaterParticleData::new), CUBE(CubeParticleData::dummy, () -> CubeParticle.Factory::new) diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index c5d81e469..2e2e6515e 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -1,5 +1,7 @@ package com.simibubi.create; +import java.util.function.Supplier; + import com.simibubi.create.compat.jei.ConversionRecipe; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe; import com.simibubi.create.content.contraptions.components.crusher.CrushingRecipe; @@ -8,13 +10,14 @@ import com.simibubi.create.content.contraptions.components.millstone.MillingReci import com.simibubi.create.content.contraptions.components.mixer.MixingRecipe; import com.simibubi.create.content.contraptions.components.press.PressingRecipe; import com.simibubi.create.content.contraptions.components.saw.CuttingRecipe; +import com.simibubi.create.content.contraptions.fluids.actors.FillingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeFactory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IExtendedRecipeFactory; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IRecipeFactory; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.inventory.IInventory; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeSerializer; @@ -24,20 +27,20 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; import net.minecraftforge.event.RegistryEvent; -import java.util.function.Supplier; - public enum AllRecipeTypes { BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING), + MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), + CONVERSION(processingSerializer(ConversionRecipe::new)), CRUSHING(processingSerializer(CrushingRecipe::new)), CUTTING(processingSerializer(CuttingRecipe::new)), - MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), MILLING(processingSerializer(MillingRecipe::new)), - MIXING(extendedProcessingSerializer(MixingRecipe::new)), + MIXING(processingSerializer(MixingRecipe::new)), PRESSING(processingSerializer(PressingRecipe::new)), SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)), SPLASHING(processingSerializer(SplashingRecipe::new)), + FILLING(processingSerializer(FillingRecipe::new)), ; @@ -78,12 +81,7 @@ public enum AllRecipeTypes { } private static Supplier> processingSerializer( - IRecipeFactory> factory) { - return () -> new ProcessingRecipeSerializer<>(factory); - } - - private static Supplier> extendedProcessingSerializer( - IExtendedRecipeFactory> factory) { + ProcessingRecipeFactory> factory) { return () -> new ProcessingRecipeSerializer<>(factory); } diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index f3792a945..7b1739db2 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -6,6 +6,7 @@ import static net.minecraft.util.Direction.UP; import java.util.function.BiFunction; +import com.simibubi.create.content.logistics.block.chute.ChuteShapes; import com.simibubi.create.foundation.utility.VoxelShaper; import net.minecraft.block.Block; @@ -28,11 +29,7 @@ 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(), - 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) - .add(4, 4, 11, 12, 12, 17) - .forDirectional(SOUTH), + EIGHT_VOXEL_POLE = shape(4, 0, 4, 12, 16, 12).forAxis(), FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14) .forHorizontal(Direction.SOUTH), PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 12, 16).add(3, 12, 3, 13, 16, 13) @@ -63,22 +60,22 @@ 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) + FUNNEL = shape(2, -2, 2, 14, 2, 14).add(3, 2, 3, 13, 6, 13) + .add(2, 6, 2, 14, 10, 14) .add(0, 10, 0, 16, 16, 16) .forDirectional(UP), - FUNNEL_COLLISION = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14) - .add(1, 6, 1, 15, 10, 15) + FUNNEL_COLLISION = shape(2, -2, 2, 14, 2, 14).add(3, 2, 3, 13, 6, 13) + .add(2, 6, 2, 14, 10, 14) .add(0, 10, 0, 16, 13, 16) .forDirectional(UP), - 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) + BELT_FUNNEL_RETRACTED = + shape(2, -5, 14, 12, 14, 18) + .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) + BELT_FUNNEL_EXTENDED = + shape(2, -4, 14, 14, 14, 18) + .add(3, -4, 10, 13, 13, 14) + .add(2, -4, 6, 14, 14, 10) .add(0, -5, 0, 16, 16, 6) .forHorizontal(NORTH), PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) @@ -111,14 +108,16 @@ public class AllShapes { // Static Block Shapes public static final VoxelShape - BASIN_BLOCK_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 14, 14) + BASIN_BLOCK_SHAPE = shape(0, 2, 0, 16, 16, 16).erase(2, 2, 2, 14, 16, 14) .add(2, 0, 2, 14, 2, 14) - .build(), HEATER_BLOCK_SHAPE = - shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) + .build(), BASIN_COLLISION_SHAPE = + shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14) + .add(2, 0, 2, 14, 2, 14) .build(), + HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) + .build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), - CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 22, 16), - SEAT = cuboid(0, 0, 0, 16, 8, 16), + CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 22, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16), SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16), MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12) .build(), @@ -132,6 +131,8 @@ public class AllShapes { .build(), PULLEY_MAGNET = shape(3, 0, 3, 13, 2, 13).add(FOUR_VOXEL_POLE.get(UP)) .build(), + SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) + .build(), MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 13, 14) .add(3, 13, 3, 13, 16, 13) .build(), @@ -171,7 +172,8 @@ public class AllShapes { LOGISTICS_TABLE = shape(TABLE_POLE_SHAPE).add(LOGISTICS_TABLE_SLOPE) .forHorizontal(SOUTH), SCHEMATICS_TABLE = shape(TABLE_POLE_SHAPE).add(SCHEMATICS_TABLE_SLOPE) - .forDirectional(SOUTH) + .forDirectional(SOUTH), + CHUTE_SLOPE = shape(ChuteShapes.createSlope()).forHorizontal(SOUTH) ; diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index a46d188ad..8b71097aa 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -44,7 +44,7 @@ public enum AllSoundEvents implements IDataProvider { AllSoundEvents() { id = Lang.asId(name()); } - + AllSoundEvents(String name) { id = name; } @@ -65,7 +65,7 @@ public enum AllSoundEvents implements IDataProvider { return id; } - public AllSoundEvents generator(DataGenerator generator){ + public AllSoundEvents generator(DataGenerator generator) { this.generator = generator; return this; } @@ -83,7 +83,9 @@ public enum AllSoundEvents implements IDataProvider { } public void generate(Path path, DirectoryCache cache) { - Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); + Gson GSON = (new GsonBuilder()).setPrettyPrinting() + .disableHtmlEscaping() + .create(); path = path.resolve("assets/create"); try { @@ -94,7 +96,8 @@ public enum AllSoundEvents implements IDataProvider { if (soundEvent.child != null) { // wrapper JsonObject s = new JsonObject(); - s.addProperty("name", soundEvent.child.getName().toString()); + s.addProperty("name", soundEvent.child.getName() + .toString()); s.addProperty("type", "event"); arr.add(s); } else { @@ -120,6 +123,6 @@ public enum AllSoundEvents implements IDataProvider { @Override public String getName() { - return null; + return "Create's Custom Sound: " + name(); } } diff --git a/src/main/java/com/simibubi/create/AllSpecialTextures.java b/src/main/java/com/simibubi/create/AllSpecialTextures.java index 6cccf5b71..27f11391a 100644 --- a/src/main/java/com/simibubi/create/AllSpecialTextures.java +++ b/src/main/java/com/simibubi/create/AllSpecialTextures.java @@ -11,6 +11,7 @@ public enum AllSpecialTextures { BLANK("blank.png"), CHECKERED("checkerboard.png"), THIN_CHECKERED("thin_checkerboard.png"), + CUTOUT_CHECKERED("cutout_checkerboard.png"), HIGHLIGHT_CHECKERED("highlighted_checkerboard.png"), SELECTION("selection.png"), diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 6927f4de2..5fa92ea72 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -40,7 +40,9 @@ public class AllSpriteShifts { public static final CTSpriteShiftEntry ANDESITE_CASING = omni("andesite_casing"), BRASS_CASING = omni("brass_casing"), - COPPER_CASING = omni("copper_casing"); + COPPER_CASING = omni("copper_casing"), + SHADOW_STEEL_CASING = omni("shadow_steel_casing"), + REFINED_RADIANCE_CASING = omni("refined_radiance_casing"); public static final CTSpriteShiftEntry CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index f50a90ce2..c537b2496 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -18,12 +18,12 @@ import net.minecraft.block.Blocks; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ITag; import net.minecraft.tags.ItemTags; import net.minecraft.util.ResourceLocation; - public class AllTags { private static final CreateRegistrate REGISTRATE = Create.registrate() .itemGroup(() -> Create.baseCreativeTab); @@ -64,7 +64,15 @@ public class AllTags { } public static enum AllItemTags { - CRUSHED_ORES(MOD), CREATE_INGOTS(MOD), BEACON_PAYMENT(FORGE), INGOTS(FORGE), NUGGETS(FORGE), PLATES(FORGE), COBBLESTONE(FORGE) + CRUSHED_ORES(MOD), + SEATS(MOD), + UPRIGHT_ON_BELT(MOD), + CREATE_INGOTS(MOD), + BEACON_PAYMENT(FORGE), + INGOTS(FORGE), + NUGGETS(FORGE), + PLATES(FORGE), + COBBLESTONE(FORGE) ; @@ -83,6 +91,11 @@ public class AllTags { return tag.contains(stack.getItem()); } + public void add(Item... values) { + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getOrCreateTagBuilder(tag) + .add(values)); + } + public void includeIn(AllItemTags parent) { REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getOrCreateTagBuilder(parent.tag) .addTag(tag)); @@ -90,7 +103,7 @@ public class AllTags { } public static enum AllBlockTags { - WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, FAN_TRANSPARENT + WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, FAN_TRANSPARENT ; @@ -99,11 +112,11 @@ public class AllTags { private AllBlockTags() { this(MOD, ""); } - + private AllBlockTags(NameSpace namespace) { this(namespace, ""); } - + private AllBlockTags(NameSpace namespace, String path) { tag = BlockTags.makeWrapperTag( new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())).toString()); @@ -112,14 +125,15 @@ public class AllTags { public boolean matches(BlockState block) { return tag.contains(block.getBlock()); } - + public void includeIn(AllBlockTags parent) { REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(parent.tag) .addTag(tag)); } - + public void includeAll(ITag.INamedTag child) { - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(tag).addTag(child)); + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(tag) + .addTag(child)); } public void add(Block ...values) { @@ -130,13 +144,17 @@ public class AllTags { public static void register() { AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.BEACON_PAYMENT); AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.INGOTS); + + AllItemTags.UPRIGHT_ON_BELT.add(Items.GLASS_BOTTLE, Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION); + + AllBlockTags.WINDMILL_SAILS.includeAll(BlockTags.WOOL); AllBlockTags.BRITTLE.includeAll(BlockTags.DOORS); AllBlockTags.BRITTLE.add(Blocks.FLOWER_POT, Blocks.BELL); - + AllBlockTags.FAN_TRANSPARENT.includeAll(BlockTags.FENCES); AllBlockTags.FAN_TRANSPARENT.add(Blocks.IRON_BARS); - + AllBlockTags.FAN_HEATERS.add(Blocks.MAGMA_BLOCK, Blocks.CAMPFIRE, Blocks.LAVA, Blocks.FIRE); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index f191f5eac..70e537b4a 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -1,7 +1,5 @@ package com.simibubi.create; -import java.util.function.Function; - import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; @@ -45,11 +43,19 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pul import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.content.contraptions.components.turntable.TurntableTileEntity; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelTileEntity; -import com.simibubi.create.content.contraptions.fluids.FluidTankRenderer; -import com.simibubi.create.content.contraptions.fluids.FluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; -import com.simibubi.create.content.contraptions.processing.*; +import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; +import com.simibubi.create.content.contraptions.processing.BasinRenderer; +import com.simibubi.create.content.contraptions.processing.BasinTileEntity; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerRenderer; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; @@ -79,258 +85,393 @@ 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; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; -import com.simibubi.create.content.logistics.block.transposer.LinkedTransposerTileEntity; -import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.tterrag.registrate.util.entry.TileEntityEntry; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.client.registry.ClientRegistry; public class AllTileEntities { // Schematics - public static final TileEntityEntry SCHEMATICANNON = - register("schematicannon", SchematicannonTileEntity::new, AllBlocks.SCHEMATICANNON); - public static final TileEntityEntry SCHEMATIC_TABLE = - register("schematic_table", SchematicTableTileEntity::new, AllBlocks.SCHEMATIC_TABLE); + public static final TileEntityEntry SCHEMATICANNON = Create.registrate() + .tileEntity("schematicannon", SchematicannonTileEntity::new) + .validBlocks(AllBlocks.SCHEMATICANNON) + .renderer(() -> SchematicannonRenderer::new) + .register(); + + public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() + .tileEntity("schematic_table", SchematicTableTileEntity::new) + .validBlocks(AllBlocks.SCHEMATIC_TABLE) + //.renderer(() -> renderer) + .register(); // Kinetics - public static final TileEntityEntry SIMPLE_KINETIC = - register("simple_kinetic", SimpleKineticTileEntity::new, AllBlocks.SHAFT, AllBlocks.COGWHEEL, - AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT); - public static final TileEntityEntry MOTOR = - register("motor", CreativeMotorTileEntity::new, AllBlocks.CREATIVE_MOTOR); - public static final TileEntityEntry GEARBOX = - register("gearbox", GearboxTileEntity::new, AllBlocks.GEARBOX); - public static final TileEntityEntry ENCASED_SHAFT = - register("encased_shaft", EncasedShaftTileEntity::new, AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT); - public static final TileEntityEntry ADJUSTABLE_PULLEY = - register("adjustable_pulley", AdjustablePulleyTileEntity::new, AllBlocks.ADJUSTABLE_PULLEY); - public static final TileEntityEntry ENCASED_FAN = - register("encased_fan", EncasedFanTileEntity::new, AllBlocks.ENCASED_FAN); - public static final TileEntityEntry NOZZLE = - register("nozzle", NozzleTileEntity::new, AllBlocks.NOZZLE); - public static final TileEntityEntry CLUTCH = - register("clutch", ClutchTileEntity::new, AllBlocks.CLUTCH); - public static final TileEntityEntry GEARSHIFT = - register("gearshift", GearshiftTileEntity::new, AllBlocks.GEARSHIFT); - public static final TileEntityEntry TURNTABLE = - register("turntable", TurntableTileEntity::new, AllBlocks.TURNTABLE); - public static final TileEntityEntry HAND_CRANK = - register("hand_crank", HandCrankTileEntity::new, AllBlocks.HAND_CRANK); - public static final TileEntityEntry CUCKOO_CLOCK = - register("cuckoo_clock", CuckooClockTileEntity::new, AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK); + public static final TileEntityEntry SIMPLE_KINETIC = Create.registrate() + .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) + .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); - public static final TileEntityEntry MECHANICAL_PUMP = - register("mechanical_pump", PumpTileEntity::new, AllBlocks.MECHANICAL_PUMP); - public static final TileEntityEntry FLUID_TANK = - register("fluid_tank", FluidTankTileEntity::new, AllBlocks.FLUID_TANK); + public static final TileEntityEntry MOTOR = Create.registrate() + .tileEntity("motor", CreativeMotorTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_MOTOR) + .renderer(() -> CreativeMotorRenderer::new) + .register(); - public static final TileEntityEntry BELT = register("belt", BeltTileEntity::new, AllBlocks.BELT); - 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", - MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON); - public static final TileEntityEntry MECHANICAL_BEARING = - register("mechanical_bearing", MechanicalBearingTileEntity::new, AllBlocks.MECHANICAL_BEARING); - public static final TileEntityEntry CLOCKWORK_BEARING = - register("clockwork_bearing", ClockworkBearingTileEntity::new, AllBlocks.CLOCKWORK_BEARING); - public static final TileEntityEntry ROPE_PULLEY = - register("rope_pulley", PulleyTileEntity::new, AllBlocks.ROPE_PULLEY); - public static final TileEntityEntry CHASSIS = register("chassis", ChassisTileEntity::new, - AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS); - public static final TileEntityEntry DRILL = - register("drill", DrillTileEntity::new, AllBlocks.MECHANICAL_DRILL); - public static final TileEntityEntry SAW = - register("saw", SawTileEntity::new, AllBlocks.MECHANICAL_SAW); - public static final TileEntityEntry HARVESTER = - register("harvester", HarvesterTileEntity::new, AllBlocks.MECHANICAL_HARVESTER); - public static final TileEntityEntry FLYWHEEL = - register("flywheel", FlywheelTileEntity::new, AllBlocks.FLYWHEEL); - public static final TileEntityEntry FURNACE_ENGINE = - register("furnace_engine", FurnaceEngineTileEntity::new, AllBlocks.FURNACE_ENGINE); + public static final TileEntityEntry GEARBOX = Create.registrate() + .tileEntity("gearbox", GearboxTileEntity::new) + .validBlocks(AllBlocks.GEARBOX) + .renderer(() -> GearboxRenderer::new) + .register(); - public static final TileEntityEntry MILLSTONE = - register("millstone", MillstoneTileEntity::new, AllBlocks.MILLSTONE); - public static final TileEntityEntry CRUSHING_WHEEL = - register("crushing_wheel", CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL); - public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = register( - "crushing_wheel_controller", CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER); - public static final TileEntityEntry WATER_WHEEL = - register("water_wheel", WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL); - public static final TileEntityEntry MECHANICAL_PRESS = - register("mechanical_press", MechanicalPressTileEntity::new, AllBlocks.MECHANICAL_PRESS); - public static final TileEntityEntry MECHANICAL_MIXER = - register("mechanical_mixer", MechanicalMixerTileEntity::new, AllBlocks.MECHANICAL_MIXER); - public static final TileEntityEntry DEPLOYER = - register("deployer", DeployerTileEntity::new, AllBlocks.DEPLOYER); - public static final TileEntityEntry BASIN = - register("basin", BasinTileEntity::new, AllBlocks.BASIN); - public static final TileEntityEntry HEATER = - register("blaze_heater", HeaterTileEntity::new, AllBlocks.HEATER); - public static final TileEntityEntry MECHANICAL_CRAFTER = - register("mechanical_crafter", MechanicalCrafterTileEntity::new, AllBlocks.MECHANICAL_CRAFTER); - public static final TileEntityEntry SEQUENCED_GEARSHIFT = - register("sequenced_gearshift", SequencedGearshiftTileEntity::new, AllBlocks.SEQUENCED_GEARSHIFT); - public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = - register("rotation_speed_controller", SpeedControllerTileEntity::new, AllBlocks.ROTATION_SPEED_CONTROLLER); - public static final TileEntityEntry SPEEDOMETER = - register("speedometer", SpeedGaugeTileEntity::new, AllBlocks.SPEEDOMETER); - public static final TileEntityEntry STRESSOMETER = - register("stressometer", StressGaugeTileEntity::new, AllBlocks.STRESSOMETER); - public static final TileEntityEntry ANALOG_LEVER = - register("analog_lever", AnalogLeverTileEntity::new, AllBlocks.ANALOG_LEVER); - public static final TileEntityEntry CART_ASSEMBLER = - register("cart_assembler", CartAssemblerTileEntity::new, AllBlocks.CART_ASSEMBLER); + public static final TileEntityEntry ENCASED_SHAFT = Create.registrate() + .tileEntity("encased_shaft", EncasedShaftTileEntity::new) + .validBlocks(AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT) + .renderer(() -> EncasedShaftRenderer::new) + .register(); + + public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() + .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_PULLEY) + .renderer(() -> EncasedShaftRenderer::new) + .register(); + + public static final TileEntityEntry ENCASED_FAN = Create.registrate() + .tileEntity("encased_fan", EncasedFanTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FAN) + .renderer(() -> EncasedFanRenderer::new) + .register(); + + public static final TileEntityEntry NOZZLE = Create.registrate() + .tileEntity("nozzle", NozzleTileEntity::new) + .validBlocks(AllBlocks.NOZZLE) + //.renderer(() -> renderer) + .register(); + + public static final TileEntityEntry CLUTCH = Create.registrate() + .tileEntity("clutch", ClutchTileEntity::new) + .validBlocks(AllBlocks.CLUTCH) + .renderer(() -> SplitShaftRenderer::new) + .register(); + + public static final TileEntityEntry GEARSHIFT = Create.registrate() + .tileEntity("gearshift", GearshiftTileEntity::new) + .validBlocks(AllBlocks.GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); + + public static final TileEntityEntry TURNTABLE = Create.registrate() + .tileEntity("turntable", TurntableTileEntity::new) + .validBlocks(AllBlocks.TURNTABLE) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); + + public static final TileEntityEntry HAND_CRANK = Create.registrate() + .tileEntity("hand_crank", HandCrankTileEntity::new) + .validBlocks(AllBlocks.HAND_CRANK) + .renderer(() -> HandCrankRenderer::new) + .register(); + + public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() + .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) + .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) + .renderer(() -> CuckooClockRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() + .tileEntity("mechanical_pump", PumpTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PUMP) + .renderer(() -> PumpRenderer::new) + .register(); + + public static final TileEntityEntry FLUID_PIPE = Create.registrate() + .tileEntity("fluid_pipe", FluidPipeTileEntity::new) + .validBlocks(AllBlocks.FLUID_PIPE) + .register(); + + public static final TileEntityEntry ENCASED_FLUID_PIPE = Create.registrate() + .tileEntity("encased_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FLUID_PIPE) + .register(); + + public static final TileEntityEntry GLASS_FLUID_PIPE = Create.registrate() + .tileEntity("glass_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.GLASS_FLUID_PIPE) + .renderer(() -> TransparentStraightPipeRenderer::new) + .register(); + + public static final TileEntityEntry FLUID_TANK = Create.registrate() + .tileEntity("fluid_tank", FluidTankTileEntity::new) + .validBlocks(AllBlocks.FLUID_TANK) + .renderer(() -> FluidTankRenderer::new) + .register(); + + public static final TileEntityEntry SPOUT = Create.registrate() + .tileEntity("spout", SpoutTileEntity::new) + .validBlocks(AllBlocks.SPOUT) + .renderer(() -> SpoutRenderer::new) + .register(); + + public static final TileEntityEntry BELT = Create.registrate() + .tileEntity("belt", BeltTileEntity::new) + .validBlocks(AllBlocks.BELT) + .renderer(() -> BeltRenderer::new) + .register(); + + public static final TileEntityEntry CHUTE = Create.registrate() + .tileEntity("chute", ChuteTileEntity::new) + .validBlocks(AllBlocks.CHUTE) + .renderer(() -> ChuteRenderer::new) + .register(); + + public static final TileEntityEntry ANDESITE_TUNNEL = Create.registrate() + .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) + .validBlocks(AllBlocks.ANDESITE_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); + + public static final TileEntityEntry BRASS_TUNNEL = Create.registrate() + .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_ARM = Create.registrate() + .tileEntity("mechanical_arm", ArmTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_ARM) + .renderer(() -> ArmRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() + .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) + .renderer(() -> MechanicalPistonRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() + .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); + + public static final TileEntityEntry CLOCKWORK_BEARING = Create.registrate() + .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) + .validBlocks(AllBlocks.CLOCKWORK_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); + + public static final TileEntityEntry ROPE_PULLEY = Create.registrate() + .tileEntity("rope_pulley", PulleyTileEntity::new) + .validBlocks(AllBlocks.ROPE_PULLEY) + .renderer(() -> PulleyRenderer::new) + .register(); + + public static final TileEntityEntry CHASSIS = Create.registrate() + .tileEntity("chassis", ChassisTileEntity::new) + .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) + //.renderer(() -> renderer) + .register(); + + public static final TileEntityEntry DRILL = Create.registrate() + .tileEntity("drill", DrillTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_DRILL) + .renderer(() -> DrillRenderer::new) + .register(); + + public static final TileEntityEntry SAW = Create.registrate() + .tileEntity("saw", SawTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_SAW) + .renderer(() -> SawRenderer::new) + .register(); + + public static final TileEntityEntry HARVESTER = Create.registrate() + .tileEntity("harvester", HarvesterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_HARVESTER) + .renderer(() -> HarvesterRenderer::new) + .register(); + + public static final TileEntityEntry FLYWHEEL = Create.registrate() + .tileEntity("flywheel", FlywheelTileEntity::new) + .validBlocks(AllBlocks.FLYWHEEL) + .renderer(() -> FlywheelRenderer::new) + .register(); + + public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() + .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) + .validBlocks(AllBlocks.FURNACE_ENGINE) + .renderer(() -> EngineRenderer::new) + .register(); + + public static final TileEntityEntry MILLSTONE = Create.registrate() + .tileEntity("millstone", MillstoneTileEntity::new) + .validBlocks(AllBlocks.MILLSTONE) + .renderer(() -> MillstoneRenderer::new) + .register(); + + public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() + .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) + .validBlocks(AllBlocks.CRUSHING_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); + + public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = Create.registrate() + .tileEntity("crushing_wheel_controller", CrushingWheelControllerTileEntity::new) + .validBlocks(AllBlocks.CRUSHING_WHEEL_CONTROLLER) + //.renderer(() -> renderer) + .register(); + + public static final TileEntityEntry WATER_WHEEL = Create.registrate() + .tileEntity("water_wheel", WaterWheelTileEntity::new) + .validBlocks(AllBlocks.WATER_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_PRESS = Create.registrate() + .tileEntity("mechanical_press", MechanicalPressTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PRESS) + .renderer(() -> MechanicalPressRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() + .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_MIXER) + .renderer(() -> MechanicalMixerRenderer::new) + .register(); + + public static final TileEntityEntry DEPLOYER = Create.registrate() + .tileEntity("deployer", DeployerTileEntity::new) + .validBlocks(AllBlocks.DEPLOYER) + .renderer(() -> DeployerRenderer::new) + .register(); + + public static final TileEntityEntry BASIN = Create.registrate() + .tileEntity("basin", BasinTileEntity::new) + .validBlocks(AllBlocks.BASIN) + .renderer(() -> BasinRenderer::new) + .register(); + + public static final TileEntityEntry HEATER = Create.registrate() + .tileEntity("blaze_heater", BlazeBurnerTileEntity::new) + .validBlocks(AllBlocks.BLAZE_BURNER) + .renderer(() -> BlazeBurnerRenderer::new) + .register(); + + public static final TileEntityEntry MECHANICAL_CRAFTER = Create.registrate() + .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_CRAFTER) + .renderer(() -> MechanicalCrafterRenderer::new) + .register(); + + public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() + .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) + .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); + + public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = Create.registrate() + .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) + .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) + .renderer(() -> SpeedControllerRenderer::new) + .register(); + + public static final TileEntityEntry SPEEDOMETER = Create.registrate() + .tileEntity("speedometer", SpeedGaugeTileEntity::new) + .validBlocks(AllBlocks.SPEEDOMETER) + .renderer(() -> GaugeRenderer::speed) + .register(); + + public static final TileEntityEntry STRESSOMETER = Create.registrate() + .tileEntity("stressometer", StressGaugeTileEntity::new) + .validBlocks(AllBlocks.STRESSOMETER) + .renderer(() -> GaugeRenderer::stress) + .register(); + + public static final TileEntityEntry ANALOG_LEVER = Create.registrate() + .tileEntity("analog_lever", AnalogLeverTileEntity::new) + .validBlocks(AllBlocks.ANALOG_LEVER) + .renderer(() -> AnalogLeverRenderer::new) + .register(); + + public static final TileEntityEntry CART_ASSEMBLER = Create.registrate() + .tileEntity("cart_assembler", CartAssemblerTileEntity::new) + .validBlocks(AllBlocks.CART_ASSEMBLER) + //.renderer(() -> renderer) + .register(); // Logistics - public static final TileEntityEntry REDSTONE_LINK = - register("redstone_link", RedstoneLinkTileEntity::new, AllBlocks.REDSTONE_LINK); - public static final TileEntityEntry NIXIE_TUBE = - register("nixie_tube", NixieTubeTileEntity::new, AllBlocks.NIXIE_TUBE); - public static final TileEntityEntry STOCKPILE_SWITCH = - register("stockpile_switch", StockpileSwitchTileEntity::new, AllBlocks.STOCKPILE_SWITCH); - public static final TileEntityEntry ADJUSTABLE_CRATE = - 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", - LinkedExtractorTileEntity::new, AllBlocks.LINKED_EXTRACTOR, AllBlocks.VERTICAL_LINKED_EXTRACTOR); - public static final TileEntityEntry TRANSPOSER = - 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 BELT_OBSERVER = - register("belt_observer", BeltObserverTileEntity::new, AllBlocks.BELT_OBSERVER); - public static final TileEntityEntry ADJUSTABLE_REPEATER = - register("adjustable_repeater", AdjustableRepeaterTileEntity::new, AllBlocks.ADJUSTABLE_REPEATER); - public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = register( - "adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new, AllBlocks.ADJUSTABLE_PULSE_REPEATER); - - @SafeVarargs - public static TileEntityEntry register(String name, - NonNullFunction, ? extends T> supplier, NonNullSupplier... blocks) { - return Create.registrate() - .tileEntity(name, supplier) - .validBlocks(blocks) + public static final TileEntityEntry REDSTONE_LINK = Create.registrate() + .tileEntity("redstone_link", RedstoneLinkTileEntity::new) + .validBlocks(AllBlocks.REDSTONE_LINK) + .renderer(() -> SmartTileEntityRenderer::new) .register(); + + public static final TileEntityEntry NIXIE_TUBE = Create.registrate() + .tileEntity("nixie_tube", NixieTubeTileEntity::new) + .validBlocks(AllBlocks.NIXIE_TUBE) + .renderer(() -> NixieTubeRenderer::new) + .register(); + + public static final TileEntityEntry STOCKPILE_SWITCH = Create.registrate() + .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) + .validBlocks(AllBlocks.STOCKPILE_SWITCH) + //.renderer(() -> renderer) + .register(); + + public static final TileEntityEntry ADJUSTABLE_CRATE = Create.registrate() + .tileEntity("adjustable_crate", AdjustableCrateTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_CRATE) + //.renderer(() -> renderer) + .register(); + + public static final TileEntityEntry CREATIVE_CRATE = Create.registrate() + .tileEntity("creative_crate", CreativeCrateTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_CRATE) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); + + public static final TileEntityEntry DEPOT = Create.registrate() + .tileEntity("depot", DepotTileEntity::new) + .validBlocks(AllBlocks.DEPOT) + .renderer(() -> DepotRenderer::new) + .register(); + + public static final TileEntityEntry FUNNEL = Create.registrate() + .tileEntity("funnel", FunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL) + .renderer(() -> FunnelRenderer::new) + .register(); + + public static final TileEntityEntry BELT_OBSERVER = Create.registrate() + .tileEntity("belt_observer", BeltObserverTileEntity::new) + .validBlocks(AllBlocks.BELT_OBSERVER) + .renderer(() -> BeltObserverRenderer::new) + .register(); + + public static final TileEntityEntry ADJUSTABLE_REPEATER = Create.registrate() + .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_REPEATER) + .renderer(() -> AdjustableRepeaterRenderer::new) + .register(); + + public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = Create.registrate() + .tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER) + .renderer(() -> AdjustableRepeaterRenderer::new) + .register(); + + public static void register() { } - - // TODO move to TileEntityBuilder#renderer - @OnlyIn(Dist.CLIENT) - public static void registerRenderers() { - bind(SCHEMATICANNON, SchematicannonRenderer::new); - - bind(SIMPLE_KINETIC, KineticTileEntityRenderer::new); - bind(TURNTABLE, KineticTileEntityRenderer::new); - bind(MOTOR, CreativeMotorRenderer::new); - bind(ENCASED_SHAFT, EncasedShaftRenderer::new); - bind(ADJUSTABLE_PULLEY, EncasedShaftRenderer::new); - bind(DRILL, DrillRenderer::new); - bind(SAW, SawRenderer::new); - bind(ENCASED_FAN, EncasedFanRenderer::new); - bind(GEARBOX, GearboxRenderer::new); - bind(GEARSHIFT, SplitShaftRenderer::new); - bind(CLUTCH, SplitShaftRenderer::new); - bind(SEQUENCED_GEARSHIFT, SplitShaftRenderer::new); - bind(BELT, BeltRenderer::new); - bind(WATER_WHEEL, KineticTileEntityRenderer::new); - 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); - - bind(MECHANICAL_PISTON, MechanicalPistonRenderer::new); - bind(MECHANICAL_BEARING, BearingRenderer::new); - bind(CLOCKWORK_BEARING, BearingRenderer::new); - bind(ROPE_PULLEY, PulleyRenderer::new); - bind(HARVESTER, HarvesterRenderer::new); - - bind(MILLSTONE, MillstoneRenderer::new); - bind(CRUSHING_WHEEL, KineticTileEntityRenderer::new); - bind(MECHANICAL_PRESS, MechanicalPressRenderer::new); - bind(MECHANICAL_MIXER, MechanicalMixerRenderer::new); - bind(MECHANICAL_CRAFTER, MechanicalCrafterRenderer::new); - bind(SPEEDOMETER, GaugeRenderer::speed); - bind(STRESSOMETER, GaugeRenderer::stress); - bind(BASIN, BasinRenderer::new); - bind(HEATER, HeaterRenderer::new); - bind(DEPLOYER, DeployerRenderer::new); - 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); - bind(NIXIE_TUBE, NixieTubeRenderer::new); - bind(EXTRACTOR, SmartTileEntityRenderer::new); - bind(LINKED_EXTRACTOR, SmartTileEntityRenderer::new); - bind(TRANSPOSER, SmartTileEntityRenderer::new); - bind(LINKED_TRANSPOSER, SmartTileEntityRenderer::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); - bind(ADJUSTABLE_PULSE_REPEATER, AdjustableRepeaterRenderer::new); - } - - @OnlyIn(Dist.CLIENT) - private static void bind(TileEntityEntry type, - Function> renderer) { - ClientRegistry.bindTileEntityRenderer(type.get(), renderer); - } - - public static void register() {} } diff --git a/src/main/java/com/simibubi/create/CommonEvents.java b/src/main/java/com/simibubi/create/CommonEvents.java deleted file mode 100644 index 4868c8a83..000000000 --- a/src/main/java/com/simibubi/create/CommonEvents.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.simibubi.create; - -import com.simibubi.create.foundation.command.CreateCommand; - -import net.minecraft.world.IWorld; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent.Phase; -import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; - -@EventBusSubscriber -public class CommonEvents { - - @SubscribeEvent - public static void onTick(ServerTickEvent event) { - if (event.phase == Phase.END) - return; - - Create.tick(); - } - - @SubscribeEvent - public static void onClose(FMLServerStoppingEvent event) { - Create.shutdown(); - } - - @SubscribeEvent - public static void registerCommands(RegisterCommandsEvent event) { - new CreateCommand(event.getDispatcher()); - } - - @SubscribeEvent - public static void onLoadWorld(WorldEvent.Load event) { - IWorld world = event.getWorld(); - Create.redstoneLinkNetworkHandler.onLoadWorld(world); - Create.torquePropagator.onLoadWorld(world); - if (event.getWorld().isRemote()) - DistExecutor.runWhenOn(Dist.CLIENT, () -> CreateClient.bufferCache::invalidate); - } - - @SubscribeEvent - public static void onUnloadWorld(WorldEvent.Unload event) { - IWorld world = event.getWorld(); - Create.redstoneLinkNetworkHandler.onUnloadWorld(world); - Create.torquePropagator.onUnloadWorld(world); - } - -} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 64b99568b..ff091b66a 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -1,8 +1,12 @@ package com.simibubi.create; +import java.util.Random; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.simibubi.create.content.CreateItemGroup; import com.simibubi.create.content.contraptions.TorquePropagator; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; @@ -11,10 +15,14 @@ import com.simibubi.create.content.palettes.PalettesItemGroup; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.command.ChunkUtil; import com.simibubi.create.foundation.command.ServerLagger; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.LangMerger; +import com.simibubi.create.foundation.data.recipe.MechanicalCraftingRecipeGen; +import com.simibubi.create.foundation.data.recipe.ProcessingRecipeGen; +import com.simibubi.create.foundation.data.recipe.StandardRecipeGen; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.worldgen.AllWorldFeatures; import com.tterrag.registrate.util.NonNullLazyValue; @@ -26,8 +34,11 @@ import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.particles.ParticleType; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; @@ -44,10 +55,16 @@ public class Create { public static ItemGroup baseCreativeTab = new CreateItemGroup(); public static ItemGroup palettesCreativeTab = new PalettesItemGroup(); + public static Gson GSON = new GsonBuilder().setPrettyPrinting() + .disableHtmlEscaping() + .create(); + public static ServerSchematicLoader schematicReceiver; public static RedstoneLinkNetworkHandler redstoneLinkNetworkHandler; public static TorquePropagator torquePropagator; public static ServerLagger lagger; + public static ChunkUtil chunkUtil; + public static Random random; private static final NonNullLazyValue registrate = CreateRegistrate.lazy(ID); @@ -61,6 +78,7 @@ public class Create { AllPaletteBlocks.register(); AllEntityTypes.register(); AllTileEntities.register(); + AllMovementBehaviours.register(); modEventBus.addListener(Create::init); modEventBus.addGenericListener(IRecipeSerializer.class, AllRecipeTypes::register); @@ -70,8 +88,11 @@ public class Create { modEventBus.addListener(AllConfigs::onLoad); modEventBus.addListener(AllConfigs::onReload); modEventBus.addListener(EventPriority.LOWEST, this::gatherData); - CreateClient.addClientListeners(modEventBus); + AllConfigs.register(); + random = new Random(); + + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.addClientListeners(modEventBus)); } public static void init(final FMLCommonSetupEvent event) { @@ -80,23 +101,15 @@ public class Create { torquePropagator = new TorquePropagator(); lagger = new ServerLagger(); + chunkUtil = new ChunkUtil(); + chunkUtil.init(); + MinecraftForge.EVENT_BUS.register(chunkUtil); + AllPackets.registerPackets(); AllTriggers.register(); AllWorldFeatures.reload(); } - public static void tick() { - if (schematicReceiver == null) - schematicReceiver = new ServerSchematicLoader(); - schematicReceiver.tick(); - - lagger.tick(); - } - - public static void shutdown() { - schematicReceiver.shutdown(); - } - public static CreateRegistrate registrate() { return registrate.get(); } @@ -110,6 +123,9 @@ public class Create { gen.addProvider(new AllAdvancements(gen)); gen.addProvider(new LangMerger(gen)); gen.addProvider(AllSoundEvents.BLAZE_MUNCH.generator(gen)); + gen.addProvider(new StandardRecipeGen(gen)); + gen.addProvider(new MechanicalCraftingRecipeGen(gen)); + ProcessingRecipeGen.registerAll(gen); } } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 3cfd33723..0892ba960 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -5,16 +5,8 @@ import java.util.List; import java.util.Map; import java.util.function.Function; -import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.ChassisRangeDisplay; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; -import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; -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; @@ -23,10 +15,6 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; -import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkRenderer; -import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueRenderer; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -40,14 +28,11 @@ import net.minecraft.item.Item; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; public class CreateClient { @@ -64,13 +49,11 @@ public class CreateClient { private static AllColorHandlers colorHandlers; public static void addClientListeners(IEventBus modEventBus) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - modEventBus.addListener(CreateClient::clientInit); - modEventBus.addListener(CreateClient::onModelBake); - modEventBus.addListener(CreateClient::onModelRegistry); - modEventBus.addListener(CreateClient::onTextureStitch); - modEventBus.addListener(AllParticleTypes::registerFactories); - }); + modEventBus.addListener(CreateClient::clientInit); + modEventBus.addListener(CreateClient::onModelBake); + modEventBus.addListener(CreateClient::onModelRegistry); + modEventBus.addListener(CreateClient::onTextureStitch); + modEventBus.addListener(AllParticleTypes::registerFactories); } public static void clientInit(FMLClientSetupEvent event) { @@ -85,7 +68,7 @@ public class CreateClient { AllKeys.register(); AllContainerTypes.registerScreenFactories(); - AllTileEntities.registerRenderers(); + //AllTileEntities.registerRenderers(); AllEntityTypes.registerRenderers(); getColorHandler().init(); @@ -95,27 +78,6 @@ public class CreateClient { ((IReloadableResourceManager) resourceManager).addReloadListener(new ResourceReloadHandler()); } - public static void gameTick() { - schematicSender.tick(); - schematicAndQuillHandler.tick(); - schematicHandler.tick(); - BeltConnectorHandler.tick(); - FilteringRenderer.tick(); - LinkRenderer.tick(); - ScrollValueRenderer.tick(); - ChassisRangeDisplay.tick(); - EdgeInteractionRenderer.tick(); - WorldshaperRenderHandler.tick(); - BlockzapperRenderHandler.tick(); - KineticDebugger.tick(); - ZapperRenderHandler.tick(); - ExtendoGripRenderHandler.tick(); -// CollisionDebugger.tick(); - ArmInteractionPointHandler.tick(); - outliner.tickOutlines(); - } - - @OnlyIn(Dist.CLIENT) public static void onTextureStitch(TextureStitchEvent.Pre event) { if (!event.getMap() .getId() @@ -125,7 +87,6 @@ public class CreateClient { .forEach(event::addSprite); } - @OnlyIn(Dist.CLIENT) public static void onModelBake(ModelBakeEvent event) { Map modelRegistry = event.getModelRegistry(); AllBlockPartials.onModelBake(event); @@ -140,7 +101,6 @@ public class CreateClient { }); } - @OnlyIn(Dist.CLIENT) public static void onModelRegistry(ModelRegistryEvent event) { AllBlockPartials.onModelRegistry(event); @@ -149,12 +109,10 @@ public class CreateClient { .forEach(ModelLoader::addSpecialModel)); } - @OnlyIn(Dist.CLIENT) protected static ModelResourceLocation getItemModelLocation(Item item) { return new ModelResourceLocation(item.getRegistryName(), "inventory"); } - @OnlyIn(Dist.CLIENT) protected static List getAllBlockStateModelLocations(Block block) { List models = new ArrayList<>(); block.getStateContainer() @@ -165,20 +123,17 @@ public class CreateClient { return models; } - @OnlyIn(Dist.CLIENT) protected static ModelResourceLocation getBlockModelLocation(Block block, String suffix) { return new ModelResourceLocation(block.getRegistryName(), suffix); } - @OnlyIn(Dist.CLIENT) protected static void swapModels(Map modelRegistry, List locations, Function factory) { locations.forEach(location -> { swapModels(modelRegistry, location, factory); }); } - - @OnlyIn(Dist.CLIENT) + protected static void swapModels(Map modelRegistry, ModelResourceLocation location, Function factory) { modelRegistry.put(location, factory.apply(modelRegistry.get(location))); diff --git a/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java b/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java index 4c838bc55..c6d46653b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java +++ b/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java @@ -1,15 +1,12 @@ package com.simibubi.create.compat.jei; -import java.util.Collections; -import java.util.List; - import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; @@ -19,30 +16,22 @@ import net.minecraftforge.items.wrapper.RecipeWrapper; /** * Helper recipe type for displaying an item relationship in JEI - * - * @author simibubi - * */ @ParametersAreNonnullByDefault public class ConversionRecipe extends ProcessingRecipe { - public ConversionRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.CONVERSION, id, group, ingredients, results, processingDuration); - } - static int counter = 0; public static ConversionRecipe create(ItemStack from, ItemStack to) { - List ingredients = - Collections.singletonList(new ProcessingIngredient(Ingredient.fromStacks(from))); - List outputs = Collections.singletonList(new ProcessingOutput(to, 1)); - return new ConversionRecipe(new ResourceLocation(Create.ID, "conversion_" + counter++), ingredients, outputs); + ResourceLocation recipeId = Create.asResource("conversion_" + counter++); + return new ProcessingRecipeBuilder<>(ConversionRecipe::new, recipeId) + .withItemIngredients(Ingredient.fromStacks(from)) + .withSingleItemOutput(to) + .build(); } - public ConversionRecipe(ResourceLocation id, List ingredients, - List results) { - this(id, "conversions", ingredients, results, -1); + public ConversionRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.CONVERSION, params); } @Override @@ -50,4 +39,14 @@ public class ConversionRecipe extends ProcessingRecipe { return false; } + @Override + protected int getMaxInputCount() { + return 1; + } + + @Override + protected int getMaxOutputCount() { + return 1; + } + } diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 18d414246..41ba41b63 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -118,7 +118,7 @@ public class CreateJEI implements IModPlugin { blastingCategory.getUid()); registration.addRecipes(findRecipes(AllRecipeTypes.MIXING), mixingCategory.getUid()); registration.addRecipes(findRecipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS - && !MechanicalPressTileEntity.canCompress(r.getIngredients())).stream().map(MixingRecipe::of) + && !MechanicalPressTileEntity.canCompress(r.getIngredients())).stream().map(MixingRecipe::convertShapeless) .collect(Collectors.toList()), mixingCategory.getUid()); registration.addRecipes(findRecipes(AllRecipeTypes.CUTTING), sawingCategory.getUid()); @@ -162,7 +162,7 @@ public class CreateJEI implements IModPlugin { registration.addRecipeCatalyst(new ItemStack(AllItems.BLOCKZAPPER.get()), blockzapperCategory.getUid()); registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_MIXER.get()), mixingCategory.getUid()); registration.addRecipeCatalyst(new ItemStack(AllBlocks.BASIN.get()), mixingCategory.getUid()); - registration.addRecipeCatalyst(new ItemStack(AllBlocks.HEATER.get()), mixingCategory.getUid()); + registration.addRecipeCatalyst(new ItemStack(AllBlocks.BLAZE_BURNER.get()), mixingCategory.getUid()); registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_SAW.get()), sawingCategory.getUid()); registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_SAW.get()), blockCuttingCategory.getUid()); registration.addRecipeCatalyst(new ItemStack(Blocks.STONECUTTER), blockCuttingCategory.getUid()); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index 832841461..59e5a866d 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -59,10 +59,10 @@ public abstract class CreateRecipeCategory> implements IRec if (!(recipe instanceof ProcessingRecipe)) return jeiSlot; ProcessingRecipe processingRecipe = (ProcessingRecipe) recipe; - List rollableResults = processingRecipe.getRollableItemResults(); + List rollableResults = processingRecipe.getRollableResults(); if (rollableResults.size() <= index) return jeiSlot; - if (processingRecipe.getRollableItemResults().get(index).getChance() == 1) + if (processingRecipe.getRollableResults().get(index).getChance() == 1) return jeiSlot; return AllGuiTextures.JEI_CHANCE_SLOT; } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index 088456e68..64129fc4c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -32,7 +32,7 @@ public class CrushingCategory extends CreateRecipeCategory results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); int size = results.size(); int offset = -size * 19 / 2; for (int outputIndex = 0; outputIndex < size; outputIndex++) { @@ -54,7 +54,7 @@ public class CrushingCategory extends CreateRecipeCategory results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); AllGuiTextures.JEI_SLOT.draw(50, 2); AllGuiTextures.JEI_DOWN_ARROW.draw(72, 7); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java index 79985ef23..78be3a3ca 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java @@ -32,7 +32,7 @@ public class MillingCategory extends CreateRecipeCategory results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); boolean single = results.size() == 1; for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { int xOffset = outputIndex % 2 == 0 ? 0 : 19; @@ -59,7 +59,7 @@ public class MillingCategory extends CreateRecipeCategory { private AnimatedMixer mixer = new AnimatedMixer(); - private AnimatedBlazeHeater heater = new AnimatedBlazeHeater(); + private AnimatedBlazeBurner heater = new AnimatedBlazeBurner(); public MixingCategory() { super("mixing", doubleItemIcon(AllBlocks.MECHANICAL_MIXER.get(), AllBlocks.BASIN.get()), @@ -49,47 +46,33 @@ public class MixingCategory extends CreateRecipeCategory { @Override public void setRecipe(IRecipeLayout recipeLayout, MixingRecipe recipe, IIngredients ingredients) { IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); - NonNullList recipeIngredients = recipe.getIngredients(); List> actualIngredients = ItemHelper.condenseIngredients(recipeIngredients); - Map catalystIndices = new HashMap<>(9); - for (int i = 0; i < actualIngredients.size(); i++) { - for (ProcessingIngredient processingIngredient : recipe.getRollableIngredients()) { - if (processingIngredient.isCatalyst() - && ItemHelper.matchIngredients(processingIngredient.getIngredient(), actualIngredients.get(i) - .getKey())) { - catalystIndices.put(i, processingIngredient.getOutputChance()); - break; - } - } - } - int size = actualIngredients.size(); int xOffset = size < 3 ? (3 - size) * 19 / 2 : 0; - int i = 0; - int yOffset = recipe.getHeatLevelRequired() > 0 ? 30 : 10; - while (i < size) { - Pair ingredient = actualIngredients.get(i); + int yOffset = recipe.getRequiredHeat() != HeatCondition.NONE ? 30 : 10; + + int i; + for (i = 0; i < actualIngredients.size(); i++) { itemStacks.init(i, true, 16 + xOffset + (i % 3) * 19, 50 - (i / 3) * 19 + yOffset); - List asList = Arrays.asList(ingredient.getKey() - .getMatchingStacks()); - itemStacks.set(i, asList.stream() - .map(stack -> { - stack = stack.copy(); - stack.setCount(ingredient.getRight() - .getValue()); - return stack; - }) - .collect(Collectors.toList())); - i++; + List stacks = new ArrayList<>(); + Pair pair = actualIngredients.get(i); + Ingredient ingredient = pair.getFirst(); + MutableInt amount = pair.getSecond(); + + for (ItemStack itemStack : ingredient.getMatchingStacks()) { + ItemStack stack = itemStack.copy(); + stack.setCount(amount.getValue()); + stacks.add(stack); + } + + itemStacks.set(i, stacks); } itemStacks.init(i, false, 141, 50 + yOffset); itemStacks.set(i, recipe.getRecipeOutput() .getStack()); - - addCatalystTooltip(itemStacks, catalystIndices); } @Override @@ -98,24 +81,18 @@ public class MixingCategory extends CreateRecipeCategory { int size = actualIngredients.size(); int xOffset = size < 3 ? (3 - size) * 19 / 2 : 0; - int yOffset = recipe.getHeatLevelRequired() > 0 ? 30 : 10; - for (int i = 0; i < size; i++) { - AllGuiTextures jeiSlot = AllGuiTextures.JEI_SLOT; - for (ProcessingIngredient processingIngredient : recipe.getRollableIngredients()) { - if (processingIngredient.isCatalyst() - && ItemHelper.matchIngredients(processingIngredient.getIngredient(), actualIngredients.get(i) - .getKey())) { - jeiSlot = AllGuiTextures.JEI_CATALYST_SLOT; - break; - } - } - jeiSlot.draw(16 + xOffset + (i % 3) * 19, 50 - (i / 3) * 19 + yOffset); - } + HeatCondition requiredHeat = recipe.getRequiredHeat(); + int yOffset = requiredHeat != HeatCondition.NONE ? 30 : 10; + for (int i = 0; i < size; i++) + AllGuiTextures.JEI_SLOT.draw(16 + xOffset + (i % 3) * 19, 50 - (i / 3) * 19 + yOffset); + AllGuiTextures.JEI_SLOT.draw(141, 50 + yOffset); AllGuiTextures.JEI_DOWN_ARROW.draw(136, 32 + yOffset); AllGuiTextures.JEI_SHADOW.draw(81, 57 + yOffset); - if (recipe.getHeatLevelRequired() > 0) - heater.drawWithHeatLevel(getBackground().getWidth() / 2 + 3, 55, recipe.getHeatLevelRequired()); + + if (requiredHeat != HeatCondition.NONE) + heater.withHeat(requiredHeat.visualizeAsBlazeBurner()) + .draw(getBackground().getWidth() / 2 + 3, 55); mixer.draw(getBackground().getWidth() / 2 + 3, 34); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java index 36514730c..f473e05ec 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java @@ -35,13 +35,13 @@ public class MysteriousItemConversionCategory extends CreateRecipeCategory results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); itemStacks.init(0, true, 26, 16); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.init(1, false, 131, 16); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java index 0fd563557..9f78bd908 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java @@ -37,13 +37,13 @@ public class PolishingCategory extends CreateRecipeCategory results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); itemStacks.init(0, true, 26, 28); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java index b635f5625..6bf0aba1b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java @@ -32,7 +32,7 @@ public class PressingCategory extends CreateRecipeCategory { @Override public void setIngredients(PressingRecipe recipe, IIngredients ingredients) { ingredients.setInputIngredients(recipe.getIngredients()); - ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs()); + ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks()); } @Override @@ -41,7 +41,7 @@ public class PressingCategory extends CreateRecipeCategory { itemStacks.init(0, true, 26, 50); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); - List results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { itemStacks.init(outputIndex + 1, false, 131 + 19 * outputIndex, 50); itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack()); @@ -54,7 +54,7 @@ public class PressingCategory extends CreateRecipeCategory { public void draw(PressingRecipe recipe, double mouseX, double mouseY) { AllGuiTextures.JEI_SLOT.draw(26, 50); getRenderedSlot(recipe, 0).draw(131, 50); - if (recipe.getRollableItemResults().size() > 1) + if (recipe.getRollableResults().size() > 1) getRenderedSlot(recipe, 1).draw(131 + 19, 50); AllGuiTextures.JEI_SHADOW.draw(61, 41); AllGuiTextures.JEI_LONG_ARROW.draw(52, 54); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java index c5b331f8c..e80686a35 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java @@ -31,7 +31,7 @@ public class SawingCategory extends CreateRecipeCategory { @Override public void setIngredients(CuttingRecipe recipe, IIngredients ingredients) { ingredients.setInputIngredients(recipe.getIngredients()); - ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs()); + ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks()); } @Override @@ -40,7 +40,7 @@ public class SawingCategory extends CreateRecipeCategory { itemStacks.init(0, true, 43, 4); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); - List results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { int xOffset = outputIndex % 2 == 0 ? 0 : 19; int yOffset = (outputIndex / 2) * -19; @@ -55,7 +55,7 @@ public class SawingCategory extends CreateRecipeCategory { @Override public void draw(CuttingRecipe recipe, double mouseX, double mouseY) { AllGuiTextures.JEI_SLOT.draw(43, 4); - int size = recipe.getRollableItemResults().size(); + int size = recipe.getRollableResults().size(); for (int i = 0; i < size; i++) { int xOffset = i % 2 == 0 ? 0 : 19; int yOffset = (i / 2) * -19; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java index 89ca987c2..c986affbd 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java @@ -31,7 +31,7 @@ public class SplashingCategory extends ProcessingViaFanCategory @Override public void setIngredients(SplashingRecipe recipe, IIngredients ingredients) { ingredients.setInputIngredients(recipe.getIngredients()); - ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs()); + ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks()); } @Override @@ -42,7 +42,7 @@ public class SplashingCategory extends ProcessingViaFanCategory .get(0) .getMatchingStacks())); - List results = recipe.getRollableItemResults(); + List results = recipe.getRollableResults(); boolean single = results.size() == 1; for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { int xOffset = outputIndex % 2 == 0 ? 0 : 19; @@ -58,7 +58,7 @@ public class SplashingCategory extends ProcessingViaFanCategory @Override protected void renderWidgets(SplashingRecipe recipe, double mouseX, double mouseY) { - int size = recipe.getPossibleOutputs() + int size = recipe.getRollableResultsAsItemStacks() .size(); AllGuiTextures.JEI_SLOT.draw(20, 47); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java new file mode 100644 index 000000000..c0753303b --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -0,0 +1,51 @@ +package com.simibubi.create.compat.jei.category.animations; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.gui.GuiGameElement; + +import mezz.jei.api.gui.drawable.IDrawable; + +public class AnimatedBlazeBurner implements IDrawable { + + private HeatLevel heatLevel; + + public AnimatedBlazeBurner withHeat(HeatLevel heatLevel) { + this.heatLevel = heatLevel; + return this; + } + + public void draw(int xOffset, int yOffset) { + RenderSystem.pushMatrix(); + RenderSystem.translatef(xOffset, yOffset, 200); + RenderSystem.rotatef(-15.5f, 1, 0, 0); + RenderSystem.rotatef(22.5f, 0, 1, 0); + int scale = 23; + + GuiGameElement.of(AllBlocks.BLAZE_BURNER.getDefaultState()) + .atLocal(0, 1.65, 0) + .scale(scale) + .render(); + + AllBlockPartials blaze = AllBlockPartials.BLAZES.get(heatLevel); + GuiGameElement.of(blaze) + .atLocal(1, 1.65, 1) + .rotate(0, 180, 0) + .scale(scale) + .render(); + + RenderSystem.popMatrix(); + } + + @Override + public int getWidth() { + return 50; + } + + @Override + public int getHeight() { + return 50; + } +} diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeHeater.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeHeater.java deleted file mode 100644 index 84483c08a..000000000 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeHeater.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.simibubi.create.compat.jei.category.animations; - -import java.util.HashMap; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.gui.GuiGameElement; - -import mezz.jei.api.gui.drawable.IDrawable; - -public class AnimatedBlazeHeater implements IDrawable { - private static final HashMap blazeModelMap = new HashMap<>(); - - public AnimatedBlazeHeater() { - super(); - blazeModelMap.put(2, AllBlockPartials.BLAZE_HEATER_BLAZE_TWO); - blazeModelMap.put(3, AllBlockPartials.BLAZE_HEATER_BLAZE_THREE); - blazeModelMap.put(4, AllBlockPartials.BLAZE_HEATER_BLAZE_FOUR); - } - - @Override - public void draw(int xOffset, int yOffset) { - drawWithHeatLevel(xOffset, yOffset, 3); - } - - public void drawWithHeatLevel(int xOffset, int yOffset, int heatLevel) { - RenderSystem.pushMatrix(); - RenderSystem.translatef(xOffset, yOffset, 200); - RenderSystem.rotatef(-15.5f, 1, 0, 0); - RenderSystem.rotatef(22.5f, 0, 1, 0); - int scale = 23; - - GuiGameElement.of(AllBlocks.HEATER.getDefaultState()) - .atLocal(0, 1.65, 0) - .scale(scale) - .render(); - - GuiGameElement.of(blazeModelMap.getOrDefault(heatLevel, AllBlockPartials.BLAZE_HEATER_BLAZE_ONE)) - .atLocal(1, 1.65, 1) - .rotate(0, 180, 0) - .scale(scale) - .render(); - - RenderSystem.popMatrix(); - } - - @Override - public int getWidth() { - return 50; - } - - @Override - public int getHeight() { - return 50; - } -} diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java index 1ae4cf281..8650d216e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java @@ -13,7 +13,7 @@ public class AnimatedCrushingWheels extends AnimatedKinetics { @Override public void draw(int xOffset, int yOffset) { RenderSystem.enableDepthTest(); - RenderSystem.translatef(xOffset, yOffset, 300); + RenderSystem.translatef(xOffset, yOffset, 100); RenderSystem.rotatef(-22.5f, 0, 1, 0); int scale = 22; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index 5cf2ad598..a45e77ecd 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -4,6 +4,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.util.math.MathHelper; public class AnimatedMixer extends AnimatedKinetics { @@ -16,31 +19,33 @@ public class AnimatedMixer extends AnimatedKinetics { int scale = 23; GuiGameElement.of(cogwheel()) - .rotateBlock(0, getCurrentAngle() * 2, 0) - .atLocal(0, 0, 0) - .scale(scale) - .render(); + .rotateBlock(0, getCurrentAngle() * 2, 0) + .atLocal(0, 0, 0) + .scale(scale) + .render(); GuiGameElement.of(AllBlocks.MECHANICAL_MIXER.getDefaultState()) - .atLocal(0, 0, 0) - .scale(scale) - .render(); + .atLocal(0, 0, 0) + .scale(scale) + .render(); + + float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTick() / 32f) + 1) / 5) + .5f; GuiGameElement.of(AllBlockPartials.MECHANICAL_MIXER_POLE) - .atLocal(0, 1, 0) - .scale(scale) - .render(); + .atLocal(0, animation, 0) + .scale(scale) + .render(); GuiGameElement.of(AllBlockPartials.MECHANICAL_MIXER_HEAD) - .rotateBlock(0, getCurrentAngle() * 4, 0) - .atLocal(0, 1, 0) - .scale(scale) - .render(); + .rotateBlock(0, getCurrentAngle() * 4, 0) + .atLocal(0, animation, 0) + .scale(scale) + .render(); GuiGameElement.of(AllBlocks.BASIN.getDefaultState()) - .atLocal(0, 1.65, 0) - .scale(scale) - .render(); + .atLocal(0, 1.65, 0) + .scale(scale) + .render(); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java index 242c363b5..356da57fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -24,8 +25,14 @@ import net.minecraft.world.World; public class KineticDebugger { public static void tick() { - if (!isActive()) + if (!isActive()) { + if (KineticTileEntityRenderer.rainbowMode) { + KineticTileEntityRenderer.rainbowMode = false; + CreateClient.bufferCache.invalidate(); + } return; + } + KineticTileEntity te = getSelectedTE(); if (te == null) return; @@ -36,7 +43,7 @@ public class KineticDebugger { VoxelShape shape = world.getBlockState(toOutline) .getRenderShape(world, toOutline); - if (te.getTheoreticalSpeed() != 0) + if (te.getTheoreticalSpeed() != 0 && !shape.isEmpty()) CreateClient.outliner.chaseAABB("kineticSource", shape.getBoundingBox() .offset(toOutline)) .lineWidth(1 / 16f) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 023927120..e376fe488 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -178,7 +178,7 @@ public abstract class KineticTileEntity extends SmartTileEntity } @Override - public CompoundNBT write(CompoundNBT compound) { + protected void write(CompoundNBT compound, boolean clientPacket) { compound.putFloat("Speed", speed); if (needsSpeedUpdate()) @@ -202,7 +202,7 @@ public abstract class KineticTileEntity extends SmartTileEntity compound.put("Network", networkTag); } - return super.write(compound); + super.write(compound, clientPacket); } public boolean needsSpeedUpdate() { @@ -210,12 +210,13 @@ public abstract class KineticTileEntity extends SmartTileEntity } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { + boolean overStressedBefore = overStressed; clearKineticInformation(); // DO NOT READ kinetic information when placed after movement if (wasMoved) { - super.read(compound); + super.read(compound, clientPacket); return; } @@ -235,14 +236,9 @@ public abstract class KineticTileEntity extends SmartTileEntity overStressed = capacity < stress && StressImpact.isEnabled(); } - super.read(compound); - } + super.read(compound, clientPacket); - @Override - public void readClientUpdate(CompoundNBT tag) { - boolean overStressedBefore = overStressed; - super.readClientUpdate(tag); - if (overStressedBefore != overStressed && speed != 0) + if (clientPacket && overStressedBefore != overStressed && speed != 0) effects.triggerOverStressedEffect(); } @@ -450,7 +446,7 @@ public abstract class KineticTileEntity extends SmartTileEntity public int getFlickerScore() { return flickerTally; } - + public static float convertToDirection(float axisSpeed, Direction d) { return d.getAxisDirection() == AxisDirection.POSITIVE ? axisSpeed : -axisSpeed; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java index ccde0e5fa..161d1828f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.HorizontalBlock; @@ -18,7 +18,11 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; -public abstract class AttachedActorBlock extends HorizontalBlock implements IPortableBlock, IWrenchable { +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public abstract class AttachedActorBlock extends HorizontalBlock implements IWrenchable { protected AttachedActorBlock(Properties p_i48377_1_) { super(p_i48377_1_); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java new file mode 100644 index 000000000..6b93996d4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java @@ -0,0 +1,32 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; + +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class BellMovementBehaviour extends MovementBehaviour { + @Override + public boolean hasSpecialMovementRenderer() { + return false; + } + + @Override + public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { + double dotProduct = oldMotion.dotProduct(motion); + + if (dotProduct <= 0 && (context.relativeMotion.length() != 0 || context.rotation.length() == 0) + || context.firstMovement) + context.world.playSound(null, new BlockPos(context.position), SoundEvents.BLOCK_BELL_USE, + SoundCategory.BLOCKS, 2.0F, 1.0F); + } + + @Override + public void stopMoving(MovementContext context) { + context.world.playSound(null, new BlockPos(context.position), SoundEvents.BLOCK_BELL_USE, SoundCategory.BLOCKS, + 2.0F, 1.0F); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java index 6d8e97a5f..bc651d78f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java @@ -58,21 +58,21 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("Progress", destroyProgress); compound.putInt("NextTick", ticksUntilNextProgress); if (breakingPos != null) compound.put("Breaking", NBTUtil.writeBlockPos(breakingPos)); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { destroyProgress = compound.getInt("Progress"); ticksUntilNextProgress = compound.getInt("NextTick"); if (compound.contains("Breaking")) breakingPos = NBTUtil.readBlockPos(compound.getCompound("Breaking")); - super.read(compound); + super.read(compound, clientPacket); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java index 89cde6402..05c568968 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java @@ -60,9 +60,10 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { && ((ContraptionEntity) passenger).getContraption() == context.contraption) continue Entities; - float damage = (float) MathHelper.clamp(Math.abs(context.relativeMotion.length() * 10) + 1, 5, 20); - if (damageSource != null && !world.isRemote) + if (damageSource != null && !world.isRemote) { + float damage = (float) MathHelper.clamp(6 * Math.pow(context.relativeMotion.length(), 0.4) + 1, 2, 10); entity.attackEntityFrom(damageSource, damage); + } if (throwsEntities() && (world.isRemote == (entity instanceof PlayerEntity))) { Vector3d motionBoost = context.motion.add(0, context.motion.length() / 4f, 0); int maxBoost = 4; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java new file mode 100644 index 000000000..a1f1c148f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.Random; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; + +import net.minecraft.block.CampfireBlock; +import net.minecraft.particles.ParticleTypes; + +public class CampfireMovementBehaviour extends MovementBehaviour { + @Override + public boolean hasSpecialMovementRenderer() { + return false; + } + + @Override + public void tick(MovementContext context) { + if (context.world == null || !context.world.isRemote || context.position == null + || !context.state.get(CampfireBlock.LIT)) + return; + + // Mostly copied from CampfireBlock and CampfireTileEntity + Random random = context.world.rand; + if (random.nextFloat() < 0.11F) { + for (int i = 0; i < random.nextInt(2) + 2; ++i) { + context.world.addOptionalParticle( + context.state.get(CampfireBlock.SIGNAL_FIRE) ? ParticleTypes.CAMPFIRE_SIGNAL_SMOKE + : ParticleTypes.CAMPFIRE_COSY_SMOKE, + true, context.position.getX() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), + context.position.getY() + random.nextDouble() + random.nextDouble(), + context.position.getZ() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), 0.0D, 0.07D, + 0.0D); + } + } + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java index 219387d3f..f82c646c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java @@ -3,8 +3,6 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.Block; @@ -25,10 +23,13 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class DrillBlock extends DirectionalKineticBlock implements IPortableBlock, ITE { +import javax.annotation.ParametersAreNonnullByDefault; +import mcp.MethodsReturnNonnullByDefault; - public static MovementBehaviour MOVEMENT = new DrillMovementBehaviour(); - public static DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor(); +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class DrillBlock extends DirectionalKineticBlock implements ITE { + public static DamageSource damageSourceDrill = new DamageSource("create.mechanical_drill").setDamageBypassesArmor(); public DrillBlock(Properties properties) { super(properties); @@ -48,7 +49,7 @@ public class DrillBlock extends DirectionalKineticBlock implements IPortableBloc withTileEntityDo(worldIn, pos, te -> { if (te.getSpeed() == 0) return; - entityIn.attackEntityFrom(damageSourceDrill, MathHelper.clamp(Math.abs(te.getSpeed() / 32f) + 1, 0, 20)); + entityIn.attackEntityFrom(damageSourceDrill, (float) getDamage(te.getSpeed())); }); } @@ -83,14 +84,16 @@ public class DrillBlock extends DirectionalKineticBlock implements IPortableBloc return PushReaction.NORMAL; } - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } - @Override public Class getTileEntityClass() { return DrillTileEntity.class; } + public static double getDamage(float speed) { + float speedAbs = Math.abs(speed); + double sub1 = Math.min(speedAbs / 16, 2); + double sub2 = Math.min(speedAbs / 32, 4); + double sub3 = Math.min(speedAbs / 64, 4); + return MathHelper.clamp(sub1 + sub2 + sub3, 1, 10); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java index 8987a1334..065d18491 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java @@ -1,13 +1,10 @@ package com.simibubi.create.content.contraptions.components.actors; import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.DamageSource; import net.minecraft.util.math.BlockPos; public class DrillTileEntity extends BlockBreakingKineticTileEntity { - public static DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor(); - public DrillTileEntity(TileEntityType type) { super(type); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java index 6c5bdee4d..68a6b5ad8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java @@ -1,16 +1,12 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockReader; -public class HarvesterBlock extends AttachedActorBlock implements IPortableBlock { - - public static MovementBehaviour MOVEMENT = new HarvesterMovementBehaviour(); +public class HarvesterBlock extends AttachedActorBlock { public HarvesterBlock(Properties p_i48377_1_) { super(p_i48377_1_); @@ -25,10 +21,4 @@ public class HarvesterBlock extends AttachedActorBlock implements IPortableBlock public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new HarvesterTileEntity(AllTileEntities.HARVESTER.get()); } - - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughBlock.java index ad3b53960..31a5ffad3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughBlock.java @@ -3,23 +3,15 @@ package com.simibubi.create.content.contraptions.components.actors; import java.util.UUID; import com.mojang.authlib.GameProfile; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.FakePlayer; public class PloughBlock extends AttachedActorBlock { - - public static MovementBehaviour MOVEMENT = new PloughMovementBehaviour(); public PloughBlock(Properties p_i48377_1_) { super(p_i48377_1_); } - - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } /** * The OnHoeUse event takes a player, so we better not pass null diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java index 5f10333fc..a992df339 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java @@ -1,8 +1,6 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import net.minecraft.block.BlockState; @@ -12,9 +10,13 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; -public class PortableStorageInterfaceBlock extends ProperDirectionalBlock implements IPortableBlock { - public static MovementBehaviour MOVEMENT = new StorageInterfaceMovement(); +import javax.annotation.ParametersAreNonnullByDefault; +import mcp.MethodsReturnNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { public PortableStorageInterfaceBlock(Properties p_i48415_1_) { super(p_i48415_1_); @@ -31,9 +33,4 @@ public class PortableStorageInterfaceBlock extends ProperDirectionalBlock implem return AllShapes.PORTABLE_STORAGE_INTERFACE.get(state.get(FACING)); } - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index fb4d5c96f..584df561a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -3,8 +3,6 @@ package com.simibubi.create.content.contraptions.components.actors; import java.util.List; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -27,10 +25,16 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class SeatBlock extends Block implements IPortableBlock { - public static MovementBehaviour MOVEMENT = new SeatMovementBehaviour(); - private boolean inCreativeTab; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import mcp.MethodsReturnNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SeatBlock extends Block { + + private final boolean inCreativeTab; public SeatBlock(Properties p_i48440_1_, boolean inCreativeTab) { super(p_i48440_1_); @@ -63,7 +67,7 @@ public class SeatBlock extends Block implements IPortableBlock { } @Override - public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, MobEntity entity) { + public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, @Nullable MobEntity entity) { return PathNodeType.RAIL; } @@ -118,8 +122,4 @@ public class SeatBlock extends Block implements IPortableBlock { entity.startRiding(seat, true); } - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java index a8df6a048..c6442a00f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java @@ -1,157 +1,157 @@ -package com.simibubi.create.content.contraptions.components.actors; - -import java.util.function.Predicate; - -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; -import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.item.ItemHelper; -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 com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTUtil; -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.vector.Vector3d; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; - -public class StorageInterfaceMovement extends MovementBehaviour { - - private static final String _exporting_ = "Exporting"; - private static final String _delay_ = "Delay"; - private static final String _workingPos_ = "WorkingPos"; - - @Override - public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()).scale(.85f); - } - - @Override - public void visitNewPosition(MovementContext context, BlockPos pos) { - Direction currentFacing = getCurrentFacing(context); - TransposerTileEntity transposer = getValidTransposer(context.world, pos, currentFacing.getAxis()); - if (transposer == null) - return; - context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); - context.data.putBoolean(_exporting_, - TransposerBlock.getBlockFacing(transposer.getBlockState()) != currentFacing); - context.stall = true; - } - - @Override - public void tick(MovementContext context) { - if (!context.data.contains(_workingPos_)) - return; - if (context.world.isRemote) - return; - - BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); - TransposerTileEntity transposer = getValidTransposer(context.world, pos, getCurrentFacing(context).getAxis()); - if (transposer == null) { - reset(context); - return; - } - - int nextExtract = context.data.getInt(_delay_); - if (nextExtract > 0) { - nextExtract--; - context.data.putInt(_delay_, nextExtract); - return; - } - - boolean extract = context.data.getBoolean(_exporting_); - boolean success = false; - IItemHandlerModifiable inv = context.contraption.inventory; - SingleTargetAutoExtractingBehaviour extracting = - TileEntityBehaviour.get(transposer, SingleTargetAutoExtractingBehaviour.TYPE); - FilteringBehaviour filtering = TileEntityBehaviour.get(transposer, FilteringBehaviour.TYPE); - - if (extract) { - // Export from Contraption - Predicate test = extracting.getFilterTest(); - int exactAmount = extracting.getAmountToExtract(); - ItemStack itemExtracted = ItemStack.EMPTY; - if (exactAmount != -1) - itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); - else - itemExtracted = ItemHelper.extract(inv, test, transposer::amountToExtract, false); - - if (!itemExtracted.isEmpty()) { - transposer.onExtract(itemExtracted); - success = exactAmount == -1; - } - - } else { - // Import to Contraption - if (extracting != null) { - extracting.setSynchronized(false); - extracting.withAdditionalFilter(stack -> { - if (filtering.anyAmount()) - return true; - return ItemHandlerHelper.insertItemStacked(inv, stack, true).isEmpty(); - }); - - extracting.withAmountThreshold(stack -> { - ItemStack tester = stack.copy(); - tester.setCount(tester.getMaxStackSize()); - return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); - }); - - extracting.setCallback(stack -> { - ItemHandlerHelper.insertItemStacked(inv, stack, false); - }); - - success = extracting.extract() && filtering.anyAmount(); - extracting.setSynchronized(true); - transposer.applyFilteringCallbacks(); - extracting.setCallback(transposer::onExtract); - } - } - - if (!success) { - reset(context); - return; - } - - context.data.putInt(_delay_, AllConfigs.SERVER.logistics.extractorDelay.get()); - } - - @Override - public void stopMoving(MovementContext context) { - reset(context); - } - - public void reset(MovementContext context) { - context.data.remove(_workingPos_); - context.data.remove(_delay_); - context.data.remove(_exporting_); - context.stall = false; - } - - private TransposerTileEntity getValidTransposer(World world, BlockPos pos, Axis validAxis) { - TileEntity te = world.getTileEntity(pos); - if (!(te instanceof TransposerTileEntity)) - return null; - if (TransposerBlock.getBlockFacing(world.getBlockState(pos)).getAxis() != validAxis) - return null; - if (world.isBlockPowered(pos)) - return null; - return (TransposerTileEntity) te; - } - - private Direction getCurrentFacing(MovementContext context) { - Vector3d directionVec = Vector3d.of(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()); - directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); - return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); - } - -} +//package com.simibubi.create.content.contraptions.components.actors; +// +//import java.util.function.Predicate; +// +//import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +//import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +//import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; +//import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity; +//import com.simibubi.create.foundation.config.AllConfigs; +//import com.simibubi.create.foundation.item.ItemHelper; +//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 com.simibubi.create.foundation.utility.VecHelper; +// +//import net.minecraft.item.ItemStack; +//import net.minecraft.nbt.NBTUtil; +//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.items.IItemHandlerModifiable; +//import net.minecraftforge.items.ItemHandlerHelper; +// +//public class StorageInterfaceMovement extends MovementBehaviour { +// +// private static final String _exporting_ = "Exporting"; +// private static final String _delay_ = "Delay"; +// private static final String _workingPos_ = "WorkingPos"; +// +// @Override +// public Vec3d getActiveAreaOffset(MovementContext context) { +// return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()).scale(.85f); +// } +// +// @Override +// public void visitNewPosition(MovementContext context, BlockPos pos) { +// Direction currentFacing = getCurrentFacing(context); +// TransposerTileEntity transposer = getValidTransposer(context.world, pos, currentFacing.getAxis()); +// if (transposer == null) +// return; +// context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); +// context.data.putBoolean(_exporting_, +// TransposerBlock.getBlockFacing(transposer.getBlockState()) != currentFacing); +// context.stall = true; +// } +// +// @Override +// public void tick(MovementContext context) { +// if (!context.data.contains(_workingPos_)) +// return; +// if (context.world.isRemote) +// return; +// +// BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); +// TransposerTileEntity transposer = getValidTransposer(context.world, pos, getCurrentFacing(context).getAxis()); +// if (transposer == null) { +// reset(context); +// return; +// } +// +// int nextExtract = context.data.getInt(_delay_); +// if (nextExtract > 0) { +// nextExtract--; +// context.data.putInt(_delay_, nextExtract); +// return; +// } +// +// boolean extract = context.data.getBoolean(_exporting_); +// boolean success = false; +// IItemHandlerModifiable inv = context.contraption.inventory; +// SingleTargetAutoExtractingBehaviour extracting = +// TileEntityBehaviour.get(transposer, SingleTargetAutoExtractingBehaviour.TYPE); +// FilteringBehaviour filtering = TileEntityBehaviour.get(transposer, FilteringBehaviour.TYPE); +// +// if (extract) { +// // Export from Contraption +// Predicate test = extracting.getFilterTest(); +// int exactAmount = extracting.getAmountFromFilter(); +// ItemStack itemExtracted = ItemStack.EMPTY; +// if (exactAmount != -1) +// itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); +// else +// itemExtracted = ItemHelper.extract(inv, test, transposer::amountToExtract, false); +// +// if (!itemExtracted.isEmpty()) { +// transposer.onExtract(itemExtracted); +// success = exactAmount == -1; +// } +// +// } else { +// // Import to Contraption +// if (extracting != null) { +// extracting.setSynchronized(false); +// extracting.withAdditionalFilter(stack -> { +// if (filtering.anyAmount()) +// return true; +// return ItemHandlerHelper.insertItemStacked(inv, stack, true).isEmpty(); +// }); +// +// extracting.withAmountThreshold(stack -> { +// ItemStack tester = stack.copy(); +// tester.setCount(tester.getMaxStackSize()); +// return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); +// }); +// +// extracting.setCallback(stack -> { +// ItemHandlerHelper.insertItemStacked(inv, stack, false); +// }); +// +// success = extracting.extract() && filtering.anyAmount(); +// extracting.setSynchronized(true); +// transposer.applyFilteringCallbacks(); +// extracting.setCallback(transposer::onExtract); +// } +// } +// +// if (!success) { +// reset(context); +// return; +// } +// +// context.data.putInt(_delay_, AllConfigs.SERVER.logistics.extractorDelay.get()); +// } +// +// @Override +// public void stopMoving(MovementContext context) { +// reset(context); +// } +// +// public void reset(MovementContext context) { +// context.data.remove(_workingPos_); +// context.data.remove(_delay_); +// context.data.remove(_exporting_); +// context.stall = false; +// } +// +// private TransposerTileEntity getValidTransposer(World world, BlockPos pos, Axis validAxis) { +// TileEntity te = world.getTileEntity(pos); +// if (!(te instanceof TransposerTileEntity)) +// return null; +// if (TransposerBlock.getBlockFacing(world.getBlockState(pos)).getAxis() != validAxis) +// return null; +// if (world.isBlockPowered(pos)) +// return null; +// return (TransposerTileEntity) te; +// } +// +// private Direction getCurrentFacing(MovementContext context) { +// Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()); +// directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); +// return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); +// } +// +//} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java new file mode 100644 index 000000000..9ff2f2d53 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.block.BlockState; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import javax.annotation.Nullable; + +@MethodsReturnNonnullByDefault +public class ContraptionBlockSource implements IBlockSource { + private final BlockPos pos; + private final MovementContext context; + private final Direction overrideFacing; + + public ContraptionBlockSource(MovementContext context, BlockPos pos) { + this(context, pos, null); + } + + public ContraptionBlockSource(MovementContext context, BlockPos pos, @Nullable Direction overrideFacing) { + this.pos = pos; + this.context = context; + this.overrideFacing = overrideFacing; + } + + @Override + public double getX() { + return (double)this.pos.getX() + 0.5D; + } + + @Override + public double getY() { + return (double)this.pos.getY() + 0.5D; + } + + @Override + public double getZ() { + return (double)this.pos.getZ() + 0.5D; + } + + @Override + public BlockPos getBlockPos() { + return pos; + } + + @Override + public BlockState getBlockState() { + if(context.state.has(BlockStateProperties.FACING) && overrideFacing != null) + return context.state.with(BlockStateProperties.FACING, overrideFacing); + return context.state; + } + + @Override + @Nullable + public T getBlockTileEntity() { + return null; + } + + @Override + public World getWorld() { + return context.world; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenseItemLocation.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenseItemLocation.java new file mode 100644 index 000000000..2b0b23916 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenseItemLocation.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +public class DispenseItemLocation { + private final boolean internal; + private final int slot; + + public static final DispenseItemLocation NONE = new DispenseItemLocation(false, -1); + + public DispenseItemLocation(boolean internal, int slot) { + this.internal = internal; + this.slot = slot; + } + + public boolean isInternal() { + return internal; + } + + public int getSlot() { + return slot; + } + + public boolean isEmpty() { + return slot < 0; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java new file mode 100644 index 000000000..19674c065 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java @@ -0,0 +1,92 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.block.DispenserBlock; +import net.minecraft.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.dispenser.IDispenseItemBehavior; +import net.minecraft.dispenser.ProjectileDispenseBehavior; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.HashMap; + +public class DispenserMovementBehaviour extends DropperMovementBehaviour { + private static final HashMap MOVED_DISPENSE_ITEM_BEHAVIOURS = new HashMap<>(); + private static final HashMap MOVED_PROJECTILE_DISPENSE_BEHAVIOURS = new HashMap<>(); + private static final DispenserLookup BEHAVIOUR_LOOKUP = new DispenserLookup(); + + public static void gatherMovedDispenseItemBehaviours() { + IMovedDispenseItemBehaviour.init(); + } + + public static void registerMovedDispenseItemBehaviour(Item item, IMovedDispenseItemBehaviour movedDispenseItemBehaviour) { + MOVED_DISPENSE_ITEM_BEHAVIOURS.put(item, movedDispenseItemBehaviour); + } + + @Override + protected void activate(MovementContext context, BlockPos pos) { + DispenseItemLocation location = getDispenseLocation(context); + if (location.isEmpty()) { + context.world.playEvent(1001, pos, 0); + } else { + ItemStack itemstack = getItemStackAt(location, context); + // Special dispense item behaviour for moving contraptions + if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemstack.getItem())) { + setItemStackAt(location, MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos), context); + return; + } + + ItemStack backup = itemstack.copy(); + // If none is there, try vanilla registry + try { + if (MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.containsKey(itemstack.getItem())) { + setItemStackAt(location, MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos), context); + return; + } + + IDispenseItemBehavior idispenseitembehavior = BEHAVIOUR_LOOKUP.getBehavior(itemstack); + if (idispenseitembehavior instanceof ProjectileDispenseBehavior) { // Projectile behaviours can be converted most of the time + IMovedDispenseItemBehaviour iMovedDispenseItemBehaviour = MovedProjectileDispenserBehaviour.of((ProjectileDispenseBehavior) idispenseitembehavior); + setItemStackAt(location, iMovedDispenseItemBehaviour.dispense(itemstack, context, pos), context); + MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.put(itemstack.getItem(), iMovedDispenseItemBehaviour); // buffer conversion if successful + return; + } + + Vec3d facingVec = new Vec3d(context.state.get(DispenserBlock.FACING).getDirectionVec()); + facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + Direction clostestFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); + ContraptionBlockSource blockSource = new ContraptionBlockSource(context, pos, clostestFacing); + + if (idispenseitembehavior.getClass() != DefaultDispenseItemBehavior.class) { // There is a dispense item behaviour registered for the vanilla dispenser + setItemStackAt(location, idispenseitembehavior.dispense(blockSource, itemstack), context); + return; + } + } catch (NullPointerException ignored) { + itemstack = backup; // Something went wrong with the TE being null in ContraptionBlockSource, reset the stack + } + + setItemStackAt(location, defaultBehaviour.dispense(itemstack, context, pos), context); // the default: launch the item + } + } + + @ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + private static class DispenserLookup extends DispenserBlock { + protected DispenserLookup() { + super(Block.Properties.from(Blocks.DISPENSER)); + } + + public IDispenseItemBehavior getBehavior(ItemStack itemStack) { + return super.getBehavior(itemStack); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java new file mode 100644 index 000000000..29ddec09b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java @@ -0,0 +1,122 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.item.ItemHelper; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class DropperMovementBehaviour extends MovementBehaviour { + protected static final MovedDefaultDispenseItemBehaviour defaultBehaviour = new MovedDefaultDispenseItemBehaviour(); + private static final Random RNG = new Random(); + + protected void activate(MovementContext context, BlockPos pos) { + DispenseItemLocation location = getDispenseLocation(context); + if (location.isEmpty()) { + context.world.playEvent(1001, pos, 0); + } else { + setItemStackAt(location, defaultBehaviour.dispense(getItemStackAt(location, context), context, pos), context); + } + } + + @Override + public void visitNewPosition(MovementContext context, BlockPos pos) { + if (context.world.isRemote) + return; + collectItems(context); + activate(context, pos); + } + + private void collectItems(MovementContext context) { + getStacks(context).stream().filter(itemStack -> !itemStack.isEmpty() && itemStack.getItem() != Items.AIR && itemStack.getMaxStackSize() > itemStack.getCount()).forEach(itemStack -> itemStack.grow( + ItemHelper.extract(context.contraption.inventory, itemStack::isItemEqual, ItemHelper.ExtractionCountMode.UPTO, itemStack.getMaxStackSize() - itemStack.getCount(), false).getCount())); + } + + private void updateTemporaryData(MovementContext context) { + if (!(context.temporaryData instanceof NonNullList) && context.world instanceof ServerWorld) { + NonNullList stacks = NonNullList.withSize(getInvSize(), ItemStack.EMPTY); + ItemStackHelper.loadAllItems(context.tileData, stacks); + context.temporaryData = stacks; + } + } + + @SuppressWarnings("unchecked") + private NonNullList getStacks(MovementContext context) { + updateTemporaryData(context); + return (NonNullList) context.temporaryData; + } + + private ArrayList getUseableLocations(MovementContext context) { + ArrayList useable = new ArrayList<>(); + for (int slot = 0; slot < getInvSize(); slot++) { + DispenseItemLocation location = new DispenseItemLocation(true, slot); + ItemStack testStack = getItemStackAt(location, context); + if (testStack == null || testStack.isEmpty()) + continue; + if (testStack.getMaxStackSize() == 1) { + location = new DispenseItemLocation(false, ItemHelper.findFirstMatchingSlotIndex(context.contraption.inventory, testStack::isItemEqual)); + if (!getItemStackAt(location, context).isEmpty()) + useable.add(location); + } else if (testStack.getCount() >= 2) + useable.add(location); + } + return useable; + } + + @Override + public void writeExtraData(MovementContext context) { + NonNullList stacks = getStacks(context); + if (stacks == null) + return; + ItemStackHelper.saveAllItems(context.tileData, stacks); + } + + @Override + public void stopMoving(MovementContext context) { + super.stopMoving(context); + writeExtraData(context); + } + + protected DispenseItemLocation getDispenseLocation(MovementContext context) { + int i = -1; + int j = 1; + List useableLocations = getUseableLocations(context); + for (int k = 0; k < useableLocations.size(); ++k) { + if (RNG.nextInt(j++) == 0) { + i = k; + } + } + if (i < 0) + return DispenseItemLocation.NONE; + else + return useableLocations.get(i); + } + + protected ItemStack getItemStackAt(DispenseItemLocation location, MovementContext context) { + if (location.isInternal()) { + return getStacks(context).get(location.getSlot()); + } else { + return context.contraption.inventory.getStackInSlot(location.getSlot()); + } + } + + protected void setItemStackAt(DispenseItemLocation location, ItemStack stack, MovementContext context) { + if (location.isInternal()) { + getStacks(context).set(location.getSlot(), stack); + } else { + context.contraption.inventory.setStackInSlot(location.getSlot(), stack); + } + } + + private static int getInvSize() { + return 9; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java new file mode 100644 index 000000000..fba60a901 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import net.minecraft.block.BeehiveBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.IBucketPickupHandler; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.item.FireworkRocketEntity; +import net.minecraft.entity.item.TNTEntity; +import net.minecraft.entity.projectile.*; +import net.minecraft.fluid.FlowingFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.tileentity.BeehiveTileEntity; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; + +import java.util.Random; + +public interface IMovedDispenseItemBehaviour { + static void init() { + MovedProjectileDispenserBehaviour movedPotionDispenseItemBehaviour = new MovedProjectileDispenserBehaviour() { + @Override + protected IProjectile getProjectileEntity(World world, double x, double y, double z, ItemStack itemStack) { + return Util.make(new PotionEntity(world, x, y, z), (p_218411_1_) -> p_218411_1_.setItem(itemStack)); + } + + protected float getProjectileInaccuracy() { + return super.getProjectileInaccuracy() * 0.5F; + } + + protected float getProjectileVelocity() { + return super.getProjectileVelocity() * .5F; + } + }; + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.SPLASH_POTION, movedPotionDispenseItemBehaviour); + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.LINGERING_POTION, movedPotionDispenseItemBehaviour); + + + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.TNT, new MovedDefaultDispenseItemBehaviour() { + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + double x = pos.getX() + facing.x * .7 + .5; + double y = pos.getY() + facing.y * .7 + .5; + double z = pos.getZ() + facing.z * .7 + .5; + TNTEntity tntentity = new TNTEntity(context.world, x, y, z, null); + tntentity.addVelocity(context.motion.x, context.motion.y, context.motion.z); + context.world.addEntity(tntentity); + context.world.playSound(null, tntentity.getX(), tntentity.getY(), tntentity.getZ(), SoundEvents.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F); + itemStack.shrink(1); + return itemStack; + } + }); + + + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.FIREWORK_ROCKET, new MovedDefaultDispenseItemBehaviour() { + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + double x = pos.getX() + facing.x * .7 + .5; + double y = pos.getY() + facing.y * .7 + .5; + double z = pos.getZ() + facing.z * .7 + .5; + FireworkRocketEntity fireworkrocketentity = new FireworkRocketEntity(context.world, itemStack, x, y, z, true); + fireworkrocketentity.shoot(facing.x, facing.y, facing.z, 0.5F, 1.0F); + context.world.addEntity(fireworkrocketentity); + itemStack.shrink(1); + return itemStack; + } + + @Override + protected void playDispenseSound(IWorld world, BlockPos pos) { + world.playEvent(1004, pos, 0); + } + }); + + + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.FIRE_CHARGE, new MovedDefaultDispenseItemBehaviour() { + @Override + protected void playDispenseSound(IWorld world, BlockPos pos) { + world.playEvent(1018, pos, 0); + } + + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + Random random = context.world.rand; + double x = pos.getX() + facing.x * .7 + .5; + double y = pos.getY() + facing.y * .7 + .5; + double z = pos.getZ() + facing.z * .7 + .5; + context.world.addEntity(Util.make(new SmallFireballEntity(context.world, x, y, z, + random.nextGaussian() * 0.05D + facing.x + context.motion.x, random.nextGaussian() * 0.05D + facing.y + context.motion.y, random.nextGaussian() * 0.05D + facing.z + context.motion.z), (p_229425_1_) -> p_229425_1_.setStack(itemStack))); + itemStack.shrink(1); + return itemStack; + } + }); + + + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.GLASS_BOTTLE, new MovedOptionalDispenseBehaviour() { + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + this.successful = false; + BlockPos interactAt = pos.offset(getClosestFacingDirection(facing)); + BlockState state = context.world.getBlockState(interactAt); + Block block = state.getBlock(); + + if (block.isIn(BlockTags.field_226151_aa_) && state.get(BeehiveBlock.HONEY_LEVEL) >= 5) { // Beehive -> honey bottles + ((BeehiveBlock) block).takeHoney(context.world, state, interactAt, null, BeehiveTileEntity.State.BEE_RELEASED); + this.successful = true; + return placeItemInInventory(itemStack, new ItemStack(Items.field_226638_pX_), context, pos, facing); + } else if (context.world.getFluidState(interactAt).isTagged(FluidTags.WATER)) { + this.successful = true; + return placeItemInInventory(itemStack, PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER), context, pos, facing); + } else { + return super.dispenseStack(itemStack, context, pos, facing); + } + } + }); + + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(Items.BUCKET, new MovedDefaultDispenseItemBehaviour() { + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + BlockPos interactAt = pos.offset(getClosestFacingDirection(facing)); + BlockState state = context.world.getBlockState(interactAt); + Block block = state.getBlock(); + if (block instanceof IBucketPickupHandler) { + Fluid fluid = ((IBucketPickupHandler) block).pickupFluid(context.world, interactAt, state); + if (fluid instanceof FlowingFluid) + return placeItemInInventory(itemStack, new ItemStack(fluid.getFilledBucket()), context, pos, facing); + } + return super.dispenseStack(itemStack, context, pos, facing); + } + }); + + final IMovedDispenseItemBehaviour spawnEggDispenseBehaviour = new MovedDefaultDispenseItemBehaviour() { + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + if (!(itemStack.getItem() instanceof SpawnEggItem)) + return super.dispenseStack(itemStack, context, pos, facing); + EntityType entityType = ((SpawnEggItem) itemStack.getItem()).getType(itemStack.getTag()); + Entity spawnedEntity = entityType.spawn(context.world, itemStack, null, pos.add(facing.x + .7, facing.y + .7, facing.z + .7), SpawnReason.DISPENSER, facing.y < .5, false); + if (spawnedEntity != null) + spawnedEntity.setMotion(context.motion.scale(2)); + itemStack.shrink(1); + return itemStack; + } + }; + + for (SpawnEggItem spawneggitem : SpawnEggItem.getEggs()) { + DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(spawneggitem, spawnEggDispenseBehaviour); + } + } + + ItemStack dispense(ItemStack itemStack, MovementContext context, BlockPos pos); +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java new file mode 100644 index 000000000..6318da0f4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java @@ -0,0 +1,93 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.DispenserBlock; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.HopperTileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; + +public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBehaviour { + private static final MovedDefaultDispenseItemBehaviour defaultInstance = new MovedDefaultDispenseItemBehaviour(); + + public static void doDispense(World p_82486_0_, ItemStack p_82486_1_, int p_82486_2_, Vec3d facing, BlockPos p_82486_4_, MovementContext context) { + double d0 = p_82486_4_.getX() + facing.x + .5; + double d1 = p_82486_4_.getY() + facing.y + .5; + double d2 = p_82486_4_.getZ() + facing.z + .5; + if (Direction.getFacingFromVector(facing.x, facing.y, facing.z).getAxis() == Direction.Axis.Y) { + d1 = d1 - 0.125D; + } else { + d1 = d1 - 0.15625D; + } + + ItemEntity itementity = new ItemEntity(p_82486_0_, d0, d1, d2, p_82486_1_); + double d3 = p_82486_0_.rand.nextDouble() * 0.1D + 0.2D; + itementity.setMotion(p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getX() * d3 + context.motion.x, p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getY() * d3 + context.motion.y, p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getZ() * d3 + context.motion.z); + p_82486_0_.addEntity(itementity); + } + + @Override + public ItemStack dispense(ItemStack itemStack, MovementContext context, BlockPos pos) { + Vec3d facingVec = new Vec3d(context.state.get(DispenserBlock.FACING).getDirectionVec()); + facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + + Direction closestToFacing = getClosestFacingDirection(facingVec); + IInventory iinventory = HopperTileEntity.getInventoryAtPosition(context.world, pos.offset(closestToFacing)); + if (iinventory == null) { + this.playDispenseSound(context.world, pos); + this.spawnDispenseParticles(context.world, pos, closestToFacing); + return this.dispenseStack(itemStack, context, pos, facingVec); + } else { + if (HopperTileEntity.putStackInInventoryAllSlots(null, iinventory, itemStack.copy().split(1), closestToFacing.getOpposite()).isEmpty()) + itemStack.shrink(1); + return itemStack; + } + } + + /** + * Dispense the specified stack, play the dispense sound and spawn particles. + */ + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + ItemStack itemstack = itemStack.split(1); + doDispense(context.world, itemstack, 6, facing, pos, context); + return itemStack; + } + + /** + * Play the dispense sound from the specified block. + */ + protected void playDispenseSound(IWorld world, BlockPos pos) { + world.playEvent(1000, pos, 0); + } + + /** + * Order clients to display dispense particles from the specified block and facing. + */ + protected void spawnDispenseParticles(IWorld world, BlockPos pos, Vec3d facing) { + spawnDispenseParticles(world, pos, getClosestFacingDirection(facing)); + } + + protected void spawnDispenseParticles(IWorld world, BlockPos pos, Direction direction) { + world.playEvent(2000, pos, direction.getIndex()); + } + + protected Direction getClosestFacingDirection(Vec3d exactFacing) { + return Direction.getFacingFromVector(exactFacing.x, exactFacing.y, exactFacing.z); + } + + protected ItemStack placeItemInInventory(ItemStack consumedFrom, ItemStack output, MovementContext context, BlockPos pos, Vec3d facing) { + consumedFrom.shrink(1); + ItemStack remainder = ItemHandlerHelper.insertItem(context.contraption.inventory, output.copy(), false); + if (!remainder.isEmpty()) + defaultInstance.dispenseStack(output, context, pos, facing); + return consumedFrom; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java new file mode 100644 index 000000000..d3eb7e88e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java @@ -0,0 +1,13 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; + +public class MovedOptionalDispenseBehaviour extends MovedDefaultDispenseItemBehaviour { + protected boolean successful = true; + + @Override + protected void playDispenseSound(IWorld world, BlockPos pos) { + world.playEvent(this.successful ? 1000 : 1001, pos, 0); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java new file mode 100644 index 000000000..aa332a1f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java @@ -0,0 +1,99 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import net.minecraft.dispenser.IPosition; +import net.minecraft.dispenser.ProjectileDispenseBehavior; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +import javax.annotation.Nullable; +import java.lang.reflect.Method; + +public abstract class MovedProjectileDispenserBehaviour extends MovedDefaultDispenseItemBehaviour { + + @Override + protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3d facing) { + double x = pos.getX() + facing.x * .7 + .5; + double y = pos.getY() + facing.y * .7 + .5; + double z = pos.getZ() + facing.z * .7 + .5; + IProjectile iprojectile = this.getProjectileEntity(context.world, x, y, z, itemStack.copy()); + if (iprojectile == null) + return itemStack; + Vec3d effectiveMovementVec = facing.scale(getProjectileVelocity()).add(context.motion); + iprojectile.shoot(effectiveMovementVec.x, effectiveMovementVec.y, effectiveMovementVec.z, (float) effectiveMovementVec.length(), this.getProjectileInaccuracy()); + context.world.addEntity((Entity) iprojectile); + itemStack.shrink(1); + return itemStack; + } + + @Override + protected void playDispenseSound(IWorld world, BlockPos pos) { + world.playEvent(1002, pos, 0); + } + + @Nullable + protected abstract IProjectile getProjectileEntity(World world, double x, double y, double z, ItemStack itemStack); + + protected float getProjectileInaccuracy() { + return 6.0F; + } + + protected float getProjectileVelocity() { + return 1.1F; + } + + public static MovedProjectileDispenserBehaviour of(ProjectileDispenseBehavior vanillaBehaviour) { + return new MovedProjectileDispenserBehaviour() { + @Override + protected IProjectile getProjectileEntity(World world, double x, double y, double z, ItemStack itemStack) { + try { + return (IProjectile) MovedProjectileDispenserBehaviour.getProjectileEntityLookup().invoke(vanillaBehaviour, world, new SimplePos(x, y, z) , itemStack); + } catch (Throwable ignored) { + } + return null; + } + + @Override + protected float getProjectileInaccuracy() { + try { + return (float) MovedProjectileDispenserBehaviour.getProjectileInaccuracyLookup().invoke(vanillaBehaviour); + } catch (Throwable ignored) { + } + return super.getProjectileInaccuracy(); + } + + @Override + protected float getProjectileVelocity() { + try { + return (float) MovedProjectileDispenserBehaviour.getProjectileVelocityLookup().invoke(vanillaBehaviour); + } catch (Throwable ignored) { + } + return super.getProjectileVelocity(); + } + }; + } + + private static Method getProjectileEntityLookup() { + Method getProjectileEntity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82499_a", World.class, IPosition.class, ItemStack.class); + getProjectileEntity.setAccessible(true); + return getProjectileEntity; + } + + private static Method getProjectileInaccuracyLookup() { + Method getProjectileInaccuracy = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82498_a"); + getProjectileInaccuracy.setAccessible(true); + return getProjectileInaccuracy; + } + + private static Method getProjectileVelocityLookup() { + Method getProjectileVelocity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82500_b"); + getProjectileVelocity.setAccessible(true); + return getProjectileVelocity; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java new file mode 100644 index 000000000..5da3e0b13 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java @@ -0,0 +1,30 @@ +package com.simibubi.create.content.contraptions.components.actors.dispenser; + +import net.minecraft.dispenser.IPosition; + +public class SimplePos implements IPosition { + private final double x; + private final double y; + private final double z; + + public SimplePos(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public double getX() { + return x; + } + + @Override + public double getY() { + return y; + } + + @Override + public double getZ() { + return z; + } +} 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 e8366f51f..67d7bcde6 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 @@ -39,23 +39,23 @@ public class CuckooClockTileEntity extends KineticTileEntity { super(type); animationType = Animation.NONE; } - + @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - if (sendAnimationUpdate) - NBTHelper.writeEnum(compound, "Animation", animationType); - sendAnimationUpdate = false; - return super.writeToClient(compound); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { - if (tag.contains("Animation")) { - animationType = NBTHelper.readEnum(tag, "Animation", Animation.class); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + if (clientPacket && compound.contains("Animation")) { + animationType = NBTHelper.readEnum(compound, "Animation", Animation.class); animationProgress.lastValue = 0; animationProgress.value = 0; } - super.readClientUpdate(tag); + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + if (clientPacket && sendAnimationUpdate) + NBTHelper.writeEnum(compound, "Animation", animationType); + sendAnimationUpdate = false; + super.write(compound, clientPacket); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index 022cc645e..0f856890e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -179,9 +179,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer type) { @@ -99,7 +100,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - inserting = new InsertingBehaviour(this, Attachments.toward(this::getTargetFacing)); + inserting = new InvManipulationBehaviour(this, this::getTargetFace); connectivity = new EdgeInteractionBehaviour(this, ConnectedInputHandler::toggleConnection) .connectivity(ConnectedInputHandler::shouldConnect) .require(AllItems.WRENCH.get()); @@ -108,13 +109,17 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } public void blockChanged() { - removeBehaviour(InsertingBehaviour.TYPE); - inserting = new InsertingBehaviour(this, Attachments.toward(this::getTargetFacing)); - putBehaviour(inserting); + removeBehaviour(InvManipulationBehaviour.TYPE); + inserting = new InvManipulationBehaviour(this, this::getTargetFace); + attachBehaviourLate(inserting); } - public Direction getTargetFacing() { - return MechanicalCrafterBlock.getTargetDirection(world.getBlockState(pos)); + public BlockFace getTargetFace(World world, BlockPos pos, BlockState state) { + return new BlockFace(pos, MechanicalCrafterBlock.getTargetDirection(state)); + } + + public Direction getTargetDirection() { + return MechanicalCrafterBlock.getTargetDirection(getBlockState()); } @Override @@ -123,7 +128,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.put("Inventory", inventory.serializeNBT()); CompoundNBT inputNBT = new CompoundNBT(); @@ -138,43 +143,19 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { compound.putInt("CountDown", countDown); compound.putBoolean("Cover", covered); - return super.write(compound); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT tag) { - if (reRender) { - tag.putBoolean("Redraw", true); + super.write(compound, clientPacket); + + if (clientPacket && reRender) { + compound.putBoolean("Redraw", true); reRender = false; } - return super.writeToClient(tag); } @Override - public void readClientUpdate(CompoundNBT tag) { - if (tag.contains("Redraw")) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); - + protected void read(CompoundNBT compound, boolean clientPacket) { Phase phaseBefore = phase; GroupedItems before = this.groupedItems; - - super.readClientUpdate(tag); - - if (phaseBefore != phase && phase == Phase.CRAFTING) - groupedItemsBeforeCraft = before; - if (phaseBefore == Phase.EXPORTING && phase == Phase.WAITING) { - Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); - Vector3d vec = Vector3d.of(facing.getDirectionVec()).scale(.75) - .add(VecHelper.getCenterOf(pos)); - Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(getBlockState()); - vec = vec.add(Vector3d.of(targetDirection.getDirectionVec()).scale(1)); - world.addParticle(ParticleTypes.CRIT, vec.x, vec.y, vec.z, 0, 0, 0); - } - - } - - @Override - public void read(CompoundNBT compound) { + inventory.deserializeNBT(compound.getCompound("Inventory")); input.read(compound.getCompound("ConnectedInput")); groupedItems = GroupedItems.read(compound.getCompound("GroupedItems")); @@ -186,7 +167,22 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { this.phase = phase; countDown = compound.getInt("CountDown"); covered = compound.getBoolean("Cover"); - super.read(compound); + super.read(compound, clientPacket); + + if (!clientPacket) + return; + if (compound.contains("Redraw")) + world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + if (phaseBefore != phase && phase == Phase.CRAFTING) + groupedItemsBeforeCraft = before; + if (phaseBefore == Phase.EXPORTING && phase == Phase.WAITING) { + Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); + Vec3d vec = new Vec3d(facing.getDirectionVec()).scale(.75) + .add(VecHelper.getCenterOf(pos)); + Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(getBlockState()); + vec = vec.add(new Vec3d(targetDirection.getDirectionVec()).scale(1)); + world.addParticle(ParticleTypes.CRIT, vec.x, vec.y, vec.z, 0, 0, 0); + } } @Override @@ -293,7 +289,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { Vector3d vec = facingVec.scale(.65) .add(VecHelper.getCenterOf(pos)); Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f) - .mul(VecHelper.planeByNormal(facingVec)) + .mul(VecHelper.axisAlingedPlaneOf(facingVec)) .normalize() .scale(progress * .5f) .add(vec); @@ -307,7 +303,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { for (int i = 0; i < 10; i++) { Vector3d randVec = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f) - .mul(VecHelper.planeByNormal(facingVec)) + .mul(VecHelper.axisAlingedPlaneOf(facingVec)) .normalize() .scale(.25f); Vector3d offset2 = randVec.add(vec); @@ -338,16 +334,16 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { protected boolean isTargetingBelt() { DirectBeltInputBehaviour behaviour = getTargetingBelt(); - return behaviour != null && behaviour.canInsertFromSide(getTargetFacing()); + return behaviour != null && behaviour.canInsertFromSide(getTargetDirection()); } protected DirectBeltInputBehaviour getTargetingBelt() { - BlockPos targetPos = pos.offset(getTargetFacing()); + BlockPos targetPos = pos.offset(getTargetDirection()); return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE); } public void tryInsert() { - if (inserting.getInventory() == null && !isTargetingBelt()) { + if (!inserting.hasInventory() && !isTargetingBelt()) { ejectWholeGrid(); return; } @@ -359,10 +355,10 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { for (Entry, ItemStack> entry : groupedItems.grid.entrySet()) { Pair pair = entry.getKey(); ItemStack stack = entry.getValue(); - Direction facing = getTargetFacing(); + BlockFace face = getTargetFace(world, pos, getBlockState()); - ItemStack remainder = behaviour == null ? inserting.insert(stack.copy(), false) - : behaviour.handleInsertion(stack, facing, false); + ItemStack remainder = behaviour == null ? inserting.insert(stack.copy()) + : behaviour.handleInsertion(stack, face.getFace(), false); if (!remainder.isEmpty()) { stack.setCount(remainder.getCount()); continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index c1af6a112..492cc9dcf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -38,15 +38,15 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("InUse", inUse); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { inUse = compound.getInt("InUse"); - super.read(compound); + super.read(compound, clientPacket); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java index bd99f7740..350a5269a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java @@ -1,20 +1,19 @@ package com.simibubi.create.content.contraptions.components.crusher; -import java.util.List; - import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.items.wrapper.RecipeWrapper; public abstract class AbstractCrushingRecipe extends ProcessingRecipe { - public AbstractCrushingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group, - List ingredients, List results, int processingDuration) { - super(recipeType, id, group, ingredients, results, processingDuration); + public AbstractCrushingRecipe(AllRecipeTypes recipeType, ProcessingRecipeParams params) { + super(recipeType, params); } + @Override + protected int getMaxInputCount() { + return 1; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java index 5f5ff519c..d03b8e07e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java @@ -1,21 +1,18 @@ package com.simibubi.create.content.contraptions.components.crusher; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; -import net.minecraft.util.ResourceLocation; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; + import net.minecraft.world.World; import net.minecraftforge.items.wrapper.RecipeWrapper; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; - @ParametersAreNonnullByDefault public class CrushingRecipe extends AbstractCrushingRecipe { - public CrushingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.CRUSHING, id, group, ingredients, results, processingDuration); + public CrushingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.CRUSHING, params); } @Override @@ -25,7 +22,7 @@ public class CrushingRecipe extends AbstractCrushingRecipe { return ingredients.get(0) .test(inv.getStackInSlot(0)); } - + @Override protected int getMaxOutputCount() { return 7; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index f30fc9e22..556501767 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -191,7 +191,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { inventory.clear(); for (int roll = 0; roll < rolls; roll++) { List rolledResults = recipe.get() - .rollResults().getItemStacks(); + .rollResults(); for (int i = 0; i < rolledResults.size(); i++) { ItemStack stack = rolledResults.get(i); ItemHelper.addToList(stack, list); @@ -215,19 +215,17 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { if (hasEntity()) compound.put("Entity", NBTUtil.writeUniqueId(entityUUID)); compound.put("Inventory", inventory.serializeNBT()); compound.putFloat("Speed", crushingspeed); - - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { - super.read(compound); - + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); if (compound.contains("Entity") && !isFrozen() && !isOccupied()) { entityUUID = NBTUtil.readUniqueId(compound.getCompound("Entity")); this.searchForEntity = true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java index 04c958125..4e407038a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java @@ -4,8 +4,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; @@ -25,9 +23,12 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE, IPortableBlock { +import javax.annotation.ParametersAreNonnullByDefault; +import mcp.MethodsReturnNonnullByDefault; - public static MovementBehaviour MOVEMENT = new DeployerMovementBehaviour(); +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE { public DeployerBlock(Properties properties) { super(properties); @@ -102,11 +103,6 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE getTileEntityClass() { return DeployerTileEntity.class; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index d5eaadf8d..df7a000ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -6,6 +6,16 @@ import static net.minecraftforge.eventbus.api.Event.Result.DENY; import java.util.ArrayList; import java.util.List; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.block.BeehiveBlock; +import net.minecraft.block.Block; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.server.management.PlayerInteractionManager; +import net.minecraft.stats.Stats; +import net.minecraft.tileentity.BeehiveTileEntity; +import net.minecraft.tileentity.TileEntity; import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.Multimap; @@ -205,7 +215,7 @@ public class DeployerHandler { progress += before; if (progress >= 1) { - player.interactionManager.tryHarvestBlock(clickedPos); + safeTryHarvestBlock(player.interactionManager, clickedPos); world.sendBlockBreakProgress(player.getEntityId(), clickedPos, -1); player.blockBreakingProgress = null; return; @@ -245,7 +255,7 @@ public class DeployerHandler { !(player.isSneaking() && holdingSomething) || (stack.doesSneakBypassUse(world, clickedPos, player)); // Use on block - if (useBlock != DENY && flag1 && clickedState.onUse(world, player, hand, result) == ActionResultType.SUCCESS) + if (useBlock != DENY && flag1 && clickedState.getBlock() instanceof BeehiveBlock && clickedState.onUse(world, player, hand, result) == ActionResultType.SUCCESS) return; if (stack.isEmpty()) return; @@ -281,8 +291,8 @@ public class DeployerHandler { ActionResult onItemRightClick = item.onItemRightClick(itemUseWorld, player, hand); player.setHeldItem(hand, onItemRightClick.getResult()); - CompoundNBT tag = stack.getOrCreateTag(); - if (stack.getItem() instanceof SandPaperItem && tag.contains("Polishing")) + CompoundNBT tag = stack.getTag(); + if (tag != null && stack.getItem() instanceof SandPaperItem && tag.contains("Polishing")) player.spawnedItemEffects = ItemStack.read(tag.getCompound("Polishing")); if (!player.getActiveItemStack() @@ -292,4 +302,45 @@ public class DeployerHandler { player.resetActiveHand(); } + private static boolean safeTryHarvestBlock(PlayerInteractionManager interactionManager, BlockPos clickedPos) { + BlockState state = interactionManager.world.getBlockState(clickedPos); + if(!(state.getBlock() instanceof BeehiveBlock)) + return interactionManager.tryHarvestBlock(clickedPos); + else { + harvestBeehive(interactionManager, state, clickedPos); + } + return true; + } + + private static void harvestBeehive(PlayerInteractionManager interactionManager, BlockState state, BlockPos clickedPos) { + // Modified code from PlayerInteractionManager, Block and BeehiveBlock to handle deployers breaking beehives without crash. + ItemStack itemstack = interactionManager.player.getHeldItemMainhand(); + ItemStack itemstack1 = itemstack.copy(); + + boolean flag1 = state.canHarvestBlock(interactionManager.world, clickedPos, interactionManager.player); + itemstack.onBlockDestroyed(interactionManager.world, state, clickedPos, interactionManager.player); + if (itemstack.isEmpty() && !itemstack1.isEmpty()) + net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(interactionManager.player, itemstack1, Hand.MAIN_HAND); + + boolean flag = state.removedByPlayer(interactionManager.world, clickedPos, interactionManager.player, flag1, interactionManager.world.getFluidState(clickedPos)); + if (flag) + state.getBlock().onPlayerDestroy(interactionManager.world, clickedPos, state); + + if (flag && flag1) { + interactionManager.player.addStat(Stats.BLOCK_MINED.get(state.getBlock())); + interactionManager.player.addExhaustion(0.005F); + TileEntity te = interactionManager.world.getTileEntity(clickedPos); + ItemStack heldItem = interactionManager.player.getHeldItemMainhand(); + Block.spawnDrops(state, interactionManager.world, clickedPos, te, interactionManager.player, heldItem); + + if (!interactionManager.world.isRemote && te instanceof BeehiveTileEntity) { + BeehiveTileEntity beehivetileentity = (BeehiveTileEntity)te; + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, heldItem) == 0) { + interactionManager.world.updateComparatorOutputLevel(clickedPos, state.getBlock()); + } + + CriteriaTriggers.BEE_NEST_DESTROYED.test((ServerPlayerEntity)interactionManager.player, state.getBlock(), heldItem, beehivetileentity.getBeeCount()); + } + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java index aaf093fa1..0e7ba0183 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.deployer; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import java.util.Iterator; + import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import net.minecraft.item.ItemStack; @@ -74,11 +75,48 @@ public class DeployerItemHandler implements IItemHandlerModifiable { @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (amount == 0) + return ItemStack.EMPTY; + + ItemStack extractedFromOverflow = ItemStack.EMPTY; + ItemStack returnToOverflow = ItemStack.EMPTY; + + for (Iterator iterator = te.overflowItems.iterator(); iterator.hasNext();) { + ItemStack existing = iterator.next(); + if (existing.isEmpty()) { + iterator.remove(); + continue; + } + + int toExtract = Math.min(amount, existing.getMaxStackSize()); + if (existing.getCount() <= toExtract) { + if (!simulate) + iterator.remove(); + extractedFromOverflow = existing; + break; + } + if (!simulate) { + iterator.remove(); + returnToOverflow = ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract); + } + extractedFromOverflow = ItemHandlerHelper.copyStackWithSize(existing, toExtract); + break; + } + + if (!returnToOverflow.isEmpty()) + te.overflowItems.add(returnToOverflow); + if (!extractedFromOverflow.isEmpty()) + return extractedFromOverflow; + ItemStack held = getHeld(); if (amount == 0 || held.isEmpty()) return ItemStack.EMPTY; + if (!te.filtering.getFilter() + .isEmpty() && te.filtering.test(held)) + return ItemStack.EMPTY; if (simulate) - return held.copy().split(amount); + return held.copy() + .split(amount); ItemStack toReturn = held.split(amount); te.markDirty(); @@ -93,7 +131,7 @@ public class DeployerItemHandler implements IItemHandlerModifiable { @Override public boolean isItemValid(int slot, ItemStack stack) { - FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE); + FilteringBehaviour filteringBehaviour = te.getBehaviour(FilteringBehaviour.TYPE); return filteringBehaviour == null || filteringBehaviour.test(stack); } 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 e88c00e24..9a3ca5050 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 @@ -3,27 +3,18 @@ package com.simibubi.create.content.contraptions.components.deployer; import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.curiosities.tools.SandPaperItem; 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.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.ExtractingBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -45,20 +36,10 @@ 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; import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; public class DeployerTileEntity extends KineticTileEntity { - private static final List> EXTRACTING_LOCATIONS = Arrays - .asList(Direction.values()) - .stream() - .map(d -> Pair.of(BlockPos.ZERO.offset(d), d.getOpposite())) - .collect(Collectors.toList()); - private FilteringBehaviour filtering; - private ExtractingBehaviour extracting; - protected State state; protected Mode mode; protected ItemStack heldItem = ItemStack.EMPTY; @@ -67,8 +48,9 @@ public class DeployerTileEntity extends KineticTileEntity { protected float reach; protected boolean boop = false; protected List overflowItems = new ArrayList<>(); - private ListNBT deferredInventoryList; + protected FilteringBehaviour filtering; private LazyOptional invHandler; + private ListNBT deferredInventoryList; enum State { WAITING, EXPANDING, RETRACTING, DUMPING; @@ -89,10 +71,7 @@ public class DeployerTileEntity extends KineticTileEntity { public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); filtering = new FilteringBehaviour(this, new DeployerFilterSlot()); - extracting = new ExtractingBehaviour(this, this::getExtractingLocations, this::onExtract); - behaviours.add(filtering); - behaviours.add(extracting); } @Override @@ -118,10 +97,6 @@ public class DeployerTileEntity extends KineticTileEntity { markDirty(); } - protected List> getExtractingLocations() { - return EXTRACTING_LOCATIONS; - } - protected int getTimerSpeed() { return (int) (getSpeed() == 0 ? 0 : MathHelper.clamp(Math.abs(getSpeed() * 2), 8, 512)); } @@ -148,9 +123,7 @@ public class DeployerTileEntity extends KineticTileEntity { ItemStack stack = player.getHeldItemMainhand(); if (state == State.WAITING) { if (!overflowItems.isEmpty()) { - tryDisposeOfItems(); - if (!overflowItems.isEmpty()) - timer = getTimerSpeed() * 10; + timer = getTimerSpeed() * 10; return; } @@ -161,15 +134,10 @@ public class DeployerTileEntity extends KineticTileEntity { sendData(); return; } - extracting.extract(1); - if (!filtering.test(stack)) - timer = getTimerSpeed() * 10; + timer = getTimerSpeed() * 10; return; } - if (filtering.getFilter().isEmpty() && stack.isEmpty()) - extracting.extract(1); - Direction facing = getBlockState().get(FACING); if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, world, pos.offset(facing, 2))) { timer = getTimerSpeed() * 10; @@ -182,12 +150,16 @@ public class DeployerTileEntity extends KineticTileEntity { state = State.EXPANDING; Vector3d movementVector = getMovementVector(); - Vector3d rayOrigin = VecHelper.getCenterOf(pos).add(movementVector.scale(3 / 2f)); - Vector3d rayTarget = VecHelper.getCenterOf(pos).add(movementVector.scale(5 / 2f)); + Vector3d rayOrigin = VecHelper.getCenterOf(pos) + .add(movementVector.scale(3 / 2f)); + Vector3d rayTarget = VecHelper.getCenterOf(pos) + .add(movementVector.scale(5 / 2f)); RayTraceContext rayTraceContext = new RayTraceContext(rayOrigin, rayTarget, BlockMode.OUTLINE, FluidMode.NONE, player); BlockRayTraceResult result = world.rayTraceBlocks(rayTraceContext); - reach = (float) (.5f + Math.min(result.getHitVec().subtract(rayOrigin).length(), .75f)); + reach = (float) (.5f + Math.min(result.getHitVec() + .subtract(rayOrigin) + .length(), .75f)); timer = 1000; sendData(); @@ -209,7 +181,6 @@ public class DeployerTileEntity extends KineticTileEntity { if (state == State.RETRACTING) { state = State.WAITING; timer = 500; - returnAndDeposit(); sendData(); return; } @@ -226,7 +197,9 @@ public class DeployerTileEntity extends KineticTileEntity { if (!(otherTile instanceof DeployerTileEntity)) return false; DeployerTileEntity deployerTile = (DeployerTileEntity) otherTile; - if (world.getBlockState(otherDeployer).get(FACING).getOpposite() != facing || deployerTile.mode != Mode.PUNCH) + if (world.getBlockState(otherDeployer) + .get(FACING) + .getOpposite() != facing || deployerTile.mode != Mode.PUNCH) return false; boop = true; @@ -274,65 +247,15 @@ public class DeployerTileEntity extends KineticTileEntity { heldItem = player.getHeldItemMainhand(); } - protected void returnAndDeposit() { - PlayerInventory inv = player.inventory; - for (List list : Arrays.asList(inv.armorInventory, inv.offHandInventory, inv.mainInventory)) { - for (int i = 0; i < list.size(); ++i) { - ItemStack itemstack = list.get(i); - if (itemstack.isEmpty()) - continue; - - if (list == inv.mainInventory && i == inv.currentItem && filtering.test(itemstack)) - continue; - - itemstack = insert(itemstack, false); - if (!itemstack.isEmpty()) - ItemHelper.addToList(itemstack, overflowItems); - list.set(i, ItemStack.EMPTY); - } - } - heldItem = player.getHeldItemMainhand(); - } - - protected void tryDisposeOfItems() { - boolean noInv = extracting.getInventories().isEmpty(); - for (Iterator iterator = overflowItems.iterator(); iterator.hasNext();) { - ItemStack itemStack = iterator.next(); - - if (noInv) { - Vector3d offset = getMovementVector(); - Vector3d outPos = VecHelper.getCenterOf(pos).add(offset.scale(-.65f)); - Vector3d motion = offset.scale(-.25f); - ItemEntity e = new ItemEntity(world, outPos.x, outPos.y, outPos.z, itemStack.copy()); - e.setMotion(motion); - world.addEntity(e); - iterator.remove(); - continue; - } - - itemStack = insert(itemStack, false); - if (itemStack.isEmpty()) - iterator.remove(); - } - } - - protected ItemStack insert(ItemStack stack, boolean simulate) { - for (IItemHandler inv : extracting.getInventories()) { - stack = ItemHandlerHelper.insertItemStacked(inv, stack, simulate); - if (stack.isEmpty()) - break; - } - return stack; - } - protected Vector3d getMovementVector() { if (!AllBlocks.DEPLOYER.has(getBlockState())) return Vector3d.ZERO; - return Vector3d.of(getBlockState().get(FACING).getDirectionVec()); + return Vector3d.of(getBlockState().get(FACING) + .getDirectionVec()); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { state = NBTHelper.readEnum(compound, "State", State.class); mode = NBTHelper.readEnum(compound, "Mode", Mode.class); timer = compound.getInt("Timer"); @@ -340,48 +263,45 @@ public class DeployerTileEntity extends KineticTileEntity { overflowItems = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND)); if (compound.contains("HeldItem")) heldItem = ItemStack.read(compound.getCompound("HeldItem")); - super.read(compound); + super.read(compound, clientPacket); + + if (!clientPacket) + return; + reach = compound.getFloat("Reach"); + if (compound.contains("Particle")) { + ItemStack particleStack = ItemStack.read(compound.getCompound("Particle")); + SandPaperItem.spawnParticles(VecHelper.getCenterOf(pos) + .add(getMovementVector().scale(2f)), particleStack, this.world); + } } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { NBTHelper.writeEnum(compound, "Mode", mode); NBTHelper.writeEnum(compound, "State", state); compound.putInt("Timer", timer); if (player != null) { - compound.put("HeldItem", player.getHeldItemMainhand().serializeNBT()); + compound.put("HeldItem", player.getHeldItemMainhand() + .serializeNBT()); ListNBT invNBT = new ListNBT(); player.inventory.write(invNBT); compound.put("Inventory", invNBT); compound.put("Overflow", NBTHelper.writeItemList(overflowItems)); } - return super.write(compound); - } - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { + super.write(compound, clientPacket); + + if (!clientPacket) + return; compound.putFloat("Reach", reach); - if (player != null) { - compound.put("HeldItem", player.getHeldItemMainhand().serializeNBT()); - if (player.spawnedItemEffects != null) { - compound.put("Particle", player.spawnedItemEffects.serializeNBT()); - player.spawnedItemEffects = null; - } + if (player == null) + return; + compound.put("HeldItem", player.getHeldItemMainhand() + .serializeNBT()); + if (player.spawnedItemEffects != null) { + compound.put("Particle", player.spawnedItemEffects.serializeNBT()); + player.spawnedItemEffects = null; } - return super.writeToClient(compound); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { - reach = tag.getFloat("Reach"); - if (tag.contains("Particle")) { - ItemStack particleStack = ItemStack.read(tag.getCompound("Particle")); - SandPaperItem - .spawnParticles(VecHelper.getCenterOf(pos).add(getMovementVector().scale(2f)), particleStack, - this.world); - } - - super.readClientUpdate(tag); } private IItemHandlerModifiable createHandler() { @@ -395,7 +315,7 @@ public class DeployerTileEntity extends KineticTileEntity { public AllBlockPartials getHandPose() { return mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING - : heldItem.isEmpty() ? AllBlockPartials.DEPLOYER_HAND_POINTING : AllBlockPartials.DEPLOYER_HAND_HOLDING; + : heldItem.isEmpty() ? AllBlockPartials.DEPLOYER_HAND_POINTING : AllBlockPartials.DEPLOYER_HAND_HOLDING; } @Override 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 96826342d..af56cb136 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 @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.simibubi.create.AllTags; import org.apache.commons.lang3.tuple.Pair; +import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.particle.AirFlowParticleData; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing.Type; @@ -17,7 +17,6 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; @@ -38,7 +37,6 @@ 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.World; -import net.minecraftforge.common.Tags; public class AirCurrent { @@ -160,60 +158,18 @@ public class AirCurrent { bounds = new AxisAlignedBB(0, 0, 0, 0, 0, 0); return; } - - World world = source.getWorld(); - BlockPos start = source.getPos(); + direction = source.getBlockState() .get(BlockStateProperties.FACING); pushing = source.getAirFlowDirection() == direction; - Vector3d directionVec = Vector3d.of(direction.getDirectionVec()); - Vector3d planeVec = VecHelper.planeByNormal(directionVec); - - // 4 Rays test for holes in the shapes blocking the flow - float offsetDistance = .25f; - Vector3d[] offsets = Vector3d.of[] { 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; - // Determine the distance of the air flow - Outer: for (int i = 1; i < maxDistance; i++) { - BlockPos currentPos = start.offset(direction, i); - if (!world.isBlockPresent(currentPos)) - break; - BlockState state = world.getBlockState(currentPos); - if (shouldAlwaysPass(state)) - continue; - VoxelShape voxelshape = state.getCollisionShape(world, currentPos, ISelectionContext.dummy()); - if (voxelshape.isEmpty()) - continue; - if (voxelshape == VoxelShapes.fullCube()) { - maxDistance = i - 1; - break; - } - - for (Vector3d offset : offsets) { - Vector3d rayStart = VecHelper.getCenterOf(currentPos) - .subtract(directionVec.scale(.5f + 1 / 32f)) - .add(offset); - Vector3d 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); - if (limitedDistance < distance) - limitedDistance = (float) distance; - } - - maxDistance = limitedDistance; - break; - } + World world = source.getWorld(); + BlockPos start = source.getPos(); + float max = this.maxDistance; + Direction facing = direction; + Vec3d directionVec = new Vec3d(facing.getDirectionVec()); + maxDistance = getFlowLimit(world, start, max, facing); // Determine segments with transported fluids/gases AirCurrentSegment currentSegment = new AirCurrentSegment(); @@ -259,6 +215,57 @@ public class AirCurrent { findAffectedHandlers(); } + public static float getFlowLimit(World world, BlockPos start, float max, Direction facing) { + Vec3d directionVec = new Vec3d(facing.getDirectionVec()); + Vec3d planeVec = VecHelper.axisAlingedPlaneOf(directionVec); + + // 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), }; + + float limitedDistance = 0; + + // Determine the distance of the air flow + Outer: for (int i = 1; i <= max; i++) { + BlockPos currentPos = start.offset(facing, i); + if (!world.isBlockPresent(currentPos)) + break; + BlockState state = world.getBlockState(currentPos); + if (shouldAlwaysPass(state)) + continue; + VoxelShape voxelshape = state.getCollisionShape(world, currentPos, ISelectionContext.dummy()); + if (voxelshape.isEmpty()) + continue; + if (voxelshape == VoxelShapes.fullCube()) { + max = i - 1; + break; + } + + for (Vec3d offset : offsets) { + 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); + if (limitedDistance < distance) + limitedDistance = (float) distance; + } + + max = limitedDistance; + break; + } + return max; + } + public void findEntities() { caughtEntities.clear(); caughtEntities = source.getWorld() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java index 0b08cfb3e..6a881f464 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java @@ -2,10 +2,11 @@ package com.simibubi.create.content.contraptions.components.fan; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; -import com.simibubi.create.content.contraptions.processing.HeaterBlock; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CKinetics; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; @@ -30,21 +31,17 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity { } @Override - public void readClientUpdate(CompoundNBT tag) { - super.readClientUpdate(tag); - airCurrent.rebuild(); - } - - @Override - public void read(CompoundNBT compound) { - super.read(compound); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); isGenerator = compound.getBoolean("Generating"); + if (clientPacket) + airCurrent.rebuild(); } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putBoolean("Generating", isGenerator); - return super.write(compound); + super.write(compound, clientPacket); } @Override @@ -77,10 +74,12 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity { return false; BlockState checkState = world.getBlockState(pos.down()); - if (!checkState.getBlock().isIn(AllBlockTags.FAN_HEATERS.tag)) + if (!checkState.getBlock() + .isIn(AllBlockTags.FAN_HEATERS.tag)) return false; - if (checkState.has(HeaterBlock.BLAZE_LEVEL) && !checkState.get(HeaterBlock.BLAZE_LEVEL).min(HeaterBlock.HeatLevel.FADING)) + if (checkState.has(BlazeBurnerBlock.HEAT_LEVEL) && !checkState.get(BlazeBurnerBlock.HEAT_LEVEL) + .isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) return false; if (checkState.has(BlockStateProperties.LIT) && !checkState.get(BlockStateProperties.LIT)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java index 3c4ca74fb..4a3c9b2ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java @@ -38,26 +38,30 @@ public class NozzleTileEntity extends SmartTileEntity { } @Override - public void addBehaviours(List behaviours) { - } + public void addBehaviours(List behaviours) {} @Override - public CompoundNBT writeToClient(CompoundNBT compound) { + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + if (!clientPacket) + return; compound.putFloat("Range", range); compound.putBoolean("Pushing", pushing); - return super.writeToClient(compound); } - + @Override - public void readClientUpdate(CompoundNBT tag) { - range = tag.getFloat("Range"); - pushing = tag.getBoolean("Pushing"); - super.readClientUpdate(tag); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + if (!clientPacket) + return; + range = compound.getFloat("Range"); + pushing = compound.getBoolean("Pushing"); } @Override public void initialize() { - fanPos = pos.offset(getBlockState().get(NozzleBlock.FACING).getOpposite()); + fanPos = pos.offset(getBlockState().get(NozzleBlock.FACING) + .getOpposite()); super.initialize(); } @@ -72,24 +76,26 @@ public class NozzleTileEntity extends SmartTileEntity { Vector3d center = VecHelper.getCenterOf(pos); if (world.isRemote && range != 0) { if (world.rand.nextInt( - MathHelper.clamp((AllConfigs.SERVER.kinetics.fanPushDistance.get() - (int) range), 1, 10)) == 0) { + MathHelper.clamp((AllConfigs.SERVER.kinetics.fanPushDistance.get() - (int) range), 1, 10)) == 0) { Vector3d start = VecHelper.offsetRandomly(center, world.rand, pushing ? 1 : range / 2); - Vector3d motion = center.subtract(start).normalize() - .scale(MathHelper.clamp(range * (pushing ? .025f : 1f), 0, .5f) * (pushing ? -1 : 1)); + Vector3d motion = center.subtract(start) + .normalize() + .scale(MathHelper.clamp(range * (pushing ? .025f : 1f), 0, .5f) * (pushing ? -1 : 1)); world.addParticle(ParticleTypes.POOF, start.x, start.y, start.z, motion.x, motion.y, motion.z); } } for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); - Vector3d diff = entity.getPositionVec().subtract(center); + Vector3d diff = entity.getPositionVec() + .subtract(center); if (!(entity instanceof PlayerEntity) && world.isRemote) continue; double distance = diff.length(); if (distance > range || entity.isSneaking() - || (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative())) { + || (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative())) { iterator.remove(); continue; } @@ -98,8 +104,10 @@ public class NozzleTileEntity extends SmartTileEntity { continue; float factor = (entity instanceof ItemEntity) ? 1 / 128f : 1 / 32f; - Vector3d pushVec = diff.normalize().scale((range - distance) * (pushing ? 1 : -1)); - entity.setMotion(entity.getMotion().add(pushVec.scale(factor))); + Vector3d pushVec = diff.normalize() + .scale((range - distance) * (pushing ? 1 : -1)); + entity.setMotion(entity.getMotion() + .add(pushVec.scale(factor))); entity.fallDistance = 0; entity.velocityChanged = true; } @@ -125,7 +133,8 @@ public class NozzleTileEntity extends SmartTileEntity { return 0; if (fan.getSpeed() == 0) return 0; - pushing = fan.getAirFlowDirection() == fan.getBlockState().get(EncasedFanBlock.FACING); + pushing = fan.getAirFlowDirection() == fan.getBlockState() + .get(EncasedFanBlock.FACING); return fan.getMaxDistance(); } @@ -140,11 +149,12 @@ public class NozzleTileEntity extends SmartTileEntity { AxisAlignedBB bb = new AxisAlignedBB(center, center).grow(range / 2f); for (Entity entity : world.getEntitiesWithinAABB(Entity.class, bb)) { - Vector3d diff = entity.getPositionVec().subtract(center); + Vector3d diff = entity.getPositionVec() + .subtract(center); double distance = diff.length(); if (distance > range || entity.isSneaking() - || (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative())) { + || (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative())) { continue; } @@ -164,7 +174,7 @@ public class NozzleTileEntity extends SmartTileEntity { continue; iterator.remove(); } - + if (!pushing && pushingEntities.size() > 256 && !world.isRemote) { world.createExplosion(null, center.x, center.y, center.z, 2, Mode.NONE); for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { @@ -178,8 +188,9 @@ public class NozzleTileEntity extends SmartTileEntity { private boolean canSee(Entity entity) { RayTraceContext context = new RayTraceContext(entity.getPositionVec(), VecHelper.getCenterOf(pos), - BlockMode.COLLIDER, FluidMode.NONE, entity); - return pos.equals(world.rayTraceBlocks(context).getPos()); + BlockMode.COLLIDER, FluidMode.NONE, entity); + return pos.equals(world.rayTraceBlocks(context) + .getPos()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java index 2ff2c545a..0e47dc7a2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java @@ -1,23 +1,20 @@ package com.simibubi.create.content.contraptions.components.fan; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing.SplashingInv; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; +import net.minecraft.world.World; @ParametersAreNonnullByDefault public class SplashingRecipe extends ProcessingRecipe { - public SplashingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.SPLASHING, id, group, ingredients, results, processingDuration); + public SplashingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.SPLASHING, params); } @Override @@ -28,6 +25,11 @@ public class SplashingRecipe extends ProcessingRecipe ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.MILLING, id, group, ingredients, results, processingDuration); + public MillingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.MILLING, params); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java index 149f038d4..56ff13266 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java @@ -43,7 +43,8 @@ public class MillstoneTileEntity extends KineticTileEntity { if (getSpeed() == 0) return; for (int i = 0; i < outputInv.getSlots(); i++) - if (outputInv.getStackInSlot(i).getCount() == outputInv.getSlotLimit(i)) + if (outputInv.getStackInSlot(i) + .getCount() == outputInv.getSlotLimit(i)) return; if (timer > 0) { @@ -58,13 +59,14 @@ public class MillstoneTileEntity extends KineticTileEntity { return; } - if (inputInv.getStackInSlot(0).isEmpty()) + if (inputInv.getStackInSlot(0) + .isEmpty()) return; RecipeWrapper inventoryIn = new RecipeWrapper(inputInv); if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) { - Optional recipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world); + Optional recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world); if (!recipe.isPresent()) { timer = 100; sendData(); @@ -84,8 +86,8 @@ public class MillstoneTileEntity extends KineticTileEntity { RecipeWrapper inventoryIn = new RecipeWrapper(inputInv); if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) { - Optional recipe = - world.getRecipeManager().getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world); + Optional recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world); if (!recipe.isPresent()) return; lastRecipe = recipe.get(); @@ -94,7 +96,8 @@ public class MillstoneTileEntity extends KineticTileEntity { ItemStack stackInSlot = inputInv.getStackInSlot(0); stackInSlot.shrink(1); inputInv.setStackInSlot(0, stackInSlot); - lastRecipe.rollResults().forEachItemStack(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false)); + lastRecipe.rollResults() + .forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false)); sendData(); markDirty(); } @@ -116,19 +119,19 @@ public class MillstoneTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("Timer", timer); compound.put("InputInventory", inputInv.serializeNBT()); compound.put("OutputInventory", outputInv.serializeNBT()); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { timer = compound.getInt("Timer"); inputInv.deserializeNBT(compound.getCompound("InputInventory")); outputInv.deserializeNBT(compound.getCompound("OutputInventory")); - super.read(compound); + super.read(compound, clientPacket); } public int getProcessingSpeed() { @@ -138,7 +141,8 @@ public class MillstoneTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - return LazyOptional.of(MillstoneInventoryHandler::new).cast(); + return LazyOptional.of(MillstoneInventoryHandler::new) + .cast(); return super.getCapability(cap, side); } @@ -149,7 +153,9 @@ public class MillstoneTileEntity extends KineticTileEntity { if (lastRecipe != null && lastRecipe.matches(inventoryIn, world)) return true; - return world.getRecipeManager().getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world).isPresent(); + return world.getRecipeManager() + .getRecipe(AllRecipeTypes.MILLING.getType(), inventoryIn, world) + .isPresent(); } private class MillstoneInventoryHandler extends CombinedInvWrapper { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index faa2aab1c..fa3687da7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -1,21 +1,19 @@ package com.simibubi.create.content.contraptions.components.mixer; +import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; -import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; -import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; -import com.simibubi.create.content.contraptions.processing.CombinedItemFluidList; -import com.simibubi.create.content.contraptions.processing.HeaterBlock; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; -import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.content.contraptions.processing.BasinTileEntity; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -33,9 +31,9 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; -import net.minecraftforge.items.IItemHandler; -import static com.simibubi.create.content.contraptions.processing.HeaterBlock.getHeaterLevel; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.IItemHandler; public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { @@ -45,31 +43,10 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { public int processingTicks; public boolean running; - public ScrollValueBehaviour minIngredients; - public MechanicalMixerTileEntity(TileEntityType type) { super(type); } - @Override - public void addBehaviours(List behaviours) { - super.addBehaviours(behaviours); - CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform((state, direction) -> direction.getAxis() - .isHorizontal()) { - - @Override - protected Vector3d 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()); - minIngredients.requiresWrench(); - behaviours.add(minIngredients); - } - public float getRenderedHeadOffset(float partialTicks) { int localTick; float offset = 0; @@ -111,17 +88,17 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { running = compound.getBoolean("Running"); runningTicks = compound.getInt("Ticks"); - super.read(compound); + super.read(compound, clientPacket); } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putBoolean("Running", running); compound.putInt("Ticks", runningTicks); - return super.write(compound); + super.write(compound, clientPacket); } @Override @@ -130,11 +107,11 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (world != null && world.isRemote && running && !basinItemInv.isPresent()) updateBasin(); } - + @Override public void tick() { super.tick(); - + if (runningTicks >= 40) { running = false; runningTicks = 0; @@ -167,14 +144,14 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } public void renderParticles() { - IItemHandler itemHandler = basinItemInv.orElse(null); - BasinInventory inv = (BasinInventory) itemHandler; - if (inv == null || world == null) + Optional basin = getBasin(); + if (!basin.isPresent() || world == null) return; - for (int slot = 0; slot < inv.getInputHandler() - .getSlots(); slot++) { - ItemStack stackInSlot = itemHandler.getStackInSlot(slot); + SmartInventory inputs = basin.get() + .getInputInventory(); + for (int slot = 0; slot < inputs.getSlots(); slot++) { + ItemStack stackInSlot = inputs.getStackInSlot(slot); if (stackInSlot.isEmpty()) continue; @@ -199,27 +176,23 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { @Override protected boolean matchBasinRecipe(IRecipe recipe) { - if (recipe == null) - return false; - if (recipe.getIngredients() - .size() < minIngredients.getValue()) + if (!super.matchBasinRecipe(recipe)) return false; NonNullList ingredients = recipe.getIngredients(); - if (!ingredients.stream() - .allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1))) - return false; + List remainingItems = new ArrayList<>(); + itemInputs.forEach(stack -> remainingItems.add(stack.copy())); + List remainingFluids = new ArrayList<>(); + fluidInputs.forEach(stack -> remainingFluids.add(stack.copy())); - CombinedItemFluidList remaining = new CombinedItemFluidList(); - inputs.forEachItemStack(stack -> remaining.add(stack.copy())); - basinFluidInv.ifPresent( - fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy()))); + // TODO: match fluid inputs - // sort by leniency + // Sort by leniency List sortedIngredients = new LinkedList<>(ingredients); sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length)); + Ingredients: for (Ingredient ingredient : sortedIngredients) { - for (ItemStack stack : remaining.getItemStacks()) { + for (ItemStack stack : remainingItems) { if (stack.isEmpty()) continue; if (ingredient.test(stack)) { @@ -232,7 +205,8 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (!(recipe instanceof MixingRecipe)) return true; - return ((MixingRecipe) recipe).getHeatLevelRequired() <= getHeatLevelApplied().ordinal(); + return ((MixingRecipe) recipe).getRequiredHeat() + .testBlazeBurner(getHeatLevel()); } @Override @@ -251,12 +225,11 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } @Override - protected void basinRemoved() { - super.basinRemoved(); - if (running) { - runningTicks = 40; - running = false; - } + protected void onBasinRemoved() { + if (!running) + return; + runningTicks = 40; + running = false; } @Override @@ -269,12 +242,12 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { return running; } - private HeaterBlock.HeatLevel getHeatLevelApplied() { + private HeatLevel getHeatLevel() { if (world == null) - return HeaterBlock.HeatLevel.NONE; + return HeatLevel.NONE; BlockState state = world.getBlockState(pos.down(3)); - if (state.has(HeaterBlock.BLAZE_LEVEL)) - return state.get(HeaterBlock.BLAZE_LEVEL); - return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? HeaterBlock.HeatLevel.SMOULDERING : HeaterBlock.HeatLevel.NONE; + if (state.has(BlazeBurnerBlock.HEAT_LEVEL)) + return state.get(BlazeBurnerBlock.HEAT_LEVEL); + return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? HeatLevel.SMOULDERING : HeatLevel.NONE; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixingRecipe.java index 80aa7b53b..c36564c57 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixingRecipe.java @@ -1,33 +1,38 @@ package com.simibubi.create.content.contraptions.components.mixer; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + +import javax.annotation.Nonnull; + import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInputInventory; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; +import com.simibubi.create.foundation.item.SmartInventory; + import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import javax.annotation.Nonnull; -import java.util.*; +public class MixingRecipe extends ProcessingRecipe { -public class MixingRecipe extends ProcessingRecipe { - - public MixingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration, List fluidIngredients, - List fluidResults, int requiredHeat) { - super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration, fluidIngredients, - fluidResults, requiredHeat); + /** + * For JEI purposes only + */ + public static MixingRecipe convertShapeless(IRecipe recipe) { + return new ProcessingRecipeBuilder<>(MixingRecipe::new, recipe.getId()) + .withItemIngredients(recipe.getIngredients()) + .withSingleItemOutput(recipe.getRecipeOutput()) + .build(); } - public static MixingRecipe of(IRecipe recipe) { - return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()), - Collections.singletonList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1, null, null, 0); + public MixingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.MIXING, params); } @Override @@ -37,16 +42,26 @@ public class MixingRecipe extends ProcessingRecipe { @Override protected int getMaxOutputCount() { - return 1; + return 1;// TODO increase } @Override - protected boolean canHaveCatalysts() { + protected int getMaxFluidInputCount() { + return 2; + } + + @Override + protected int getMaxFluidOutputCount() { + return 1;// TODO increase? + } + + @Override + protected boolean canRequireHeat() { return true; } @Override - public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) { + public boolean matches(SmartInventory inv, @Nonnull World worldIn) { if (inv.isEmpty()) return false; @@ -80,22 +95,4 @@ public class MixingRecipe extends ProcessingRecipe { return true; } - @Override - protected boolean canHaveFluidIngredient() { - return true; - } - - @Override - protected boolean canHaveFluidOutput() { - return true; - } - - @Override - protected boolean requiresHeating() { - return this.requiredHeat > 0; - } - - public int getHeatLevelRequired() { - return requiredHeat; - } } 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 b20362530..d546afba8 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 @@ -6,15 +6,15 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; -import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; -import com.simibubi.create.content.contraptions.processing.CombinedItemFluidList; +import com.simibubi.create.content.contraptions.processing.BasinTileEntity; 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.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; +import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.entity.Entity; @@ -25,7 +25,6 @@ import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; @@ -35,7 +34,6 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; @@ -85,37 +83,30 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { running = compound.getBoolean("Running"); mode = Mode.values()[compound.getInt("Mode")]; finished = compound.getBoolean("Finished"); runningTicks = compound.getInt("Ticks"); - super.read(compound); + super.read(compound, clientPacket); + + if (clientPacket) { + NBTHelper.iterateCompoundList(compound.getList("ParticleItems", NBT.TAG_COMPOUND), + c -> pressedItems.add(ItemStack.read(c))); + spawnParticles(); + } } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putBoolean("Running", running); compound.putInt("Mode", mode.ordinal()); compound.putBoolean("Finished", finished); compound.putInt("Ticks", runningTicks); - return super.write(compound); - } + super.write(compound, clientPacket); - @Override - public CompoundNBT writeToClient(CompoundNBT tag) { - ListNBT particleItems = new ListNBT(); - pressedItems.forEach(stack -> particleItems.add(stack.serializeNBT())); - tag.put("ParticleItems", particleItems); - return super.writeToClient(tag); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { - super.readClientUpdate(tag); - ListNBT particleItems = tag.getList("ParticleItems", NBT.TAG_COMPOUND); - particleItems.forEach(nbt -> pressedItems.add(ItemStack.read((CompoundNBT) nbt))); - spawnParticles(); + if (clientPacket) + compound.put("ParticleItems", NBTHelper.writeCompoundList(pressedItems, ItemStack::serializeNBT)); } @Override @@ -186,13 +177,13 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (!world.isRemote) { pressedItems.clear(); applyBasinRecipe(); - IItemHandler orElse = basinItemInv.orElse(null); - if (basinItemInv.isPresent() && orElse instanceof BasinInventory) { - BasinInventory inv = (BasinInventory) orElse; - for (int slot = 0; slot < inv.getInputHandler() - .getSlots(); slot++) { - ItemStack stackInSlot = inv.getStackInSlot(slot); + Optional basin = getBasin(); + SmartInventory inputs = basin.get() + .getInputInventory(); + if (basin.isPresent()) { + for (int slot = 0; slot < inputs.getSlots(); slot++) { + ItemStack stackInSlot = inputs.getStackInSlot(slot); if (stackInSlot.isEmpty()) continue; pressedItems.add(stackInSlot); @@ -291,20 +282,15 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { @Override protected boolean matchBasinRecipe(IRecipe recipe) { - if (recipe == null) + if (!super.matchBasinRecipe(recipe)) return false; NonNullList ingredients = recipe.getIngredients(); - if (!ingredients.stream() - .allMatch(Ingredient::isSimple)) - return false; - - CombinedItemFluidList remaining = new CombinedItemFluidList(); - inputs.forEachItemStack(stack -> remaining.add(stack.copy())); - basinFluidInv.ifPresent(fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy()))); + List remainingItems = new ArrayList<>(); + itemInputs.forEach(stack -> remainingItems.add(stack.copy())); Ingredients: for (Ingredient ingredient : ingredients) { - for (ItemStack stack : remaining.getItemStacks()) { + for (ItemStack stack : remainingItems) { if (stack.isEmpty()) continue; if (ingredient.test(stack)) { @@ -331,9 +317,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { } @Override - protected void basinRemoved() { + protected void onBasinRemoved() { pressedItems.clear(); - super.basinRemoved(); running = false; runningTicks = 0; sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java index 3ff546dd5..b08c0e1c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java @@ -1,22 +1,19 @@ package com.simibubi.create.content.contraptions.components.press; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.PressingInv; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; +import net.minecraft.world.World; @ParametersAreNonnullByDefault public class PressingRecipe extends ProcessingRecipe { - public PressingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.PRESSING, id, group, ingredients, results, processingDuration); + public PressingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.PRESSING, params); } @Override @@ -27,6 +24,11 @@ public class PressingRecipe extends ProcessingRecipe { - public CuttingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.CUTTING, id, group, ingredients, results, processingDuration); + public CuttingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.CUTTING, params); } @Override @@ -26,6 +23,11 @@ public class CuttingRecipe extends ProcessingRecipe { return ingredients.get(0) .test(inv.getStackInSlot(0)); } + + @Override + protected int getMaxInputCount() { + return 1; + } @Override protected int getMaxOutputCount() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java index 95f247870..7e5f74f9b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java @@ -3,14 +3,12 @@ package com.simibubi.create.content.contraptions.components.saw; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; -import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.DrillBlock; 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.filtering.FilteringBehaviour; - +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.material.PushReaction; @@ -25,18 +23,20 @@ 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.MathHelper; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class SawBlock extends DirectionalAxisKineticBlock implements ITE, IPortableBlock { +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SawBlock extends DirectionalAxisKineticBlock implements ITE { public static final BooleanProperty RUNNING = BooleanProperty.create("running"); - public static DamageSource damageSourceSaw = new DamageSource("create.saw").setDamageBypassesArmor(); - public static MovementBehaviour MOVEMENT = new SawMovementBehaviour(); + public static DamageSource damageSourceSaw = new DamageSource("create.mechanical_saw").setDamageBypassesArmor(); public SawBlock(Properties properties) { super(properties); @@ -77,7 +77,7 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE { if (te.getSpeed() == 0) return; - entityIn.attackEntityFrom(damageSourceSaw, MathHelper.clamp(Math.abs(te.getSpeed() / 32f) + 1, 0, 20)); + entityIn.attackEntityFrom(damageSourceSaw, (float) DrillBlock.getDamage(te.getSpeed())); }); } @@ -127,11 +127,6 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE getTileEntityClass() { return SawTileEntity.class; 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 b43f0b2c4..4c56a95fa 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 @@ -74,7 +74,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - filtering = new FilteringBehaviour(this, new SawFilterSlot()); + filtering = new FilteringBehaviour(this, new SawFilterSlot()).forRecipes(); behaviours.add(filtering); behaviours.add(new DirectBeltInputBehaviour(this)); } @@ -94,15 +94,15 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.put("Inventory", inventory.serializeNBT()); compound.putInt("RecipeIndex", recipeIndex); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { - super.read(compound); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); inventory.deserializeNBT(compound.getCompound("Inventory")); recipeIndex = compound.getInt("RecipeIndex"); } @@ -197,7 +197,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && side != Direction.DOWN) return invProvider.cast(); return super.getCapability(cap, side); } @@ -248,7 +248,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { for (int roll = 0; roll < rolls; roll++) { List results = new LinkedList(); if (recipe instanceof CuttingRecipe) - results = ((CuttingRecipe) recipe).rollResults().getItemStacks(); + results = ((CuttingRecipe) recipe).rollResults(); else if (recipe instanceof StonecuttingRecipe) results.add(recipe.getRecipeOutput() .copy()); 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 e5944e514..880017bec 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 @@ -13,14 +13,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; 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.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.redstone.RedstoneLinkBlock; -import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; import net.minecraft.block.AbstractPressurePlateBlock; import net.minecraft.block.AbstractRailBlock; @@ -94,8 +92,6 @@ public class BlockMovementTraits { if (AllBlocks.BELT.has(blockState)) return true; - if (block instanceof ExtractorBlock) - return true; return blockState.getPushReaction() != PushReaction.BLOCK; } @@ -116,6 +112,8 @@ public class BlockMovementTraits { return true; if (block instanceof HorizontalFaceBlock) return true; + if (block instanceof CartAssemblerBlock) + return false; if (block instanceof AbstractRailBlock) return true; if (block instanceof RedstoneDiodeBlock) @@ -140,8 +138,6 @@ public class BlockMovementTraits { return direction == Direction.DOWN; if (block instanceof DoorBlock) return direction == Direction.DOWN; - if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock)) - return direction == AttachedLogisticalBlock.getBlockFacing(state); if (block instanceof RedstoneLinkBlock) return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING); if (block instanceof FlowerPotBlock) @@ -197,6 +193,8 @@ public class BlockMovementTraits { public static boolean notSupportive(BlockState state, Direction facing) { if (AllBlocks.MECHANICAL_DRILL.has(state)) return state.get(BlockStateProperties.FACING) == facing; + if (AllBlocks.CART_ASSEMBLER.has(state)) + return Direction.DOWN == facing; if (AllBlocks.MECHANICAL_SAW.has(state)) return state.get(BlockStateProperties.FACING) == facing; if (AllBlocks.PORTABLE_STORAGE_INTERFACE.has(state)) 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 ea1e13db9..890777321 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 @@ -21,6 +21,7 @@ import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; @@ -146,9 +147,9 @@ public abstract class Contraption { protected static MovementBehaviour getMovement(BlockState state) { Block block = state.getBlock(); - if (!(block instanceof IPortableBlock)) + if (!AllMovementBehaviours.hasMovementBehaviour(block)) return null; - return ((IPortableBlock) block).getMovementBehaviour(); + return AllMovementBehaviours.getMovementBehaviour(block); } public Set getColliders(World world, Direction movementDirection) { @@ -234,7 +235,7 @@ public abstract class Contraption { return true; if (!BlockMovementTraits.movementNecessary(world, pos)) return true; - if (!BlockMovementTraits.movementAllowed(world, pos)) + if (!movementAllowed(world, pos)) return false; BlockState state = world.getBlockState(pos); if (isChassis(state) && !moveChassis(world, pos, forcedDirection, frontier, visited)) @@ -344,7 +345,7 @@ public abstract class Contraption { BlockState blockState = world.getBlockState(offsetPos); if (isAnchoringBlockAt(offsetPos)) continue; - if (!BlockMovementTraits.movementAllowed(world, offsetPos)) { + if (!movementAllowed(world, offsetPos)) { if (offset == forcedDirection && isSlimeBlock) return false; continue; @@ -367,6 +368,10 @@ public abstract class Contraption { return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get(); } + protected boolean movementAllowed(World world, BlockPos pos) { + return BlockMovementTraits.movementAllowed(world, pos); + } + protected boolean isAnchoringBlockAt(BlockPos pos) { return pos.equals(anchor); } @@ -435,7 +440,7 @@ public abstract class Contraption { TileEntity te = pair.getValue(); if (te != null && MountedStorage.canUseAsStorage(te)) storage.put(localPos, new MountedStorage(te)); - if (captured.state.getBlock() instanceof IPortableBlock) + if (AllMovementBehaviours.hasMovementBehaviour(captured.state.getBlock())) actors.add(MutablePair.of(blockInfo, null)); } @@ -459,7 +464,8 @@ public abstract class Contraption { else renderOrder.add(0, info.pos); CompoundNBT tag = info.nbt; - if (tag == null || block instanceof IPortableBlock) + MovementBehaviour movementBehaviour = AllMovementBehaviours.getMovementBehaviour(block); + if (tag == null || (movementBehaviour != null && movementBehaviour.hasSpecialMovementRenderer())) return; tag.putInt("x", info.pos.getX()); @@ -467,6 +473,8 @@ public abstract class Contraption { tag.putInt("z", info.pos.getZ()); TileEntity te = TileEntity.create(tag); + if (te == null) + return; te.setLocation(new WrappedWorld(world) { @Override @@ -495,36 +503,29 @@ public abstract class Contraption { }); 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")))); - }); + NBTHelper.iterateCompoundList(nbt.getList("Superglue", NBT.TAG_COMPOUND), c -> superglue + .add(Pair.of(NBTUtil.readBlockPos(c.getCompound("Pos")), Direction.byIndex(c.getByte("Direction"))))); + + seats.clear(); + NBTHelper.iterateCompoundList(nbt.getList("Seats", NBT.TAG_COMPOUND), c -> seats.add(NBTUtil.readBlockPos(c))); + + seatMapping.clear(); + NBTHelper.iterateCompoundList(nbt.getList("Passengers", NBT.TAG_COMPOUND), + c -> seatMapping.put(NBTUtil.readUniqueId(c.getCompound("Id")), c.getInt("Seat"))); 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)); + NBTHelper.iterateCompoundList(nbt.getList("Storage", NBT.TAG_COMPOUND), c -> storage + .put(NBTUtil.readBlockPos(c.getCompound("Pos")), MountedStorage.deserialize(c.getCompound("Data")))); + + IItemHandlerModifiable[] handlers = new IItemHandlerModifiable[storage.size()]; + int index = 0; + for (MountedStorage mountedStorage : storage.values()) + handlers[index++] = mountedStorage.getItemHandler(); + inventory = new CombinedInvWrapper(handlers); if (nbt.contains("BoundsFront")) bounds = NBTHelper.readAABB(nbt.getList("BoundsFront", 5)); - getSeats().clear(); - NBTHelper.iterateCompoundList(nbt.getList("Seats", NBT.TAG_COMPOUND), - c -> getSeats().add(NBTUtil.readBlockPos(c))); - getSeatMapping().clear(); - NBTHelper.iterateCompoundList(nbt.getList("Passengers", NBT.TAG_COMPOUND), - c -> getSeatMapping().put(NBTUtil.readUniqueId(c.getCompound("Id")), c.getInt("Seat"))); - stalled = nbt.getBoolean("Stalled"); anchor = NBTUtil.readBlockPos(nbt.getCompound("Anchor")); } @@ -564,7 +565,7 @@ public abstract class Contraption { for (BlockPos pos : storage.keySet()) { CompoundNBT c = new CompoundNBT(); MountedStorage mountedStorage = storage.get(pos); - if (!mountedStorage.isWorking()) + if (!mountedStorage.isValid()) continue; c.put("Pos", NBTUtil.writeBlockPos(pos)); c.put("Data", mountedStorage.serialize()); @@ -604,7 +605,7 @@ public abstract class Contraption { public void removeBlocksFromWorld(IWorld world, BlockPos offset) { storage.values() - .forEach(MountedStorage::empty); + .forEach(MountedStorage::removeStorageFromWorld); glueToRemove.forEach(SuperGlueEntity::remove); for (boolean brittles : Iterate.trueAndFalse) { @@ -702,8 +703,8 @@ public abstract class Contraption { if (storage.containsKey(block.pos)) { MountedStorage mountedStorage = storage.get(block.pos); - if (mountedStorage.isWorking()) - mountedStorage.fill(tileEntity); + if (mountedStorage.isValid()) + mountedStorage.addStorageToWorld(tileEntity); } } } @@ -789,7 +790,7 @@ public abstract class Contraption { Vector3d vec = Vector3d.of(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) .getDirectionVec()); - Vector3d planeByNormal = VecHelper.planeByNormal(vec); + Vector3d planeByNormal = VecHelper.axisAlingedPlaneOf(vec); Vector3d min = vec.mul(bb.minX, bb.minY, bb.minZ) .add(planeByNormal.scale(-maxDiff)); Vector3d max = vec.mul(bb.maxX, bb.maxY, bb.maxZ) @@ -812,8 +813,13 @@ public abstract class Contraption { return seatMapping; } + public void setSeatMapping(Map seatMapping) { + this.seatMapping = seatMapping; + } + public List getSeats() { return seats; } + public void addExtraInventories(Entity entity) {}; } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index 3b06e9af2..6b213271c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import static java.util.concurrent.TimeUnit.SECONDS; import static net.minecraft.entity.Entity.collideBoundingBoxHeuristically; import static net.minecraft.entity.Entity.horizontalMag; @@ -8,18 +7,17 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.concurrent.ExecutionException; import java.util.stream.Stream; +import com.simibubi.create.AllMovementBehaviours; import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableObject; import com.google.common.base.Predicates; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableSet; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingMovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; import com.simibubi.create.foundation.collision.ContinuousOBBCollider.ContinuousSeparationManifold; import com.simibubi.create.foundation.collision.Matrix3d; import com.simibubi.create.foundation.collision.OrientedBB; @@ -30,18 +28,11 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.CocoaBlock; -import net.minecraft.client.Minecraft; -import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.MoverType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.ReuseableStream; import net.minecraft.util.math.AxisAlignedBB; @@ -53,78 +44,11 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.event.TickEvent.ClientTickEvent; -import net.minecraftforge.event.TickEvent.Phase; -import net.minecraftforge.event.TickEvent.WorldTickEvent; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -@EventBusSubscriber public class ContraptionCollider { - public static DamageSource damageSourceContraptionSuffocate = - new DamageSource("create.contraption_suffocate").setDamageBypassesArmor(); - public static boolean wasClientPlayerGrounded; - public static Cache>> activeContraptions = CacheBuilder.newBuilder() - .expireAfterAccess(400, SECONDS) - .build(); - - @SubscribeEvent - public static void addSpawnedContraptionsToCollisionList(EntityJoinWorldEvent event) { - Entity entity = event.getEntity(); - if (!(entity instanceof ContraptionEntity)) - return; - try { - List> list = activeContraptions.get(event.getWorld(), ArrayList::new); - ContraptionEntity contraption = (ContraptionEntity) entity; - list.add(new WeakReference<>(contraption)); - } catch (ExecutionException e) { - e.printStackTrace(); - } - } - - @SubscribeEvent - @OnlyIn(Dist.CLIENT) - public static void playerCollisionHappensOnClientTick(ClientTickEvent event) { - if (event.phase == Phase.START) - return; - ClientWorld world = Minecraft.getInstance().world; - if (world == null) - return; - runCollisions(world); - } - - @SubscribeEvent - public static void entityCollisionHappensPreWorldTick(WorldTickEvent event) { - if (event.phase == Phase.END) - return; - World world = event.world; - runCollisions(world); - } - - @SubscribeEvent - public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingUpdateEvent event) { - LivingEntity entityLiving = event.getEntityLiving(); - if (entityLiving == null) - return; - if (entityLiving.world.isRemote) - return; - CompoundNBT data = entityLiving.getPersistentData(); - if (!data.contains("ContraptionDismountLocation")) - return; - Vector3d position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", NBT.TAG_DOUBLE)); - if (entityLiving.getRidingEntity() == null) - entityLiving.setPositionAndUpdate(position.x, position.y, position.z); - data.remove("ContraptionDismountLocation"); - } - - private static void runCollisions(World world) { - List> list = activeContraptions.getIfPresent(world); + public static void runCollisions(World world) { + List> list = ContraptionHandler.activeContraptions.getIfPresent(world); if (list == null) return; for (Iterator> iterator = list.iterator(); iterator.hasNext();) { @@ -138,7 +62,7 @@ public class ContraptionCollider { } } - public static void collideEntities(ContraptionEntity contraptionEntity) { + private static void collideEntities(ContraptionEntity contraptionEntity) { World world = contraptionEntity.getEntityWorld(); Contraption contraption = contraptionEntity.getContraption(); AxisAlignedBB bounds = contraptionEntity.getBoundingBox(); @@ -288,7 +212,7 @@ public class ContraptionCollider { entity.fallDistance = 0; entity.onGround = true; contraptionEntity.collidingEntities.add(entity); - if (!serverPlayer) + if (!serverPlayer) contactPointMotion = contraptionEntity.getContactPointMotion(entityPosition); } @@ -324,7 +248,7 @@ public class ContraptionCollider { entity.setPosition(entityPosition.x + allowedMovement.x, entityPosition.y + allowedMovement.y, entityPosition.z + allowedMovement.z); entity.setMotion(entityMotion); - + if (!serverPlayer && player) AllPackets.channel.sendToServer(new ClientMotionPacket(entityMotion, true)); } @@ -372,68 +296,7 @@ public class ContraptionCollider { return Vector3d; } - public static void pushEntityOutOfShape(Entity entity, VoxelShape voxelShape, Vector3d positionOffset, - Vector3d shapeMotion) { - AxisAlignedBB entityBB = entity.getBoundingBox() - .offset(positionOffset); - Vector3d entityMotion = entity.getMotion(); - - if (!voxelShape.toBoundingBoxList() - .stream() - .anyMatch(entityBB::intersects)) - return; - - AxisAlignedBB shapeBB = voxelShape.getBoundingBox(); - Direction bestSide = Direction.DOWN; - double bestOffset = 100; - double finalOffset = 0; - - for (Direction face : Direction.values()) { - Axis axis = face.getAxis(); - double d = axis == Axis.X ? entityBB.getXSize() + shapeBB.getXSize() - : axis == Axis.Y ? entityBB.getYSize() + shapeBB.getYSize() : entityBB.getZSize() + shapeBB.getZSize(); - d = d + .5f; - - Vector3d nudge = Vector3d.of(face.getDirectionVec()).scale(d); - AxisAlignedBB nudgedBB = entityBB.offset(nudge.getX(), nudge.getY(), nudge.getZ()); - double nudgeDistance = face.getAxisDirection() == AxisDirection.POSITIVE ? -d : d; - double offset = voxelShape.getAllowedOffset(face.getAxis(), nudgedBB, nudgeDistance); - double abs = Math.abs(nudgeDistance - offset); - if (abs < Math.abs(bestOffset) && abs != 0) { - bestOffset = abs; - finalOffset = abs; - bestSide = face; - } - } - - if (bestOffset != 0) { - entity.move(MoverType.SELF, Vector3d.of(bestSide.getDirectionVec()).scale(finalOffset)); - boolean positive = bestSide.getAxisDirection() == AxisDirection.POSITIVE; - - double clamped; - switch (bestSide.getAxis()) { - case X: - clamped = positive ? Math.max(shapeMotion.x, entityMotion.x) : Math.min(shapeMotion.x, entityMotion.x); - entity.setMotion(clamped, entityMotion.y, entityMotion.z); - break; - case Y: - clamped = positive ? Math.max(shapeMotion.y, entityMotion.y) : Math.min(shapeMotion.y, entityMotion.y); - if (bestSide == Direction.UP) - clamped = shapeMotion.y; - entity.setMotion(entityMotion.x, clamped, entityMotion.z); - entity.handleFallDamage(entity.fallDistance, 1); - entity.fallDistance = 0; - entity.onGround = true; - break; - case Z: - clamped = positive ? Math.max(shapeMotion.z, entityMotion.z) : Math.min(shapeMotion.z, entityMotion.z); - entity.setMotion(entityMotion.x, entityMotion.y, clamped); - break; - } - } - } - - public static ReuseableStream getPotentiallyCollidedShapes(World world, Contraption contraption, + private static ReuseableStream getPotentiallyCollidedShapes(World world, Contraption contraption, AxisAlignedBB localBB) { double height = localBB.getYSize(); @@ -531,11 +394,11 @@ public class ContraptionCollider { BlockState collidedState = world.getBlockState(colliderPos); BlockInfo blockInfo = contraption.blocks.get(pos); - if (blockInfo.state.getBlock() instanceof IPortableBlock) { - IPortableBlock block = (IPortableBlock) blockInfo.state.getBlock(); - if (block.getMovementBehaviour() instanceof BlockBreakingMovementBehaviour) { + if (AllMovementBehaviours.hasMovementBehaviour(blockInfo.state.getBlock())) { + MovementBehaviour movementBehaviour = AllMovementBehaviours.getMovementBehaviour(blockInfo.state.getBlock()); + if (movementBehaviour instanceof BlockBreakingMovementBehaviour) { BlockBreakingMovementBehaviour behaviour = - (BlockBreakingMovementBehaviour) block.getMovementBehaviour(); + (BlockBreakingMovementBehaviour) movementBehaviour; if (!behaviour.canBreak(world, colliderPos, collidedState) && !collidedState.getCollisionShape(world, pos) .isEmpty()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java index a428d6c00..61289a5e2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java @@ -6,8 +6,11 @@ import static com.simibubi.create.foundation.utility.AngleHelper.getShortestAngl import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; +import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; + import org.apache.commons.lang3.tuple.MutablePair; import com.simibubi.create.AllEntityTypes; @@ -16,6 +19,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionSeatMappingPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCoupling; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingHandler; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AngleHelper; @@ -29,6 +35,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.IProjectile; import net.minecraft.entity.item.BoatEntity; import net.minecraft.entity.item.HangingEntity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -73,11 +80,18 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD protected boolean stationary; protected boolean initialized; final List collidingEntities = new ArrayList<>(); + private boolean isSerializingFurnaceCart; + private boolean attachedExtraInventories; private static final Ingredient FUEL_ITEMS = Ingredient.fromItems(Items.COAL, Items.CHARCOAL); private static final DataParameter STALLED = EntityDataManager.createKey(ContraptionEntity.class, DataSerializers.BOOLEAN); + private static final DataParameter> COUPLING = + EntityDataManager.createKey(ContraptionEntity.class, DataSerializers.OPTIONAL_UNIQUE_ID); + private static final DataParameter> COUPLED_CART = + EntityDataManager.createKey(ContraptionEntity.class, DataSerializers.OPTIONAL_UNIQUE_ID); + public float prevYaw; public float prevPitch; public float prevRoll; @@ -94,6 +108,8 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD super(entityTypeIn, worldIn); motionBeforeStall = Vector3d.ZERO; stationary = entityTypeIn == AllEntityTypes.STATIONARY_CONTRAPTION.get(); + isSerializingFurnaceCart = false; + attachedExtraInventories = false; forcedAngle = -1; } @@ -198,7 +214,7 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD return; callback.accept(passenger, transformedVector.x, transformedVector.y, transformedVector.z); } - + protected Vector3d getPassengerPosition(Entity passenger) { AxisAlignedBB bb = passenger.getBoundingBox(); double ySize = bb.getYSize(); @@ -308,36 +324,69 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD public void tickAsPassenger(Entity e) { boolean rotationLock = false; boolean pauseWhileRotating = false; - - if (contraption instanceof MountedContraption) { - rotationLock = ((MountedContraption) contraption).rotationMode == CartMovementMode.ROTATION_LOCKED; - pauseWhileRotating = ((MountedContraption) contraption).rotationMode == CartMovementMode.ROTATE_PAUSED; - } + boolean rotating = false; Entity riding = e; while (riding.getRidingEntity() != null) riding = riding.getRidingEntity(); - Vector3d movementVector = riding.getMotion(); - if (riding instanceof BoatEntity) - movementVector = getPositionVec().subtract(prevPosX, prevPosY, prevPosZ); - Vector3d motion = movementVector.normalize(); - boolean rotating = false; + if (!attachedExtraInventories) { + contraption.addExtraInventories(riding); + attachedExtraInventories = true; + } - if (!rotationLock) { - if (motion.length() > 0) { - targetYaw = yawFromVector(motion); - if (targetYaw < 0) - targetYaw += 360; - if (yaw < 0) - yaw += 360; + boolean isOnCoupling = false; + if (contraption instanceof MountedContraption) { + MountedContraption mountedContraption = (MountedContraption) contraption; + UUID couplingId = getCouplingId(); + isOnCoupling = couplingId != null && riding instanceof AbstractMinecartEntity; + if (isOnCoupling) { + MinecartCoupling coupling = MinecartCouplingHandler.getCoupling(world, couplingId); + if (coupling != null && coupling.areBothEndsPresent()) { + boolean notOnMainCart = !coupling.getId() + .equals(riding.getUniqueID()); + Vec3d positionVec = coupling.asCouple() + .get(notOnMainCart) + .getPositionVec(); + prevYaw = yaw; + prevPitch = pitch; + double diffZ = positionVec.z - riding.getZ(); + double diffX = positionVec.x - riding.getX(); + yaw = (float) (MathHelper.atan2(diffZ, diffX) * 180 / Math.PI); + pitch = (float) (Math.atan2(positionVec.y - getY(), Math.sqrt(diffX * diffX + diffZ * diffZ)) * 180 + / Math.PI); + + if (notOnMainCart) { + yaw += 180; + } + } } - prevYaw = yaw; - yaw = angleLerp(0.4f, yaw, targetYaw); - if (Math.abs(AngleHelper.getShortestAngleDiff(yaw, targetYaw)) < 1f) - yaw = targetYaw; - else - rotating = true; + rotationLock = mountedContraption.rotationMode == CartMovementMode.ROTATION_LOCKED; + pauseWhileRotating = mountedContraption.rotationMode == CartMovementMode.ROTATE_PAUSED; + } + + Vec3d movementVector = riding.getMotion(); + if (!isOnCoupling) { + if (riding instanceof BoatEntity) + movementVector = getPositionVec().subtract(prevPosX, prevPosY, prevPosZ); + Vec3d motion = movementVector.normalize(); + + if (!rotationLock) { + if (motion.length() > 0) { + targetYaw = yawFromVector(motion); + if (targetYaw < 0) + targetYaw += 360; + if (yaw < 0) + yaw += 360; + } + + prevYaw = yaw; + yaw = angleLerp(0.4f, yaw, targetYaw); + if (Math.abs(AngleHelper.getShortestAngleDiff(yaw, targetYaw)) < 1f) + yaw = targetYaw; + else + rotating = true; + } } boolean wasStalled = isStalled(); @@ -356,7 +405,12 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD if (!isStalled() && (riding instanceof FurnaceMinecartEntity)) { FurnaceMinecartEntity furnaceCart = (FurnaceMinecartEntity) riding; + + // Notify to not trigger serialization side-effects + isSerializingFurnaceCart = true; CompoundNBT nbt = furnaceCart.serializeNBT(); + isSerializingFurnaceCart = false; + int fuel = nbt.getInt("Fuel"); int fuelBefore = fuel; double pushX = nbt.getDouble("PushX"); @@ -415,6 +469,7 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD boolean newPosVisited = false; BlockPos gridPosition = new BlockPos(actorPosition); + Vec3d oldMotion = context.motion; if (!context.stall) { Vector3d previousPosition = context.position; @@ -431,7 +486,7 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD BearingContraption bc = (BearingContraption) getContraption(); Direction facing = bc.getFacing(); Vector3d activeAreaOffset = actor.getActiveAreaOffset(context); - if (activeAreaOffset.mul(VecHelper.planeByNormal(Vector3d.of(facing.getDirectionVec()))) + if (activeAreaOffset.mul(VecHelper.axisAlingedPlaneOf(new Vec3d(facing.getDirectionVec()))) .equals(Vector3d.ZERO)) { if (VecHelper.onSameAxis(blockInfo.pos, BlockPos.ZERO, facing.getAxis())) { context.motion = Vector3d.of(facing.getDirectionVec()).scale(facing.getAxis() @@ -456,6 +511,8 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD actor.visitNewPosition(context, gridPosition); context.firstMovement = false; } + if (!oldMotion.equals(context.motion)) + actor.onSpeedChanged(context, oldMotion, context.motion); actor.tick(context); contraption.stalled |= context.stall; } @@ -551,6 +608,8 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD @Override protected void registerData() { this.dataManager.register(STALLED, false); + this.dataManager.register(COUPLING, Optional.empty()); + this.dataManager.register(COUPLED_CART, Optional.empty()); } @Override @@ -569,6 +628,14 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD } if (compound.contains("Controller")) controllerPos = NBTUtil.readBlockPos(compound.getCompound("Controller")); + + if (compound.contains("OnCoupling")) { + setCouplingId(NBTUtil.readUniqueId(compound.getCompound("OnCoupling"))); + setCoupledCart(NBTUtil.readUniqueId(compound.getCompound("CoupledCart"))); + } else { + setCouplingId(null); + setCoupledCart(null); + } } public void forceYaw(float forcedYaw) { @@ -607,6 +674,11 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD compound.putFloat("InitialAngle", initialAngle); compound.putBoolean("Stalled", isStalled()); compound.putBoolean("Initialized", initialized); + + if (getCouplingId() != null) { + compound.put("OnCoupling", NBTUtil.writeUniqueId(getCouplingId())); + compound.put("CoupledCart", NBTUtil.writeUniqueId(getCoupledCart())); + } } @Override @@ -676,6 +748,9 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD @SuppressWarnings("deprecation") @Override public CompoundNBT writeWithoutTypeId(CompoundNBT nbt) { + if (isSerializingFurnaceCart) + return nbt; + Vector3d vec = getPositionVec(); List passengers = getPassengers(); @@ -795,6 +870,8 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD return false; if (e instanceof HangingEntity) return false; + if (e instanceof AbstractMinecartEntity) + return false; if (e instanceof SuperGlueEntity) return false; if (e instanceof SeatEntity) @@ -814,4 +891,24 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD return e.getPushReaction() == PushReaction.NORMAL; } + @Nullable + public UUID getCouplingId() { + Optional uuid = dataManager.get(COUPLING); + return uuid == null ? null : uuid.isPresent() ? uuid.get() : null; + } + + public void setCouplingId(UUID id) { + dataManager.set(COUPLING, Optional.ofNullable(id)); + } + + @Nullable + public UUID getCoupledCart() { + Optional uuid = dataManager.get(COUPLED_CART); + return uuid.isPresent() ? uuid.get() : null; + } + + public void setCoupledCart(UUID id) { + dataManager.set(COUPLED_CART, Optional.ofNullable(id)); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java new file mode 100644 index 000000000..ff63f6662 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java @@ -0,0 +1,51 @@ +package com.simibubi.create.content.contraptions.components.structureMovement; + +import static java.util.concurrent.TimeUnit.SECONDS; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants.NBT; + +public class ContraptionHandler { + + public static Cache>> activeContraptions = CacheBuilder.newBuilder() + .expireAfterAccess(400, SECONDS) + .build(); + + public static void addSpawnedContraptionsToCollisionList(Entity entity, World world) { + if (!(entity instanceof ContraptionEntity)) + return; + try { + List> list = activeContraptions.get(world, ArrayList::new); + ContraptionEntity contraption = (ContraptionEntity) entity; + list.add(new WeakReference<>(contraption)); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + + public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, World world) { + if (world.isRemote) + return; + CompoundNBT data = entityLiving.getPersistentData(); + if (!data.contains("ContraptionDismountLocation")) + return; + Vec3d position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", NBT.TAG_DOUBLE)); + if (entityLiving.getRidingEntity() == null) + entityLiving.setPositionAndUpdate(position.x, position.y, position.z); + data.remove("ContraptionDismountLocation"); + } + +} diff --git a/src/main/java/ContraptionInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionHandler.java similarity index 93% rename from src/main/java/ContraptionInteractionHandler.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionHandler.java index 8ae1d08c5..36ada9e88 100644 --- a/src/main/java/ContraptionInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionHandler.java @@ -1,8 +1,7 @@ +package com.simibubi.create.content.contraptions.components.structureMovement; import org.apache.commons.lang3.mutable.MutableObject; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionInteractionPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionInteractionPacket; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index 845791577..62dcf37c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -106,12 +106,13 @@ public class ContraptionRenderer { for (MatrixStack m : matrixStacks) { m.push(); MatrixStacker.of(m) - .translate(blockInfo.pos); + .translate(blockInfo.pos); } - - Contraption.getMovement(blockInfo.state) - .renderInContraption(context, ms, msLocal, buffer); - + + MovementBehaviour movementBehaviour = Contraption.getMovement(blockInfo.state); + if (movementBehaviour != null) + movementBehaviour.renderInContraption(context, ms, msLocal, buffer); + for (MatrixStack m : matrixStacks) m.pop(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IPortableBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IPortableBlock.java deleted file mode 100644 index 8c889fb12..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IPortableBlock.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.content.contraptions.components.structureMovement; - -public interface IPortableBlock { - - public MovementBehaviour getMovementBehaviour(); - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java index 81a43c60e..e64dfc2df 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; +import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler; +import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.ChestBlock; import net.minecraft.item.ItemStack; @@ -18,21 +20,41 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; +//FIXME: More dynamic mounted storage in .4 public class MountedStorage { private static final ItemStackHandler dummyHandler = new ItemStackHandler(); ItemStackHandler handler; - boolean working; + boolean valid; private TileEntity te; + public static boolean canUseAsStorage(TileEntity te) { + if (te == null) + return false; + + if (AllTileEntities.ADJUSTABLE_CRATE.is(te)) + return true; + if (AllTileEntities.CREATIVE_CRATE.is(te)) + return true; + if (te instanceof ShulkerBoxTileEntity) + return true; + if (te instanceof ChestTileEntity) + return true; + if (te instanceof BarrelTileEntity) + return true; + + LazyOptional capability = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + return capability.orElse(null) instanceof ItemStackHandler; + } + public MountedStorage(TileEntity te) { this.te = te; handler = dummyHandler; } - public void empty() { - working = false; + public void removeStorageFromWorld() { + valid = false; if (te == null) return; @@ -64,7 +86,7 @@ public class MountedStorage { // te uses ItemStackHandler if (teHandler instanceof ItemStackHandler) { handler = (ItemStackHandler) teHandler; - working = true; + valid = true; return; } @@ -76,27 +98,25 @@ public class MountedStorage { handler.setStackInSlot(slot, inv.getStackInSlot(slot)); inv.setStackInSlot(slot, ItemStack.EMPTY); } - working = true; + valid = true; return; } } - public MountedStorage(CompoundNBT nbt) { - handler = new ItemStackHandler(); - working = nbt != null; - if (working) - handler.deserializeNBT(nbt); - } + public void addStorageToWorld(TileEntity te) { + // FIXME: More dynamic mounted storage in .4 + if (handler instanceof BottomlessItemHandler) + return; - public void fill(TileEntity te) { - IItemHandler teHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - .orElse(dummyHandler); - if (teHandler != dummyHandler && teHandler instanceof IItemHandlerModifiable) { - IItemHandlerModifiable inv = (IItemHandlerModifiable) teHandler; - for (int slot = 0; slot < Math.min(inv.getSlots(), handler.getSlots()); slot++) - inv.setStackInSlot(slot, handler.getStackInSlot(slot)); - } + LazyOptional capability = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + IItemHandler teHandler = capability.orElse(null); + if (!(teHandler instanceof IItemHandlerModifiable)) + return; + + IItemHandlerModifiable inv = (IItemHandlerModifiable) teHandler; + for (int slot = 0; slot < Math.min(inv.getSlots(), handler.getSlots()); slot++) + inv.setStackInSlot(slot, handler.getStackInSlot(slot)); } public IItemHandlerModifiable getItemHandler() { @@ -104,28 +124,38 @@ public class MountedStorage { } public CompoundNBT serialize() { - return working ? handler.serializeNBT() : null; + if (!valid) + return null; + CompoundNBT tag = handler.serializeNBT(); + + if (handler instanceof BottomlessItemHandler) { + NBTHelper.putMarker(tag, "Bottomless"); + tag.put("ProvidedStack", handler.getStackInSlot(0) + .serializeNBT()); + } + + return tag; } - public boolean isWorking() { - return working; + public static MountedStorage deserialize(CompoundNBT nbt) { + MountedStorage storage = new MountedStorage(null); + storage.handler = new ItemStackHandler(); + if (nbt == null) + return storage; + storage.valid = true; + + if (nbt.contains("Bottomless")) { + ItemStack providedStack = ItemStack.read(nbt.getCompound("ProvidedStack")); + storage.handler = new BottomlessItemHandler(() -> providedStack); + return storage; + } + + storage.handler.deserializeNBT(nbt); + return storage; } - public static boolean canUseAsStorage(TileEntity te) { - if (te == null) - return false; - if (AllTileEntities.ADJUSTABLE_CRATE.is(te)) - return true; - if (te instanceof ShulkerBoxTileEntity) - return true; - if (te instanceof ChestTileEntity) - return true; - if (te instanceof BarrelTileEntity) - return true; - LazyOptional capability = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); - if (capability.isPresent() && capability.orElse(null) instanceof ItemStackHandler) - return true; - return false; + public boolean isValid() { + return valid; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 2e282a09d..c2eacc244 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -47,8 +47,15 @@ public abstract class MovementBehaviour { } + public boolean hasSpecialMovementRenderer() { + return true; + } + @OnlyIn(Dist.CLIENT) public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) {} + public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { + + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index fd608f76e..e2262c785 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -227,26 +227,26 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe } @Override - public CompoundNBT write(CompoundNBT tag) { - tag.putBoolean("Running", running); - tag.putFloat("HourAngle", hourAngle); - tag.putFloat("MinuteAngle", minuteAngle); - return super.write(tag); + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putBoolean("Running", running); + compound.putFloat("HourAngle", hourAngle); + compound.putFloat("MinuteAngle", minuteAngle); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT tag) { - running = tag.getBoolean("Running"); - hourAngle = tag.getFloat("HourAngle"); - minuteAngle = tag.getFloat("MinuteAngle"); - super.read(tag); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { + protected void read(CompoundNBT compound, boolean clientPacket) { float hourAngleBefore = hourAngle; float minuteAngleBefore = minuteAngle; - super.readClientUpdate(tag); + + running = compound.getBoolean("Running"); + hourAngle = compound.getFloat("HourAngle"); + minuteAngle = compound.getFloat("MinuteAngle"); + super.read(compound, clientPacket); + + if (!clientPacket) + return; + if (running) { clientHourAngleDiff = AngleHelper.getShortestAngleDiff(hourAngleBefore, hourAngle); clientMinuteAngleDiff = AngleHelper.getShortestAngleDiff(minuteAngleBefore, minuteAngle); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 37fc4cc6f..5c63ba8b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -102,27 +102,25 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp } @Override - public CompoundNBT write(CompoundNBT tag) { - tag.putBoolean("Running", running); - tag.putBoolean("Windmill", isWindmill); - tag.putFloat("Angle", angle); - tag.putFloat("LastGenerated", lastGeneratedSpeed); - return super.write(tag); + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putBoolean("Running", running); + compound.putBoolean("Windmill", isWindmill); + compound.putFloat("Angle", angle); + compound.putFloat("LastGenerated", lastGeneratedSpeed); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT tag) { - running = tag.getBoolean("Running"); - isWindmill = tag.getBoolean("Windmill"); - angle = tag.getFloat("Angle"); - lastGeneratedSpeed = tag.getFloat("LastGenerated"); - super.read(tag); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { + protected void read(CompoundNBT compound, boolean clientPacket) { float angleBefore = angle; - super.readClientUpdate(tag); + running = compound.getBoolean("Running"); + isWindmill = compound.getBoolean("Windmill"); + angle = compound.getFloat("Angle"); + lastGeneratedSpeed = compound.getFloat("LastGenerated"); + super.read(compound, clientPacket); + + if (!clientPacket) + return; if (running) { clientAngleDiff = AngleHelper.getShortestAngleDiff(angleBefore, angle); angle = angleBefore; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index 6faa70def..43f266082 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -88,12 +88,12 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements return ActionResultType.SUCCESS; } + @SuppressWarnings("deprecation") @Override public BlockState rotate(BlockState state, Rotation rotation) { if (rotation == Rotation.NONE) return state; - @SuppressWarnings("deprecation") BlockState rotated = super.rotate(state, rotation); for (Direction face : Direction.values()) { BooleanProperty glueableSide = getGlueableSide(rotated, face); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ChassisRangeDisplay.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java similarity index 97% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ChassisRangeDisplay.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java index fdb17e76c..796c5793e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ChassisRangeDisplay.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.contraptions.components.structureMovement; +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; import java.util.ArrayList; import java.util.Collections; @@ -14,7 +14,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; -import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java index 454af89ea..c7efc5d12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java @@ -11,7 +11,6 @@ import java.util.Set; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits; -import com.simibubi.create.content.contraptions.components.structureMovement.ChassisRangeDisplay; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index c714b28da..6728d4906 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -404,4 +404,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat return new ItemRequirement(ItemUseType.DAMAGE, AllItems.SUPER_GLUE.get()); } + @Override + public boolean doesEntityNotTriggerPressurePlate() { + return true; + } } 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 3b58e92d9..98863bfaa 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 @@ -81,7 +81,7 @@ public class SuperGlueItem extends Item { @OnlyIn(Dist.CLIENT) public static void spawnParticles(World world, BlockPos pos, Direction direction, boolean fullBlock) { Vector3d vec = Vector3d.of(direction.getDirectionVec()); - Vector3d plane = VecHelper.planeByNormal(vec); + Vector3d plane = VecHelper.axisAlingedPlaneOf(vec); Vector3d facePos = VecHelper.getCenterOf(pos) .add(vec.scale(.5f)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java index e7c29e47f..cd73d52ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -63,7 +64,9 @@ public class SuperGlueRenderer extends EntityRenderer { Direction face = entity.getFacingDirection(); ms.push(); - AngleHelper.applyRotation(face, ms); + MatrixStacker.of(ms) + .rotateY(AngleHelper.horizontalAngle(face)) + .rotateX(AngleHelper.verticalAngle(face)); Entry peek = ms.peek(); Vector3d[][] quads = { quad1, quad2 }; @@ -87,7 +90,8 @@ public class SuperGlueRenderer extends EntityRenderer { Vector3d diff = Vector3d.of(Direction.SOUTH.getDirectionVec()); Vector3d extension = diff.normalize() .scale(1 / 32f - 1 / 128f); - Vector3d plane = VecHelper.planeByNormal(diff); + + Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); Axis axis = Direction.getFacingFromVector(diff.x, diff.y, diff.z) .getAxis(); 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 fa4631e25..805437c2c 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 @@ -11,6 +11,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingHandler; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; @@ -24,6 +25,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.item.minecart.ChestMinecartEntity; import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; @@ -45,6 +47,7 @@ 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.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -111,7 +114,7 @@ public class CartAssemblerBlock extends AbstractRailBlock @Override public void onMinecartPass(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, AbstractMinecartEntity cart) { - if (!cart.canBeRidden() && !(cart instanceof FurnaceMinecartEntity)) + if (!canAssembleTo(cart)) return; withTileEntityDo(world, pos, te -> { @@ -163,6 +166,10 @@ public class CartAssemblerBlock extends AbstractRailBlock }); } + public static boolean canAssembleTo(AbstractMinecartEntity cart) { + return cart.canBeRidden() || cart instanceof FurnaceMinecartEntity || cart instanceof ChestMinecartEntity; + } + @Override @Nonnull public ActionResultType onUse(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @@ -207,7 +214,24 @@ public class CartAssemblerBlock extends AbstractRailBlock float initialAngle = facing.getHorizontalAngle(); withTileEntityDo(world, pos, te -> contraption.rotationMode = CartMovementMode.values()[te.movementMode.value]); + + boolean couplingFound = contraption.connectedCart != null; + if (couplingFound) { + MinecartCouplingHandler.connectCarts(null, world, cart.getEntityId(), + contraption.connectedCart.getEntityId()); + Vec3d diff = contraption.connectedCart.getPositionVec() + .subtract(cart.getPositionVec()); + initialAngle = Direction.fromAngle(MathHelper.atan2(diff.z, diff.x) * 180 / Math.PI) + .getHorizontalAngle(); + } + ContraptionEntity entity = ContraptionEntity.createMounted(world, contraption, initialAngle, facing); + + if (couplingFound) { + entity.setCouplingId(cart.getUniqueID()); + entity.setCoupledCart(contraption.connectedCart.getUniqueID()); + } + entity.setPosition(pos.getX(), pos.getY(), pos.getZ()); world.addEntity(entity); entity.startRiding(cart); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java new file mode 100644 index 000000000..f0eae3e70 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java @@ -0,0 +1,140 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.mounted; + +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class ItemHandlerModifiableFromIInventory implements IItemHandlerModifiable { + private final IInventory inventory; + + public ItemHandlerModifiableFromIInventory(IInventory inventory) { + this.inventory = inventory; + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + inventory.setInventorySlotContents(slot, stack); + } + + @Override + public int getSlots() { + return inventory.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory.getStackInSlot(slot); + } + + @Override + @Nonnull + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) + { + if (stack.isEmpty()) + return ItemStack.EMPTY; + + if (!isItemValid(slot, stack)) + return stack; + + validateSlotIndex(slot); + + ItemStack existing = getStackInSlot(slot); + + int limit = getStackLimit(slot, stack); + + if (!existing.isEmpty()) + { + if (!ItemHandlerHelper.canItemStacksStack(stack, existing)) + return stack; + + limit -= existing.getCount(); + } + + if (limit <= 0) + return stack; + + boolean reachedLimit = stack.getCount() > limit; + + if (!simulate) + { + if (existing.isEmpty()) + { + setStackInSlot(slot, reachedLimit ? ItemHandlerHelper.copyStackWithSize(stack, limit) : stack); + } + else + { + existing.grow(reachedLimit ? limit : stack.getCount()); + } + } + + return reachedLimit ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount()- limit) : ItemStack.EMPTY; + } + + @Override + @Nonnull + public ItemStack extractItem(int slot, int amount, boolean simulate) + { + if (amount == 0) + return ItemStack.EMPTY; + + validateSlotIndex(slot); + + ItemStack existing = getStackInSlot(slot); + + if (existing.isEmpty()) + return ItemStack.EMPTY; + + int toExtract = Math.min(amount, existing.getMaxStackSize()); + + if (existing.getCount() <= toExtract) + { + if (!simulate) + { + setStackInSlot(slot, ItemStack.EMPTY); + return existing; + } + else + { + return existing.copy(); + } + } + else + { + if (!simulate) + { + setStackInSlot(slot, ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract)); + } + + return ItemHandlerHelper.copyStackWithSize(existing, toExtract); + } + } + + @Override + public int getSlotLimit(int slot) { + return inventory.getInventoryStackLimit(); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return inventory.isItemValidForSlot(slot, stack); + } + + private void validateSlotIndex(int slot) + { + if (slot < 0 || slot >= getSlots()) + throw new RuntimeException("Slot " + slot + " not in valid range - [0," + getSlots() + ")"); + } + + private int getStackLimit(int slot, ItemStack stack) + { + return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index ad7b991bb..a0d3c23c2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -212,8 +212,7 @@ public class MinecartContraptionItem extends Item { public static ItemStack create(Type type, ContraptionEntity entity) { ItemStack stack = - (type == Type.RIDEABLE ? AllItems.MINECART_CONTRAPTION : AllItems.FURNACE_MINECART_CONTRAPTION) - .asStack(); + (type == Type.RIDEABLE ? AllItems.MINECART_CONTRAPTION : AllItems.FURNACE_MINECART_CONTRAPTION).asStack(); CompoundNBT tag = entity.getContraption() .writeNBT(); tag.remove("UUID"); 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 d26800f77..f8bd4aeb0 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 @@ -10,24 +10,32 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.RailShape; import net.minecraft.tileentity.TileEntity; 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.vector.Vector3d; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraft.entity.Entity; +import net.minecraft.inventory.IInventory; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class MountedContraption extends Contraption { public CartMovementMode rotationMode; + public AbstractMinecartEntity connectedCart; public MountedContraption() { rotationMode = CartMovementMode.ROTATE; @@ -71,12 +79,35 @@ public class MountedContraption extends Contraption { protected Pair capture(World world, BlockPos pos) { Pair pair = super.capture(world, pos); BlockInfo capture = pair.getKey(); - if (AllBlocks.CART_ASSEMBLER.has(capture.state)) - return Pair.of(new BlockInfo(capture.pos, CartAssemblerBlock.createAnchor(capture.state), null), - pair.getValue()); + if (AllBlocks.CART_ASSEMBLER.has(capture.state)) { + if (!pos.equals(anchor)) { + for (Axis axis : Iterate.axes) { + if (axis.isVertical()) + continue; + if (VecHelper.onSameAxis(anchor, pos, axis) && connectedCart == null) { + for (AbstractMinecartEntity abstractMinecartEntity : world + .getEntitiesWithinAABB(AbstractMinecartEntity.class, new AxisAlignedBB(pos))) { + if (!CartAssemblerBlock.canAssembleTo(abstractMinecartEntity)) + break; + connectedCart = abstractMinecartEntity; + addExtraInventories(abstractMinecartEntity); + } + } + } + } + return Pair.of(new BlockInfo(pos, CartAssemblerBlock.createAnchor(capture.state), null), pair.getValue()); + } return pair; } + @Override + protected boolean movementAllowed(World world, BlockPos pos) { + BlockState blockState = world.getBlockState(pos); + if (!pos.equals(anchor) && AllBlocks.CART_ASSEMBLER.has(blockState)) + return true; + return super.movementAllowed(world, pos); + } + @Override public CompoundNBT writeNBT() { CompoundNBT writeNBT = super.writeNBT(); @@ -94,10 +125,15 @@ public class MountedContraption extends Contraption { protected boolean customBlockPlacement(IWorld world, BlockPos pos, BlockState state) { return AllBlocks.MINECART_ANCHOR.has(state); } - + @Override protected boolean customBlockRemoval(IWorld world, BlockPos pos, BlockState state) { - return pos.equals(anchor); + return AllBlocks.MINECART_ANCHOR.has(state); } + @Override + public void addExtraInventories(Entity cart) { + if (cart instanceof IInventory) + inventory = new CombinedInvWrapper(new ItemHandlerModifiableFromIInventory((IInventory) cart), inventory); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 8c64b3f73..1e794f692 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -145,50 +145,38 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme } @Override - public CompoundNBT write(CompoundNBT tag) { - tag.putBoolean("Running", running); - tag.putBoolean("Waiting", waitingForSpeedChange); - tag.putFloat("Offset", offset); - return super.write(tag); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - if (forceMove) { + protected void write(CompoundNBT compound, boolean clientPacket) { + compound.putBoolean("Running", running); + compound.putBoolean("Waiting", waitingForSpeedChange); + compound.putFloat("Offset", offset); + super.write(compound, clientPacket); + + if (clientPacket && forceMove) { compound.putBoolean("ForceMovement", forceMove); forceMove = false; } - return super.writeToClient(compound); } @Override - public void read(CompoundNBT tag) { - running = tag.getBoolean("Running"); - waitingForSpeedChange = tag.getBoolean("Waiting"); - offset = tag.getFloat("Offset"); - super.read(tag); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { - boolean forceMovement = tag.contains("ForceMovement"); + protected void read(CompoundNBT compound, boolean clientPacket) { + boolean forceMovement = compound.contains("ForceMovement"); float offsetBefore = offset; - super.readClientUpdate(tag); - if (forceMovement) { - if (movedContraption != null) { - applyContraptionPosition(); - } - } else { - if (running) { - clientOffsetDiff = offset - offsetBefore; - offset = offsetBefore; - } + running = compound.getBoolean("Running"); + waitingForSpeedChange = compound.getBoolean("Waiting"); + offset = compound.getFloat("Offset"); + super.read(compound, clientPacket); + + if (!clientPacket) + return; + if (forceMovement) + applyContraptionPosition(); + else if (running) { + clientOffsetDiff = offset - offsetBefore; + offset = offsetBefore; } - if (!running) movedContraption = null; - } public abstract void disassemble(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index 37252c721..f449f2e32 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -29,15 +29,15 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { } @Override - public void read(CompoundNBT tag) { - extensionLength = tag.getInt("ExtensionLength"); - super.read(tag); + protected void read(CompoundNBT compound, boolean clientPacket) { + extensionLength = compound.getInt("ExtensionLength"); + super.read(compound, clientPacket); } @Override - public CompoundNBT write(CompoundNBT tag) { + protected void write(CompoundNBT tag, boolean clientPacket) { tag.putInt("ExtensionLength", extensionLength); - return super.write(tag); + super.write(tag, clientPacket); } @Override 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 734e095a8..20b24fb8c 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,6 +8,7 @@ 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; @@ -168,15 +169,15 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { } @Override - public void read(CompoundNBT tag) { - initialOffset = tag.getInt("InitialOffset"); - super.read(tag); + protected void read(CompoundNBT compound, boolean clientPacket) { + initialOffset = compound.getInt("InitialOffset"); + super.read(compound, clientPacket); } @Override - public CompoundNBT write(CompoundNBT tag) { - tag.putInt("InitialOffset", initialOffset); - return super.write(tag); + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putInt("InitialOffset", initialOffset); + super.write(compound, clientPacket); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ClientMotionPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java similarity index 98% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ClientMotionPacket.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java index 17261237b..a80351080 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ClientMotionPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.contraptions.components.structureMovement; +package com.simibubi.create.content.contraptions.components.structureMovement.sync; import java.util.function.Supplier; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java similarity index 94% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionPacket.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java index 0b2d2c56a..731c791e4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionInteractionPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java @@ -1,7 +1,8 @@ -package com.simibubi.create.content.contraptions.components.structureMovement; +package com.simibubi.create.content.contraptions.components.structureMovement.sync; import java.util.function.Supplier; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionSeatMappingPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java similarity index 84% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionSeatMappingPacket.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java index d67e51504..4596dbd28 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionSeatMappingPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java @@ -1,10 +1,11 @@ -package com.simibubi.create.content.contraptions.components.structureMovement; +package com.simibubi.create.content.contraptions.components.structureMovement.sync; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.function.Supplier; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.client.Minecraft; @@ -44,12 +45,12 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase { public void handle(Supplier context) { context.get() .enqueueWork(() -> { - Entity entityByID = Minecraft.getInstance().world - .getEntityByID(entityID); + Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityID); if (!(entityByID instanceof ContraptionEntity)) return; ContraptionEntity contraptionEntity = (ContraptionEntity) entityByID; - contraptionEntity.contraption.seatMapping = mapping; + contraptionEntity.getContraption() + .setSeatMapping(mapping); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/ClientMinecartCouplingHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/ClientMinecartCouplingHandler.java new file mode 100644 index 000000000..30a4fe4ee --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/ClientMinecartCouplingHandler.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.Random; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; + +public class ClientMinecartCouplingHandler { + + static AbstractMinecartEntity selectedCart; + static Random r = new Random(); + + public static void tick() { + if (selectedCart == null) + return; + spawnSelectionParticles(selectedCart.getBoundingBox(), false); + ClientPlayerEntity player = Minecraft.getInstance().player; + ItemStack heldItemMainhand = player.getHeldItemMainhand(); + ItemStack heldItemOffhand = player.getHeldItemOffhand(); + if (AllItems.MINECART_COUPLING.isIn(heldItemMainhand) || AllItems.MINECART_COUPLING.isIn(heldItemOffhand)) + return; + selectedCart = null; + } + + static void onCartClicked(PlayerEntity player, AbstractMinecartEntity entity) { + if (Minecraft.getInstance().player != player) + return; + if (selectedCart == null || selectedCart == entity) { + selectedCart = entity; + spawnSelectionParticles(selectedCart.getBoundingBox(), true); + return; + } + spawnSelectionParticles(entity.getBoundingBox(), true); + AllPackets.channel.sendToServer(new MinecartCouplingCreationPacket(selectedCart, entity)); + selectedCart = null; + } + + static void sneakClick() { + selectedCart = null; + } + + private static void spawnSelectionParticles(AxisAlignedBB axisAlignedBB, boolean highlight) { + ClientWorld world = Minecraft.getInstance().world; + Vec3d center = axisAlignedBB.getCenter(); + int amount = highlight ? 100 : 2; + IParticleData particleData = highlight ? ParticleTypes.END_ROD : new RedstoneParticleData(1, 1, 1, 1); + for (int i = 0; i < amount; i++) { + Vec3d v = VecHelper.offsetRandomly(Vec3d.ZERO, r, 1); + double yOffset = v.y; + v = v.mul(1, 0, 1) + .normalize() + .add(0, yOffset / 8f, 0) + .add(center); + world.addParticle(particleData, v.x, v.y, v.z, 0, 0, 0); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCoupling.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCoupling.java new file mode 100644 index 000000000..2f1241ad1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCoupling.java @@ -0,0 +1,117 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingSerializer.CouplingData; +import com.simibubi.create.foundation.utility.Couple; + +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.world.World; + +public class MinecartCoupling { + + WeakReference mainCart; + WeakReference connectedCart; + double length; + + private MinecartCoupling(AbstractMinecartEntity mainCart, AbstractMinecartEntity connectedCart, double length) { + this.mainCart = new WeakReference<>(mainCart); + this.connectedCart = new WeakReference<>(connectedCart); + this.length = length; + } + + public static MinecartCoupling create(AbstractMinecartEntity mainCart, AbstractMinecartEntity connectedCart) { + return new MinecartCoupling(mainCart, connectedCart, + Math.max(2, getDistanceBetweenCarts(mainCart, connectedCart))); + } + + @Nullable + public static List loadAllAttached(World world, AbstractMinecartEntity minecart) { + List loaded = new ArrayList<>(2); + List otherCartsInRange = + world.getEntitiesWithinAABB(AbstractMinecartEntity.class, minecart.getBoundingBox() + .grow(MinecartCouplingHandler.maxDistance()), c -> c != minecart); + + List couplingData = MinecartCouplingSerializer.getCouplingData(minecart); + Connections: for (CouplingData connection : couplingData) { + boolean cartIsMain = connection.main; + UUID cartCouplingUUID = connection.id; + + for (AbstractMinecartEntity otherCart : otherCartsInRange) { + List otherCouplingData = MinecartCouplingSerializer.getCouplingData(otherCart); + for (CouplingData otherConnection : otherCouplingData) { + boolean otherIsMain = otherConnection.main; + UUID otherCouplingUUID = otherConnection.id; + + if (cartIsMain == otherIsMain) + continue; + if (!otherCouplingUUID.equals(cartCouplingUUID)) + continue; + + AbstractMinecartEntity mainCart = cartIsMain ? minecart : otherCart; + AbstractMinecartEntity connectedCart = cartIsMain ? otherCart : minecart; + loaded.add(new MinecartCoupling(mainCart, connectedCart, connection.length)); + continue Connections; + } + } + } + + return loaded; + } + + public void writeToCarts() { + MinecartCouplingSerializer.removeCouplingFromCart(mainCart.get(), this); + MinecartCouplingSerializer.removeCouplingFromCart(connectedCart.get(), this); + + MinecartCouplingSerializer.addCouplingToCart(mainCart.get(), this); + MinecartCouplingSerializer.addCouplingToCart(connectedCart.get(), this); + } + + /** + * Swap main and connected cart for aliging couplings of a train.
+ * Changes are written to the carts' nbt data!
+ * Id of this coupling will change! + */ + public void flip() { + MinecartCouplingSerializer.removeCouplingFromCart(mainCart.get(), this); + MinecartCouplingSerializer.removeCouplingFromCart(connectedCart.get(), this); + + WeakReference oldMain = mainCart; + mainCart = connectedCart; + connectedCart = oldMain; + + MinecartCouplingSerializer.addCouplingToCart(mainCart.get(), this); + MinecartCouplingSerializer.addCouplingToCart(connectedCart.get(), this); + } + + public static double getDistanceBetweenCarts(AbstractMinecartEntity mainCart, + AbstractMinecartEntity connectedCart) { + return mainCart.getBoundingBox() + .getCenter() + .subtract(connectedCart.getBoundingBox() + .getCenter()) + .length(); + } + + public boolean areBothEndsPresent() { + return (mainCart.get() != null && mainCart.get() + .isAlive()) && (connectedCart.get() != null + && connectedCart.get() + .isAlive()); + } + + public UUID getId() { + return mainCart.get() + .getUniqueID(); + } + + public Couple asCouple() { + return Couple.create(mainCart.get(), connectedCart.get()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingCreationPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingCreationPacket.java new file mode 100644 index 000000000..a382acc55 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingCreationPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class MinecartCouplingCreationPacket extends SimplePacketBase { + + int id1, id2; + + public MinecartCouplingCreationPacket(AbstractMinecartEntity cart1, AbstractMinecartEntity cart2) { + id1 = cart1.getEntityId(); + id2 = cart2.getEntityId(); + } + + public MinecartCouplingCreationPacket(PacketBuffer buffer) { + id1 = buffer.readInt(); + id2 = buffer.readInt(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeInt(id1); + buffer.writeInt(id2); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity sender = context.get() + .getSender(); + if (sender != null) + MinecartCouplingHandler.connectCarts(sender, sender.world, id1, id2); + }); + context.get() + .setPacketHandled(true); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingHandler.java new file mode 100644 index 000000000..a55fea532 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingHandler.java @@ -0,0 +1,404 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.tuple.Pair; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingSerializer.CouplingData; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.WorldAttached; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectLists; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.PacketDistributor; + +/* + * + * Couplings are a directional connection of two Minecart entities + * - ID and Key is the UUID of the main cart + * - They are immediately written to both minecarts' nbt tags upon creation. + * {Main: true, Id: {L: ", M: "}, Length: 5} + * + * Trains are an ordered list of Couplings + * - ID and Key is the UUID of the main coupling + * - Every coupling is part of exactly one train, lonely couplings are still treated as such + * - When two trains are merged, the couplings have to be re-oriented to always point towards the main coupling + * + * Loaded carts are queued to be dealt with on world tick, + * so that the world functions are not accessed during the chunk deserialization + * + * Challenges: + * - Minecarts can only be corrected by changing their motion or their position + * - A Minecarts' motion vector does not represent its actual movement next tick + * - There is no accessible simulation step (can be copied / at'd) + * - It is not always known which cart is ahead/behind + * - If both ends keep a contant momentum, the link stress is not necessarily satisfied + * - Carts cannot be "dragged" directly towards resolving link stress; + * It is not entirely predictable how motions outside of the rail vector get projected + * + * + * + * Day III, couplings still too unstable. Why is that? What causes the instability, is it the general approach or a specific issue + * Explored strategies: + * + * Acellerate against violation diff -> perpetual motion, Jittering, bouncyness + * Brake and correct towards violation diff -> quick loss of momentum + * Move against diff -> de-rails carts on tricky paths + * + * Not yet explored: running an actual simulation step for the minecarts' movement. + * + * - satisfied link + * -- stretched link + * . shortened link + * ? not visible in ctx + * = cart + * => moving cart + * + * Create algorithm to find a tick order which maximizes resolved stress + * + * => ? <= ? = - => (@t) + * ^ tick here first + * + * cart[], motion[], position[] + * Predict through simulation + motion, that without any intervention, this happens: + * + * => ? <= ? = -- => (@t+1) + * + * Decision: Accelerate trailing? (free motion) + * Brake leading? (loss of momentum) + * -> Both? + * + * Soft collisions can always be resolved. Just have to adjust motions accordingly. + * Hard collisions should never be resolved by the soft/motion resolver, as it would generate or void momentum! + * + * Approach: Hard pass then soft pass. two iterations of the coupling list + * + * find starting point of hard resolve: the center of balance + * i from left, j from right + * compare and approach the exact center of the resolved chain. + * + * -3 -2-10v 0 + * 0-----0-0-0-0 + * 0--0--0--0--0 + * 2 1 + * 0---0-0---0---0--0--0-0-0-0-0 + * 0--0--0--0--0--0--0--0--0--0--0 + * + * v + * 0-0-0 + * 0--0--0 + * + * v + * 0---0---0---0 + * 0-0-0-0 + * + * -1 0 -1 0 + * 0-0---0--0---0-0 + * 0--0--0--0--0--0 + * + * + * + * iterate both ways from the center and resolve hard collisions. + * + * + * if coupling is NOT ok @t { + * Something unpredictable happened. + * Try to reach soft state asap. every lost cycle in hard will act strangely and render inconsistently + * Using motion to hard resolve is probably a bad idea + * + * if cart on rail -> force move along rail away from collision + * else straight-up push it + * use simulation to test if movements are possible + * + * hard resolves are usually quite tiny. If they go beyond 1m then something really messed up + * } + * + * if coupling could not be fixed { + * clear all motion of the two carts (?) + * A failed hard collision implies that the Minecarts cannot be forced together/apart, might aswell not make things worse + * } + * + * + * Soft collisions only mess with motion values. It is still good to find a good order of iteration- + * that way predictions of earlier couplings in the loop are still accurate + * + * =>>> - = - <= - =>> + * + * left to right + * =>> - = - => - => + * right to left + * =>> - => - = - => + * + * + * + * + * if now coupling is ok @t { + * + * Run Prediction I + * if (coupling is ok @t+1) + * my job here is done; return + * + * get required force to resolve (front or back) + * distribute equally over both carts + * + * Run Prediction II + * if (coupling is ok @t+1*) + * looks good; return + * + * re-distribute force to other cart + * all collisions should be fixed at this point. return; + * (in case of sudden changes/ bad predictions, the next cycle can handle the hard resolve) + * + * } + * + * + * + * NEXT STEPS + * 1. normalize diagonal rail vectors and debug all possible rail motion transfers. The required tools have to work properly + * 2. implement a prediction step + * 3. find a suitable hard collision resolver + * 4. find a suitable soft collision order + * + */ + +public class MinecartCouplingHandler { + + static WorldAttached> loadedCouplings = new WorldAttached<>(HashMap::new); + static WorldAttached> loadedTrains = new WorldAttached<>(HashMap::new); + + static WorldAttached> queuedCarts = + new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>())); + + public static void connectCarts(@Nullable PlayerEntity player, World world, int cartId1, int cartId2) { + Entity entity1 = world.getEntityByID(cartId1); + Entity entity2 = world.getEntityByID(cartId2); + + if (!(entity1 instanceof AbstractMinecartEntity)) + return; + if (!(entity2 instanceof AbstractMinecartEntity)) + return; + if ((int) entity1.getPositionVec() + .distanceTo(entity2.getPositionVec()) > maxDistance()) + return; + + AbstractMinecartEntity cart1 = (AbstractMinecartEntity) entity1; + AbstractMinecartEntity cart2 = (AbstractMinecartEntity) entity2; + + if (alreadyCoupled(world, cart1, cart2)) + return; + + addCoupling(world, MinecartCoupling.create(cart1, cart2), false); + + if (world.isRemote) + return; + AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> cart1), + new MinecartCouplingSyncPacket(cart1, cart2)); + } + + @OnlyIn(Dist.CLIENT) + public static void render(MatrixStack ms, IRenderTypeBuffer buffer) { + ClientWorld world = Minecraft.getInstance().world; + if (world == null) + return; + loadedCouplings.get(world) + .values() + .forEach(c -> MinecartCouplingRenderer.renderCoupling(ms, buffer, c)); + } + + public static void tick(World world) { + initQueuedCarts(world); + removeUnloadedCouplings(world); + loadedTrains.get(world) + .values() + .forEach(t -> t.tickCouplings(world)); + } + + private static void initQueuedCarts(World world) { + List queued = queuedCarts.get(world); + if (queued == null) + return; + for (AbstractMinecartEntity minecart : queued) + MinecartCoupling.loadAllAttached(world, minecart) + .forEach(c -> addCoupling(world, c, true)); + queued.clear(); + } + + private static void removeUnloadedCouplings(World world) { + List toRemove = new ArrayList<>(); + Map couplings = loadedCouplings.get(world); + if (couplings == null) + return; + for (Entry entry : couplings.entrySet()) + if (!entry.getValue() + .areBothEndsPresent()) + toRemove.add(entry.getKey()); + couplings.keySet() + .removeAll(toRemove); + } + + public static void handleAddedMinecart(Entity entity, World world) { + if (!(entity instanceof AbstractMinecartEntity)) + return; + if (world.isRemote) + queueLoadedMinecartClient(entity, world); + else + queueLoadedMinecart(entity, world); + } + + public static void queueLoadedMinecartClient(Entity entity, World world) { + AllPackets.channel.sendToServer(new PersistantDataPacketRequest(entity)); + } + + public static void queueLoadedMinecart(Entity entity, World world) { + AbstractMinecartEntity minecart = (AbstractMinecartEntity) entity; + CompoundNBT nbt = minecart.getPersistentData(); + if (!nbt.contains("Couplings")) + return; + queuedCarts.get(world) + .add(minecart); + } + + static int maxDistance() { + return AllConfigs.SERVER.kinetics.maxCartCouplingLength.get(); + } + + public static Pair getTrainIfComplete(World world, AbstractMinecartEntity minecart, + @Nullable UUID ignore) { + AbstractMinecartEntity current = minecart; + UUID trainId = current.getUniqueID(); + for (int i = 0; i < 100; i++) { + List couplingData = MinecartCouplingSerializer.getCouplingData(current); + for (CouplingData data : couplingData) { + if (data.main) + continue; + if (ignore != null && ignore.equals(data.id)) + continue; + trainId = data.id; + MinecartCoupling coupling = loadedCouplings.get(world) + .get(trainId); + + // Not fully loaded in + if (coupling == null) + return Pair.of(trainId, false); + + current = coupling.mainCart.get(); + } + } + + // Complete + return Pair.of(trainId, true); + } + + private static boolean alreadyCoupled(World world, AbstractMinecartEntity cart1, AbstractMinecartEntity cart2) { + Pair trainOf = getTrainIfComplete(world, cart1, null); + Pair trainOf2 = getTrainIfComplete(world, cart2, null); + return trainOf.getRight() && trainOf2.getRight() && trainOf.getLeft() + .equals(trainOf2.getLeft()); + } + + private static void addCoupling(World world, MinecartCoupling coupling, boolean loadedFromChunk) { + MinecartTrain train = new MinecartTrain(coupling); + Pair trainIdOfMain = getTrainIfComplete(world, coupling.mainCart.get(), null); + Pair trainIdOfConnected = + getTrainIfComplete(world, coupling.connectedCart.get(), loadedFromChunk ? coupling.getId() : null); + + // Something is not loaded + if (!loadedFromChunk && !(trainIdOfMain.getValue() && trainIdOfConnected.getValue())) + return; + + // Coupling was already loaded in + if (loadedFromChunk && loadedCouplings.get(world) + .containsKey(coupling.getId())) + return; + + if (!world.isRemote) { + Map trains = loadedTrains.get(world); + MinecartTrain trainOfMain = trains.get(trainIdOfMain.getKey()); + MinecartTrain trainOfConnected = trains.get(trainIdOfConnected.getKey()); + + // Connected cart is part of a train, merge it onto the newly created one + if (trainOfConnected != null) + trains.remove(trainIdOfConnected.getKey()) + .mergeOnto(world, train); + + // Main cart is part of a train, merge the newly created one onto it + boolean mainCartHasTrain = trainOfMain != null && trainIdOfMain.getKey() + .equals(coupling.getId()); + if (trainOfMain != null) { + if (mainCartHasTrain && !loadedFromChunk) + flipTrain(world, trainOfMain); + train.mergeOnto(world, trainOfMain); + train = null; + } + + // ...add the new train otherwise + if (train != null) + trains.put(train.getId(), train); + } + + loadedCouplings.get(world) + .put(coupling.getId(), coupling); + if (!loadedFromChunk) + coupling.writeToCarts(); + } + + public static void flipTrain(World world, MinecartTrain train) { + Map map = loadedTrains.get(world); + map.remove(train.getId()); + train.flip(world); + map.put(train.getId(), train); + } + + public static MinecartCoupling getCoupling(World world, UUID id) { + Map map = loadedCouplings.get(world); + return map.get(id); + } + + public static void flipCoupling(World world, MinecartCoupling coupling) { + Map map = loadedCouplings.get(world); + map.remove(coupling.getId()); + + if (coupling.areBothEndsPresent()) { + Couple carts = coupling.asCouple(); + Couple ids = carts.map(Entity::getUniqueID); + carts.map(c -> c.isBeingRidden() ? c.getPassengers() + .get(0) : null) + .map(c -> c instanceof ContraptionEntity ? (ContraptionEntity) c : null) + .forEachWithContext((contraption, current) -> { + if (contraption == null || contraption.getCouplingId() == null) + return; + boolean switchTo = contraption.getCouplingId() + .equals(ids.get(current)) ? !current : current; + if (!carts.get(switchTo).getUniqueID().equals(contraption.getCoupledCart())) + return; + contraption.setCouplingId(ids.get(switchTo)); + contraption.setCoupledCart(ids.get(!switchTo)); + }); + } + + coupling.flip(); + map.put(coupling.getId(), coupling); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java new file mode 100644 index 000000000..ba6f13fd7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import com.simibubi.create.AllItems; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResultType; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class MinecartCouplingItem extends Item { + + public MinecartCouplingItem(Properties p_i48487_1_) { + super(p_i48487_1_); + } + + @SubscribeEvent + public static void couplingItemCanBeUsedOnMinecarts(PlayerInteractEvent.EntityInteract event) { + Entity interacted = event.getTarget(); + if (!(interacted instanceof AbstractMinecartEntity)) + return; + AbstractMinecartEntity minecart = (AbstractMinecartEntity) interacted; + PlayerEntity player = event.getPlayer(); + if (player == null) + return; + ItemStack heldItem = player.getHeldItem(event.getHand()); + if (!AllItems.MINECART_COUPLING.isIn(heldItem)) + return; + + World world = event.getWorld(); + if (MinecartCouplingSerializer.getCouplingData(minecart).size() < 2) { + if (world != null && world.isRemote) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> cartClicked(player, minecart)); + } + + event.setCanceled(true); + event.setCancellationResult(ActionResultType.SUCCESS); + } + + @OnlyIn(Dist.CLIENT) + private static void cartClicked(PlayerEntity player, AbstractMinecartEntity interacted) { + ClientMinecartCouplingHandler.onCartClicked(player, (AbstractMinecartEntity) interacted); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingRenderer.java new file mode 100644 index 000000000..90fe48243 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingRenderer.java @@ -0,0 +1,197 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import static net.minecraft.util.math.MathHelper.lerp; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +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 MinecartCouplingRenderer { + + public static void renderCoupling(MatrixStack ms, IRenderTypeBuffer buffer, MinecartCoupling coupling) { + if (!coupling.areBothEndsPresent()) + return; + ClientWorld world = Minecraft.getInstance().world; + Couple carts = coupling.asCouple(); + Couple lightValues = + carts.map(c -> WorldRenderer.getLightmapCoordinates(world, new BlockPos(c.getBoundingBox() + .getCenter()))); + + Vec3d center = carts.getFirst() + .getPositionVec() + .add(carts.getSecond() + .getPositionVec()) + .scale(.5f); + + Couple transforms = carts.map(c -> getSuitableCartEndpoint(c, center)); + + BlockState renderState = Blocks.AIR.getDefaultState(); + IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); + SuperByteBuffer attachment = AllBlockPartials.COUPLING_ATTACHMENT.renderOn(renderState); + SuperByteBuffer ring = AllBlockPartials.COUPLING_RING.renderOn(renderState); + SuperByteBuffer connector = AllBlockPartials.COUPLING_CONNECTOR.renderOn(renderState); + + Vec3d zero = Vec3d.ZERO; + Vec3d firstEndpoint = transforms.getFirst() + .apply(zero); + Vec3d secondEndpoint = transforms.getSecond() + .apply(zero); + Vec3d endPointDiff = secondEndpoint.subtract(firstEndpoint); + double connectorYaw = -Math.atan2(endPointDiff.z, endPointDiff.x) * 180.0D / Math.PI; + double connectorPitch = Math.atan2(endPointDiff.y, endPointDiff.mul(1, 0, 1) + .length()) * 180 / Math.PI; + + MatrixStacker msr = MatrixStacker.of(ms); + carts.forEachWithContext((cart, isFirst) -> { + CartEndpoint cartTransform = transforms.get(isFirst); + + ms.push(); + cartTransform.apply(ms); + attachment.light(lightValues.get(isFirst)) + .renderInto(ms, builder); + msr.rotateY(connectorYaw - cartTransform.yaw); + ring.light(lightValues.get(isFirst)) + .renderInto(ms, builder); + ms.pop(); + }); + + int l1 = lightValues.getFirst(); + int l2 = lightValues.getSecond(); + int meanBlockLight = (((l1 >> 4) & 0xf) + ((l2 >> 4) & 0xf)) / 2; + int meanSkyLight = (((l1 >> 20) & 0xf) + ((l2 >> 20) & 0xf)) / 2; + + ms.push(); + msr.translate(firstEndpoint) + .rotateY(connectorYaw) + .rotateZ(connectorPitch); + ms.scale((float) endPointDiff.length(), 1, 1); + + connector.light(meanSkyLight << 20 | meanBlockLight << 4) + .renderInto(ms, builder); + ms.pop(); + } + + private static CartEndpoint getSuitableCartEndpoint(AbstractMinecartEntity cart, Vec3d centerOfCoupling) { + long i = cart.getEntityId() * 493286711L; + i = i * i * 4392167121L + i * 98761L; + float x = (((float) (i >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float y = (((float) (i >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F + 0.375F; + float z = (((float) (i >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + double xIn = lerp(pt, cart.lastTickPosX, cart.getX()); + double yIn = lerp(pt, cart.lastTickPosY, cart.getY()); + double zIn = lerp(pt, cart.lastTickPosZ, cart.getZ()); + + float yaw = lerp(pt, cart.prevRotationYaw, cart.rotationYaw); + float pitch = lerp(pt, cart.prevRotationPitch, cart.rotationPitch); + float roll = cart.getRollingAmplitude() - pt; + + float rollAmplifier = cart.getDamage() - pt; + if (rollAmplifier < 0.0F) + rollAmplifier = 0.0F; + roll = roll > 0 ? MathHelper.sin(roll) * roll * rollAmplifier / 10.0F * cart.getRollingDirection() : 0; + + Vec3d positionVec = new Vec3d(xIn, yIn, zIn); + Vec3d frontVec = positionVec.add(VecHelper.rotate(new Vec3d(.5, 0, 0), 180 - yaw, Axis.Y)); + Vec3d backVec = positionVec.add(VecHelper.rotate(new Vec3d(-.5, 0, 0), 180 - yaw, Axis.Y)); + + Vec3d railVecOfPos = cart.getPos(xIn, yIn, zIn); + boolean flip = false; + + if (railVecOfPos != null) { + frontVec = cart.getPosOffset(xIn, yIn, zIn, (double) 0.3F); + backVec = cart.getPosOffset(xIn, yIn, zIn, (double) -0.3F); + if (frontVec == null) + frontVec = railVecOfPos; + if (backVec == null) + backVec = railVecOfPos; + + x += railVecOfPos.x; + y += (frontVec.y + backVec.y) / 2; + z += railVecOfPos.z; + + Vec3d endPointDiff = backVec.add(-frontVec.x, -frontVec.y, -frontVec.z); + if (endPointDiff.length() != 0.0D) { + endPointDiff = endPointDiff.normalize(); + yaw = (float) (Math.atan2(endPointDiff.z, endPointDiff.x) * 180.0D / Math.PI); + pitch = (float) (Math.atan(endPointDiff.y) * 73.0D); + } + } else { + x += xIn; + y += yIn; + z += zIn; + } + + final float offsetMagnitude = 13 / 16f; + boolean isBackFaceCloser = + frontVec.squareDistanceTo(centerOfCoupling) > backVec.squareDistanceTo(centerOfCoupling); + flip = isBackFaceCloser; + float offset = isBackFaceCloser ? -offsetMagnitude : offsetMagnitude; + + return new CartEndpoint(x, y + 2 / 16f, z, 180 - yaw, -pitch, roll, offset, flip); + } + + static class CartEndpoint { + + float x; + float y; + float z; + float yaw; + float pitch; + float roll; + float offset; + boolean flip; + + public CartEndpoint(float x, float y, float z, float yaw, float pitch, float roll, float offset, boolean flip) { + this.x = x; + this.y = y; + this.z = z; + this.yaw = yaw; + this.pitch = pitch; + this.roll = roll; + this.offset = offset; + this.flip = flip; + } + + public Vec3d apply(Vec3d vec) { + vec = vec.add(offset, 0, 0); + vec = VecHelper.rotate(vec, roll, Axis.X); + vec = VecHelper.rotate(vec, pitch, Axis.Z); + vec = VecHelper.rotate(vec, yaw, Axis.Y); + return vec.add(x, y, z); + } + + public void apply(MatrixStack ms) { + ms.translate(x, y, z); + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(yaw)); + ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(pitch)); + ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(roll)); + ms.translate(offset, 0, 0); + if (flip) + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(180)); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSerializer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSerializer.java new file mode 100644 index 000000000..1743a5de8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSerializer.java @@ -0,0 +1,65 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraftforge.common.util.Constants.NBT; + +public class MinecartCouplingSerializer { + + public static void addCouplingToCart(AbstractMinecartEntity minecart, MinecartCoupling coupling) { + CompoundNBT nbt = minecart.getPersistentData(); + ListNBT couplingList = nbt.getList("Couplings", NBT.TAG_COMPOUND); + boolean main = coupling.mainCart.get() == minecart; + couplingList.add(createCouplingTag(main, coupling)); + nbt.put("Couplings", couplingList); + } + + public static void removeCouplingFromCart(AbstractMinecartEntity minecart, MinecartCoupling coupling) { + CompoundNBT nbt = minecart.getPersistentData(); + ListNBT couplingList = nbt.getList("Couplings", NBT.TAG_COMPOUND); + couplingList.removeIf(inbt -> coupling.getId() + .equals(NBTUtil.readUniqueId(((CompoundNBT) inbt).getCompound("Id")))); + nbt.put("Couplings", couplingList); + } + + private static CompoundNBT createCouplingTag(boolean main, MinecartCoupling coupling) { + CompoundNBT nbt = new CompoundNBT(); + nbt.put("Id", NBTUtil.writeUniqueId(coupling.getId())); + nbt.putBoolean("Main", main); + nbt.putDouble("Length", coupling.length); + return nbt; + } + + public static List getCouplingData(AbstractMinecartEntity minecart) { + List list = new ArrayList<>(); + CompoundNBT nbt = minecart.getPersistentData(); + NBTHelper.iterateCompoundList(nbt.getList("Couplings", NBT.TAG_COMPOUND), c -> { + boolean main = c.getBoolean("Main"); + UUID id = NBTUtil.readUniqueId(c.getCompound("Id")); + double length = c.getDouble("Length"); + list.add(new CouplingData(main, id, length)); + }); + return list; + } + + static class CouplingData { + boolean main; + UUID id; + double length; + + public CouplingData(boolean main, UUID id, double length) { + this.main = main; + this.id = id; + this.length = length; + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSyncPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSyncPacket.java new file mode 100644 index 000000000..293a41003 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingSyncPacket.java @@ -0,0 +1,31 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.function.Supplier; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class MinecartCouplingSyncPacket extends MinecartCouplingCreationPacket { + + public MinecartCouplingSyncPacket(AbstractMinecartEntity cart1, AbstractMinecartEntity cart2) { + super(cart1, cart2); + } + + public MinecartCouplingSyncPacket(PacketBuffer buffer) { + super(buffer); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> MinecartCouplingHandler.connectCarts(null, Minecraft.getInstance().world, id1, id2)); + context.get() + .setPacketHandled(true); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java new file mode 100644 index 000000000..b3f4d5b01 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java @@ -0,0 +1,222 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import static net.minecraft.entity.Entity.horizontalMag; + +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; +import com.mojang.datafixers.util.Pair; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; + +import net.minecraft.block.AbstractRailBlock; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; +import net.minecraft.state.properties.RailShape; +import net.minecraft.util.Direction; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public class MinecartSim2020 { + + private static final Map> MATRIX = + Util.make(Maps.newEnumMap(RailShape.class), (p_226574_0_) -> { + Vec3i vec3i = Direction.WEST.getDirectionVec(); + Vec3i vec3i1 = Direction.EAST.getDirectionVec(); + Vec3i vec3i2 = Direction.NORTH.getDirectionVec(); + Vec3i vec3i3 = Direction.SOUTH.getDirectionVec(); + Vec3i vec3i4 = vec3i.down(); + Vec3i vec3i5 = vec3i1.down(); + Vec3i vec3i6 = vec3i2.down(); + Vec3i vec3i7 = vec3i3.down(); + p_226574_0_.put(RailShape.NORTH_SOUTH, Pair.of(vec3i2, vec3i3)); + p_226574_0_.put(RailShape.EAST_WEST, Pair.of(vec3i, vec3i1)); + p_226574_0_.put(RailShape.ASCENDING_EAST, Pair.of(vec3i4, vec3i1)); + p_226574_0_.put(RailShape.ASCENDING_WEST, Pair.of(vec3i, vec3i5)); + p_226574_0_.put(RailShape.ASCENDING_NORTH, Pair.of(vec3i2, vec3i7)); + p_226574_0_.put(RailShape.ASCENDING_SOUTH, Pair.of(vec3i6, vec3i3)); + p_226574_0_.put(RailShape.SOUTH_EAST, Pair.of(vec3i3, vec3i1)); + p_226574_0_.put(RailShape.SOUTH_WEST, Pair.of(vec3i3, vec3i)); + p_226574_0_.put(RailShape.NORTH_WEST, Pair.of(vec3i2, vec3i)); + p_226574_0_.put(RailShape.NORTH_EAST, Pair.of(vec3i2, vec3i1)); + }); + + public static Vec3d predictMotionOf(AbstractMinecartEntity cart) { + if (cart instanceof FurnaceMinecartEntity) { + return cart.getPositionVec() + .subtract(cart.lastTickPosX, cart.lastTickPosY, cart.lastTickPosZ); + } + return cart.getMotion().scale(1.03f); +// if (cart instanceof ContainerMinecartEntity) { +// ContainerMinecartEntity containerCart = (ContainerMinecartEntity) cart; +// float f = 0.98F; +// if (containerCart.isEmpty()) +// return cart.getMotion() +// .mul(f, 0.0D, f); +// int i = 15 - Container.calcRedstoneFromInventory(containerCart); +// f += (float) i * 0.001F; +// return cart.getMotion() +// .mul(f, 0.0D, f); +// } +// return cart.getMotion() +// .scale(cart.isBeingRidden() ? 0.997D : 0.96D); + } + + public static boolean canAddMotion(AbstractMinecartEntity c) { + if (c instanceof FurnaceMinecartEntity) + return MathHelper.epsilonEquals(((FurnaceMinecartEntity) c).pushX, 0) + && MathHelper.epsilonEquals(((FurnaceMinecartEntity) c).pushZ, 0); + List passengers = c.getPassengers(); + if (passengers.isEmpty()) + return true; + for (Entity entity : passengers) { + if (entity instanceof ContraptionEntity) { + ContraptionEntity contraptionEntity = (ContraptionEntity) entity; + return !contraptionEntity.isStalled(); + } + } + return true; + } + + public static void moveCartAlongTrack(AbstractMinecartEntity cart, Vec3d forcedMovement, BlockPos cartPos, + BlockState trackState) { + + if (forcedMovement.equals(Vec3d.ZERO)) + return; + + Vec3d previousMotion = cart.getMotion(); + cart.fallDistance = 0.0F; + + double x = cart.getX(); + double y = cart.getY(); + double z = cart.getZ(); + + double actualX = x; + double actualY = y; + double actualZ = z; + + Vec3d actualVec = cart.getPos(actualX, actualY, actualZ); + actualY = cartPos.getY() + 1; + + AbstractRailBlock abstractrailblock = (AbstractRailBlock) trackState.getBlock(); + RailShape railshape = abstractrailblock.getRailDirection(trackState, cart.world, cartPos, cart); + switch (railshape) { + case ASCENDING_EAST: + forcedMovement = forcedMovement.add(-1 * cart.getSlopeAdjustment(), 0.0D, 0.0D); + actualY++; + break; + case ASCENDING_WEST: + forcedMovement = forcedMovement.add(cart.getSlopeAdjustment(), 0.0D, 0.0D); + actualY++; + break; + case ASCENDING_NORTH: + forcedMovement = forcedMovement.add(0.0D, 0.0D, cart.getSlopeAdjustment()); + actualY++; + break; + case ASCENDING_SOUTH: + forcedMovement = forcedMovement.add(0.0D, 0.0D, -1 * cart.getSlopeAdjustment()); + actualY++; + default: + break; + } + + Pair pair = MATRIX.get(railshape); + Vec3i vec3i = pair.getFirst(); + Vec3i vec3i1 = pair.getSecond(); + double d4 = (double) (vec3i1.getX() - vec3i.getX()); + double d5 = (double) (vec3i1.getZ() - vec3i.getZ()); +// double d6 = Math.sqrt(d4 * d4 + d5 * d5); + double d7 = forcedMovement.x * d4 + forcedMovement.z * d5; + if (d7 < 0.0D) { + d4 = -d4; + d5 = -d5; + } + + double d23 = (double) cartPos.getX() + 0.5D + (double) vec3i.getX() * 0.5D; + double d10 = (double) cartPos.getZ() + 0.5D + (double) vec3i.getZ() * 0.5D; + double d12 = (double) cartPos.getX() + 0.5D + (double) vec3i1.getX() * 0.5D; + double d13 = (double) cartPos.getZ() + 0.5D + (double) vec3i1.getZ() * 0.5D; + d4 = d12 - d23; + d5 = d13 - d10; + double d14; + if (d4 == 0.0D) { + d14 = actualZ - (double) cartPos.getZ(); + } else if (d5 == 0.0D) { + d14 = actualX - (double) cartPos.getX(); + } else { + double d15 = actualX - d23; + double d16 = actualZ - d10; + d14 = (d15 * d4 + d16 * d5) * 2.0D; + } + + actualX = d23 + d4 * d14; + actualZ = d10 + d5 * d14; + + cart.setPosition(actualX, actualY, actualZ); + cart.setMotion(forcedMovement); + cart.moveMinecartOnRail(cartPos); + + x = cart.getX(); + y = cart.getY(); + z = cart.getZ(); + + if (vec3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i.getX() + && MathHelper.floor(z) - cartPos.getZ() == vec3i.getZ()) { + cart.setPosition(x, y + (double) vec3i.getY(), z); + } else if (vec3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i1.getX() + && MathHelper.floor(z) - cartPos.getZ() == vec3i1.getZ()) { + cart.setPosition(x, y + (double) vec3i1.getY(), z); + } + + x = cart.getX(); + y = cart.getY(); + z = cart.getZ(); + + Vec3d vec3d3 = cart.getPos(x, y, z); + if (vec3d3 != null && actualVec != null) { + double d17 = (actualVec.y - vec3d3.y) * 0.05D; + Vec3d vec3d4 = cart.getMotion(); + double d18 = Math.sqrt(horizontalMag(vec3d4)); + if (d18 > 0.0D) { + cart.setMotion(vec3d4.mul((d18 + d17) / d18, 1.0D, (d18 + d17) / d18)); + } + + cart.setPosition(x, vec3d3.y, z); + } + + x = cart.getX(); + y = cart.getY(); + z = cart.getZ(); + + int j = MathHelper.floor(x); + int i = MathHelper.floor(z); + if (j != cartPos.getX() || i != cartPos.getZ()) { + Vec3d vec3d5 = cart.getMotion(); + double d26 = Math.sqrt(horizontalMag(vec3d5)); + cart.setMotion(d26 * (double) (j - cartPos.getX()), vec3d5.y, d26 * (double) (i - cartPos.getZ())); + } + + cart.setMotion(previousMotion); + + if (cart instanceof FurnaceMinecartEntity) { +// FurnaceMinecartEntity furnaceCart = (FurnaceMinecartEntity) cart; +// Vec3d vec3d = cart.getMotion(); +// double d2 = horizontalMag(vec3d); +// double d3 = furnaceCart.pushX * furnaceCart.pushX + furnaceCart.pushZ * furnaceCart.pushZ; +// if (d3 > 1.0E-4D && d2 > 0.001D) { +// double d40 = (double) MathHelper.sqrt(d2); +// double d50 = (double) MathHelper.sqrt(d3); +// furnaceCart.pushX = vec3d.x / d40 * d50; +// furnaceCart.pushZ = vec3d.z / d40 * d50; +// furnaceCart.setMotion(vec3d.mul(0.8D, 0.0D, 0.8D) +// .add(furnaceCart.pushX, 0.0D, furnaceCart.pushZ)); +// } + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java new file mode 100644 index 000000000..987e73920 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java @@ -0,0 +1,367 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.UUID; + +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.AbstractRailBlock; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.state.properties.RailShape; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class MinecartTrain { + + protected ArrayList couplings; + protected double momentum; + boolean complete; + + public MinecartTrain(MinecartCoupling coupling) { + couplings = new ArrayList<>(); + couplings.add(coupling); + tickOrder = 1; // start at most stressed + } + + public void flip(World world) { + Collections.reverse(couplings); + couplings.forEach(c -> MinecartCouplingHandler.flipCoupling(world, c)); + } + + public void mergeOnto(World world, MinecartTrain other) { + AbstractMinecartEntity trailingOfOther = other.couplings.get(other.couplings.size() - 1).connectedCart.get(); + AbstractMinecartEntity leadingOfThis = couplings.get(0).mainCart.get(); + + if (trailingOfOther != leadingOfThis) + flip(world); + + other.couplings.addAll(couplings); + } + + public int tickOrder; + + public void tickCouplings(World world) { + + // SOFT collision - modify motion of carts with stressed links @t+1 + double sharedMotion = 0; + int participants = 0; + for (int i = 0; i < couplings.size(); i++) { + MinecartCoupling minecartCoupling = couplings.get(i); + boolean last = i + 1 == couplings.size(); + if (!minecartCoupling.areBothEndsPresent()) + continue; + participants++; + sharedMotion += minecartCoupling.mainCart.get() + .getMotion() + .length(); + + if (last) { + participants++; + sharedMotion += minecartCoupling.connectedCart.get() + .getMotion() + .length(); + } + } + + if (participants == 0) + return; + + sharedMotion /= participants; + + /* + * Tick order testing: 0: start from motion outlier 1: start at most stressed + * coupling 2: start at front 3: start at back + */ + + if (tickOrder == 0) { + // Iterate starting from biggest outlier in motion + double maxDiff = 0; + int argMax = 0; + for (int i = 0; i < couplings.size(); i++) { + MinecartCoupling minecartCoupling = couplings.get(i); + boolean last = i + 1 == couplings.size(); + if (!minecartCoupling.areBothEndsPresent()) + continue; + + double diff = Math.abs(minecartCoupling.mainCart.get() + .getMotion() + .length() - sharedMotion); + if (diff > maxDiff) { + maxDiff = diff; + argMax = i; + } + + if (last) { + diff = Math.abs(minecartCoupling.connectedCart.get() + .getMotion() + .length() - sharedMotion); + if (diff > maxDiff) { + maxDiff = diff; + argMax = i; + } + } + } + + for (boolean hard : Iterate.trueAndFalse) { + for (int i = argMax - 1; i >= 0; i--) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + for (int i = argMax; i < couplings.size(); i++) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + } + return; + } + + if (tickOrder == 1) { + // Iterate starting from biggest stress + double maxStress = 0; + int argMax = 0; + for (int i = 0; i < couplings.size(); i++) { + MinecartCoupling minecartCoupling = couplings.get(i); + if (!minecartCoupling.areBothEndsPresent()) + continue; + double stress = getStressOfCoupling(minecartCoupling); + if (stress > maxStress) { + maxStress = stress; + argMax = i; + } + } + + for (boolean hard : Iterate.trueAndFalse) { + for (int i = argMax - 1; i >= 0; i--) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + for (int i = argMax; i < couplings.size(); i++) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + } + return; + } + + if (momentum >= 0 == (tickOrder == 2)) { + // Iterate front to back + for (boolean hard : Iterate.trueAndFalse) + for (int i = 0; i < couplings.size(); i++) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + + } else { + // Iterate back to front + for (boolean hard : Iterate.trueAndFalse) + for (int i = couplings.size() - 1; i >= 0; i--) + if (couplings.get(i) + .areBothEndsPresent()) + collisionStep(world, couplings.get(i) + .asCouple() + .swap(), couplings.get(i).length, hard); + } + + } + + private float getStressOfCoupling(MinecartCoupling coupling) { + if (!coupling.areBothEndsPresent()) + return 0; + return (float) (coupling.length - coupling.mainCart.get() + .getPositionVec() + .distanceTo(coupling.connectedCart.get() + .getPositionVec())); + } + + public void collisionStep(World world, Couple carts, double couplingLength, boolean hard) { + if (hard) + hardCollisionStep(world, carts, couplingLength); + else + softCollisionStep(world, carts, couplingLength); + } + + public void hardCollisionStep(World world, Couple carts, double couplingLength) { + Couple corrections = Couple.create(null, null); + Couple maxSpeed = carts.map(AbstractMinecartEntity::getMaxCartSpeedOnRail); + boolean firstLoop = true; + for (boolean current : new boolean[] { true, false, true }) { + AbstractMinecartEntity cart = carts.get(current); + AbstractMinecartEntity otherCart = carts.get(!current); + + float stress = (float) (couplingLength - cart.getPositionVec() + .distanceTo(otherCart.getPositionVec())); + + RailShape shape = null; + BlockPos railPosition = cart.getCurrentRailPosition(); + BlockState railState = world.getBlockState(railPosition.up()); + + if (railState.getBlock() instanceof AbstractRailBlock) { + AbstractRailBlock block = (AbstractRailBlock) railState.getBlock(); + shape = block.getRailDirection(railState, world, railPosition, cart); + } + + Vec3d correction = Vec3d.ZERO; + Vec3d pos = cart.getPositionVec(); + Vec3d link = otherCart.getPositionVec() + .subtract(pos); + float correctionMagnitude = firstLoop ? -stress / 2f : -stress; + correction = shape != null ? followLinkOnRail(link, pos, correctionMagnitude, shape).subtract(pos) + : link.normalize() + .scale(correctionMagnitude); + + float maxResolveSpeed = 1.75f; + correction = VecHelper.clamp(correction, Math.min(maxResolveSpeed, maxSpeed.get(current))); + + if (corrections.get(current) == null) + corrections.set(current, correction); + + if (shape != null) + MinecartSim2020.moveCartAlongTrack(cart, correction, railPosition, railState); + else { + cart.move(MoverType.SELF, correction); + cart.setMotion(cart.getMotion() + .scale(0.5f)); + } + firstLoop = false; + } + } + + public void softCollisionStep(World world, Couple carts, double couplingLength) { + + Couple positions = carts.map(Entity::getPositionVector); + Couple maxSpeed = carts.map(AbstractMinecartEntity::getMaxCartSpeedOnRail); + Couple canAddmotion = carts.map(MinecartSim2020::canAddMotion); + + Couple shapes = carts.map(current -> { + BlockPos railPosition = current.getCurrentRailPosition(); + BlockState railState = world.getBlockState(railPosition.up()); + if (!(railState.getBlock() instanceof AbstractRailBlock)) + return null; + AbstractRailBlock block = (AbstractRailBlock) railState.getBlock(); + return block.getRailDirection(railState, world, railPosition, current); + }); + + Couple motions = carts.map(MinecartSim2020::predictMotionOf); + Couple nextPositions = positions.copy(); + nextPositions.replaceWithParams(Vec3d::add, motions); + + float futureStress = (float) (couplingLength - nextPositions.getFirst() + .distanceTo(nextPositions.getSecond())); + if (Math.abs(futureStress) < 1 / 128f) + return; + + for (boolean current : Iterate.trueAndFalse) { + Vec3d correction = Vec3d.ZERO; + Vec3d pos = nextPositions.get(current); + Vec3d link = nextPositions.get(!current) + .subtract(pos); + float correctionMagnitude = -futureStress / 2f; + + if (canAddmotion.get(current) != canAddmotion.get(!current)) + correctionMagnitude = !canAddmotion.get(current) ? 0 : correctionMagnitude * 2; + + RailShape shape = shapes.get(current); + correction = shape != null ? followLinkOnRail(link, pos, correctionMagnitude, shape).subtract(pos) + : link.normalize() + .scale(correctionMagnitude); + correction = VecHelper.clamp(correction, maxSpeed.get(current)); + motions.set(current, motions.get(current) + .add(correction)); + } + + motions.replaceWithParams(VecHelper::clamp, maxSpeed); + carts.forEachWithParams(Entity::setMotion, motions); + } + + public static Vec3d followLinkOnRail(Vec3d link, Vec3d cart, float diffToReduce, RailShape shape) { + Vec3d railAxis = getRailVec(shape); + double dotProduct = railAxis.dotProduct(link); + if (Double.isNaN(dotProduct) || dotProduct == 0 || diffToReduce == 0) + return cart; + + Vec3d axis = railAxis.scale(-Math.signum(dotProduct)); + Vec3d center = cart.add(link); + double radius = link.length() - diffToReduce; + Vec3d intersectSphere = VecHelper.intersectSphere(cart, axis, center, radius); + + // Cannot satisfy on current rail vector + if (intersectSphere == null) + return cart.add(VecHelper.project(link, axis)); + + return intersectSphere; + } + + private static Vec3d getRailVec(RailShape shape) { + switch (shape) { + case ASCENDING_NORTH: + case ASCENDING_SOUTH: + case NORTH_SOUTH: + return new Vec3d(0, 0, 1); + case ASCENDING_EAST: + case ASCENDING_WEST: + case EAST_WEST: + return new Vec3d(1, 0, 0); + case NORTH_EAST: + case SOUTH_WEST: + return new Vec3d(1, 0, 1).normalize(); + case NORTH_WEST: + case SOUTH_EAST: + return new Vec3d(1, 0, -1).normalize(); + default: + return new Vec3d(0, 1, 0); + } + } + + public UUID getId() { + return couplings.get(0) + .getId(); + } + + public static void doDebugRender(World world, MinecartCoupling coupling, int index) { + AbstractMinecartEntity mainCart = coupling.mainCart.get(); + AbstractMinecartEntity connectedCart = coupling.connectedCart.get(); + + if (!coupling.areBothEndsPresent()) + return; + + int yOffset = 1; + Vec3d mainCenter = mainCart.getPositionVec() + .add(0, yOffset, 0); + Vec3d connectedCenter = connectedCart.getPositionVec() + .add(0, yOffset, 0); + + int color = ColorHelper.mixColors(0xabf0e9, 0xee8572, + (float) MathHelper.clamp(Math.abs(coupling.length - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); + + CreateClient.outliner.showLine(coupling + "" + index, mainCenter, connectedCenter) + .colored(color) + .lineWidth(1 / 8f); + + Vec3d point = mainCart.getPositionVec() + .add(0, yOffset, 0); + CreateClient.outliner.showLine(coupling.getId() + "" + index, point, point.add(0, 1 / 128f, 0)) + .colored(0xffffff) + .lineWidth(1 / 4f); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacket.java new file mode 100644 index 000000000..1504b6200 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacket.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.function.Supplier; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class PersistantDataPacket extends PersistantDataPacketRequest { + + CompoundNBT persistentData; + + public PersistantDataPacket(Entity entity) { + super(entity); + persistentData = entity.getPersistentData(); + } + + public PersistantDataPacket(PacketBuffer buffer) { + super(buffer); + persistentData = buffer.readCompoundTag(); + } + + @Override + public void write(PacketBuffer buffer) { + super.write(buffer); + buffer.writeCompoundTag(persistentData); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ClientWorld world = Minecraft.getInstance().world; + if (world == null) + return; + Entity entityByID = world.getEntityByID(entityId); + if (entityByID == null) + return; + CompoundNBT persistentData = entityByID.getPersistentData(); + persistentData.merge(this.persistentData); + MinecartCouplingHandler.queueLoadedMinecart(entityByID, world); + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacketRequest.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacketRequest.java new file mode 100644 index 000000000..b641cee8c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/PersistantDataPacketRequest.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.train; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent.Context; +import net.minecraftforge.fml.network.PacketDistributor; + +public class PersistantDataPacketRequest extends SimplePacketBase { + + int entityId; + + public PersistantDataPacketRequest(Entity entity) { + entityId = entity.getEntityId(); + } + + public PersistantDataPacketRequest(PacketBuffer buffer) { + entityId = buffer.readInt(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeInt(entityId); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity sender = context.get() + .getSender(); + if (sender == null || sender.world == null) + return; + Entity entityByID = sender.world.getEntityByID(entityId); + if (entityByID == null) + return; + AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> sender), + new PersistantDataPacket(entityByID)); + }); + context.get() + .setPacketHandled(true); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java index 3232188ea..c7f39e7b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java @@ -24,8 +24,8 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { } @Override - public void read(CompoundNBT compound) { - super.read(compound); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); if (compound.contains("Flows")) { for (Direction d : Direction.values()) setFlow(d, compound.getCompound("Flows") @@ -39,13 +39,13 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { CompoundNBT flows = new CompoundNBT(); for (Direction d : Direction.values()) flows.putFloat(d.getName(), this.flows.get(d)); compound.put("Flows", flows); - return super.write(compound); + super.write(compound, clientPacket); } public void setFlow(Direction direction, float speed) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java index d7ae0d73b..9b03c90d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java @@ -87,17 +87,20 @@ public class CombinedFluidHandler implements IFluidHandler { @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)) { + if (stack.isEmpty() || 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; } + if (stack.isEmpty()) + stack = tanks[i].copy(); + if (stack.isEmpty()) + continue; stack.setAmount(newDrainAmount); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java new file mode 100644 index 000000000..0e9492909 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java @@ -0,0 +1,355 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Pair; + +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.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class FluidNetwork { + + BlockFace pumpLocation; + Map>> pipeGraph; + List flows; + Set targets; + Set rangeEndpoints; + Map previousFlow; + + boolean connectToPumps; + int waitForUnloadedNetwork; + + public FluidNetwork() { + pipeGraph = new HashMap<>(); + flows = new ArrayList<>(); + targets = new HashSet<>(); + rangeEndpoints = new HashSet<>(); + previousFlow = new HashMap<>(); + } + + public boolean hasEndpoints() { + for (FluidNetworkFlow pipeFlow : flows) + if (pipeFlow.hasValidTargets()) + return true; + return false; + } + + public Collection getEndpoints(boolean pulling) { + if (!pulling) { + for (FluidNetworkFlow pipeFlow : flows) + return pipeFlow.outputEndpoints; + return Collections.emptySet(); + } + + List list = new ArrayList<>(); + for (FluidNetworkFlow pipeFlow : flows) { + if (!pipeFlow.hasValidTargets()) + continue; + list.add(pipeFlow.source); + } + return list; + } + + public void tick(IWorld world, PumpTileEntity pumpTE) { + if (connectToPumps) { + connectToOtherFNs(world, pumpTE); + connectToPumps = false; + } + } + + public void tickFlows(IWorld world, PumpTileEntity pumpTE, boolean pulling, float speed) { + if (connectToPumps) + return; + initFlows(pumpTE, pulling); + previousFlow.clear(); + flows.forEach(ep -> ep.tick(world, speed)); + } + + private void initFlows(PumpTileEntity pumpTE, boolean pulling) { + if (targets.isEmpty()) + return; + if (!flows.isEmpty()) + return; + World world = pumpTE.getWorld(); + if (pulling) { + targets.forEach(ne -> flows.add(new FluidNetworkFlow(this, ne, world, pulling))); + } else { + PumpEndpoint pumpEndpoint = new PumpEndpoint(pumpLocation.getOpposite(), pumpTE); + flows.add(new FluidNetworkFlow(this, pumpEndpoint, world, pulling)); + } + } + + public void connectToOtherFNs(IWorld world, PumpTileEntity pump) { + List> frontier = new ArrayList<>(); + Set visited = new HashSet<>(); + int maxDistance = FluidPropagator.getPumpRange() * 2; + frontier.add(Pair.of(-1, pumpLocation.getPos())); + + while (!frontier.isEmpty()) { + Pair entry = frontier.remove(0); + int distance = entry.getFirst(); + BlockPos currentPos = entry.getSecond(); + + if (!world.isAreaLoaded(currentPos, 0)) + continue; + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + + List connections; + if (currentPos.equals(pumpLocation.getPos())) { + connections = ImmutableList.of(pumpLocation.getFace()); + } else { + BlockState currentState = world.getBlockState(currentPos); + FluidPipeBehaviour pipe = FluidPropagator.getPipe(world, currentPos); + if (pipe == null) + continue; + connections = FluidPropagator.getPipeConnections(currentState, pipe); + } + + for (Direction face : connections) { + BlockFace blockFace = new BlockFace(currentPos, face); + BlockPos connectedPos = blockFace.getConnectedPos(); + BlockState connectedState = world.getBlockState(connectedPos); + + if (connectedPos.equals(pumpLocation.getPos())) + continue; + if (!world.isAreaLoaded(connectedPos, 0)) + continue; + if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING) + .getAxis() == face.getAxis()) { + TileEntity tileEntity = world.getTileEntity(connectedPos); + if (tileEntity instanceof PumpTileEntity) { + PumpTileEntity otherPump = (PumpTileEntity) tileEntity; + if (otherPump.networks == null) + continue; + + otherPump.networks.forEach(fn -> { + int nearest = Integer.MAX_VALUE; + BlockFace argNearest = null; + for (BlockFace pumpEndpoint : fn.rangeEndpoints) { + if (pumpEndpoint.isEquivalent(pumpLocation)) { + argNearest = pumpEndpoint; + break; + } + Pair> pair = + pipeGraph.get(pumpEndpoint.getConnectedPos()); + if (pair == null) + continue; + Integer distanceFromPump = pair.getFirst(); + Map pipeConnections = pair.getSecond(); + + if (!pipeConnections.containsKey(pumpEndpoint.getOppositeFace())) + continue; + if (nearest <= distanceFromPump) + continue; + nearest = distanceFromPump; + argNearest = pumpEndpoint; + + } + if (argNearest != null) { + InterPumpEndpoint endpoint = new InterPumpEndpoint(world, argNearest.getOpposite(), + pump, otherPump, pumpLocation, fn.pumpLocation); + targets.add(endpoint); + fn.targets.add(endpoint.opposite(world)); + } + }); + + } + continue; + } + if (visited.contains(connectedPos)) + continue; + if (distance > maxDistance) + continue; + FluidPipeBehaviour targetPipe = FluidPropagator.getPipe(world, connectedPos); + if (targetPipe == null) + continue; + if (targetPipe.isConnectedTo(connectedState, face.getOpposite())) + frontier.add(Pair.of(distance + 1, connectedPos)); + } + } + + } + + public void assemble(IWorld world, PumpTileEntity pumpTE, BlockFace pumpLocation) { + Map openEnds = pumpTE.getOpenEnds(pumpLocation.getFace()); + openEnds.values() + .forEach(OpenEndedPipe::markStale); + + this.pumpLocation = pumpLocation; + if (!collectEndpoint(world, pumpLocation, openEnds, 0)) { + + List> frontier = new ArrayList<>(); + Set visited = new HashSet<>(); + int maxDistance = FluidPropagator.getPumpRange(); + frontier.add(Pair.of(0, pumpLocation.getConnectedPos())); + + while (!frontier.isEmpty()) { + Pair entry = frontier.remove(0); + int distance = entry.getFirst(); + BlockPos currentPos = entry.getSecond(); + + if (!world.isAreaLoaded(currentPos, 0)) + continue; + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + BlockState currentState = world.getBlockState(currentPos); + FluidPipeBehaviour pipe = FluidPropagator.getPipe(world, currentPos); + if (pipe == null) + continue; + + for (Direction face : FluidPropagator.getPipeConnections(currentState, pipe)) { + BlockFace blockFace = new BlockFace(currentPos, face); + BlockPos connectedPos = blockFace.getConnectedPos(); + + if (connectedPos.equals(pumpLocation.getPos())) { + addEntry(blockFace.getPos(), blockFace.getFace(), true, distance); + continue; + } + if (!world.isAreaLoaded(connectedPos, 0)) + continue; + if (collectEndpoint(world, blockFace, openEnds, distance)) + continue; + if (FluidPropagator.getPipe(world, connectedPos) == null) + continue; + if (visited.contains(connectedPos)) + continue; + if (distance + 1 >= maxDistance) { + rangeEndpoints.add(blockFace); + addEntry(currentPos, face, false, distance); + FluidPropagator.showBlockFace(blockFace) + .lineWidth(1 / 8f) + .colored(0xff0000); + continue; + } + + addConnection(connectedPos, currentPos, face.getOpposite(), distance); + frontier.add(Pair.of(distance + 1, connectedPos)); + } + } + } + + Set staleEnds = new HashSet<>(); + openEnds.entrySet() + .forEach(e -> { + if (e.getValue() + .isStale()) + staleEnds.add(e.getKey()); + }); + staleEnds.forEach(openEnds::remove); + + connectToPumps = true; + } + + private FluidNetworkEndpoint reuseOrCreateOpenEnd(IWorld world, Map openEnds, + BlockFace toCreate) { + OpenEndedPipe openEndedPipe = null; + if (openEnds.containsKey(toCreate)) { + openEndedPipe = openEnds.get(toCreate); + openEndedPipe.unmarkStale(); + } else { + openEndedPipe = new OpenEndedPipe(toCreate); + openEnds.put(toCreate, openEndedPipe); + } + return new FluidNetworkEndpoint(world, toCreate, openEndedPipe.getCapability()); + + } + + private boolean collectEndpoint(IWorld world, BlockFace blockFace, Map openEnds, + int distance) { + BlockPos connectedPos = blockFace.getConnectedPos(); + BlockState connectedState = world.getBlockState(connectedPos); + + // other pipe, no endpoint + FluidPipeBehaviour pipe = FluidPropagator.getPipe(world, connectedPos); + if (pipe != null && pipe.isConnectedTo(connectedState, blockFace.getOppositeFace())) + return false; + TileEntity tileEntity = world.getTileEntity(connectedPos); + + // fluid handler endpoint + Direction face = blockFace.getFace(); + if (tileEntity != null) { + LazyOptional capability = + tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, face.getOpposite()); + if (capability.isPresent()) { + targets.add(new FluidNetworkEndpoint(world, blockFace, capability)); + addEntry(blockFace.getPos(), face, false, distance); + FluidPropagator.showBlockFace(blockFace) + .colored(0x00b7c2) + .lineWidth(1 / 8f); + return true; + } + } + + // open endpoint + if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING) + .getAxis() == face.getAxis()) { + rangeEndpoints.add(blockFace); + addEntry(blockFace.getPos(), face, false, distance); + return true; + } + if (!FluidPropagator.isOpenEnd(world, blockFace.getPos(), face)) + return false; + + targets.add(reuseOrCreateOpenEnd(world, openEnds, blockFace)); + addEntry(blockFace.getPos(), face, false, distance); + FluidPropagator.showBlockFace(blockFace) + .colored(0xb700c2) + .lineWidth(1 / 8f); + return true; + } + + private void addConnection(BlockPos from, BlockPos to, Direction direction, int distance) { + addEntry(from, direction, true, distance); + addEntry(to, direction.getOpposite(), false, distance + 1); + } + + private void addEntry(BlockPos pos, Direction direction, boolean outbound, int distance) { + if (!pipeGraph.containsKey(pos)) + pipeGraph.put(pos, Pair.of(distance, new HashMap<>())); + pipeGraph.get(pos) + .getSecond() + .put(direction, outbound); + } + + public void reAssemble(IWorld world, PumpTileEntity pumpTE, BlockFace pumpLocation) { + rangeEndpoints.clear(); + targets.clear(); + pipeGraph.clear(); + assemble(world, pumpTE, pumpLocation); + } + + public void remove(IWorld world) { + clearFlows(world, false); + } + + public void clearFlows(IWorld world, boolean saveState) { + for (FluidNetworkFlow networkFlow : flows) { + if (!networkFlow.getFluidStack() + .isEmpty()) + networkFlow.addToSkippedConnections(world); + networkFlow.resetFlow(world); + } + flows.clear(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkEndpoint.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkEndpoint.java new file mode 100644 index 000000000..e37e0b35c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkEndpoint.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.fluids; + +import com.simibubi.create.foundation.utility.BlockFace; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IWorld; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; + +public class FluidNetworkEndpoint { + BlockFace location; + protected LazyOptional handler; + + public FluidNetworkEndpoint(IWorld world, BlockFace location, LazyOptional handler) { + this.location = location; + this.handler = handler; + this.handler.addListener($ -> onHandlerInvalidated(world)); + } + + protected void onHandlerInvalidated(IWorld world) { + IFluidHandler tank = handler.orElse(null); + if (tank != null) + return; + TileEntity tileEntity = world.getTileEntity(location.getConnectedPos()); + if (tileEntity == null) + return; + LazyOptional capability = + tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, location.getOppositeFace()); + if (capability.isPresent()) { + handler = capability; + handler.addListener($ -> onHandlerInvalidated(world)); + } + } + + public FluidStack provideFluid() { + IFluidHandler tank = provideHandler().orElse(null); + if (tank == null) + return FluidStack.EMPTY; + return tank.drain(1, FluidAction.SIMULATE); + } + + public LazyOptional provideHandler() { + return handler; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java new file mode 100644 index 000000000..9c861bb2e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java @@ -0,0 +1,304 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; + +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.IWorld; +import net.minecraftforge.fluids.FluidStack; + +class FluidNetworkFlow { + + @FunctionalInterface + static interface PipeFlowConsumer { + void accept(FluidPipeBehaviour pipe, Direction face, boolean inbound); + } + + /** + * + */ + private final FluidNetwork activePipeNetwork; + FluidNetworkEndpoint source; + FluidStack fluidStack; + Set flowPointers; + + Set outputEndpoints; + boolean pumpReached; + + boolean pulling; + float speed; + + public FluidNetworkFlow(FluidNetwork activePipeNetwork, FluidNetworkEndpoint source, IWorld world, + boolean pulling) { + this.activePipeNetwork = activePipeNetwork; + this.source = source; + this.pulling = pulling; + flowPointers = new HashSet<>(); + outputEndpoints = new HashSet<>(); + fluidStack = FluidStack.EMPTY; + tick(world, 0); + } + + void resetFlow(IWorld world) { + fluidStack = FluidStack.EMPTY; + flowPointers.clear(); + outputEndpoints.clear(); + pumpReached = false; + forEachPipeFlow(world, (pipe, face, inbound) -> pipe.removeFlow(this, face, inbound)); + } + + void addToSkippedConnections(IWorld world) { + forEachPipeFlow(world, (pipe, face, inbound) -> { + if (!pipe.getFluid().isFluidEqual(fluidStack)) + return; + BlockFace blockFace = new BlockFace(pipe.getPos(), face); + this.activePipeNetwork.previousFlow.put(blockFace, pipe.getFluid()); + }); + } + + void forEachPipeFlow(IWorld world, FluidNetworkFlow.PipeFlowConsumer consumer) { + Set flowPointers = new HashSet<>(); + flowPointers.add(getSource()); + + // Update all branches of this flow, and create new ones if necessary + while (!flowPointers.isEmpty()) { + List toAdd = new ArrayList<>(); + for (Iterator iterator = flowPointers.iterator(); iterator.hasNext();) { + BlockFace flowPointer = iterator.next(); + BlockPos currentPos = flowPointer.getPos(); + FluidPipeBehaviour pipe = getPipeInTree(world, currentPos); + if (pipe == null) { + iterator.remove(); + continue; + } + Map directions = this.activePipeNetwork.pipeGraph.get(currentPos) + .getSecond(); + for (Entry entry : directions.entrySet()) { + boolean inbound = entry.getValue() != pulling; + Direction face = entry.getKey(); + if (inbound && face != flowPointer.getFace()) + continue; + consumer.accept(pipe, face, inbound); + if (inbound) + continue; + toAdd.add(new BlockFace(currentPos.offset(face), face.getOpposite())); + } + iterator.remove(); + } + flowPointers.addAll(toAdd); + } + } + + void tick(IWorld world, float speed) { + boolean skipping = speed == 0; + Map previousFlow = this.activePipeNetwork.previousFlow; + if (skipping && previousFlow.isEmpty()) + return; + + this.speed = speed; + FluidStack provideFluid = source.provideFluid(); + if (!fluidStack.isEmpty() && !fluidStack.isFluidEqual(provideFluid)) { + resetFlow(world); + return; + } + + fluidStack = provideFluid; + + // There is currently no unfinished flow being followed + if (flowPointers.isEmpty()) { + + // The fluid source has run out -> reset + if (fluidStack.isEmpty()) { + if (hasValidTargets()) + resetFlow(world); + return; + } + + // Keep the flows if all is well + if (hasValidTargets()) + return; + + // Start a new flow from or towards the pump + BlockFace source = getSource(); + if (tryConnectTo(world, source.getOpposite())) + return; + flowPointers.add(source); + } + + boolean skipped = false; + Set pausedPointers = new HashSet<>(); + + do { + skipped = false; + List toAdd = null; + + // Update all branches of this flow, and create new ones if necessary + for (Iterator iterator = flowPointers.iterator(); iterator.hasNext();) { + BlockFace flowPointer = iterator.next(); + BlockPos currentPos = flowPointer.getPos(); + + if (pausedPointers.contains(flowPointer)) + continue; + + FluidPipeBehaviour pipe = getPipeInTree(world, currentPos); + if (pipe == null) { + iterator.remove(); + continue; + } + + Map directions = this.activePipeNetwork.pipeGraph.get(currentPos) + .getSecond(); + boolean inboundComplete = false; + boolean allFlowsComplete = true; + BlockState state = world.getBlockState(currentPos); + + // First loop only inbound flows of a pipe to see if they have reached the + // center + for (boolean inboundPass : Iterate.trueAndFalse) { + if (!inboundPass && !inboundComplete) + break; + + // For all connections of the pipe tree of the pump + for (Entry entry : directions.entrySet()) { + Boolean awayFromPump = entry.getValue(); + Direction direction = entry.getKey(); + boolean inbound = awayFromPump != pulling; + + if (inboundPass && direction != flowPointer.getFace()) + continue; + if (!inboundPass && inbound) + continue; + if (!pipe.canTransferToward(fluidStack, state, direction, inbound)) + continue; + + BlockFace blockface = new BlockFace(currentPos, direction); + + if (!pipe.hasStartedFlow(this, direction, inbound)) + pipe.addFlow(this, direction, inbound, false); + if (skipping && canSkip(previousFlow, blockface)) { + pipe.skipFlow(direction, inbound); + FluidPropagator.showBlockFace(blockface) + .colored(0x0) + .lineWidth(1 / 8f); + skipped = true; + } + + if (!pipe.hasCompletedFlow(direction, inbound)) { + allFlowsComplete = false; + continue; + } + + if (inboundPass) { + inboundComplete = true; + continue; + } + + // Outward pass, check if any target was reached + tryConnectTo(world, blockface); + } + } + + if (!allFlowsComplete && !skipping) + continue; + + // Create a new flow branch at each outward pipe connection + for (Entry entry : directions.entrySet()) { + if (entry.getValue() != pulling) + continue; + Direction face = entry.getKey(); + BlockFace addedBlockFace = new BlockFace(currentPos.offset(face), face.getOpposite()); + if (skipping && !canSkip(previousFlow, addedBlockFace)) { + allFlowsComplete = false; + continue; + } + if (toAdd == null) + toAdd = new ArrayList<>(); + toAdd.add(addedBlockFace); + } + + if (!allFlowsComplete && skipping) { + pausedPointers.add(flowPointer); + continue; + } + + iterator.remove(); + + } // End of branch loop + + if (toAdd != null) + flowPointers.addAll(toAdd); + + } while (skipping && skipped); + } + + private boolean canSkip(Map previousFlow, BlockFace blockface) { + return previousFlow.containsKey(blockface) && previousFlow.get(blockface) + .isFluidEqual(fluidStack); + } + + private boolean tryConnectTo(IWorld world, BlockFace blockface) { + // Pulling flow, target is the pump + if (pulling) { + if (!this.activePipeNetwork.pumpLocation.getOpposite() + .equals(blockface)) + return false; + pumpReached = true; + TileEntity targetTE = world.getTileEntity(this.activePipeNetwork.pumpLocation.getPos()); + if (targetTE instanceof PumpTileEntity) + ((PumpTileEntity) targetTE).setProvidedFluid(fluidStack); + FluidPropagator.showBlockFace(this.activePipeNetwork.pumpLocation) + .colored(0x799351) + .lineWidth(1 / 8f); + return true; + } + + // Pushing flow, targets are the endpoints + for (FluidNetworkEndpoint networkEndpoint : this.activePipeNetwork.targets) { + if (!networkEndpoint.location.isEquivalent(blockface)) + continue; + outputEndpoints.add(networkEndpoint); + FluidPropagator.showBlockFace(blockface) + .colored(0x799351) + .lineWidth(1 / 8f); + return !(networkEndpoint instanceof InterPumpEndpoint); + } + + return false; + } + + private BlockFace getSource() { + return pulling ? source.location : this.activePipeNetwork.pumpLocation.getOpposite(); + } + + private FluidPipeBehaviour getPipeInTree(IWorld world, BlockPos currentPos) { + if (!world.isAreaLoaded(currentPos, 0)) + return null; + if (!this.activePipeNetwork.pipeGraph.containsKey(currentPos)) + return null; + return TileEntityBehaviour.get(world, currentPos, FluidPipeBehaviour.TYPE); + } + + boolean hasValidTargets() { + return pumpReached || !outputEndpoints.isEmpty(); + } + + public float getSpeed() { + return speed; + } + + public FluidStack getFluidStack() { + return fluidStack; + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java new file mode 100644 index 000000000..0edd0cfd0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java @@ -0,0 +1,57 @@ +package com.simibubi.create.content.contraptions.fluids; + +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.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; + +public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + + public AttachmentTypes getAttachment(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + if (!isPipeConnectedTowards(state, direction)) + return AttachmentTypes.NONE; + + BlockPos offsetPos = pos.offset(direction); + BlockState facingState = world.getBlockState(offsetPos); + + if (facingState.getBlock() instanceof PumpBlock && facingState.get(PumpBlock.FACING) + .getAxis() == direction.getAxis()) + return AttachmentTypes.NONE; + + if (FluidPropagator.hasFluidCapability(facingState, world, offsetPos, direction)) + return AttachmentTypes.DRAIN; + + return AttachmentTypes.RIM; + } + + public boolean isPipeConnectedTowards(BlockState state, Direction direction) { + FluidPipeBehaviour fluidPipeBehaviour = tileEntity.getBehaviour(FluidPipeBehaviour.TYPE); + if (fluidPipeBehaviour == null) + return false; + return fluidPipeBehaviour.isConnectedTo(state, direction); + } + + public static enum AttachmentTypes { + NONE, RIM, DRAIN; + + public boolean hasModel() { + return this != NONE; + } + } + + public FluidPipeAttachmentBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java new file mode 100644 index 000000000..3010fa403 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java @@ -0,0 +1,524 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.Set; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllSpecialTextures; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.KineticDebugger; +import com.simibubi.create.foundation.fluid.FluidHelper; +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.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.DistExecutor; + +public abstract class FluidPipeBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + + // Direction -> (inboundflows{}, outwardflows{}) + Map> allFlows; + FluidStack fluid; + Couple collision; + + public FluidPipeBehaviour(SmartTileEntity te) { + super(te); + allFlows = new IdentityHashMap<>(); + fluid = FluidStack.EMPTY; + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + public void notifyNetwork() { + FluidPropagator.propagateChangedPipe(this.getWorld(), tileEntity.getPos(), tileEntity.getBlockState()); + } + + public boolean canTransferToward(FluidStack fluid, BlockState state, Direction direction, boolean inbound) { + return isConnectedTo(state, direction); + } + + public abstract boolean isConnectedTo(BlockState state, Direction direction); + + public float getRimRadius(BlockState state, Direction direction) { + return 1 / 4f + 1 / 64f; + } + + public boolean hasStartedFlow(FluidNetworkFlow flow, Direction face, boolean inbound) { + return allFlows.containsKey(face) && allFlows.get(face) + .get(inbound) + .hasFlow(flow); + } + + public boolean hasCompletedFlow(Direction face, boolean inbound) { + return allFlows.containsKey(face) && allFlows.get(face) + .get(inbound) + .isCompleted(); + } + + @Override + public void write(CompoundNBT compound, boolean client) { + compound.put("Fluid", fluid.writeToNBT(new CompoundNBT())); + ListNBT flows = new ListNBT(); + for (Direction face : Iterate.directions) + for (boolean inbound : Iterate.trueAndFalse) { + LerpedFloat flowProgress = getFlowProgress(face, inbound); + if (flowProgress == null) + continue; + CompoundNBT nbt = new CompoundNBT(); + NBTHelper.writeEnum(nbt, "Face", face); + nbt.putBoolean("In", inbound); + PipeFlows pipeFlows = allFlows.get(face) + .get(inbound); + Set participants = pipeFlows.participants; + nbt.putBoolean("Silent", participants == null || participants.isEmpty()); + nbt.put("Progress", flowProgress.writeNBT()); + + if (client) + nbt.putFloat("Strength", pipeFlows.bestFlowStrength); + + flows.add(nbt); + } + compound.put("Flows", flows); + } + + @Override + public void read(CompoundNBT compound, boolean client) { + fluid = FluidStack.loadFluidStackFromNBT(compound.getCompound("Fluid")); + + if (client) { + for (Direction face : Iterate.directions) + if (allFlows.containsKey(face)) + allFlows.get(face) + .forEach(pf -> pf.progress = null); + } + + NBTHelper.iterateCompoundList(compound.getList("Flows", NBT.TAG_COMPOUND), nbt -> { + Direction face = NBTHelper.readEnum(nbt, "Face", Direction.class); + boolean inbound = nbt.getBoolean("In"); + LerpedFloat progress = createFlowProgress(0); + progress.readNBT(nbt.getCompound("Progress"), false); + addFlow(null, face, inbound, nbt.getBoolean("Silent")); + setFlowProgress(face, inbound, progress); + if (client) + setVisualFlowStrength(face, inbound, nbt.getFloat("Strength")); + }); + + if (!client) + return; + + for (Direction face : Iterate.directions) { + if (!allFlows.containsKey(face)) + return; + Couple couple = allFlows.get(face); + if (couple.get(true).progress == null && couple.get(false).progress == null) + allFlows.remove(face); + if (allFlows.isEmpty()) + clear(); + } + } + + public void addFlow(@Nullable FluidNetworkFlow flow, Direction face, boolean inbound, boolean silent) { + if (flow != null) { + FluidStack fluid = flow.getFluidStack(); + if (!this.fluid.isEmpty() && !fluid.isFluidEqual(this.fluid)) { + collision = Couple.create(this.fluid, fluid); + return; + } + this.fluid = fluid; + } + + if (!allFlows.containsKey(face)) { + allFlows.put(face, Couple.create(PipeFlows::new)); + if (inbound && !silent) + spawnSplashOnRim(face); + } + + if (flow != null) { + PipeFlows flows = allFlows.get(face) + .get(inbound); + flows.addFlow(flow); + contentsChanged(); + } + } + + public void removeFlow(FluidNetworkFlow flow, Direction face, boolean inbound) { + if (!allFlows.containsKey(face)) + return; + Couple couple = allFlows.get(face); + couple.get(inbound) + .removeFlow(flow); + contentsChanged(); + if (!couple.get(true) + .isActive() + && !couple.get(false) + .isActive()) + allFlows.remove(face); + if (allFlows.isEmpty()) + clear(); + } + + public void setVisualFlowStrength(Direction face, boolean inbound, float strength) { + if (!allFlows.containsKey(face)) + return; + allFlows.get(face) + .get(inbound).bestFlowStrength = strength; + } + + public void setFlowProgress(Direction face, boolean inbound, LerpedFloat progress) { + if (!allFlows.containsKey(face)) + return; + allFlows.get(face) + .get(inbound).progress = progress; + } + + public LerpedFloat getFlowProgress(Direction face, boolean inbound) { + if (!allFlows.containsKey(face)) + return null; + return allFlows.get(face) + .get(inbound).progress; + } + + public void skipFlow(Direction face, boolean inbound) { + if (!allFlows.containsKey(face)) + return; + Couple couple = allFlows.get(face); + couple.get(inbound) + .skip(); + } + + public void clear() { + allFlows.clear(); + fluid = FluidStack.EMPTY; + contentsChanged(); + } + + public void spawnParticles() { + DistExecutor.runWhenOn(Dist.CLIENT, () -> this::spawnParticlesInner); + } + + public void spawnSplashOnRim(Direction face) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> spawnSplashOnRimInner(face)); + } + + public static final int MAX_PARTICLE_RENDER_DISTANCE = 20; + public static final int SPLASH_PARTICLE_AMOUNT = 1; + public static final float IDLE_PARTICLE_SPAWN_CHANCE = 1 / 800f; + public static final Random r = new Random(); + + @OnlyIn(Dist.CLIENT) + private void spawnParticlesInner() { + if (!isRenderEntityWithinDistance()) + return; + if (fluid.isEmpty()) + return; + + World world = Minecraft.getInstance().world; + BlockPos pos = tileEntity.getPos(); + BlockState state = world.getBlockState(pos); + + for (Direction face : Iterate.directions) { + boolean open = FluidPropagator.isOpenEnd(world, pos, face); + if (isConnectedTo(state, face)) { + if (open) { + spawnPouringLiquid(world, state, fluid, face, 1); + continue; + } + if (r.nextFloat() < IDLE_PARTICLE_SPAWN_CHANCE) + spawnRimParticles(world, state, fluid, face, 1); + } + } + } + + @OnlyIn(Dist.CLIENT) + private void spawnSplashOnRimInner(Direction face) { + if (!isRenderEntityWithinDistance()) + return; + if (fluid.isEmpty()) + return; + World world = Minecraft.getInstance().world; + BlockPos pos = tileEntity.getPos(); + BlockState state = world.getBlockState(pos); + spawnRimParticles(world, state, fluid, face, SPLASH_PARTICLE_AMOUNT); + } + + @OnlyIn(Dist.CLIENT) + private void spawnRimParticles(World world, BlockState state, FluidStack fluid, Direction side, int amount) { + BlockPos pos = tileEntity.getPos(); + if (FluidPropagator.isOpenEnd(world, pos, side)) { + spawnPouringLiquid(world, state, fluid, side, amount); + return; + } + + IParticleData particle = null; + if (FluidHelper.isWater(fluid.getFluid())) + particle = ParticleTypes.DRIPPING_WATER; + if (FluidHelper.isLava(fluid.getFluid())) + particle = ParticleTypes.DRIPPING_LAVA; + // TODO: Generic drip particle type for forge fluids + + if (particle == null) + return; + + float rimRadius = getRimRadius(state, side); + Vec3d directionVec = new Vec3d(side.getDirectionVec()); + + for (int i = 0; i < amount; i++) { + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, 1) + .normalize(); + vec = VecHelper.clampComponentWise(vec, rimRadius) + .mul(VecHelper.axisAlingedPlaneOf(directionVec)) + .add(directionVec.scale(.45 + r.nextFloat() / 16f)); + Vec3d m = vec; + vec = vec.add(VecHelper.getCenterOf(pos)); + + world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + } + } + + @OnlyIn(Dist.CLIENT) + private void spawnPouringLiquid(World world, BlockState state, FluidStack fluid, Direction side, int amount) { + IParticleData particle = new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() + .getDefaultState() + .getBlockState()); + float rimRadius = getRimRadius(state, side); + Vec3d directionVec = new Vec3d(side.getDirectionVec()); + + Couple couple = allFlows.get(side); + if (couple == null) + return; + couple.forEachWithContext((flow, inbound) -> { + if (flow.progress == null) + return; + for (int i = 0; i < amount; i++) { + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, rimRadius); + vec = vec.mul(VecHelper.axisAlingedPlaneOf(directionVec)) + .add(directionVec.scale(.5 + r.nextFloat() / 4f)); + Vec3d m = vec; + Vec3d centerOf = VecHelper.getCenterOf(tileEntity.getPos()); + vec = vec.add(centerOf); + if (inbound) { + vec = vec.add(m); + m = centerOf.add(directionVec.scale(.5)) + .subtract(vec) + .scale(3); + } + world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + } + }); + + } + + @OnlyIn(Dist.CLIENT) + private boolean isRenderEntityWithinDistance() { + Entity renderViewEntity = Minecraft.getInstance() + .getRenderViewEntity(); + if (renderViewEntity == null) + return false; + Vec3d center = VecHelper.getCenterOf(tileEntity.getPos()); + if (renderViewEntity.getPositionVec() + .distanceTo(center) > MAX_PARTICLE_RENDER_DISTANCE) + return false; + return true; + } + + static AxisAlignedBB smallCenter = new AxisAlignedBB(BlockPos.ZERO).shrink(.25); + + @Override + public void tick() { + super.tick(); + boolean isRemote = getWorld().isRemote; + + allFlows.values() + .forEach(c -> c.forEach(pf -> pf.tick(isRemote))); + + if (isRemote) { + clientTick(); + return; + } + + if (collision != null) { + FluidReactions.handlePipeFlowCollision(getWorld(), tileEntity.getPos(), collision.getFirst(), + collision.getSecond()); + collision = null; + return; + } + } + + public Pair getStrogestFlow(Direction side) { + Couple couple = allFlows.get(side); + if (couple == null) + return null; + + PipeFlows in = couple.get(true); + PipeFlows out = couple.get(false); + Couple progress = couple.map(pf -> pf.progress); + boolean inboundStronger = false; + + if (in.isCompleted() != out.isCompleted()) { + inboundStronger = in.isCompleted(); + } else if ((progress.get(true) == null) != (progress.get(false) == null)) { + inboundStronger = progress.get(true) != null; + } else { + if (progress.get(true) != null) + inboundStronger = in.bestFlowStrength > out.bestFlowStrength; + } + + return Pair.of(inboundStronger, progress.get(inboundStronger)); + } + + private void clientTick() { + spawnParticles(); + + if (!KineticDebugger.isActive()) + return; + if (fluid.isEmpty()) + return; + for (Entry> entry : allFlows.entrySet()) { + Direction face = entry.getKey(); + Vec3d directionVec = new Vec3d(face.getDirectionVec()); + float size = 1 / 4f; + boolean extended = !isConnectedTo(tileEntity.getBlockState(), face.getOpposite()); + float length = extended ? .75f : .5f; + + entry.getValue() + .forEachWithContext((flow, inbound) -> { + if (flow.progress == null) + return; + float value = flow.progress.getValue(); + Vec3d start = directionVec.scale(inbound ? .5 : .5f - length); + Vec3d offset = directionVec.scale(length * (inbound ? -1 : 1)) + .scale(value); + + Vec3d scale = new Vec3d(1, 1, 1).subtract(directionVec.scale(face.getAxisDirection() + .getOffset())) + .scale(size); + AxisAlignedBB bb = + new AxisAlignedBB(start, start.add(offset)).offset(VecHelper.getCenterOf(tileEntity.getPos())) + .grow(scale.x, scale.y, scale.z); + + int color = 0x7fdbda; + if (!fluid.isEmpty()) { + Fluid fluid2 = fluid.getFluid(); + if (fluid2 == Fluids.WATER) + color = 0x1D4D9B; + if (fluid2 == Fluids.LAVA) + color = 0xFF773D; + } + + CreateClient.outliner.chaseAABB(Pair.of(this, face), bb) + .withFaceTexture(AllSpecialTextures.CUTOUT_CHECKERED) + .colored(color) + .lineWidth(1 / 16f); + }); + } + } + + private void contentsChanged() { + tileEntity.markDirty(); + tileEntity.sendData(); + } + + private LerpedFloat createFlowProgress(double speed) { + return LerpedFloat.linear() + .startWithValue(0) + .chase(1, speed, Chaser.LINEAR); + } + + public FluidStack getFluid() { + return fluid; + } + + class PipeFlows { + LerpedFloat progress; + Set participants; + float bestFlowStrength; + + void addFlow(FluidNetworkFlow flow) { + if (participants == null) + participants = new HashSet<>(); + participants.add(flow); + + if (progress == null) { + progress = createFlowProgress(flow.getSpeed()); + } + } + + boolean hasFlow(FluidNetworkFlow flow) { + return participants != null && participants.contains(flow); + } + + void tick(boolean onClient) { + if (progress == null) + return; + if (!onClient) { + if (participants == null) + return; + bestFlowStrength = 0; + for (FluidNetworkFlow networkFlow : participants) + bestFlowStrength = Math.max(bestFlowStrength, networkFlow.getSpeed()); + if (isCompleted()) + return; + if (progress.updateChaseSpeed(bestFlowStrength)) + contentsChanged(); + } + progress.tickChaser(); + } + + void skip() { + progress = LerpedFloat.linear() + .startWithValue(1); + } + + void removeFlow(FluidNetworkFlow flow) { + if (participants == null) + return; + participants.remove(flow); + } + + boolean isActive() { + return participants != null && !participants.isEmpty(); + } + + boolean isCompleted() { + return progress != null && progress.getValue() == 1; + } + + } + +} 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 deleted file mode 100644 index bd2126a78..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBlock.java +++ /dev/null @@ -1,157 +0,0 @@ -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.FluidState; -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; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.IBlockDisplayReader; -import net.minecraft.world.IWorld; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; - -import javax.annotation.Nullable; - -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) { - return state.getBlock() instanceof FluidPipeBlock; - } - - 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()).isPresent(); - } - - // TODO: more generic pipe connection handling. Ideally without marker interface - public static boolean canConnectTo(IBlockDisplayReader world, BlockPos pos, BlockState neighbour, Direction blockFace) { - if (isPipe(neighbour) || isTank(neighbour, world, pos, blockFace)) - return true; - return neighbour.getBlock() instanceof PumpBlock && blockFace.getAxis() == neighbour.get(PumpBlock.FACING) - .getAxis(); - } - - public static boolean shouldDrawRim(IBlockDisplayReader world, BlockPos pos, BlockState state, Direction direction) { - if (!isPipe(state)) - return false; - if (!state.get(FACING_TO_PROPERTY_MAP.get(direction))) - return false; - BlockPos offsetPos = pos.offset(direction); - BlockState facingState = world.getBlockState(offsetPos); - if (facingState.getBlock() instanceof PumpBlock && facingState.get(PumpBlock.FACING) - .getAxis() == direction.getAxis()) - return false; - if (!isPipe(facingState)) - return true; - if (!isCornerOrEndPipe(world, pos, state)) - return false; - if (isStraightPipe(world, offsetPos, facingState)) - return true; - if (!shouldDrawCasing(world, pos, state) && shouldDrawCasing(world, offsetPos, facingState)) - return true; - if (isCornerOrEndPipe(world, offsetPos, facingState)) - return direction.getAxisDirection() == AxisDirection.POSITIVE; - return false; - } - - public static boolean isCornerOrEndPipe(IBlockDisplayReader world, BlockPos pos, BlockState state) { - return isPipe(state) && !isStraightPipe(world, pos, state) && !shouldDrawCasing(world, pos, state); - } - - public static boolean isStraightPipe(IBlockDisplayReader world, BlockPos pos, BlockState state) { - if (!isPipe(state)) - return false; - boolean axisFound = false; - for (Axis axis : Iterate.axes) { - Direction d1 = Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis); - Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - if (state.get(FACING_TO_PROPERTY_MAP.get(d1)) && state.get(FACING_TO_PROPERTY_MAP.get(d2))) - if (axisFound) - return false; - else - axisFound = true; - } - return axisFound; - } - - public static boolean shouldDrawCasing(IBlockDisplayReader world, BlockPos pos, BlockState state) { - if (!isPipe(state)) - return false; - for (Axis axis : Iterate.axes) { - int connections = 0; - for (Direction direction : Iterate.directions) - if (direction.getAxis() != axis && state.get(FACING_TO_PROPERTY_MAP.get(direction))) - connections++; - if (connections > 2) - return true; - } - return false; - } - - @Override - protected void fillStateContainer(Builder builder) { - builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); - return updateBlockState(getDefaultState(), context.getNearestLookingDirection(), null, context.getWorld(), - 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); - } - - public BlockState updateBlockState(BlockState state, Direction preferredDirection, @Nullable Direction ignore, - IBlockDisplayReader world, BlockPos pos) { - // Update sides that are not ignored - for (Direction d : Iterate.directions) - if (d != ignore) - state = state.with(FACING_TO_PROPERTY_MAP.get(d), - canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d.getOpposite())); - - // See if it has enough connections - Direction connectedDirection = null; - for (Direction d : Iterate.directions) { - if (state.get(FACING_TO_PROPERTY_MAP.get(d))) { - if (connectedDirection != null) - return state; - connectedDirection = d; - } - } - - // Add opposite end if only one connection - if (connectedDirection != null) - return state.with(FACING_TO_PROPERTY_MAP.get(connectedDirection.getOpposite()), true); - - // Use preferred - return state.with(FACING_TO_PROPERTY_MAP.get(preferredDirection), true) - .with(FACING_TO_PROPERTY_MAP.get(preferredDirection.getOpposite()), true); - } - - @Override - public FluidState 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/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java new file mode 100644 index 000000000..066750b38 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -0,0 +1,192 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang3.mutable.MutableObject; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.fluids.pipes.AxisPipeBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fml.DistExecutor; + +public class FluidPropagator { + + public static Direction validateNeighbourChange(BlockState state, World world, BlockPos pos, Block otherBlock, + BlockPos neighborPos, boolean isMoving) { + if (world.isRemote) + return null; + if (otherBlock instanceof FluidPipeBlock) + return null; + if (otherBlock instanceof AxisPipeBlock) + return null; + if (otherBlock instanceof PumpBlock) + return null; + if (otherBlock instanceof FlowingFluidBlock) + return null; + if (!isStraightPipe(state)) + return null; + for (Direction d : Iterate.directions) { + if (!pos.offset(d) + .equals(neighborPos)) + continue; + return d; + } + return null; + } + + public static FluidPipeBehaviour getPipe(IBlockReader reader, BlockPos pos) { + return TileEntityBehaviour.get(reader, pos, FluidPipeBehaviour.TYPE); + } + + public static boolean isOpenEnd(IBlockReader reader, BlockPos pos, Direction side) { + BlockPos connectedPos = pos.offset(side); + BlockState connectedState = reader.getBlockState(connectedPos); + FluidPipeBehaviour pipe = FluidPropagator.getPipe(reader, connectedPos); + if (pipe != null && pipe.isConnectedTo(connectedState, side.getOpposite())) + return false; + if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING) + .getAxis() == side.getAxis()) + return false; + if (Block.hasSolidSide(connectedState, reader, connectedPos, side.getOpposite())) + return false; + if (!(connectedState.getMaterial() + .isReplaceable() && connectedState.getBlockHardness(reader, connectedPos) != -1) + && !connectedState.has(BlockStateProperties.WATERLOGGED)) + return false; + return true; + } + + public static void propagateChangedPipe(IWorld world, BlockPos pipePos, BlockState pipeState) { + List frontier = new ArrayList<>(); + Set visited = new HashSet<>(); + + frontier.add(pipePos); + + // Visit all connected pumps to update their network + while (!frontier.isEmpty()) { + BlockPos currentPos = frontier.remove(0); + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + BlockState currentState = currentPos.equals(pipePos) ? pipeState : world.getBlockState(currentPos); + FluidPipeBehaviour pipe = getPipe(world, currentPos); + if (pipe == null) + continue; + for (Direction direction : getPipeConnections(currentState, pipe)) { + BlockPos target = currentPos.offset(direction); + if (!world.isAreaLoaded(target, 0)) + continue; + + TileEntity tileEntity = world.getTileEntity(target); + BlockState targetState = world.getBlockState(target); + if (tileEntity instanceof PumpTileEntity) { + if (!AllBlocks.MECHANICAL_PUMP.has(targetState) || targetState.get(PumpBlock.FACING) + .getAxis() != direction.getAxis()) + continue; + PumpTileEntity pump = (PumpTileEntity) tileEntity; + pump.updatePipesOnSide(direction.getOpposite()); + continue; + } + if (visited.contains(target)) + continue; + FluidPipeBehaviour targetPipe = getPipe(world, target); + if (targetPipe == null) + continue; + if (targetPipe.isConnectedTo(targetState, direction.getOpposite())) + frontier.add(target); + } + } + } + + public static List getPipeConnections(BlockState state, FluidPipeBehaviour pipe) { + List list = new ArrayList<>(); + for (Direction d : Iterate.directions) + if (pipe.isConnectedTo(state, d)) + list.add(d); + return list; + } + + public static int getPumpRange() { + return AllConfigs.SERVER.fluids.mechanicalPumpRange.get(); + } + + public static OutlineParams showBlockFace(BlockFace face) { + MutableObject params = new MutableObject<>(new OutlineParams()); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + Vec3d directionVec = new Vec3d(face.getFace() + .getDirectionVec()); + Vec3d scaleVec = directionVec.scale(-.25f * face.getFace() + .getAxisDirection() + .getOffset()); + directionVec = directionVec.scale(.5f); + params.setValue(CreateClient.outliner.showAABB(face, + FluidPropagator.smallCenter.offset(directionVec.add(new Vec3d(face.getPos()))) + .grow(scaleVec.x, scaleVec.y, scaleVec.z) + .grow(1 / 16f))); + }); + return params.getValue(); + } + + static AxisAlignedBB smallCenter = new AxisAlignedBB(BlockPos.ZERO).shrink(.25); + + public static boolean hasFluidCapability(BlockState state, IBlockReader world, BlockPos pos, Direction blockFace) { + if (!state.hasTileEntity()) + return false; + TileEntity tileEntity = world.getTileEntity(pos); + return tileEntity != null + && tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, blockFace.getOpposite()) + .isPresent(); + } + + public static boolean isStraightPipe(BlockState state) { + if (state.getBlock() instanceof AxisPipeBlock) + return true; + if (!FluidPipeBlock.isPipe(state)) + return false; + boolean axisFound = false; + int connections = 0; + for (Axis axis : Iterate.axes) { + Direction d1 = Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis); + Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + boolean openAt1 = FluidPipeBlock.isOpenAt(state, d1); + boolean openAt2 = FluidPipeBlock.isOpenAt(state, d2); + if (openAt1) + connections++; + if (openAt2) + connections++; + if (openAt1 && openAt2) + if (axisFound) + return false; + else + axisFound = true; + } + return axisFound && connections == 2; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java new file mode 100644 index 000000000..c15d2a40a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.contraptions.fluids; + +import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.utility.BlockHelper; + +import net.minecraft.block.Blocks; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +public class FluidReactions { + + public static void handlePipeFlowCollision(World world, BlockPos pos, FluidStack fluid, FluidStack fluid2) { + Fluid f1 = fluid.getFluid(); + Fluid f2 = fluid2.getFluid(); + BlockHelper.destroyBlock(world, pos, 1); + if (f1 == Fluids.WATER && f2 == Fluids.LAVA || f2 == Fluids.WATER && f1 == Fluids.LAVA) + world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + } + + public static void handlePipeSpillCollision(World world, BlockPos pos, Fluid pipeFluid, IFluidState worldFluid) { + Fluid pf = FluidHelper.convertToStill(pipeFluid); + Fluid wf = worldFluid.getFluid(); + if (pf == Fluids.WATER && wf == Fluids.LAVA) + world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); + if (pf == Fluids.WATER && wf == Fluids.FLOWING_LAVA) + world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + else if (pf == Fluids.LAVA && wf == Fluids.WATER) + world.setBlockState(pos, Blocks.STONE.getDefaultState()); + else if (pf == Fluids.LAVA && wf == Fluids.FLOWING_WATER) + world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpEndpoint.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpEndpoint.java new file mode 100644 index 000000000..62904f74b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpEndpoint.java @@ -0,0 +1,108 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.lang.ref.WeakReference; + +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.world.IWorld; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class InterPumpEndpoint extends FluidNetworkEndpoint { + + Couple>> pumps; + + private InterPumpEndpoint(IWorld world, BlockFace location, LazyOptional handler) { + super(world, location, handler); + } + + public InterPumpEndpoint(IWorld world, BlockFace location, PumpTileEntity source, PumpTileEntity interfaced, + BlockFace sourcePos, BlockFace interfacedPos) { + this(world, location, LazyOptional.empty()); + handler = LazyOptional.of(() -> new InterPumpFluidHandler(this)); + pumps = Couple.create(Pair.of(sourcePos, new WeakReference<>(source)), + Pair.of(interfacedPos, new WeakReference<>(interfaced))); + } + + public InterPumpEndpoint opposite(IWorld world) { + InterPumpEndpoint interPumpEndpoint = new InterPumpEndpoint(world, this.location.getOpposite(), handler); + interPumpEndpoint.pumps = pumps.copy(); + return interPumpEndpoint; + } + + public Couple>> getPumps() { + return pumps; + } + + public boolean isPulling(boolean first) { + Pair> pair = getPumps().get(first); + PumpTileEntity pumpTileEntity = pair.getSecond() + .get(); + if (pumpTileEntity == null || pumpTileEntity.isRemoved()) + return false; + return pumpTileEntity.isPullingOnSide(pumpTileEntity.isFront(pair.getFirst() + .getFace())); + } + + public int getTransferSpeed(boolean first) { + PumpTileEntity pumpTileEntity = getPumps().get(first) + .getSecond() + .get(); + if (pumpTileEntity == null || pumpTileEntity.isRemoved()) + return 0; + return pumpTileEntity.getFluidTransferSpeed(); + } + + @Override + public LazyOptional provideHandler() { + if (isPulling(true) == isPulling(false)) + return LazyOptional.empty(); + if (getTransferSpeed(true) > getTransferSpeed(false)) + return LazyOptional.empty(); + return super.provideHandler(); + } + + @Override + public FluidStack provideFluid() { + if (!provideHandler().isPresent()) + return FluidStack.EMPTY; + + Couple>> pumps = getPumps(); + for (boolean current : Iterate.trueAndFalse) { + if (isPulling(current)) + continue; + + Pair> pair = pumps.get(current); + BlockFace blockFace = pair.getFirst(); + PumpTileEntity pumpTileEntity = pair.getSecond() + .get(); + if (pumpTileEntity == null) + continue; + if (pumpTileEntity.networks == null) + continue; + FluidNetwork fluidNetwork = pumpTileEntity.networks.get(pumpTileEntity.isFront(blockFace.getFace())); + for (FluidNetworkFlow fluidNetworkFlow : fluidNetwork.flows) { + for (FluidNetworkEndpoint fne : fluidNetworkFlow.outputEndpoints) { + if (!(fne instanceof InterPumpEndpoint)) + continue; + InterPumpEndpoint ipe = (InterPumpEndpoint) fne; + if (!ipe.location.isEquivalent(location)) + continue; + + FluidStack heldFluid = fluidNetworkFlow.fluidStack; + if (heldFluid.isEmpty()) + return heldFluid; + FluidStack copy = heldFluid.copy(); + copy.setAmount(1); + return heldFluid; + } + } + } + return FluidStack.EMPTY; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpFluidHandler.java new file mode 100644 index 000000000..34e0bd8e1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/InterPumpFluidHandler.java @@ -0,0 +1,44 @@ +package com.simibubi.create.content.contraptions.fluids; + +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.templates.FluidTank; + +public class InterPumpFluidHandler extends FluidTank { + + InterPumpEndpoint endpoint; + + public InterPumpFluidHandler(InterPumpEndpoint endpoint) { + super(Integer.MAX_VALUE); + this.endpoint = endpoint; + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + if (resource.isEmpty()) + return 0; + int maxInput = Math.min(resource.getAmount(), Math.max(getTransferCapacity() - getFluidAmount(), 0)); + FluidStack toInsert = resource.copy(); + toInsert.setAmount(maxInput); + FluidPropagator.showBlockFace(endpoint.location).colored(0x77d196).lineWidth(1/4f); + return super.fill(toInsert, action); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + return super.drain(maxDrain, action); + } + + public FluidStack provide() { + FluidStack heldFluid = getFluid(); + if (heldFluid.isEmpty()) + return heldFluid; + FluidStack copy = heldFluid.copy(); + copy.setAmount(1); + return copy; + } + + private int getTransferCapacity() { + return Math.min(endpoint.getTransferSpeed(true), endpoint.getTransferSpeed(false)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java new file mode 100644 index 000000000..29e89f1f9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -0,0 +1,172 @@ +package com.simibubi.create.content.contraptions.fluids; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; + +public class OpenEndedPipe { + + World world; + + private OpenEndFluidHandler fluidHandler; + private BlockPos outputPos; + private boolean wasPulling; + private boolean stale; + + public OpenEndedPipe(BlockFace face) { + fluidHandler = new OpenEndFluidHandler(); + outputPos = face.getConnectedPos(); + } + + public void tick(World world, boolean pulling) { + this.world = world; + if (!world.isAreaLoaded(outputPos, 0)) + return; + if (pulling != wasPulling) { + if (pulling) + fluidHandler.clear(); + wasPulling = pulling; + } + + BlockState state = world.getBlockState(outputPos); + IFluidState fluidState = state.getFluidState(); + boolean waterlog = state.has(BlockStateProperties.WATERLOGGED); + + if (!waterlog && !state.getMaterial() + .isReplaceable()) + return; + + // TODO different pipe end types + if (pulling) { + if (fluidState.isEmpty() || !fluidState.isSource()) + return; + if (!fluidHandler.tryCollectFluid(fluidState.getFluid())) + return; + if (waterlog) { + world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, false), 3); + return; + } + world.setBlockState(outputPos, fluidState.getBlockState() + .with(FlowingFluidBlock.LEVEL, 14), 3); + return; + } + + Fluid providedFluid = fluidHandler.tryProvidingFluid(); + if (providedFluid == null) + return; + if (!fluidState.isEmpty() && fluidState.getFluid() != providedFluid) { + FluidReactions.handlePipeSpillCollision(world, outputPos, providedFluid, fluidState); + return; + } + if (fluidState.isSource()) + return; + if (waterlog) { + if (providedFluid.getFluid() != Fluids.WATER) + return; + world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, true), 3); + return; + } + world.setBlockState(outputPos, providedFluid.getDefaultState() + .getBlockState(), 3); + } + + public LazyOptional getCapability() { + return LazyOptional.of(() -> fluidHandler); + } + + public CompoundNBT writeToNBT(CompoundNBT compound) { + fluidHandler.writeToNBT(compound); + compound.putBoolean("Pulling", wasPulling); + return compound; + } + + public void readNBT(CompoundNBT compound) { + fluidHandler.readFromNBT(compound); + wasPulling = compound.getBoolean("Pulling"); + } + + public void markStale() { + stale = true; + } + + public void unmarkStale() { + stale = false; + } + + public boolean isStale() { + return stale; + } + + private class OpenEndFluidHandler extends FluidTank { + + public OpenEndFluidHandler() { + super(1500); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + // Never allow being filled when a source is attached + if (world == null) + return 0; + if (!world.isAreaLoaded(outputPos, 0)) + return 0; + if (resource.isEmpty()) + return 0; + BlockState state = world.getBlockState(outputPos); + IFluidState fluidState = state.getFluidState(); + if (!fluidState.isEmpty() && fluidState.getFluid() != resource.getFluid()) { + FluidReactions.handlePipeSpillCollision(world, outputPos, resource.getFluid(), fluidState); + return 0; + } + if (fluidState.isSource()) + return 0; + if (!(state.has(BlockStateProperties.WATERLOGGED) && resource.getFluid() == Fluids.WATER) + && !state.getMaterial() + .isReplaceable()) + return 0; + + // Never allow being filled above 1000 + FluidStack insertable = resource.copy(); + insertable.setAmount(Math.min(insertable.getAmount(), Math.max(1000 - getFluidAmount(), 0))); + return super.fill(insertable, action); + } + + public boolean tryCollectFluid(Fluid fluid) { + for (boolean simulate : Iterate.trueAndFalse) + if (super.fill(new FluidStack(fluid, 1000), + simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE) != 1000) + return false; + return true; + } + + @Nullable + public Fluid tryProvidingFluid() { + Fluid fluid = getFluid().getFluid(); + for (boolean simulate : Iterate.trueAndFalse) + if (drain(1000, simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE).getAmount() != 1000) + return null; + return fluid; + } + + public void clear() { + setFluid(FluidStack.EMPTY); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java similarity index 60% rename from src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeModel.java rename to src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java index 6d7723a38..715ccf946 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java @@ -1,11 +1,15 @@ package com.simibubi.create.content.contraptions.fluids; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour.AttachmentTypes; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.foundation.block.render.WrappedBakedModel; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; @@ -13,24 +17,27 @@ import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockDisplayReader; +import net.minecraft.world.ILightReader; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; -public class FluidPipeModel extends WrappedBakedModel { +public class PipeAttachmentModel extends WrappedBakedModel { private static ModelProperty PIPE_PROPERTY = new ModelProperty<>(); - public FluidPipeModel(IBakedModel template) { + public PipeAttachmentModel(IBakedModel template) { super(template); } @Override - public IModelData getModelData(IBlockDisplayReader world, BlockPos pos, BlockState state, IModelData tileData) { + public IModelData getModelData(ILightReader world, BlockPos pos, BlockState state, IModelData tileData) { PipeModelData data = new PipeModelData(); - for (Direction d : Iterate.directions) - data.putRim(d, FluidPipeBlock.shouldDrawRim(world, pos, state, d)); + FluidPipeAttachmentBehaviour attachmentBehaviour = + TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (attachmentBehaviour != null) + for (Direction d : Iterate.directions) + data.putRim(d, attachmentBehaviour.getAttachment(world, pos, state, d)); data.setEncased(FluidPipeBlock.shouldDrawCasing(world, pos, state)); return new ModelDataMap.Builder().withInitial(PIPE_PROPERTY, data) .build(); @@ -41,8 +48,10 @@ public class FluidPipeModel extends WrappedBakedModel { List quads = super.getQuads(state, side, rand, data); if (data instanceof ModelDataMap) { ModelDataMap modelDataMap = (ModelDataMap) data; - if (modelDataMap.hasProperty(PIPE_PROPERTY)) + if (modelDataMap.hasProperty(PIPE_PROPERTY)) { + quads = new ArrayList<>(quads); addQuads(quads, state, side, rand, modelDataMap, modelDataMap.getData(PIPE_PROPERTY)); + } } return quads; } @@ -50,8 +59,9 @@ public class FluidPipeModel extends WrappedBakedModel { private void addQuads(List quads, BlockState state, Direction side, Random rand, IModelData data, PipeModelData pipeData) { for (Direction d : Iterate.directions) - if (pipeData.getRim(d)) - quads.addAll(AllBlockPartials.PIPE_RIMS.get(d) + if (pipeData.hasRim(d)) + quads.addAll(AllBlockPartials.PIPE_ATTACHMENTS.get(pipeData.getRim(d)) + .get(d) .get() .getQuads(state, side, rand, data)); if (pipeData.isEncased()) @@ -60,15 +70,15 @@ public class FluidPipeModel extends WrappedBakedModel { } private class PipeModelData { - boolean[] rims; + AttachmentTypes[] rims; boolean encased; public PipeModelData() { - rims = new boolean[6]; - Arrays.fill(rims, false); + rims = new AttachmentTypes[6]; + Arrays.fill(rims, AttachmentTypes.NONE); } - public void putRim(Direction face, boolean rim) { + public void putRim(Direction face, AttachmentTypes rim) { rims[face.getIndex()] = rim; } @@ -76,7 +86,11 @@ public class FluidPipeModel extends WrappedBakedModel { this.encased = encased; } - public boolean getRim(Direction face) { + public boolean hasRim(Direction face) { + return rims[face.getIndex()] != AttachmentTypes.NONE; + } + + public AttachmentTypes getRim(Direction face) { return rims[face.getIndex()]; } 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 4ac97ba7b..f64aae45f 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 @@ -1,14 +1,24 @@ package com.simibubi.create.content.contraptions.fluids; +import java.util.Map; + +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.foundation.utility.BlockFace; +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.fluid.Fluids; import net.minecraft.fluid.FluidState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemUseContext; +import net.minecraft.network.DebugPacketSender; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; @@ -20,71 +30,137 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable { - public PumpBlock(Properties p_i48415_1_) { - super(p_i48415_1_); - setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); - } + 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 BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { + BlockState state = super.updateAfterWrenched(newState, context); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + if (world.isRemote) + return state; + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof PumpTileEntity)) + return state; + PumpTileEntity pump = (PumpTileEntity) tileEntity; + if (pump.networks == null) + return state; - @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)); - } + FluidNetwork apn1 = pump.networks.get(true); + FluidNetwork apn2 = pump.networks.get(false); - @Override - public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { - return true; - } + // Collect pipes that can be skipped + apn1.clearFlows(world, true); + apn2.clearFlows(world, true); - @Override - public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); - } + // Swap skipsets as the networks change sides + Map skippedConnections = apn1.previousFlow; + apn1.previousFlow = apn2.previousFlow; + apn2.previousFlow = skippedConnections; - @Override - protected void fillStateContainer(Builder builder) { - builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); - } + // Init networks next tick + pump.networksToUpdate.forEach(MutableBoolean::setTrue); + pump.networks.swap(); + pump.reversed = !pump.reversed; - @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; - } + return state; + } - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); - } + @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 boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, + boolean isMoving) { + DebugPacketSender.func_218806_a(world, pos); + if (world.isRemote) + return; + if (otherBlock instanceof FluidPipeBlock) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof PumpTileEntity)) + return; + PumpTileEntity pump = (PumpTileEntity) tileEntity; + Direction facing = state.get(FACING); + for (boolean front : Iterate.trueAndFalse) { + Direction side = front ? facing : facing.getOpposite(); + if (!pos.offset(side) + .equals(neighborPos)) + continue; + pump.updatePipesOnSide(side); + } + } + + @Override + public FluidState 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) { + FluidState ifluidstate = context.getWorld() + .getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } + + public static boolean isPump(BlockState state) { + return state.getBlock() instanceof PumpBlock; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpEndpoint.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpEndpoint.java new file mode 100644 index 000000000..eb0d0f18c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpEndpoint.java @@ -0,0 +1,26 @@ +package com.simibubi.create.content.contraptions.fluids; + +import com.simibubi.create.foundation.utility.BlockFace; + +import net.minecraft.world.IWorld; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; + +public class PumpEndpoint extends FluidNetworkEndpoint { + + PumpTileEntity pumpTE; + + public PumpEndpoint(BlockFace location, PumpTileEntity pumpTE) { + super(pumpTE.getWorld(), location, LazyOptional.empty()); + this.pumpTE = pumpTE; + } + + @Override + protected void onHandlerInvalidated(IWorld world) {} + + @Override + public FluidStack provideFluid() { + return pumpTE.providedFluid; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 0ff9a0ddb..6b0deac58 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -31,7 +31,7 @@ public class PumpRenderer extends KineticTileEntityRenderer { PumpTileEntity pump = (PumpTileEntity) te; Vector3d rotationOffset = new Vector3d(.5, 14 / 16f, .5); BlockState blockState = te.getBlockState(); - float angle = MathHelper.lerp(pump.arrowDirection.get(partialTicks), 0, 90) - 90; + float angle = MathHelper.lerp(pump.arrowDirection.getValue(partialTicks), 0, 90) - 90; for (float yRot : new float[] { 0, 90 }) { ms.push(); SuperByteBuffer arrow = AllBlockPartials.MECHANICAL_PUMP_ARROW.renderOn(blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 02f00736e..2e83cfd4b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -1,29 +1,380 @@ package com.simibubi.create.content.contraptions.fluids; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.mutable.MutableBoolean; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class PumpTileEntity extends KineticTileEntity { - InterpolatedChasingValue arrowDirection; + LerpedFloat arrowDirection; + Couple networks; + Couple> openEnds; + Couple networksToUpdate; + + boolean reversed; + FluidStack providedFluid; public PumpTileEntity(TileEntityType typeIn) { super(typeIn); - arrowDirection = new InterpolatedChasingValue(); - arrowDirection.start(1); + arrowDirection = LerpedFloat.linear() + .startWithValue(1); + networksToUpdate = Couple.create(MutableBoolean::new); + openEnds = Couple.create(HashMap::new); + setProvidedFluid(FluidStack.EMPTY); + } + + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours.add(new PumpAttachmentBehaviour(this)); + } + + @Override + public void initialize() { + super.initialize(); + reversed = getSpeed() < 0; } @Override public void tick() { super.tick(); + float speed = getSpeed(); + if (world.isRemote) { - float speed = getSpeed(); - if (speed != 0) - arrowDirection.target(Math.signum(speed)); - arrowDirection.tick(); + if (speed == 0) + return; + arrowDirection.chase(speed >= 0 ? 1 : -1, .5f, Chaser.EXP); + arrowDirection.tickChaser(); + return; + } + + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof PumpBlock)) + return; + Direction face = blockState.get(PumpBlock.FACING); + MutableBoolean networkUpdated = new MutableBoolean(false); + + if (networks == null) { + networks = Couple.create(new FluidNetwork(), new FluidNetwork()); + networks.forEachWithContext((fn, front) -> { + BlockFace blockFace = new BlockFace(pos, front ? face : face.getOpposite()); + fn.assemble(world, this, blockFace); + FluidPropagator.showBlockFace(blockFace) + .lineWidth(1 / 8f); + }); + networkUpdated.setTrue(); + } + + networksToUpdate.forEachWithContext((update, front) -> { + if (update.isFalse()) + return; + FluidNetwork activePipeNetwork = networks.get(front); + if (activePipeNetwork == null) + return; + BlockFace blockFace = new BlockFace(pos, front ? face : face.getOpposite()); + activePipeNetwork.reAssemble(world, this, blockFace); + FluidPropagator.showBlockFace(blockFace) + .lineWidth(1 / 8f); + update.setFalse(); + networkUpdated.setTrue(); + }); + + if (networkUpdated.isTrue()) + return; + + networks.forEach(fn -> fn.tick(world, this)); + + if (speed == 0) + return; + if (speed < 0 != reversed) { + networks.forEachWithContext((fn, current) -> fn.clearFlows(world, true)); + reversed = speed < 0; + return; + } + + boolean pullingSide = isPullingOnSide(true); + float flowSpeed = Math.abs(speed) / 256f; + + networks.forEachWithContext((fn, front) -> { + boolean pulling = isPullingOnSide(front); + fn.tickFlows(world, this, pulling, flowSpeed); + openEnds.get(front) + .values() + .forEach(oep -> oep.tick(world, pulling)); + }); + + if (!networks.get(pullingSide) + .hasEndpoints()) { + setProvidedFluid(FluidStack.EMPTY); + return; + } + + if (networks.getFirst() + .hasEndpoints() + && networks.getSecond() + .hasEndpoints()) { + performTransfer(); + } + + } + + @Override + public void remove() { + super.remove(); + if (networks != null) + networks.forEachWithContext((fn, current) -> fn.clearFlows(world, false)); + } + + private void performTransfer() { + boolean input = isPullingOnSide(true); + Collection inputs = networks.get(input) + .getEndpoints(true); + Collection outputs = networks.get(!input) + .getEndpoints(false); + + int flowSpeed = getFluidTransferSpeed(); + FluidStack transfer = FluidStack.EMPTY; + for (boolean simulate : Iterate.trueAndFalse) { + FluidAction action = simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE; + + List availableInputs = new ArrayList<>(inputs); + while (!availableInputs.isEmpty() && transfer.getAmount() < flowSpeed) { + int diff = flowSpeed - transfer.getAmount(); + int dividedTransfer = diff / availableInputs.size(); + int remainder = diff % availableInputs.size(); + + for (Iterator iterator = availableInputs.iterator(); iterator.hasNext();) { + int toTransfer = dividedTransfer; + if (remainder > 0) { + toTransfer++; + remainder--; + } + + FluidNetworkEndpoint ne = iterator.next(); + IFluidHandler handler = ne.provideHandler() + .orElse(null); + if (handler == null) { + iterator.remove(); + continue; + } + FluidStack drained = handler.drain(toTransfer, action); + if (drained.isEmpty()) { + iterator.remove(); + continue; + } + if (transfer.isFluidEqual(drained) || transfer.isEmpty()) { + if (drained.getAmount() < toTransfer) + iterator.remove(); + FluidStack copy = drained.copy(); + copy.setAmount(drained.getAmount() + transfer.getAmount()); + transfer = copy; + continue; + } + iterator.remove(); + continue; + } + + } + + List availableOutputs = new ArrayList<>(outputs); + while (!availableOutputs.isEmpty() && transfer.getAmount() > 0) { + int dividedTransfer = transfer.getAmount() / availableOutputs.size(); + int remainder = transfer.getAmount() % availableOutputs.size(); + + for (Iterator iterator = availableOutputs.iterator(); iterator.hasNext();) { + FluidNetworkEndpoint ne = iterator.next(); + int toTransfer = dividedTransfer; + if (remainder > 0) { + toTransfer++; + remainder--; + } + + if (transfer.isEmpty()) + break; + IFluidHandler handler = ne.provideHandler() + .orElse(null); + if (handler == null) { + iterator.remove(); + continue; + } + + FluidStack divided = transfer.copy(); + divided.setAmount(toTransfer); + int fill = handler.fill(divided, action); + transfer.setAmount(transfer.getAmount() - fill); + if (fill < toTransfer) + iterator.remove(); + } + + } + + flowSpeed -= transfer.getAmount(); + transfer = FluidStack.EMPTY; } } + public int getFluidTransferSpeed() { + float rotationSpeed = Math.abs(getSpeed()); + int flowSpeed = (int) (rotationSpeed / 2f); + if (rotationSpeed != 0 && flowSpeed == 0) + flowSpeed = 1; + return flowSpeed; + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putBoolean("Reversed", reversed); + serializeOpenEnds(compound); + super.write(compound, clientPacket); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + reversed = compound.getBoolean("Reversed"); + deserializeOpenEnds(compound); + super.read(compound, clientPacket); + } + + public void updatePipesOnSide(Direction side) { + if (!isSideAccessible(side)) + return; + updatePipeNetwork(isFront(side)); + } + + protected boolean isFront(Direction side) { + if (networks == null) + return false; + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof PumpBlock)) + return false; + Direction front = blockState.get(PumpBlock.FACING); + boolean isFront = side == front; + return isFront; + } + + protected void updatePipeNetwork(boolean front) { + if (networks != null) + networks.get(front) + .clearFlows(world, true); + networksToUpdate.get(front) + .setTrue(); + if (getSpeed() == 0 || (isPullingOnSide(front)) && networks != null) + setProvidedFluid(FluidStack.EMPTY); + } + + public boolean isSideAccessible(Direction side) { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof PumpBlock)) + return false; + return blockState.get(PumpBlock.FACING) + .getAxis() == side.getAxis(); + } + + public boolean isPullingOnSide(boolean front) { + return front == reversed; + } + + public Map getOpenEnds(Direction side) { + return openEnds.get(isFront(side)); + } + + private void serializeOpenEnds(CompoundNBT compound) { + compound.put("OpenEnds", openEnds.serializeEach(m -> { + CompoundNBT compoundNBT = new CompoundNBT(); + ListNBT entries = new ListNBT(); + m.entrySet() + .forEach(e -> { + CompoundNBT innerCompound = new CompoundNBT(); + innerCompound.put("Pos", e.getKey() + .serializeNBT()); + e.getValue() + .writeToNBT(innerCompound); + entries.add(innerCompound); + }); + compoundNBT.put("Entries", entries); + return compoundNBT; + })); + } + + private void deserializeOpenEnds(CompoundNBT compound) { + openEnds = Couple.deserializeEach(compound.getList("OpenEnds", NBT.TAG_COMPOUND), c -> { + Map map = new HashMap<>(); + NBTHelper.iterateCompoundList(c.getList("Entries", NBT.TAG_COMPOUND), innerCompound -> { + BlockFace key = BlockFace.fromNBT(innerCompound.getCompound("Pos")); + OpenEndedPipe value = new OpenEndedPipe(key); + value.readNBT(innerCompound); + map.put(key, value); + }); + return map; + }); + + compound.put("OpenEnds", openEnds.serializeEach(m -> { + CompoundNBT compoundNBT = new CompoundNBT(); + ListNBT entries = new ListNBT(); + m.entrySet() + .forEach(e -> { + CompoundNBT innerCompound = new CompoundNBT(); + innerCompound.put("Pos", e.getKey() + .serializeNBT()); + e.getValue() + .writeToNBT(innerCompound); + entries.add(innerCompound); + }); + compoundNBT.put("Entries", entries); + return compoundNBT; + })); + } + + public void setProvidedFluid(FluidStack providedFluid) { + this.providedFluid = providedFluid; + } + + class PumpAttachmentBehaviour extends FluidPipeAttachmentBehaviour { + + public PumpAttachmentBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public boolean isPipeConnectedTowards(BlockState state, Direction direction) { + return isSideAccessible(direction); + } + + @Override + public AttachmentTypes getAttachment(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + AttachmentTypes attachment = super.getAttachment(world, pos, state, direction); + if (attachment == AttachmentTypes.RIM) + return AttachmentTypes.NONE; + return attachment; + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java new file mode 100644 index 000000000..59a3b3ada --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java @@ -0,0 +1,100 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.List; +import java.util.Optional; + +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.foundation.fluid.FluidIngredient; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class FillingBySpout { + + static RecipeWrapper wrapper = new RecipeWrapper(new ItemStackHandler(1)); + + public static boolean canItemBeFilled(World world, ItemStack stack) { + wrapper.setInventorySlotContents(0, stack); + if (world.getRecipeManager() + .getRecipe(AllRecipeTypes.FILLING.getType(), wrapper, world) + .isPresent()) + return true; + + LazyOptional capability = + stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return false; + for (int i = 0; i < tank.getTanks(); i++) { + if (tank.getFluidInTank(i) + .getAmount() < tank.getTankCapacity(i)) + return true; + } + return false; + } + + public static int getRequiredAmountForItem(World world, ItemStack stack, FluidStack availableFluid) { + wrapper.setInventorySlotContents(0, stack); + Optional> recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.FILLING.getType(), wrapper, world); + if (recipe.isPresent()) { + FillingRecipe fillingRecipe = (FillingRecipe) recipe.get(); + FluidIngredient requiredFluid = fillingRecipe.getRequiredFluid(); + if (requiredFluid.test(availableFluid)) + return requiredFluid.getRequiredAmount(); + } + + LazyOptional capability = + stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return -1; + if (tank instanceof FluidBucketWrapper) + return 1000; + + int filled = tank.fill(availableFluid, FluidAction.SIMULATE); + return filled == 0 ? -1 : filled; + } + + public static ItemStack fillItem(World world, int requiredAmount, ItemStack stack, FluidStack availableFluid) { + FluidStack toFill = availableFluid.copy(); + toFill.setAmount(requiredAmount); + availableFluid.shrink(requiredAmount); + + wrapper.setInventorySlotContents(0, stack); + Optional> recipe = world.getRecipeManager() + .getRecipe(AllRecipeTypes.FILLING.getType(), wrapper, world); + if (recipe.isPresent()) { + FillingRecipe fillingRecipe = (FillingRecipe) recipe.get(); + FluidIngredient requiredFluid = fillingRecipe.getRequiredFluid(); + if (requiredFluid.test(toFill)) { + List results = fillingRecipe.rollResults(); + stack.shrink(1); + return results.isEmpty() ? ItemStack.EMPTY : results.get(0); + } + } + + ItemStack split = stack.copy(); + split.setCount(1); + LazyOptional capability = + split.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return ItemStack.EMPTY; + tank.fill(toFill, FluidAction.EXECUTE); + ItemStack container = tank.getContainer() + .copy(); + stack.shrink(1); + return container; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java new file mode 100644 index 000000000..7a085f03a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; +import com.simibubi.create.foundation.fluid.FluidIngredient; + +import net.minecraft.world.World; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class FillingRecipe extends ProcessingRecipe { + + public FillingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.FILLING, params); + } + + @Override + public boolean matches(RecipeWrapper inv, World p_77569_2_) { + return ingredients.get(0).test(inv.getStackInSlot(0)); + } + + @Override + protected int getMaxInputCount() { + return 1; + } + + @Override + protected int getMaxOutputCount() { + return 1; + } + + @Override + protected int getMaxFluidInputCount() { + return 1; + } + + public FluidIngredient getRequiredFluid() { + if (fluidIngredients.isEmpty()) + throw new IllegalStateException("Filling Recipe: " + id.toString() + " has no fluid ingredient!"); + return fluidIngredients.get(0); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java new file mode 100644 index 000000000..583b3dffb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +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; + +public class SpoutBlock extends Block { + + public SpoutBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.SPOUT; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.SPOUT.create(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java new file mode 100644 index 000000000..a97ee37b3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fluids.FluidStack; + +public class SpoutRenderer extends SafeTileEntityRenderer { + + public SpoutRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + static final AllBlockPartials[] BITS = + { AllBlockPartials.SPOUT_TOP, AllBlockPartials.SPOUT_MIDDLE, AllBlockPartials.SPOUT_BOTTOM }; + + @Override + protected void renderSafe(SpoutTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + + Pair fluid = te.getFluid(); + FluidStack fluidStack = fluid.getFirst(); + float level = fluid.getSecond() + .getValue(partialTicks); + + if (!fluidStack.isEmpty() && level != 0) { + float min = 2.5f / 16f; + float max = min + (11 / 16f); + float yOffset = (11 / 16f) * level; + ms.push(); + ms.translate(0, yOffset, 0); + FluidRenderer.renderTiledFluidBB(fluidStack, min, min - yOffset, min, max, min, max, buffer, ms, light, + false); + ms.pop(); + } + + int processingTicks = te.processingTicks; + float processingPT = te.processingTicks - partialTicks; + float processingProgress = 1 - (processingPT - 5) / 10; + processingProgress = MathHelper.clamp(processingProgress, 0, 1); + float radius = 0; + + if (processingTicks != -1) { + radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); + AxisAlignedBB bb = new AxisAlignedBB(0.5, .5, 0.5, 0.5, -1.2, 0.5).grow(radius / 32f); + FluidRenderer.renderTiledFluidBB(fluidStack, (float) bb.minX, (float) bb.minY, (float) bb.minZ, + (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); + } + + float squeeze = radius; + if (processingPT < 0) + squeeze = 0; + else if (processingPT < 2) + squeeze = MathHelper.lerp(processingPT / 2f, 0, -1); + else if (processingPT < 10) + squeeze = -1; + + ms.push(); + for (AllBlockPartials bit : BITS) { + bit.renderOn(te.getBlockState()) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + ms.translate(0, -3 * squeeze / 32f, 0); + } + ms.pop(); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java new file mode 100644 index 000000000..b723a4849 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -0,0 +1,254 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +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.ArrayList; +import java.util.List; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.fluid.SmartFluidTank; +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.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; + +// FIXME: Quite similar to FluidTankTileEntity, create a behaviour + +public class SpoutTileEntity extends SmartTileEntity { + + protected FluidTank tank; + protected LazyOptional capability; + protected LerpedFloat fluidLevel; + protected FluidStack renderedFluid; + + public static final int FILLING_TIME = 20; + protected int processingTicks; + + private static final int SYNC_RATE = 8; + protected int syncCooldown; + protected boolean queuedSync; + + protected boolean sendSplash; + protected BeltProcessingBehaviour beltProcessing; + + public SpoutTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + tank = new SmartFluidTank(1000, this::onFluidStackChanged); + capability = LazyOptional.of(() -> tank); + fluidLevel = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .25, Chaser.EXP); + renderedFluid = FluidStack.EMPTY; + processingTicks = -1; + } + + protected void onFluidStackChanged(FluidStack newFluidStack) { + if (!hasWorld()) + return; + fluidLevel.chase(tank.getFluidAmount() / (float) tank.getCapacity(), .25, Chaser.EXP); + if (!world.isRemote) { + markDirty(); + sendData(); + } + } + + @Override + public void initialize() { + super.initialize(); + if (!world.isRemote) { + fluidLevel.forceNextSync(); + onFluidStackChanged(tank.getFluid()); + } + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox().expand(0, -2, 0); + } + + @Override + public void addBehaviours(List behaviours) { + beltProcessing = new BeltProcessingBehaviour(this).whenItemEnters(this::onItemReceived) + .whileItemHeld(this::whenItemHeld); + behaviours.add(beltProcessing); + } + + protected ProcessingResult onItemReceived(TransportedItemStack transported, + TransportedItemStackHandlerBehaviour handler) { + if (!FillingBySpout.canItemBeFilled(world, transported.stack)) + return PASS; + if (tank.isEmpty()) + return HOLD; + if (FillingBySpout.getRequiredAmountForItem(world, transported.stack, tank.getFluid()) == -1) + return PASS; + return HOLD; + } + + protected ProcessingResult whenItemHeld(TransportedItemStack transported, + TransportedItemStackHandlerBehaviour handler) { + if (processingTicks != -1 && processingTicks != 5) + return HOLD; + if (!FillingBySpout.canItemBeFilled(world, transported.stack)) + return PASS; + if (tank.isEmpty()) + return HOLD; + FluidStack fluid = tank.getFluid(); + int requiredAmountForItem = FillingBySpout.getRequiredAmountForItem(world, transported.stack, fluid.copy()); + if (requiredAmountForItem == -1) + return PASS; + if (requiredAmountForItem > fluid.getAmount()) + return HOLD; + + if (processingTicks == -1) { + processingTicks = FILLING_TIME; + markDirty(); + sendData(); + return HOLD; + } + + // Process finished + ItemStack out = FillingBySpout.fillItem(world, requiredAmountForItem, transported.stack, fluid); + if (!out.isEmpty()) { + List outList = new ArrayList<>(); + TransportedItemStack held = null; + TransportedItemStack result = transported.copy(); + result.stack = out; + if (!transported.stack.isEmpty()) + held = transported.copy(); + outList.add(result); + handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(outList, held)); + } + + tank.setFluid(fluid); + sendSplash = true; + markDirty(); + sendData(); + return PASS; + } + + @Override + public void remove() { + capability.invalidate(); + super.remove(); + } + + @Override + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.put("TankContent", tank.writeToNBT(new CompoundNBT())); + compound.put("Level", fluidLevel.writeNBT()); + compound.putInt("ProcessingTicks", processingTicks); + if (sendSplash && clientPacket) { + compound.putBoolean("Splash", true); + sendSplash = false; + } + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + tank.readFromNBT(compound.getCompound("TankContent")); + fluidLevel.readNBT(compound.getCompound("Level"), clientPacket); + processingTicks = compound.getInt("ProcessingTicks"); + if (!tank.getFluid() + .isEmpty()) + renderedFluid = tank.getFluid(); + + if (!clientPacket) + return; + if (compound.contains("Splash")) + spawnSplash(renderedFluid); + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY && side != Direction.DOWN) + return capability.cast(); + return super.getCapability(cap, side); + } + + public Pair getFluid() { + return Pair.of(renderedFluid, fluidLevel); + } + + public void sendDataImmediately() { + syncCooldown = 0; + queuedSync = false; + sendData(); + } + + @Override + public void tick() { + super.tick(); + if (processingTicks >= 0) + processingTicks--; + if (processingTicks >= 8 && world.isRemote) + spawnProcessingParticles(renderedFluid); + if (syncCooldown > 0) { + syncCooldown--; + if (syncCooldown == 0 && queuedSync) + sendData(); + } + if (fluidLevel != null) + fluidLevel.tickChaser(); + } + + @Override + public void sendData() { + if (syncCooldown > 0) { + queuedSync = true; + return; + } + super.sendData(); + queuedSync = false; + syncCooldown = SYNC_RATE; + } + + protected void spawnProcessingParticles(FluidStack fluid) { + Vec3d vec = VecHelper.getCenterOf(pos); + vec = vec.subtract(0, 8 / 16f, 0); + IParticleData particle = new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() + .getDefaultState() + .getBlockState()); + world.addOptionalParticle(particle, vec.x, vec.y, vec.z, 0, -.5f, 0); + } + + protected static int SPLASH_PARTICLE_COUNT = 20; + + protected void spawnSplash(FluidStack fluid) { + Vec3d vec = VecHelper.getCenterOf(pos); + vec = vec.subtract(0, 2 - 5 / 16f, 0); + IParticleData particle = new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() + .getDefaultState() + .getBlockState()); + for (int i = 0; i < SPLASH_PARTICLE_COUNT; i++) { + Vec3d m = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, 0.25f); + m = new Vec3d(m.x, Math.abs(m.y), m.z); + world.addOptionalParticle(particle, vec.x, vec.y, vec.z, m.x, m.y, m.z); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java new file mode 100644 index 000000000..71a17ee4f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -0,0 +1,97 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.Map; +import java.util.Random; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.contraptions.fluids.FluidPropagator; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.RotatedPillarBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.DebugPacketSender; +import net.minecraft.state.BooleanProperty; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +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.TickPriority; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; + +public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchable { + + public AxisPipeBlock(Properties p_i48339_1_) { + super(p_i48339_1_); + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + boolean blockTypeChanged = state.getBlock() != newState.getBlock(); + if (blockTypeChanged && !world.isRemote) + FluidPropagator.propagateChangedPipe(world, pos, state); + if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) + world.removeTileEntity(pos); + } + + @Override + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isRemote) + return; + if (state != oldState) + world.getPendingBlockTicks() + .scheduleTick(pos, this, 1, TickPriority.HIGH); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + return AllBlocks.FLUID_PIPE.asStack(); + } + + @Override + public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, + boolean isMoving) { + DebugPacketSender.func_218806_a(world, pos); + Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); + if (d == null) + return; + if (!isOpenAt(state, d)) + return; + world.getPendingBlockTicks() + .scheduleTick(pos, this, 1, TickPriority.HIGH); + } + + public static boolean isOpenAt(BlockState state, Direction d) { + return d.getAxis() == state.get(AXIS); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + FluidPropagator.propagateChangedPipe(world, pos, state); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.EIGHT_VOXEL_POLE.get(state.get(AXIS)); + } + + public BlockState toRegularPipe(IWorld world, BlockPos pos, BlockState state) { + Direction side = Direction.getFacingFromAxis(AxisDirection.POSITIVE, state.get(AXIS)); + Map facingToPropertyMap = FluidPipeBlock.FACING_TO_PROPERTY_MAP; + return AllBlocks.FLUID_PIPE.get() + .updateBlockState(AllBlocks.FLUID_PIPE.getDefaultState() + .with(facingToPropertyMap.get(side), true) + .with(facingToPropertyMap.get(side.getOpposite()), true), side, null, world, pos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java new file mode 100644 index 000000000..6d236427c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.simibubi.create.AllTileEntities; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemUseContext; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +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.World; + +public class EncasedPipeBlock extends AxisPipeBlock { + + public EncasedPipeBlock(Properties p_i48339_1_) { + super(p_i48339_1_); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.ENCASED_FLUID_PIPE.create(); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return VoxelShapes.fullCube(); + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + World world = context.getWorld(); + BlockPos pos = context.getPos(); + world.setBlockState(pos, toRegularPipe(world, pos, state), 3); + return ActionResultType.SUCCESS; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java new file mode 100644 index 000000000..299f70405 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java @@ -0,0 +1,248 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.Random; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; +import com.simibubi.create.content.contraptions.fluids.FluidPropagator; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +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.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemUseContext; +import net.minecraft.network.DebugPacketSender; +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.Axis; +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.world.IBlockReader; +import net.minecraft.world.ILightReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.TickPriority; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; + +public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWrenchable { + + public FluidPipeBlock(Properties properties) { + super(4 / 16f, properties); + this.setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + World world = context.getWorld(); + BlockPos pos = context.getPos(); + Axis axis = getAxis(world, pos, state); + if (axis == null) + return ActionResultType.PASS; + if (context.getFace() + .getAxis() == axis) + return ActionResultType.PASS; + if (!world.isRemote) + world.setBlockState(pos, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + .with(GlassFluidPipeBlock.AXIS, axis)); + return ActionResultType.SUCCESS; + } + + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult hit) { + if (!AllBlocks.COPPER_CASING.isIn(player.getHeldItem(hand))) + return ActionResultType.PASS; + Axis axis = getAxis(world, pos, state); + if (axis == null) + return ActionResultType.PASS; + if (!world.isRemote) + world.setBlockState(pos, AllBlocks.ENCASED_FLUID_PIPE.getDefaultState() + .with(EncasedPipeBlock.AXIS, axis)); + return ActionResultType.SUCCESS; + } + + @Nullable + private Axis getAxis(IBlockReader world, BlockPos pos, BlockState state) { + if (!FluidPropagator.isStraightPipe(state)) + return null; + Axis axis = null; + for (Direction d : Iterate.directions) { + if (isOpenAt(state, d)) { + axis = d.getAxis(); + break; + } + } + return axis; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.FLUID_PIPE.create(); + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + boolean blockTypeChanged = state.getBlock() != newState.getBlock(); + if (blockTypeChanged && !world.isRemote) + FluidPropagator.propagateChangedPipe(world, pos, state); + if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) + world.removeTileEntity(pos); + } + + @Override + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isRemote) + return; + if (state != oldState) + world.getPendingBlockTicks() + .scheduleTick(pos, this, 1, TickPriority.HIGH); + } + + @Override + public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, + boolean isMoving) { + DebugPacketSender.func_218806_a(world, pos); + Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); + if (d == null) + return; + if (!isOpenAt(state, d)) + return; + world.getPendingBlockTicks() + .scheduleTick(pos, this, 1, TickPriority.HIGH); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + FluidPropagator.propagateChangedPipe(world, pos, state); + } + + public static boolean isPipe(BlockState state) { + return state.getBlock() instanceof FluidPipeBlock; + } + + public static boolean canConnectTo(ILightReader world, BlockPos pos, BlockState neighbour, Direction blockFace) { + if (isPipe(neighbour) || FluidPropagator.hasFluidCapability(neighbour, world, pos, blockFace)) + return true; + FluidPipeAttachmentBehaviour attachmentBehaviour = + TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (attachmentBehaviour == null) + return false; + return attachmentBehaviour.isPipeConnectedTowards(neighbour, blockFace); + } + + public static boolean shouldDrawRim(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + BlockPos offsetPos = pos.offset(direction); + BlockState facingState = world.getBlockState(offsetPos); + if (!isPipe(facingState)) + return true; + if (!isCornerOrEndPipe(world, pos, state)) + return false; + if (FluidPropagator.isStraightPipe(facingState)) + return true; + if (!shouldDrawCasing(world, pos, state) && shouldDrawCasing(world, offsetPos, facingState)) + return true; + if (isCornerOrEndPipe(world, offsetPos, facingState)) + return direction.getAxisDirection() == AxisDirection.POSITIVE; + return true; + } + + public static boolean isOpenAt(BlockState state, Direction direction) { + return state.get(FACING_TO_PROPERTY_MAP.get(direction)); + } + + public static boolean isCornerOrEndPipe(ILightReader world, BlockPos pos, BlockState state) { + return isPipe(state) && !FluidPropagator.isStraightPipe(state) && !shouldDrawCasing(world, pos, state); + } + + public static boolean shouldDrawCasing(ILightReader world, BlockPos pos, BlockState state) { + if (!isPipe(state)) + return false; + for (Axis axis : Iterate.axes) { + int connections = 0; + for (Direction direction : Iterate.directions) + if (direction.getAxis() != axis && isOpenAt(state, direction)) + connections++; + if (connections > 2) + return true; + } + return false; + } + + @Override + protected void fillStateContainer(Builder builder) { + 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()).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); + } + + public BlockState updateBlockState(BlockState state, Direction preferredDirection, @Nullable Direction ignore, + ILightReader world, BlockPos pos) { + // Update sides that are not ignored + for (Direction d : Iterate.directions) + if (d != ignore) + state = state.with(FACING_TO_PROPERTY_MAP.get(d), + canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d)); + + // See if it has enough connections + Direction connectedDirection = null; + for (Direction d : Iterate.directions) { + if (isOpenAt(state, d)) { + if (connectedDirection != null) + return state; + connectedDirection = d; + } + } + + // Add opposite end if only one connection + if (connectedDirection != null) + return state.with(FACING_TO_PROPERTY_MAP.get(connectedDirection.getOpposite()), true); + + // Use preferred + 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/pipes/FluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java new file mode 100644 index 000000000..5b0ca5222 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.List; + +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; +import com.simibubi.create.content.contraptions.fluids.FluidPipeBehaviour; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; + +public class FluidPipeTileEntity extends SmartTileEntity { + + public FluidPipeTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new StandardPipeBehaviour(this)); + behaviours.add(new StandardPipeAttachmentBehaviour(this)); + } + + class StandardPipeBehaviour extends FluidPipeBehaviour { + + public StandardPipeBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public boolean isConnectedTo(BlockState state, Direction direction) { + return FluidPipeBlock.isPipe(state) && state.get(FluidPipeBlock.FACING_TO_PROPERTY_MAP.get(direction)); + } + + } + + class StandardPipeAttachmentBehaviour extends FluidPipeAttachmentBehaviour { + + public StandardPipeAttachmentBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public AttachmentTypes getAttachment(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + AttachmentTypes attachment = super.getAttachment(world, pos, state, direction); + + BlockPos offsetPos = pos.offset(direction); + if (!FluidPipeBlock.isPipe(world.getBlockState(offsetPos))) { + FluidPipeAttachmentBehaviour attachmentBehaviour = + TileEntityBehaviour.get(world, offsetPos, FluidPipeAttachmentBehaviour.TYPE); + if (attachmentBehaviour != null && attachmentBehaviour + .isPipeConnectedTowards(world.getBlockState(offsetPos), direction.getOpposite())) + return AttachmentTypes.NONE; + } + + if (attachment == AttachmentTypes.RIM && !FluidPipeBlock.shouldDrawRim(world, pos, state, direction)) + return AttachmentTypes.NONE; + return attachment; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java new file mode 100644 index 000000000..83f3bae69 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.simibubi.create.AllTileEntities; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemUseContext; +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.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class GlassFluidPipeBlock extends AxisPipeBlock { + + public static final BooleanProperty ALT = BooleanProperty.create("alt"); + + public GlassFluidPipeBlock(Properties p_i48339_1_) { + super(p_i48339_1_); + setDefaultState(getDefaultState().with(ALT, false)); + } + + @Override + protected void fillStateContainer(Builder p_206840_1_) { + super.fillStateContainer(p_206840_1_.add(ALT)); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.GLASS_FLUID_PIPE.create(); + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + BlockState newState = state; + World world = context.getWorld(); + BlockPos pos = context.getPos(); + if (!state.get(ALT)) + newState = state.with(ALT, true); + else + newState = toRegularPipe(world, pos, state); + world.setBlockState(pos, newState, 3); + return ActionResultType.SUCCESS; + } + + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java new file mode 100644 index 000000000..b5e273f5b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java @@ -0,0 +1,64 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.List; + +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; +import com.simibubi.create.content.contraptions.fluids.FluidPipeBehaviour; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; + +public class StraightPipeTileEntity extends SmartTileEntity { + + public StraightPipeTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new StraightPipeBehaviour(this)); + behaviours.add(new StraightPipeAttachmentBehaviour(this)); + } + + class StraightPipeBehaviour extends FluidPipeBehaviour { + + public StraightPipeBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public boolean isConnectedTo(BlockState state, Direction direction) { + return state.get(AxisPipeBlock.AXIS) == direction.getAxis(); + } + + } + + class StraightPipeAttachmentBehaviour extends FluidPipeAttachmentBehaviour { + + public StraightPipeAttachmentBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public AttachmentTypes getAttachment(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + AttachmentTypes attachment = super.getAttachment(world, pos, state, direction); + BlockState otherState = world.getBlockState(pos.offset(direction)); + if (state.getBlock() instanceof AxisPipeBlock && otherState.getBlock() instanceof AxisPipeBlock) { + if (state.get(AxisPipeBlock.AXIS) == otherState.get(AxisPipeBlock.AXIS)) { + if (state.getBlock() == otherState.getBlock() + || direction.getAxisDirection() == AxisDirection.POSITIVE) + return AttachmentTypes.NONE; + } + } + return attachment; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java new file mode 100644 index 000000000..c5d446bb6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java @@ -0,0 +1,59 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.fluids.FluidPipeBehaviour; +import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraftforge.fluids.FluidStack; + +public class TransparentStraightPipeRenderer extends SafeTileEntityRenderer { + + public TransparentStraightPipeRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(StraightPipeTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + FluidPipeBehaviour pipe = te.getBehaviour(FluidPipeBehaviour.TYPE); + if (pipe == null) + return; + FluidStack fluidStack = pipe.getFluid(); + if (fluidStack.isEmpty()) + return; + + for (Direction side : Iterate.directions) { + if (!pipe.isConnectedTo(te.getBlockState(), side)) + continue; + Pair strogestFlow = pipe.getStrogestFlow(side); + if (strogestFlow == null) + continue; + LerpedFloat second = strogestFlow.getSecond(); + if (second == null) + continue; + + float value = second.getValue(partialTicks); + Boolean inbound = strogestFlow.getFirst(); + if (value == 1 && !inbound) { + FluidPipeBehaviour adjacent = TileEntityBehaviour.get(te.getWorld(), te.getPos() + .offset(side), FluidPipeBehaviour.TYPE); + + if (adjacent != null && adjacent.getFluid() + .isEmpty()) + value -= 1e-6f; + } + + FluidRenderer.renderFluidStream(fluidStack, side, 3 / 16f, value, inbound, buffer, ms, light); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java similarity index 96% rename from src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java rename to src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 35a482a47..0b209bbbf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.contraptions.fluids; +package com.simibubi.create.content.contraptions.fluids.tank; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; @@ -31,7 +31,7 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; @@ -171,10 +171,10 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE 0) { + syncCooldown--; + if (syncCooldown == 0 && queuedSync) + sendData(); + } if (updateConnectivity) updateConnectivity(); if (fluidLevel != null) @@ -96,7 +106,7 @@ public class FluidTankTileEntity extends SmartTileEntity { FluidAttributes attributes = newFluidStack.getFluid() .getAttributes(); - int luminosity = attributes.getLuminosity(newFluidStack) / 2; + int luminosity = (int) (attributes.getLuminosity(newFluidStack) / 1.2f); boolean reversed = attributes.isLighterThanAir(); int maxY = (int) ((getFillState() * height) + 1); @@ -116,6 +126,11 @@ public class FluidTankTileEntity extends SmartTileEntity { } } } + + if (!world.isRemote) { + markDirty(); + sendData(); + } } protected void setLuminosity(int luminosity) { @@ -162,6 +177,7 @@ public class FluidTankTileEntity extends SmartTileEntity { getWorld().setBlockState(pos, state, 22); } + refreshCapability(); markDirty(); sendData(); } @@ -173,6 +189,23 @@ public class FluidTankTileEntity extends SmartTileEntity { te.setWindows(!te.window); } + public void sendDataImmediately() { + syncCooldown = 0; + queuedSync = false; + sendData(); + } + + @Override + public void sendData() { + if (syncCooldown > 0) { + queuedSync = true; + return; + } + super.sendData(); + queuedSync = false; + syncCooldown = SYNC_RATE; + } + public void setWindows(boolean window) { this.window = window; for (int yOffset = 0; yOffset < height; yOffset++) { @@ -213,10 +246,18 @@ public class FluidTankTileEntity extends SmartTileEntity { if (controller.equals(this.controller)) return; this.controller = controller; + refreshCapability(); markDirty(); sendData(); } + private void refreshCapability() { + LazyOptional oldCap = fluidCapability; + fluidCapability = LazyOptional.of(() -> isController() ? tankInventory + : getControllerTE() != null ? getControllerTE().tankInventory : new FluidTank(0)); + oldCap.invalidate(); + } + public BlockPos getController() { return isController() ? pos : controller; } @@ -236,39 +277,38 @@ public class FluidTankTileEntity extends SmartTileEntity { } @Override - public void read(CompoundNBT tag) { - super.read(tag); - updateConnectivity = tag.contains("Uninitialized"); - luminosity = tag.getInt("Luminosity"); - controller = null; - - if (tag.contains("Controller")) - controller = NBTUtil.readBlockPos(tag.getCompound("Controller")); - - if (isController()) { - window = tag.getBoolean("Window"); - width = tag.getInt("Size"); - height = tag.getInt("Height"); - tankInventory.setCapacity(getTotalTankSize() * getCapacityMultiplier()); - tankInventory.readFromNBT(tag.getCompound("TankContent")); - if (tankInventory.getSpace() < 0) - tankInventory.drain(-tankInventory.getSpace(), FluidAction.EXECUTE); - } - - if (tag.contains("ForceFluidLevel") || fluidLevel == null) - fluidLevel = new InterpolatedChasingValue().start(getFillState()) - .withSpeed(1 / 2f); - } - - @Override - public void readClientUpdate(CompoundNBT tag) { + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + BlockPos controllerBefore = controller; int prevSize = width; int prevHeight = height; int prevLum = luminosity; + + updateConnectivity = compound.contains("Uninitialized"); + luminosity = compound.getInt("Luminosity"); + controller = null; - super.readClientUpdate(tag); + if (compound.contains("Controller")) + controller = NBTUtil.readBlockPos(compound.getCompound("Controller")); + if (isController()) { + window = compound.getBoolean("Window"); + width = compound.getInt("Size"); + height = compound.getInt("Height"); + tankInventory.setCapacity(getTotalTankSize() * getCapacityMultiplier()); + tankInventory.readFromNBT(compound.getCompound("TankContent")); + if (tankInventory.getSpace() < 0) + tankInventory.drain(-tankInventory.getSpace(), FluidAction.EXECUTE); + } + + if (compound.contains("ForceFluidLevel") || fluidLevel == null) + fluidLevel = new InterpolatedChasingValue().start(getFillState()) + .withSpeed(1 / 2f); + + if (!clientPacket) + return; + boolean changeOfController = controllerBefore == null ? controller != null : !controllerBefore.equals(controller); if (changeOfController || prevSize != width || prevHeight != height) { @@ -279,15 +319,17 @@ public class FluidTankTileEntity extends SmartTileEntity { } if (isController()) { float fillState = getFillState(); - if (tag.contains("ForceFluidLevel") || fluidLevel == null) - fluidLevel = new InterpolatedChasingValue().start(fillState) - .withSpeed(1 / 2f); + if (compound.contains("ForceFluidLevel") || fluidLevel == null) + fluidLevel = new InterpolatedChasingValue().start(fillState); fluidLevel.target(fillState); } if (luminosity != prevLum && hasWorld()) world.getChunkProvider() - .getLightManager() - .checkBlock(pos); + .getLightManager() + .checkBlock(pos); + + if (compound.contains("LazySync")) + fluidLevel.withSpeed(compound.contains("LazySync") ? 1 / 8f : 1 / 2f); } protected float getFillState() { @@ -295,44 +337,42 @@ public class FluidTankTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT tag) { + public void write(CompoundNBT compound, boolean clientPacket) { if (updateConnectivity) - tag.putBoolean("Uninitialized", true); + compound.putBoolean("Uninitialized", true); if (!isController()) - tag.put("Controller", NBTUtil.writeBlockPos(controller)); + compound.put("Controller", NBTUtil.writeBlockPos(controller)); if (isController()) { - tag.putBoolean("Window", window); - tag.put("TankContent", tankInventory.writeToNBT(new CompoundNBT())); - tag.putInt("Size", width); - tag.putInt("Height", height); + compound.putBoolean("Window", window); + compound.put("TankContent", tankInventory.writeToNBT(new CompoundNBT())); + compound.putInt("Size", width); + compound.putInt("Height", height); } - tag.putInt("Luminosity", luminosity); - return super.write(tag); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { + compound.putInt("Luminosity", luminosity); + super.write(compound, clientPacket); + + if (!clientPacket) + return; if (forceFluidLevelUpdate) compound.putBoolean("ForceFluidLevel", true); + if (queuedSync) + compound.putBoolean("LazySync", true); forceFluidLevelUpdate = false; - return super.writeToClient(compound); } @Nonnull @Override public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - FluidTankTileEntity controller = getControllerTE(); - if (controller != null) - return controller.fluidCapability.cast(); - } + if (!fluidCapability.isPresent()) + refreshCapability(); + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + return fluidCapability.cast(); return super.getCapability(cap, side); } @Override public void remove() { super.remove(); - fluidCapability.invalidate(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java index 09ed16ef0..f1a0acf11 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.particle; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.utility.ColorHelper; @@ -32,7 +33,7 @@ public class AirFlowParticle extends SimpleAnimatedParticle { this.maxAge = 40; canCollide = false; selectSprite(7); - Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .25f); + Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, Create.random, .25f); this.setPosition(posX + offset.x, posY + offset.y, posZ + offset.z); this.prevPosX = posX; this.prevPosY = posY; diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java new file mode 100644 index 000000000..f6524ea40 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java @@ -0,0 +1,104 @@ +package com.simibubi.create.content.contraptions.particle; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class AirParticle extends SimpleAnimatedParticle { + + private float originX, originY, originZ; + private float targetX, targetY, targetZ; + private float drag; + + private float twirlRadius, twirlAngleOffset; + private Axis twirlAxis; + + protected AirParticle(World world, AirParticleData data, double x, double y, double z, double dx, double dy, + double dz, IAnimatedSprite sprite) { + super(world, x, y, z, sprite, world.rand.nextFloat() * .5f); + particleScale *= 0.75F; + canCollide = false; + + setPosition(posX, posY, posZ); + originX = (float) (prevPosX = posX); + originY = (float) (prevPosY = posY); + originZ = (float) (prevPosZ = posZ); + targetX = (float) (x + dx); + targetY = (float) (y + dy); + targetZ = (float) (z + dz); + drag = data.drag; + + twirlRadius = Create.random.nextFloat() / 6; + twirlAngleOffset = Create.random.nextFloat() * 360; + twirlAxis = Create.random.nextBoolean() ? Axis.X : Axis.Z; + + // speed in m/ticks + maxAge = Math.min((int) (new Vec3d(dx, dy, dz).length() / data.speed), 60); + selectSprite(7); + setAlphaF(.25f); + } + + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + @Override + public void tick() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (this.age++ >= this.maxAge) { + this.setExpired(); + return; + } + + float progress = (float) Math.pow(((float) age) / maxAge, drag); + float angle = (progress * 2 * 360 + twirlAngleOffset) % 360; + Vec3d twirl = VecHelper.rotate(new Vec3d(0, twirlRadius, 0), angle, twirlAxis); + + float x = (float) (MathHelper.lerp(progress, originX, targetX) + twirl.x); + float y = (float) (MathHelper.lerp(progress, originY, targetY) + twirl.y); + float z = (float) (MathHelper.lerp(progress, originZ, targetZ) + twirl.z); + + motionX = x - posX; + motionY = y - posY; + motionZ = z - posZ; + + selectSpriteWithAge(field_217584_C); + this.move(this.motionX, this.motionY, this.motionZ); + } + + public int getBrightnessForRender(float partialTick) { + BlockPos blockpos = new BlockPos(this.posX, this.posY, this.posZ); + return this.world.isBlockPresent(blockpos) ? WorldRenderer.getLightmapCoordinates(world, blockpos) : 0; + } + + private void selectSprite(int index) { + setSprite(field_217584_C.get(index, 8)); + } + + public static class Factory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public Factory(IAnimatedSprite animatedSprite) { + this.spriteSet = animatedSprite; + } + + public Particle makeParticle(AirParticleData data, World worldIn, double x, double y, double z, double xSpeed, + double ySpeed, double zSpeed) { + return new AirParticle(worldIn, data, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java new file mode 100644 index 000000000..3f40c9576 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java @@ -0,0 +1,73 @@ +package com.simibubi.create.content.contraptions.particle; + +import java.util.Locale; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.simibubi.create.AllParticleTypes; + +import net.minecraft.client.particle.ParticleManager.IParticleMetaFactory; +import net.minecraft.network.PacketBuffer; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class AirParticleData implements IParticleData, ICustomParticle { + + public static final IParticleData.IDeserializer DESERIALIZER = + new IParticleData.IDeserializer() { + public AirParticleData deserialize(ParticleType particleTypeIn, StringReader reader) + throws CommandSyntaxException { + reader.expect(' '); + float drag = reader.readFloat(); + reader.expect(' '); + float speed = reader.readFloat(); + return new AirParticleData(drag, speed); + } + + public AirParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { + return new AirParticleData(buffer.readFloat(), buffer.readFloat()); + } + }; + + float drag; + float speed; + + public AirParticleData(float drag, float speed) { + this.drag = drag; + this.speed = speed; + } + + public AirParticleData() { + this(0, 0); + } + + @Override + public ParticleType getType() { + return AllParticleTypes.AIR.get(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeFloat(drag); + buffer.writeFloat(speed); + } + + @Override + public String getParameters() { + return String.format(Locale.ROOT, "%s %f %f", AllParticleTypes.AIR.parameter(), drag, speed); + } + + @Override + public IDeserializer getDeserializer() { + return DESERIALIZER; + } + + @Override + @OnlyIn(Dist.CLIENT) + public IParticleMetaFactory getFactory() { + return AirParticle.Factory::new; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java index da7f7f7fc..5668b81ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java @@ -14,6 +14,7 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; @@ -75,11 +76,13 @@ public class CubeParticle extends Particle { tessellator.draw(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.disableLighting(); RenderSystem.enableTexture(); } }; protected float scale; + protected boolean hot; public CubeParticle(World world, double x, double y, double z, double motionX, double motionY, double motionZ) { super(world, x, y, z); @@ -92,12 +95,39 @@ public class CubeParticle extends Particle { public void setScale(float scale) { this.scale = scale; - this.setSize(scale, scale); + this.setSize(scale * 0.5f, scale * 0.5f); } public void averageAge(int age) { this.maxAge = (int) (age + (rand.nextDouble() * 2D - 1D) * 8); } + + public void setHot(boolean hot) { + this.hot = hot; + } + + private boolean billowing = false; + + @Override + public void tick() { + if (this.hot && this.age > 0) { + if (this.prevPosY == this.posY) { + billowing = true; + field_228343_B_ = false; // Prevent motion being ignored due to vertical collision + if (this.motionX == 0 && this.motionZ == 0) { + Vec3d diff = new Vec3d(new BlockPos(posX, posY, posZ)).add(0.5, 0.5, 0.5).subtract(posX, posY, posZ); + this.motionX = -diff.x * 0.1; + this.motionZ = -diff.z * 0.1; + } + this.motionX *= 1.1; + this.motionY *= 0.9; + this.motionZ *= 1.1; + } else if (billowing) { + this.motionY *= 1.2; + } + } + super.tick(); + } @Override public void buildGeometry(IVertexBuilder builder, ActiveRenderInfo renderInfo, float p_225606_3_) { @@ -146,6 +176,7 @@ public class CubeParticle extends Particle { particle.setColor(data.r, data.g, data.b); particle.setScale(data.scale); particle.averageAge(data.avgAge); + particle.setHot(data.hot); return particle; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java index 7e2ec3279..dc22608c7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java @@ -28,12 +28,14 @@ public class CubeParticleData implements IParticleData, ICustomParticle type, PacketBuffer buffer) { - return new CubeParticleData(buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readInt()); + return new CubeParticleData(buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readInt(), buffer.readBoolean()); } }; @@ -42,17 +44,19 @@ public class CubeParticleData implements IParticleData, ICustomParticle, IWrenchab try { BasinTileEntity te = getTileEntity(worldIn, pos); - IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1)); + IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1)); for (int slot = 0; slot < inv.getSlots(); slot++) { player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); inv.setStackInSlot(slot, ItemStack.EMPTY); @@ -81,12 +83,10 @@ public class BasinBlock extends Block implements ITE, IWrenchab return; ItemEntity itemEntity = (ItemEntity) entityIn; withTileEntityDo(worldIn, entityIn.getPosition(), te -> { - ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputItemInventory, itemEntity.getItem() + ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem() .copy(), false); - if (insertItem.isEmpty()) { itemEntity.remove(); - if (!itemEntity.world.isRemote) AllTriggers.triggerForNearbyPlayers(AllTriggers.BASIN_THROW, itemEntity.world, itemEntity.getPosition(), 3); @@ -103,14 +103,20 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) { - return; - } + public VoxelShape getCollisionShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext ctx) { + if (ctx.getEntity() instanceof ItemEntity) + return AllShapes.BASIN_COLLISION_SHAPE; + return getShape(state, reader, pos, ctx); + } + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) + return; + TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); withTileEntityDo(worldIn, pos, te -> { - ItemHelper.dropContents(worldIn, pos, te.inputItemInventory); - ItemHelper.dropContents(worldIn, pos, te.outputItemInventory); + ItemHelper.dropContents(worldIn, pos, te.inputInventory); + ItemHelper.dropContents(worldIn, pos, te.outputInventory); }); worldIn.removeTileEntity(pos); } @@ -123,7 +129,7 @@ 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).inputItemInventory); + return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory); } catch (TileEntityException e) { } return 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInputInventory.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInputInventory.java new file mode 100644 index 000000000..6f105dd5e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInputInventory.java @@ -0,0 +1,27 @@ +package com.simibubi.create.content.contraptions.processing; + +import com.simibubi.create.foundation.item.SmartInventory; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; + +public class BasinInputInventory extends SmartInventory { + + public BasinInputInventory(int slots, BasinTileEntity te) { + super(slots, te); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + // Only insert if no other slot already has a 'full' stack of this item + for (int i = 0; i < getSlots(); i++) { + ItemStack stackInSlot = getStackInSlot(i); + if (ItemHandlerHelper.canItemStacksStack(stack, stackInSlot) + && stackInSlot.getCount() == getStackLimit(i, stackInSlot)) + return stack; + } + + return super.insertItem(slot, stack, simulate); + } + +} 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 18645dedd..26320f935 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,10 +7,9 @@ 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; +import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.simple.DeferralBehaviour; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; @@ -23,11 +22,11 @@ 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.FluidStack; 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; import net.minecraftforge.items.ItemHandlerHelper; public abstract class BasinOperatingTileEntity extends KineticTileEntity { @@ -35,12 +34,16 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { public DeferralBehaviour basinChecker; public boolean basinRemoved; protected IRecipe lastRecipe; + protected LazyOptional basinItemInv = LazyOptional.empty(); + protected List itemInputs; protected LazyOptional basinFluidInv = LazyOptional.empty(); - protected CombinedItemFluidList inputs; + protected List fluidInputs; public BasinOperatingTileEntity(TileEntityType typeIn) { super(typeIn); + itemInputs = new ArrayList<>(); + fluidInputs = new ArrayList<>(); } @Override @@ -59,26 +62,30 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { } public void gatherInputs() { - inputs = new CombinedItemFluidList(); - - 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); - } + itemInputs.clear(); + basinItemInv.ifPresent(handler -> { + for (int slot = 0; slot < handler.getSlots(); ++slot) { + ItemStack itemstack = handler.getStackInSlot(slot); + if (!itemstack.isEmpty()) + itemInputs.add(itemstack); } }); - basinFluidInv.ifPresent(iFluidHandler -> ((CombinedFluidHandler) iFluidHandler).forEachTank(inputs::add)); + fluidInputs.clear(); + basinFluidInv.ifPresent(handler -> { + for (int tank = 0; tank < handler.getTanks(); tank++) { + FluidStack fluidInTank = handler.getFluidInTank(tank); + if (!fluidInTank.isEmpty()) + fluidInputs.add(fluidInTank); + } + }); } @Override public void tick() { if (basinRemoved) { basinRemoved = false; - basinRemoved(); + onBasinRemoved(); sendData(); return; } @@ -134,31 +141,27 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { if (!basinItemInv.isPresent() || !basinFluidInv.isPresent()) return; - BasinInventory inv = (BasinInventory) basinItemInv.orElse(null); - - IItemHandlerModifiable inputs = inv.getInputHandler(); - IItemHandlerModifiable outputs = inv.getOutputHandler(); - List catalysts = new ArrayList<>(); + Optional basin = getBasin(); + if (!basin.isPresent()) + return; + SmartInventory inputs = basin.get().getInputInventory(); + SmartInventory outputs = basin.get().getOutputInventory(); List containers = new ArrayList<>(); NonNullList ingredients = lastRecipe.getIngredients(); Ingredients: for (int i = 0; i < ingredients.size(); i++) { Ingredient ingredient = ingredients.get(i); + for (int slot = 0; slot < inputs.getSlots(); slot++) { if (!ingredient.test(inputs.extractItem(slot, 1, true))) continue; ItemStack extracted = inputs.extractItem(slot, 1, false); - if ((lastRecipe instanceof ProcessingRecipe) - && ((ProcessingRecipe) lastRecipe).getRollableIngredients() - .get(i) - .remains()) { - catalysts.add(extracted.copy()); - } else if (extracted.hasContainerItem()) { + if (extracted.hasContainerItem()) containers.add(extracted.getContainerItem() .copy()); - } continue Ingredients; } + // something wasn't found return; } @@ -170,10 +173,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { AllTriggers.triggerForNearbyPlayers(trigger, world, pos, 4); } + outputs.allowInsertion(); ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput() - .copy(), false); + .copy(), false); // TODO only works for single item output containers.forEach(stack -> ItemHandlerHelper.insertItemStacked(outputs, stack, false)); - catalysts.forEach(c -> ItemHandlerHelper.insertItemStacked(outputs, c, false)); + outputs.forbidInsertion(); // Continue mixing gatherInputs(); @@ -182,22 +186,21 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { sendData(); } - getBasin().ifPresent(te -> te.contentsChanged = true); + getBasin().ifPresent(BasinTileEntity::notifyChangeOfContents); } 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() + .sorted((r1, r2) -> r2.getIngredients() + .size() + - r1.getIngredients() .size()) .collect(Collectors.toList()); } - protected void basinRemoved() { - - } + protected abstract void onBasinRemoved(); protected Optional getBasin() { if (world == null) @@ -210,7 +213,24 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract boolean matchStaticFilters(IRecipe recipe); - protected abstract boolean matchBasinRecipe(IRecipe recipe); + protected boolean matchBasinRecipe(IRecipe recipe) { + if (recipe == null) + return false; + + Optional basin = getBasin(); + if (!basin.isPresent()) + return false; + BasinTileEntity basinTileEntity = basin.get(); + if (!basinTileEntity.getFilter() + .test(recipe.getRecipeOutput())) + return false; + + NonNullList ingredients = recipe.getIngredients(); + if (!ingredients.stream() + .allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1))) + return false; + return true; + } protected abstract Object getRecipeCacheKey(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index ff0bbd9f3..610af7156 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.processing; import java.util.Random; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -17,7 +17,7 @@ import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; -public class BasinRenderer extends SafeTileEntityRenderer { +public class BasinRenderer extends SmartTileEntityRenderer { public BasinRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -25,13 +25,15 @@ public class BasinRenderer extends SafeTileEntityRenderer { @Override protected void renderSafe(BasinTileEntity basin, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { + super.renderSafe(basin, partialTicks, ms, buffer, light, overlay); + ms.push(); BlockPos pos = basin.getPos(); ms.translate(.5, .2f, .5); Random r = new Random(pos.hashCode()); - IItemHandlerModifiable inv = basin.inventory.orElse(new ItemStackHandler()); + IItemHandlerModifiable inv = basin.itemCapability.orElse(new ItemStackHandler()); for (int slot = 0; slot < inv.getSlots(); slot++) { ItemStack stack = inv.getStackInSlot(slot); if (stack.isEmpty()) @@ -44,7 +46,9 @@ public class BasinRenderer extends SafeTileEntityRenderer { ms.translate(vec.x, vec.y, vec.z); ms.multiply(new Vector3f((float) vec2.z, (float) vec2.y, 0).getDegreesQuaternion((float) vec2.x * 180)); - Minecraft.getInstance().getItemRenderer().renderItem(stack, TransformType.GROUND, light, overlay, ms, buffer); + Minecraft.getInstance() + .getItemRenderer() + .renderItem(stack, TransformType.GROUND, light, overlay, ms, buffer); ms.pop(); } ms.translate(0, 1 / 64f, 0); 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 f96fc6384..5dcbc472c 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 @@ -6,137 +6,79 @@ import java.util.Optional; import javax.annotation.Nonnull; import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; +import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.VecHelper; -import net.minecraft.item.ItemStack; +import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; 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; -import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; -import net.minecraftforge.items.wrapper.RecipeWrapper; public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity { - public boolean contentsChanged; - - protected ItemStackHandler outputItemInventory = new ItemStackHandler(9) { - protected void onContentsChanged(int slot) { - sendData(); - markDirty(); - } - }; - - public class BasinInputInventory extends RecipeWrapper { - public BasinInputInventory() { - super(inputItemInventory); - } - } - - protected ItemStackHandler inputItemInventory = new ItemStackHandler(9) { - protected void onContentsChanged(int slot) { - contentsChanged = true; - sendData(); - markDirty(); - } - - @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)) - if (stackInSlot.getCount() == getStackLimit(i, stackInSlot)) - return stack; - } - return super.insertItem(slot, stack, simulate); - } - }; - - public static class BasinInventory extends CombinedInvWrapper { - public BasinInventory(ItemStackHandler input, ItemStackHandler output) { - super(input, output); - } - - @Nonnull - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (isInput(slot)) - return ItemStack.EMPTY; - return super.extractItem(slot, amount, simulate); - } - - @Nonnull - @Override - public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { - if (!isInput(slot)) - return stack; - return super.insertItem(slot, stack, simulate); - } - - public boolean isInput(int slot) { - return getIndexForSlot(slot) == 0; - } - - public IItemHandlerModifiable getInputHandler() { - return itemHandler[0]; - } - - public IItemHandlerModifiable getOutputHandler() { - return itemHandler[1]; - } - - } - - protected LazyOptional inventory = - LazyOptional.of(() -> new BasinInventory(inputItemInventory, outputItemInventory)); - - protected LazyOptional fluidInventory = - LazyOptional.of(() -> new CombinedFluidHandler(9, 1000)); - - public BasinInputInventory recipeInventory; + public BasinInputInventory inputInventory; + protected SmartInventory outputInventory; + protected LazyOptional itemCapability; + protected LazyOptional fluidCapability; + + private boolean contentsChanged; + private FilteringBehaviour filtering; public BasinTileEntity(TileEntityType type) { super(type); + inputInventory = new BasinInputInventory(9, this); + inputInventory.withMaxStackSize(8).forbidExtraction(); + outputInventory = new SmartInventory(9, this).forbidInsertion(); + itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory)); + fluidCapability = LazyOptional.of(() -> new CombinedFluidHandler(9, 1000)); contentsChanged = true; - recipeInventory = new BasinInputInventory(); } @Override public void addBehaviours(List behaviours) { behaviours.add(new DirectBeltInputBehaviour(this)); + filtering = new FilteringBehaviour(this, new BasinValueBox()).moveText(new Vec3d(2, -8, 0)) + .withCallback(newFilter -> contentsChanged = true) + .forRecipes(); + behaviours.add(filtering); } @Override - public void read(CompoundNBT compound) { - super.read(compound); - inputItemInventory.deserializeNBT(compound.getCompound("InputItems")); - outputItemInventory.deserializeNBT(compound.getCompound("OutputItems")); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + inputInventory.deserializeNBT(compound.getCompound("InputItems")); + outputInventory.deserializeNBT(compound.getCompound("OutputItems")); if (compound.contains("fluids")) - fluidInventory + fluidCapability .ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10))); } @Override - public CompoundNBT write(CompoundNBT compound) { - super.write(compound); - compound.put("InputItems", inputItemInventory.serializeNBT()); - compound.put("OutputItems", outputItemInventory.serializeNBT()); - fluidInventory.ifPresent(combinedFuidHandler -> { + public void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.put("InputItems", inputInventory.serializeNBT()); + compound.put("OutputItems", outputInventory.serializeNBT()); + fluidCapability.ifPresent(combinedFuidHandler -> { ListNBT nbt = combinedFuidHandler.getListNBT(); compound.put("fluids", nbt); }); - return compound; } public void onEmptied() { @@ -146,8 +88,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt @Override public void remove() { onEmptied(); - inventory.invalidate(); - fluidInventory.invalidate(); + itemCapability.invalidate(); + fluidCapability.invalidate(); super.remove(); } @@ -155,9 +97,9 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt @Override public LazyOptional getCapability(@Nonnull Capability cap, Direction side) { if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - return inventory.cast(); + return itemCapability.cast(); if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - return fluidInventory.cast(); + return fluidCapability.cast(); return super.getCapability(cap, side); } @@ -178,4 +120,41 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt return Optional.empty(); } + public FilteringBehaviour getFilter() { + return filtering; + } + + public void notifyChangeOfContents() { + contentsChanged = true; + } + + public SmartInventory getInputInventory() { + return inputInventory; + } + + public SmartInventory getOutputInventory() { + return outputInventory; + } + + @Override + @OnlyIn(Dist.CLIENT) + public double getMaxRenderDistanceSquared() { + return 256; + } + + class BasinValueBox extends ValueBoxTransform.Sided { + + @Override + protected Vec3d getSouthLocation() { + return VecHelper.voxelSpace(8, 12, 16); + } + + @Override + protected boolean isSideActive(BlockState state, Direction direction) { + return direction.getAxis() + .isHorizontal(); + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/CombinedItemFluidList.java b/src/main/java/com/simibubi/create/content/contraptions/processing/CombinedItemFluidList.java deleted file mode 100644 index f5eac96d6..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/CombinedItemFluidList.java +++ /dev/null @@ -1,36 +0,0 @@ -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 CombinedItemFluidList { - private final ArrayList itemStacks = new ArrayList<>(); - private final ArrayList fluidStacks = new ArrayList<>(); - - public void add(ItemStack itemstack) { - itemStacks.add(itemstack); - } - - public void add(FluidStack fluidStack) { - fluidStacks.add(fluidStack); - } - - public void forEachItemStack(Consumer itemStackConsumer) { - itemStacks.forEach(itemStackConsumer); - } - - public void forEachFluidStack(Consumer fluidStackConsumer) { - fluidStacks.forEach(fluidStackConsumer); - } - - public ArrayList getItemStacks() { - return itemStacks; - } - - public ArrayList getFluidStacks() { - return fluidStacks; - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java new file mode 100644 index 000000000..cb8bdfbbe --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.contraptions.processing; + +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.utility.Lang; + +public enum HeatCondition { + + NONE, HEATED, SUPERHEATED, + + ; + + public boolean testBlazeBurner(BlazeBurnerBlock.HeatLevel level) { + if (this == SUPERHEATED) + return level == HeatLevel.SEETHING; + if (this == HEATED) + return level != HeatLevel.NONE && level != HeatLevel.SMOULDERING; + return true; + } + + public BlazeBurnerBlock.HeatLevel visualizeAsBlazeBurner() { + if (this == SUPERHEATED) + return HeatLevel.SEETHING; + if (this == HEATED) + return HeatLevel.KINDLED; + return HeatLevel.NONE; + } + + public String serialize() { + return Lang.asId(name()); + } + + public static HeatCondition deserialize(String name) { + for (HeatCondition heatCondition : values()) + if (heatCondition.serialize() + .equals(name)) + return heatCondition; + Create.logger.warn("Tried to deserialize invalid heat condition: \"" + name + "\""); + return NONE; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java deleted file mode 100644 index 71530f5fa..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.simibubi.create.content.contraptions.processing; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -import com.simibubi.create.AllShapes; -import com.simibubi.create.AllTileEntities; -import com.simibubi.create.foundation.block.ITE; - -import com.simibubi.create.foundation.utility.Lang; -import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.state.EnumProperty; -import net.minecraft.state.Property; -import net.minecraft.state.StateContainer.Builder; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -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.MathHelper; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HeaterBlock extends Block implements ITE { - - //public static Property BLAZE_LEVEL = IntegerProperty.create("blaze_level", 0, 4); - public static Property BLAZE_LEVEL = EnumProperty.create("blaze", HeatLevel.class); - - public HeaterBlock(Properties properties) { - super(properties); - setDefaultState(super.getDefaultState().with(BLAZE_LEVEL, HeatLevel.NONE)); - } - - @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder); - builder.add(BLAZE_LEVEL); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return state.get(BLAZE_LEVEL).min(HeatLevel.SMOULDERING); - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.HEATER.create(); - } - - @Override - public Class getTileEntityClass() { - return HeaterTileEntity.class; - } - - @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { - if (!hasTileEntity(state)) - return ActionResultType.PASS; - - TileEntity te = world.getTileEntity(pos); - if (!(te instanceof HeaterTileEntity)) - return ActionResultType.PASS; - - if (!((HeaterTileEntity) te).tryUpdateFuel(player.getHeldItem(hand), player)) - return ActionResultType.PASS; - - if (!player.isCreative()) - player.getHeldItem(hand).shrink(1); - - return ActionResultType.SUCCESS; - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - if (!context.getItem().hasTag()) - return getDefaultState(); - - CompoundNBT tag = context.getItem().getTag(); - if (!tag.contains("has_blaze")) - return getDefaultState(); - - if (tag.getBoolean("has_blaze")) - return getDefaultState().with(BLAZE_LEVEL, HeatLevel.SMOULDERING); - - return getDefaultState(); - } - - @Override - public VoxelShape getShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext context) { - return AllShapes.HEATER_BLOCK_SHAPE; - } - - @Override - public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) { - if (p_220071_4_ == ISelectionContext.dummy()) - return AllShapes.HEATER_BLOCK_SPECIAL_COLLISION_SHAPE; - - return super.getShape(p_220071_1_, p_220071_2_, p_220071_3_, p_220071_4_); - } - - @Override - public int getLightValue(BlockState state, IBlockReader world, BlockPos pos) { - return MathHelper.clamp(state.get(BLAZE_LEVEL).ordinal() * 4 - 1, 0, 15); - } - - static void setBlazeLevel(@Nullable World world, BlockPos pos, HeatLevel blazeLevel) { - if (world != null) - world.setBlockState(pos, world.getBlockState(pos).with(BLAZE_LEVEL, blazeLevel)); - } - - public static HeatLevel getHeaterLevel(BlockState blockState) { - return blockState.has(HeaterBlock.BLAZE_LEVEL) ? blockState.get(HeaterBlock.BLAZE_LEVEL) : HeatLevel.NONE; - } - - public enum HeatLevel implements IStringSerializable { - NONE, - SMOULDERING, - FADING, - KINDLED, - SEETHING, - //if you think you have better names let me know :) - ; - - @Override - public String getString() { - return Lang.asId(name()); - } - - public boolean min(HeatLevel heatLevel) { - return this.ordinal() >= heatLevel.ordinal(); - } - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlockItem.java deleted file mode 100644 index 88be8b0f2..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlockItem.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.simibubi.create.content.contraptions.processing; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import mcp.MethodsReturnNonnullByDefault; - -import net.minecraft.block.Block; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.monster.BlazeEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.MobSpawnerTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HeaterBlockItem extends BlockItem { - public HeaterBlockItem(Block block, Properties properties) { - super(block, properties); - } - - @Override - public ActionResultType onItemUse(ItemUseContext context) { - TileEntity te = context.getWorld() - .getTileEntity(context.getPos()); - if (te instanceof MobSpawnerTileEntity && ((MobSpawnerTileEntity) te).getSpawnerBaseLogic() - .getCachedEntity() instanceof BlazeEntity) { - ItemStack itemWithBlaze = withBlaze(context.getItem()); - context.getItem() - .shrink(1); - dropOrPlaceBack(context.getWorld(), context.getPlayer(), itemWithBlaze); - return ActionResultType.SUCCESS; - } - return super.onItemUse(context); - } - - @Override - public boolean itemInteractionForEntity(ItemStack heldItem, PlayerEntity player, LivingEntity entity, Hand hand) { - if (entity instanceof BlazeEntity) { - ItemStack itemWithBlaze = withBlaze(heldItem); - heldItem.shrink(1); - dropOrPlaceBack(player.getEntityWorld(), player, itemWithBlaze); - entity.remove(); - return true; - } - return super.itemInteractionForEntity(heldItem, player, entity, hand); - } - - private static ItemStack withBlaze(ItemStack base) { - ItemStack newItem = new ItemStack(base.getItem(), 1); - CompoundNBT tag = new CompoundNBT(); - tag.putBoolean("has_blaze", true); - newItem.setTag(tag); - return newItem; - } - - private static void dropOrPlaceBack(@Nullable World world, @Nullable PlayerEntity player, ItemStack item) { - if (player == null) - return; - if (player instanceof FakePlayer || world == null) { - player.dropItem(item, false, false); - } else { - player.inventory.placeItemBackInInventory(world, item); - } - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterRenderer.java deleted file mode 100644 index 2dbd9e2d8..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterRenderer.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.content.contraptions.processing; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.util.Direction; - -import java.util.HashMap; - -public class HeaterRenderer extends SafeTileEntityRenderer { - private static final Minecraft INSTANCE = Minecraft.getInstance(); - private static final HashMap blazeModelMap = new HashMap<>(); - - public HeaterRenderer(TileEntityRendererDispatcher dispatcher) { - super(dispatcher); - blazeModelMap.put(HeaterBlock.HeatLevel.FADING, AllBlockPartials.BLAZE_HEATER_BLAZE_TWO); - blazeModelMap.put(HeaterBlock.HeatLevel.KINDLED, AllBlockPartials.BLAZE_HEATER_BLAZE_THREE); - blazeModelMap.put(HeaterBlock.HeatLevel.SEETHING, AllBlockPartials.BLAZE_HEATER_BLAZE_FOUR); - } - - @Override - protected void renderSafe(HeaterTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { - AllBlockPartials blazeModel = - blazeModelMap.getOrDefault(te.getHeatLevel(), AllBlockPartials.BLAZE_HEATER_BLAZE_ONE); - - float angle; - if (INSTANCE.player == null) { - angle = 0; - } else { - Vector3f difference = new Vector3f(INSTANCE.player.getPositionVector() - .subtract(te.getPos() - .getX() + 0.5, 0, - te.getPos() - .getZ() + 0.5) - .mul(1, 0, 1)); - difference.normalize(); - angle = (float) ((difference.getX() < 0 ? 1 : -1) * Math.acos(Direction.NORTH.getUnitVector() - .dot(difference))); - } - SuperByteBuffer blazeBuffer = blazeModel.renderOn(te.getBlockState()); - blazeBuffer.rotateCentered(Direction.UP, angle); - blazeBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingIngredient.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingIngredient.java deleted file mode 100644 index a25d9fcc2..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingIngredient.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.simibubi.create.content.contraptions.processing; - -import java.util.List; -import java.util.Random; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import com.google.gson.JsonObject; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.network.PacketBuffer; - -public class ProcessingIngredient implements Predicate { - - private float outputChance; - private Ingredient ingredient; - private static Random r = new Random(); - - public ProcessingIngredient(Ingredient ingredient) { - this(ingredient, 0); - } - - public ProcessingIngredient(Ingredient ingredient, float outputChance) { - this.ingredient = ingredient; - this.outputChance = outputChance; - } - - public float getOutputChance() { - return outputChance; - } - - public boolean isCatalyst() { - return outputChance > 0; - } - - public static ProcessingIngredient parse(PacketBuffer buffer) { - Ingredient ingredient = Ingredient.read(buffer); - return new ProcessingIngredient(ingredient, buffer.readFloat()); - } - - public static ProcessingIngredient parse(JsonObject json) { - Ingredient ingredient = Ingredient.deserialize(json); - float chance = 0; - if (json.has("return_chance")) - chance = json.get("return_chance").getAsFloat(); - return new ProcessingIngredient(ingredient, chance); - } - - public void write(PacketBuffer buffer) { - getIngredient().write(buffer); - buffer.writeFloat(outputChance); - } - - @Override - public boolean test(ItemStack t) { - return ingredient.test(t); - } - - public Ingredient getIngredient() { - return ingredient; - } - - public static List list(List ingredients) { - return ingredients.stream().map(ProcessingIngredient::new).collect(Collectors.toList()); - } - - public boolean remains() { - return r.nextFloat() <= outputChance; - } - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java index 186cf0b72..b0c1d85b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java @@ -2,11 +2,24 @@ package com.simibubi.create.content.contraptions.processing; import java.util.Random; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.simibubi.create.Create; + import net.minecraft.item.ItemStack; +import net.minecraft.nbt.JsonToNBT; import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; public class ProcessingOutput { + public static final ProcessingOutput EMPTY = new ProcessingOutput(ItemStack.EMPTY, 1); + private static final Random r = new Random(); private final ItemStack stack; private final float chance; @@ -29,14 +42,54 @@ public class ProcessingOutput { for (int roll = 0; roll < stack.getCount(); roll++) if (r.nextFloat() > chance) outputAmount--; - return outputAmount > 0 ? new ItemStack(stack.getItem(), outputAmount) : ItemStack.EMPTY; + if (outputAmount == 0) + return ItemStack.EMPTY; + ItemStack out = stack.copy(); + out.setCount(outputAmount); + return out; } - + + public JsonElement serialize() { + JsonObject json = new JsonObject(); + json.addProperty("item", stack.getItem() + .getRegistryName() + .toString()); + json.addProperty("count", stack.getCount()); + if (stack.hasTag()) + json.add("nbt", new JsonParser().parse(stack.getTag().toString())); + if (chance != 1) + json.addProperty("chance", chance); + return json; + } + + public static ProcessingOutput deserialize(JsonElement je) { + if (!je.isJsonObject()) + throw new JsonSyntaxException("ProcessingOutput must be a json object"); + + JsonObject json = je.getAsJsonObject(); + String itemId = JSONUtils.getString(json, "item"); + int count = JSONUtils.getInt(json, "count"); + float chance = JSONUtils.hasField(json, "chance") ? JSONUtils.getFloat(json, "chance") : 1; + ItemStack itemstack = new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemId)), count); + + if (JSONUtils.hasField(json, "nbt")) { + try { + JsonElement element = json.get("nbt"); + itemstack.setTag(JsonToNBT.getTagFromJson( + element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.getString(element, "nbt"))); + } catch (CommandSyntaxException e) { + e.printStackTrace(); + } + } + + return new ProcessingOutput(itemstack, chance); + } + public void write(PacketBuffer buf) { buf.writeItemStack(getStack()); buf.writeFloat(getChance()); } - + public static ProcessingOutput read(PacketBuffer buf) { return new ProcessingOutput(buf.readItemStack(), buf.readFloat()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java index 8134ee208..5f928b1db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java @@ -1,7 +1,20 @@ package com.simibubi.create.content.contraptions.processing; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.logging.log4j.Logger; + +import com.google.gson.JsonObject; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import com.simibubi.create.foundation.utility.Lang; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -9,78 +22,126 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; -import java.util.stream.Collectors; - @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public abstract class ProcessingRecipe implements IRecipe { - protected final List ingredients; - protected final ResourceLocation id; - protected final String group; - protected final int processingDuration; - protected final List fluidIngredients; - protected final List fluidResults; - protected final int requiredHeat; - private final List results; - private final IRecipeType type; - private final IRecipeSerializer serializer; - public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group, - List ingredients, List results, int processingDuration) { - this(recipeType, id, group, ingredients, results, processingDuration, null, null, 0); - } + protected ResourceLocation id; + protected NonNullList ingredients; + protected NonNullList results; + protected NonNullList fluidIngredients; + protected NonNullList fluidResults; + protected int processingDuration; + protected HeatCondition requiredHeat; - public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group, - List ingredients, List results, int processingDuration, - @Nullable List fluidIngredients, @Nullable List fluidResults, int requiredHeat) { - this.type = recipeType.type; + private IRecipeType type; + private IRecipeSerializer serializer; + private AllRecipeTypes enumType; + + public ProcessingRecipe(AllRecipeTypes recipeType, ProcessingRecipeParams params) { + + this.enumType = recipeType; + this.processingDuration = params.processingDuration; + this.fluidIngredients = params.fluidIngredients; + this.fluidResults = params.fluidResults; this.serializer = recipeType.serializer; - this.id = id; - this.group = group; - this.ingredients = ingredients; - this.results = results; - this.processingDuration = processingDuration; - this.fluidIngredients = fluidIngredients; - this.fluidResults = fluidResults; - this.requiredHeat = requiredHeat; - validate(recipeType); + this.requiredHeat = params.requiredHeat; + this.ingredients = params.ingredients; + this.type = recipeType.type; + this.results = params.results; + this.id = params.id; + + validate(Lang.asId(recipeType.name())); } - private void validate(AllRecipeTypes recipeType) { - if (ingredients.size() > getMaxInputCount()) - Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more inputs (" - + ingredients.size() + ") than supported (" + getMaxInputCount() + ")."); - if (results.size() > getMaxOutputCount()) - Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more outputs (" - + results.size() + ") than supported (" + getMaxOutputCount() + ")."); - ingredients.forEach(i -> { - if (i.isCatalyst() && !canHaveCatalysts()) - Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() - + ") has a catalyst ingredient, which act like a regular ingredient in this type."); - }); + // Recipe type options: + + protected abstract int getMaxInputCount(); + + protected abstract int getMaxOutputCount(); + + protected boolean canRequireHeat() { + return false; + } + + protected boolean canSpecifyDuration() { + return true; + } + + protected int getMaxFluidInputCount() { + return 0; + } + + protected int getMaxFluidOutputCount() { + return 0; + } + + // + + private void validate(String recipeTypeName) { + String messageHeader = "Your custom " + recipeTypeName + " recipe (" + id.toString() + ")"; + Logger logger = Create.logger; + int ingredientCount = ingredients.size(); + int outputCount = results.size(); + + if (ingredientCount > getMaxInputCount()) + logger.warn(messageHeader + " has more item inputs (" + ingredientCount + ") than supported (" + + getMaxInputCount() + ")."); + + if (outputCount > getMaxOutputCount()) + logger.warn(messageHeader + " has more item outputs (" + outputCount + ") than supported (" + + getMaxOutputCount() + ")."); + + if (processingDuration > 0 && !canSpecifyDuration()) + logger.warn(messageHeader + " specified a duration. Durations have no impact on this type of recipe."); + + if (requiredHeat != HeatCondition.NONE && !canRequireHeat()) + logger.warn( + messageHeader + " specified a heat condition. Heat conditions have no impact on this type of recipe."); + + ingredientCount = fluidIngredients.size(); + outputCount = fluidResults.size(); + + if (ingredientCount > getMaxFluidInputCount()) + logger.warn(messageHeader + " has more fluid inputs (" + ingredientCount + ") than supported (" + + getMaxFluidInputCount() + ")."); + + if (outputCount > getMaxFluidOutputCount()) + logger.warn(messageHeader + " has more fluid outputs (" + outputCount + ") than supported (" + + getMaxFluidOutputCount() + ")."); } @Override public NonNullList getIngredients() { - NonNullList nonnulllist = NonNullList.create(); - this.ingredients.forEach(e -> nonnulllist.add(e.getIngredient())); - return nonnulllist; + return ingredients; + } + + public NonNullList getFluidIngredients() { + return fluidIngredients; + } + + public NonNullList getRollableResults() { + return results; + } + + public NonNullList getFluidResults() { + return fluidResults; } - public int getProcessingDuration() { - return processingDuration; + public List getRollableResultsAsItemStacks() { + return getRollableResults().stream() + .map(ProcessingOutput::getStack) + .collect(Collectors.toList()); } - public CombinedItemFluidList rollResults() { - CombinedItemFluidList results = new CombinedItemFluidList(); - for (ProcessingOutput output : getRollableItemResults()) { + public List rollResults() { + List results = new ArrayList<>(); + for (ProcessingOutput output : getRollableResults()) { ItemStack stack = output.rollOutput(); if (!stack.isEmpty()) results.add(stack); @@ -88,6 +149,16 @@ public abstract class ProcessingRecipe implements IRecipe< return results; } + public int getProcessingDuration() { + return processingDuration; + } + + public HeatCondition getRequiredHeat() { + return requiredHeat; + } + + // IRecipe<> paperwork + @Override public ItemStack getCraftingResult(T inv) { return getRecipeOutput(); @@ -100,8 +171,8 @@ public abstract class ProcessingRecipe implements IRecipe< @Override public ItemStack getRecipeOutput() { - return getRollableItemResults().isEmpty() ? ItemStack.EMPTY - : getRollableItemResults().get(0) + return getRollableResults().isEmpty() ? ItemStack.EMPTY + : getRollableResults().get(0) .getStack(); } @@ -115,9 +186,10 @@ public abstract class ProcessingRecipe implements IRecipe< return serializer; } + // Processing recipes do not show up in the recipe book @Override public String getGroup() { - return group; + return "processing"; } @Override @@ -125,41 +197,18 @@ public abstract class ProcessingRecipe implements IRecipe< return type; } - protected int getMaxInputCount() { - return 1; + // Additional Data added by subtypes + + public void readAdditional(JsonObject json) {} + + public void readAdditional(PacketBuffer buffer) {} + + public void writeAdditional(JsonObject json) {} + + public void writeAdditional(PacketBuffer buffer) {} + + public AllRecipeTypes getEnumType() { + return enumType; } - protected int getMaxOutputCount() { - return 15; - } - - protected boolean canHaveCatalysts() { - return false; - } - - public List getRollableItemResults() { - return results; - } - - public List getRollableIngredients() { - return ingredients; - } - - public List getPossibleOutputs() { - return getRollableItemResults().stream() - .map(ProcessingOutput::getStack) - .collect(Collectors.toList()); - } - - protected boolean canHaveFluidIngredient() { - return false; - } - - protected boolean canHaveFluidOutput() { - return false; - } - - protected boolean requiresHeating() { - return false; - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java new file mode 100644 index 000000000..d33278705 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java @@ -0,0 +1,259 @@ +package com.simibubi.create.content.contraptions.processing; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.Tag; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; +import net.minecraftforge.common.crafting.conditions.NotCondition; +import net.minecraftforge.fluids.FluidStack; + +public class ProcessingRecipeBuilder> { + + protected ProcessingRecipeFactory factory; + protected ProcessingRecipeParams params; + protected List recipeConditions; + + public ProcessingRecipeBuilder(ProcessingRecipeFactory factory, ResourceLocation recipeId) { + params = new ProcessingRecipeParams(recipeId); + recipeConditions = new ArrayList<>(); + this.factory = factory; + } + + public ProcessingRecipeBuilder withItemIngredients(Ingredient... ingredients) { + return withItemIngredients(NonNullList.from(Ingredient.EMPTY, ingredients)); + } + + public ProcessingRecipeBuilder withItemIngredients(NonNullList ingredients) { + params.ingredients = ingredients; + return this; + } + + public ProcessingRecipeBuilder withSingleItemOutput(ItemStack output) { + return withItemOutputs(new ProcessingOutput(output, 1)); + } + + public ProcessingRecipeBuilder withItemOutputs(ProcessingOutput... outputs) { + return withItemOutputs(NonNullList.from(ProcessingOutput.EMPTY, outputs)); + } + + public ProcessingRecipeBuilder withItemOutputs(NonNullList outputs) { + params.results = outputs; + return this; + } + + public ProcessingRecipeBuilder withFluidIngredients(FluidIngredient... ingredients) { + return withFluidIngredients(NonNullList.from(FluidIngredient.EMPTY, ingredients)); + } + + public ProcessingRecipeBuilder withFluidIngredients(NonNullList ingredients) { + params.fluidIngredients = ingredients; + return this; + } + + public ProcessingRecipeBuilder withFluidOutputs(FluidStack... outputs) { + return withFluidOutputs(NonNullList.from(FluidStack.EMPTY, outputs)); + } + + public ProcessingRecipeBuilder withFluidOutputs(NonNullList outputs) { + params.fluidResults = outputs; + return this; + } + + public ProcessingRecipeBuilder duration(int ticks) { + params.processingDuration = ticks; + return this; + } + + public ProcessingRecipeBuilder averageProcessingDuration() { + return duration(100); + } + + public ProcessingRecipeBuilder requiresHeat(HeatCondition condition) { + params.requiredHeat = condition; + return this; + } + + public T build() { + return factory.create(params); + } + + public void build(Consumer consumer) { + consumer.accept(new DataGenResult<>(build(), recipeConditions)); + } + + // Datagen shortcuts + + public ProcessingRecipeBuilder require(Tag tag) { + return require(Ingredient.fromTag(tag)); + } + + public ProcessingRecipeBuilder require(IItemProvider item) { + return require(Ingredient.fromItems(item)); + } + + public ProcessingRecipeBuilder require(Ingredient ingredient) { + params.ingredients.add(ingredient); + return this; + } + + public ProcessingRecipeBuilder require(Fluid fluid, int amount) { + return require(FluidIngredient.fromFluid(fluid, amount)); + } + + public ProcessingRecipeBuilder require(Tag fluidTag, int amount) { + return require(FluidIngredient.fromTag(fluidTag, amount)); + } + + public ProcessingRecipeBuilder require(FluidIngredient ingredient) { + params.fluidIngredients.add(ingredient); + return this; + } + + public ProcessingRecipeBuilder output(IItemProvider item) { + return output(item, 1); + } + + public ProcessingRecipeBuilder output(float chance, IItemProvider item) { + return output(chance, item, 1); + } + + public ProcessingRecipeBuilder output(IItemProvider item, int amount) { + return output(1, item, amount); + } + + public ProcessingRecipeBuilder output(float chance, IItemProvider item, int amount) { + return output(chance, new ItemStack(item, amount)); + } + + public ProcessingRecipeBuilder output(ItemStack output) { + return output(1, output); + } + + public ProcessingRecipeBuilder output(float chance, ItemStack output) { + params.results.add(new ProcessingOutput(output, chance)); + return this; + } + + public ProcessingRecipeBuilder output(Fluid fluid, int amount) { + params.fluidResults.add(new FluidStack(fluid, amount)); + return this; + } + + // + + public ProcessingRecipeBuilder whenModLoaded(String modid) { + return withCondition(new ModLoadedCondition(modid)); + } + + public ProcessingRecipeBuilder whenModMissing(String modid) { + return withCondition(new NotCondition(new ModLoadedCondition(modid))); + } + + public ProcessingRecipeBuilder withCondition(ICondition condition) { + recipeConditions.add(condition); + return this; + } + + @FunctionalInterface + public interface ProcessingRecipeFactory> { + T create(ProcessingRecipeParams params); + } + + public static class ProcessingRecipeParams { + + ResourceLocation id; + NonNullList ingredients; + NonNullList results; + NonNullList fluidIngredients; + NonNullList fluidResults; + int processingDuration; + HeatCondition requiredHeat; + + ProcessingRecipeParams(ResourceLocation id) { + this.id = id; + ingredients = NonNullList.create(); + results = NonNullList.create(); + fluidIngredients = NonNullList.create(); + fluidResults = NonNullList.create(); + processingDuration = 0; + requiredHeat = HeatCondition.NONE; + } + + } + + public static class DataGenResult> implements IFinishedRecipe { + + private List recipeConditions; + private ProcessingRecipeSerializer serializer; + private ResourceLocation id; + private S recipe; + + @SuppressWarnings("unchecked") + public DataGenResult(S recipe, List recipeConditions) { + this.recipeConditions = recipeConditions; + AllRecipeTypes recipeType = recipe.getEnumType(); + String typeName = Lang.asId(recipeType.name()); + this.recipe = recipe; + + if (!(recipeType.serializer instanceof ProcessingRecipeSerializer)) + throw new IllegalStateException("Cannot datagen ProcessingRecipe of type: " + typeName); + + this.id = Create.asResource(typeName + "/" + recipe.getId() + .getPath()); + this.serializer = (ProcessingRecipeSerializer) recipe.getSerializer(); + } + + @Override + public void serialize(JsonObject json) { + serializer.write(json, recipe); + if (recipeConditions.isEmpty()) + return; + + JsonArray conds = new JsonArray(); + recipeConditions.forEach(c -> conds.add(CraftingHelper.serialize(c))); + json.add("conditions", conds); + } + + @Override + public ResourceLocation getID() { + return id; + } + + @Override + public IRecipeSerializer getSerializer() { + return serializer; + } + + @Override + public JsonObject getAdvancementJson() { + return null; + } + + @Override + public ResourceLocation getAdvancementID() { + return null; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java index 3c8de24d8..031a7f973 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java @@ -1,172 +1,171 @@ package com.simibubi.create.content.contraptions.processing; +import javax.annotation.ParametersAreNonnullByDefault; + +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeFactory; +import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.fluid.FluidIngredient; + import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.fluid.Fluid; -import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; import net.minecraft.network.PacketBuffer; import net.minecraft.util.JSONUtils; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.Registry; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.registries.ForgeRegistries; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; +import net.minecraftforge.registries.ForgeRegistryEntry; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class ProcessingRecipeSerializer> - extends net.minecraftforge.registries.ForgeRegistryEntry> implements IRecipeSerializer { +public class ProcessingRecipeSerializer> extends ForgeRegistryEntry> + implements IRecipeSerializer { - protected final IRecipeFactory factory; + private final ProcessingRecipeFactory factory; - public ProcessingRecipeSerializer(IRecipeFactory factory) { + public ProcessingRecipeSerializer(ProcessingRecipeFactory factory) { this.factory = factory; } - @SuppressWarnings("deprecation") - public T read(ResourceLocation recipeId, JsonObject json) { - String s = JSONUtils.getString(json, "group", ""); + protected void writeToJson(JsonObject json, T recipe) { + JsonArray jsonIngredients = new JsonArray(); + JsonArray jsonOutputs = new JsonArray(); - List ingredients = new ArrayList<>(); - List fluidIngredients = new ArrayList<>(); - for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) { - JsonObject entry = e.getAsJsonObject(); - if (JSONUtils.hasField(entry, "fluid")) { - addFluidToList(fluidIngredients, entry); - } else { - int count = 1; - if (JSONUtils.hasField(entry, "count")) { - count = JSONUtils.getInt(entry, "count"); - } - for (int i = 0; i < count; i++) { - ingredients.add(ProcessingIngredient.parse(entry)); - } - } + recipe.getIngredients() + .forEach(i -> jsonIngredients.add(i.serialize())); + recipe.getFluidIngredients() + .forEach(i -> jsonIngredients.add(i.serialize())); + + recipe.getRollableResults() + .forEach(o -> jsonOutputs.add(o.serialize())); + recipe.getFluidResults() + .forEach(o -> jsonOutputs.add(FluidHelper.serializeFluidStack(o))); + + json.add("ingredients", jsonIngredients); + json.add("results", jsonOutputs); + + int processingDuration = recipe.getProcessingDuration(); + if (processingDuration > 0) + json.addProperty("processingTime", processingDuration); + + HeatCondition requiredHeat = recipe.getRequiredHeat(); + if (requiredHeat != HeatCondition.NONE) + json.addProperty("heatRequirement", requiredHeat.serialize()); + + recipe.writeAdditional(json); + } + + protected T readFromJson(ResourceLocation recipeId, JsonObject json) { + ProcessingRecipeBuilder builder = new ProcessingRecipeBuilder<>(factory, recipeId); + NonNullList ingredients = NonNullList.create(); + NonNullList fluidIngredients = NonNullList.create(); + NonNullList results = NonNullList.create(); + NonNullList fluidResults = NonNullList.create(); + + for (JsonElement je : JSONUtils.getJsonArray(json, "ingredients")) { + if (FluidIngredient.isFluidIngredient(je)) + fluidIngredients.add(FluidIngredient.deserialize(je)); + else + ingredients.add(Ingredient.deserialize(je)); } - List results = new ArrayList<>(); - List fluidResults = new ArrayList<>(); - for (JsonElement e : JSONUtils.getJsonArray(json, "results")) { - JsonObject entry = e.getAsJsonObject(); - if (JSONUtils.hasField(entry, "fluid")) { - addFluidToList(fluidResults, entry); - } else { - String s1 = JSONUtils.getString(entry, "item"); - int i = JSONUtils.getInt(entry, "count"); - float chance = 1; - if (JSONUtils.hasField(entry, "chance")) - chance = JSONUtils.getFloat(entry, "chance"); - ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i); - results.add(new ProcessingOutput(itemstack, chance)); - } + for (JsonElement je : JSONUtils.getJsonArray(json, "results")) { + JsonObject jsonObject = je.getAsJsonObject(); + if (JSONUtils.hasField(jsonObject, "fluid")) + fluidResults.add(FluidHelper.deserializeFluidStack(jsonObject)); + else + results.add(ProcessingOutput.deserialize(je)); } - int duration = -1; + builder.withItemIngredients(ingredients) + .withItemOutputs(results) + .withFluidIngredients(fluidIngredients) + .withFluidOutputs(fluidResults); + if (JSONUtils.hasField(json, "processingTime")) - duration = JSONUtils.getInt(json, "processingTime"); + builder.duration(JSONUtils.getInt(json, "processingTime")); + if (JSONUtils.hasField(json, "heatRequirement")) + builder.requiresHeat(HeatCondition.deserialize(JSONUtils.getString(json, "heatRequirement"))); - int requiredHeat = 0; - if (JSONUtils.hasField(json, "requiredHeat")) - requiredHeat = JSONUtils.getInt(json, "requiredHeat"); - - return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults, - requiredHeat); + return builder.build(); } - private void addFluidToList(List fluidStacks, JsonObject entry) { - Fluid fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryCreate(JSONUtils.getString(entry, "fluid"))); - int amount = 1; - if (JSONUtils.hasField(entry, "amount")) { - amount = JSONUtils.getInt(entry, "amount"); - } - if (fluid != null && amount > 0) - fluidStacks.add(new FluidStack(fluid, amount)); + protected void writeToBuffer(PacketBuffer buffer, T recipe) { + NonNullList ingredients = recipe.getIngredients(); + NonNullList fluidIngredients = recipe.getFluidIngredients(); + NonNullList outputs = recipe.getRollableResults(); + NonNullList fluidOutputs = recipe.getFluidResults(); + + buffer.writeVarInt(ingredients.size()); + ingredients.forEach(i -> i.write(buffer)); + buffer.writeVarInt(fluidIngredients.size()); + fluidIngredients.forEach(i -> i.write(buffer)); + + buffer.writeVarInt(outputs.size()); + outputs.forEach(o -> o.write(buffer)); + buffer.writeVarInt(fluidOutputs.size()); + fluidOutputs.forEach(o -> o.writeToPacket(buffer)); + + buffer.writeVarInt(recipe.getProcessingDuration()); + buffer.writeVarInt(recipe.getRequiredHeat() + .ordinal()); } - public T read(ResourceLocation recipeId, PacketBuffer buffer) { - String s = buffer.readString(32767); + protected T readFromBuffer(ResourceLocation recipeId, PacketBuffer buffer) { + NonNullList ingredients = NonNullList.create(); + NonNullList fluidIngredients = NonNullList.create(); + NonNullList results = NonNullList.create(); + NonNullList fluidResults = NonNullList.create(); - List ingredients = new ArrayList<>(); - int ingredientCount = buffer.readInt(); - for (int i = 0; i < ingredientCount; i++) - ingredients.add(ProcessingIngredient.parse(buffer)); - - int fluidInputCount = buffer.readInt(); - List fluidIngredients = new ArrayList<>(); - for (int i = 0; i < fluidInputCount; i++) - fluidIngredients.add(FluidStack.readFromPacket(buffer)); - - List results = new ArrayList<>(); - int outputCount = buffer.readInt(); - for (int i = 0; i < outputCount; i++) + int size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + ingredients.add(Ingredient.read(buffer)); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + fluidIngredients.add(FluidIngredient.read(buffer)); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) results.add(ProcessingOutput.read(buffer)); - - int fluidOutputCount = buffer.readInt(); - List fluidResults = new ArrayList<>(); - for (int i = 0; i < fluidOutputCount; i++) + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) fluidResults.add(FluidStack.readFromPacket(buffer)); - int duration = buffer.readInt(); - int requiredHeat = buffer.readInt(); - - return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults, - requiredHeat); + return new ProcessingRecipeBuilder<>(factory, recipeId).withItemIngredients(ingredients) + .withItemOutputs(results) + .withFluidIngredients(fluidIngredients) + .withFluidOutputs(fluidResults) + .duration(buffer.readVarInt()) + .requiresHeat(HeatCondition.values()[buffer.readVarInt()]) + .build(); } - public void write(PacketBuffer buffer, T recipe) { - buffer.writeString(recipe.group); - - buffer.writeInt(recipe.ingredients.size()); - recipe.ingredients.forEach(i -> i.write(buffer)); - if (recipe.canHaveFluidIngredient() && recipe.fluidIngredients != null) { - buffer.writeInt(recipe.fluidIngredients.size()); - recipe.fluidIngredients.forEach(fluidStack -> fluidStack.writeToPacket(buffer)); - } else { - buffer.writeInt(0); - } - - buffer.writeInt(recipe.getRollableItemResults() - .size()); - recipe.getRollableItemResults() - .forEach(i -> i.write(buffer)); - if (recipe.canHaveFluidOutput() && recipe.fluidResults != null) { - buffer.writeInt(recipe.fluidResults.size()); - recipe.fluidResults.forEach(fluidStack -> fluidStack.writeToPacket(buffer)); - } else { - buffer.writeInt(0); - } - - buffer.writeInt(recipe.processingDuration); - buffer.writeInt(recipe.requiredHeat); + public final void write(JsonObject json, T recipe) { + writeToJson(json, recipe); } - public interface IRecipeFactory> { - default T create(ResourceLocation recipeId, String s, List ingredients, - List results, int duration, @Nullable List fluidIngredients, - @Nullable List fluidResults, int requiredHeat) { - return create(recipeId, s, ingredients, results, duration); - } - - T create(ResourceLocation recipeId, String s, List ingredients, - List results, int duration); + @Override + public final T read(ResourceLocation id, JsonObject json) { + return readFromJson(id, json); } - public interface IExtendedRecipeFactory> extends IRecipeFactory { - @Override - T create(ResourceLocation recipeId, String s, List ingredients, - List results, int duration, @Nullable List fluidIngredients, - @Nullable List fluidResults, int requiredHeat); - - @Override - default T create(ResourceLocation recipeId, String s, List ingredients, - List results, int duration) { - throw new IllegalStateException("Incorrect recipe creation function used: " + recipeId); - } + @Override + public final void write(PacketBuffer buffer, T recipe) { + writeToBuffer(buffer, recipe); } + + @Override + public final T read(ResourceLocation id, PacketBuffer buffer) { + return readFromBuffer(id, buffer); + } + + public ProcessingRecipeFactory getFactory() { + return factory; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java new file mode 100644 index 000000000..8c2870ae6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java @@ -0,0 +1,184 @@ +package com.simibubi.create.content.contraptions.processing.burner; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.utility.Lang; + +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.advancements.criterion.StatePropertiesPredicate; +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.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.Property; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +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.minecraft.loot.ConstantRange; +import net.minecraft.loot.ItemLootEntry; +import net.minecraft.loot.LootPool; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.conditions.BlockStateProperty; +import net.minecraft.loot.conditions.ILootCondition.IBuilder; +import net.minecraft.loot.conditions.SurvivesExplosion; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class BlazeBurnerBlock extends Block implements ITE { + + public static final Property HEAT_LEVEL = EnumProperty.create("blaze", HeatLevel.class); + + public BlazeBurnerBlock(Properties properties) { + super(properties); + setDefaultState(super.getDefaultState().with(HEAT_LEVEL, HeatLevel.NONE)); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder); + builder.add(HEAT_LEVEL); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return state.get(HEAT_LEVEL) + .isAtLeast(HeatLevel.SMOULDERING); + } + + @Override + public void fillItemGroup(ItemGroup p_149666_1_, NonNullList p_149666_2_) { + p_149666_2_.add(AllItems.EMPTY_BLAZE_BURNER.asStack()); + super.fillItemGroup(p_149666_1_, p_149666_2_); + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.HEATER.create(); + } + + @Override + public Class getTileEntityClass() { + return BlazeBurnerTileEntity.class; + } + + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult blockRayTraceResult) { + if (!hasTileEntity(state)) + return ActionResultType.PASS; + + TileEntity te = world.getTileEntity(pos); + if (!(te instanceof BlazeBurnerTileEntity)) + return ActionResultType.PASS; + + if (!((BlazeBurnerTileEntity) te).tryUpdateFuel(player.getHeldItem(hand), player)) + return ActionResultType.PASS; + + if (!player.isCreative()) + player.getHeldItem(hand) + .shrink(1); + + return ActionResultType.SUCCESS; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + ItemStack stack = context.getItem(); + Item item = stack.getItem(); + BlockState defaultState = getDefaultState(); + if (!(item instanceof BlazeBurnerBlockItem)) + return defaultState; + HeatLevel initialHeat = + ((BlazeBurnerBlockItem) item).hasCapturedBlaze() ? HeatLevel.SMOULDERING : HeatLevel.NONE; + return defaultState.with(HEAT_LEVEL, initialHeat); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext context) { + return AllShapes.HEATER_BLOCK_SHAPE; + } + + @Override + public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, + ISelectionContext p_220071_4_) { + if (p_220071_4_ == ISelectionContext.dummy()) + return AllShapes.HEATER_BLOCK_SPECIAL_COLLISION_SHAPE; + return getShape(p_220071_1_, p_220071_2_, p_220071_3_, p_220071_4_); + } + + @Override + public int getLightValue(BlockState state, IBlockReader world, BlockPos pos) { + return MathHelper.clamp(state.get(HEAT_LEVEL) + .ordinal() * 4 - 1, 0, 15); + } + + static void setBlazeLevel(World world, BlockPos pos, HeatLevel blazeLevel) { + BlockState blockState = world.getBlockState(pos); + if (!(blockState.getBlock() instanceof BlazeBurnerBlock)) + return; + world.setBlockState(pos, blockState.with(HEAT_LEVEL, blazeLevel)); + } + + public static HeatLevel getHeatLevelOf(BlockState blockState) { + return blockState.contains(BlazeBurnerBlock.HEAT_LEVEL) ? blockState.get(BlazeBurnerBlock.HEAT_LEVEL) + : HeatLevel.NONE; + } + + public static LootTable.Builder buildLootTable() { + IBuilder survivesExplosion = SurvivesExplosion.builder(); + BlazeBurnerBlock block = AllBlocks.BLAZE_BURNER.get(); + + LootTable.Builder builder = LootTable.builder(); + LootPool.Builder poolBuilder = LootPool.builder(); + for (HeatLevel level : HeatLevel.values()) { + IItemProvider drop = + level == HeatLevel.NONE ? AllItems.EMPTY_BLAZE_BURNER.get() : AllBlocks.BLAZE_BURNER.get(); + poolBuilder.addEntry(ItemLootEntry.builder(drop) + .acceptCondition(survivesExplosion) + .acceptCondition(BlockStateProperty.builder(block) + .properties(StatePropertiesPredicate.Builder.create() + .exactMatch(HEAT_LEVEL, level)))); + } + builder.addLootPool(poolBuilder.rolls(ConstantRange.of(1))); + return builder; + } + + public enum HeatLevel implements IStringSerializable { + NONE, SMOULDERING, FADING, KINDLED, SEETHING,; + + public static HeatLevel byIndex(int index) { + return values()[index]; + } + + @Override + public String getString() { + return Lang.asId(name()); + } + + public boolean isAtLeast(HeatLevel heatLevel) { + return this.ordinal() >= heatLevel.ordinal(); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java new file mode 100644 index 000000000..95ff6f7dc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.contraptions.processing.burner; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.utility.VecHelper; + +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.monster.BlazeEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.MobSpawnerTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.WeightedSpawnerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.spawner.AbstractSpawner; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class BlazeBurnerBlockItem extends BlockItem { + + private boolean capturedBlaze; + + public static BlazeBurnerBlockItem empty(Properties properties) { + return new BlazeBurnerBlockItem(AllBlocks.BLAZE_BURNER.get(), properties, false); + } + + public static BlazeBurnerBlockItem withBlaze(Block block, Properties properties) { + return new BlazeBurnerBlockItem(block, properties, true); + } + + @Override + public void addToBlockToItemMap(Map p_195946_1_, Item p_195946_2_) { + if (!hasCapturedBlaze()) + return; + super.addToBlockToItemMap(p_195946_1_, p_195946_2_); + } + + private BlazeBurnerBlockItem(Block block, Properties properties, boolean capturedBlaze) { + super(block, properties); + this.capturedBlaze = capturedBlaze; + } + + @Override + public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + if (!hasCapturedBlaze()) + return; + super.fillItemGroup(p_150895_1_, p_150895_2_); + } + + @Override + public String getTranslationKey() { + return hasCapturedBlaze() ? super.getTranslationKey() : "item.create." + getRegistryName().getPath(); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) { + if (hasCapturedBlaze()) + return super.onItemUse(context); + + World world = context.getWorld(); + BlockPos pos = context.getPos(); + TileEntity te = world.getTileEntity(pos); + PlayerEntity player = context.getPlayer(); + + if (!(te instanceof MobSpawnerTileEntity)) + return super.onItemUse(context); + + AbstractSpawner spawner = ((MobSpawnerTileEntity) te).getSpawnerBaseLogic(); + List possibleSpawns = + ObfuscationReflectionHelper.getPrivateValue(AbstractSpawner.class, spawner, "field_98285_e"); + if (possibleSpawns.isEmpty()) { + possibleSpawns = new ArrayList<>(); + possibleSpawns + .add(ObfuscationReflectionHelper.getPrivateValue(AbstractSpawner.class, spawner, "field_98282_f")); + } + + ResourceLocation blazeId = EntityType.BLAZE.getRegistryName(); + for (WeightedSpawnerEntity e : possibleSpawns) { + ResourceLocation spawnerEntityId = new ResourceLocation(e.getNbt() + .getString("id")); + if (!spawnerEntityId.equals(blazeId)) + continue; + + spawnCaptureEffects(world, VecHelper.getCenterOf(pos)); + if (world.isRemote) + return ActionResultType.SUCCESS; + + giveBurnerItemTo(player, context.getItem(), context.getHand()); + return ActionResultType.SUCCESS; + } + + return super.onItemUse(context); + } + + @Override + public boolean itemInteractionForEntity(ItemStack heldItem, PlayerEntity player, LivingEntity entity, Hand hand) { + if (hasCapturedBlaze()) + return false; + if (!(entity instanceof BlazeEntity)) + return false; + + World world = player.world; + spawnCaptureEffects(world, entity.getPositionVec()); + if (world.isRemote) + return true; + + giveBurnerItemTo(player, heldItem, hand); + entity.remove(); + return true; + } + + protected void giveBurnerItemTo(PlayerEntity player, ItemStack heldItem, Hand hand) { + ItemStack filled = AllBlocks.BLAZE_BURNER.asStack(); + if (!player.isCreative()) + heldItem.shrink(1); + if (heldItem.isEmpty()) { + player.setHeldItem(hand, filled); + return; + } + player.inventory.placeItemBackInInventory(player.world, filled); + } + + private void spawnCaptureEffects(World world, Vec3d vec) { + if (world.isRemote) { + for (int i = 0; i < 40; i++) { + Vec3d motion = VecHelper.offsetRandomly(Vec3d.ZERO, world.rand, .125f); + world.addParticle(ParticleTypes.FLAME, vec.x, vec.y, vec.z, motion.x, motion.y, motion.z); + Vec3d circle = motion.mul(1, 0, 1) + .normalize() + .scale(.5f); + world.addParticle(ParticleTypes.SMOKE, circle.x, vec.y, circle.z, 0, -0.125, 0); + } + return; + } + + BlockPos soundPos = new BlockPos(vec); + world.playSound(null, soundPos, SoundEvents.ENTITY_BLAZE_HURT, SoundCategory.HOSTILE, .25f, .75f); + world.playSound(null, soundPos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.HOSTILE, .5f, .75f); + } + + public boolean hasCapturedBlaze() { + return capturedBlaze; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java new file mode 100644 index 000000000..0f6d60479 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -0,0 +1,39 @@ +package com.simibubi.create.content.contraptions.processing.burner; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; + +public class BlazeBurnerRenderer extends SafeTileEntityRenderer { + + public BlazeBurnerRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(BlazeBurnerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + HeatLevel heatLevel = te.getHeatLevel(); + if (heatLevel == HeatLevel.NONE) + return; + + float renderTick = AnimationTickHolder.getRenderTick() + (te.hashCode() % 13) * 16f; + float offset = (MathHelper.sin((float) ((renderTick / 16f) % (2 * Math.PI))) + .5f) / 16f; + + AllBlockPartials blazeModel = AllBlockPartials.BLAZES.get(heatLevel); + SuperByteBuffer blazeBuffer = blazeModel.renderOn(te.getBlockState()); + blazeBuffer.rotateCentered(Direction.UP, (float) Math.toRadians(-te.rot + (te.speed * partialTicks))); + blazeBuffer.translate(0, offset, 0); + blazeBuffer.light(0xF000F0) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java similarity index 58% rename from src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java rename to src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java index 94306fc13..dac3dc308 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.contraptions.processing; +package com.simibubi.create.content.contraptions.processing.burner; import java.util.List; import java.util.Random; @@ -7,21 +7,25 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.components.deployer.DeployerFakePlayer; import com.simibubi.create.content.contraptions.particle.CubeParticleData; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.ColorHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.EggEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; import net.minecraft.particles.IParticleData; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.ProjectileImpactEvent; @@ -29,7 +33,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber -public class HeaterTileEntity extends SmartTileEntity { +public class BlazeBurnerTileEntity extends SmartTileEntity { private final static int[][] heatParticleColors = { {0x3B141A, 0x47141A, 0x7A3B24, 0x854D26}, @@ -42,8 +46,11 @@ public class HeaterTileEntity extends SmartTileEntity { private int remainingBurnTime; private FuelType activeFuel; + + // Rendering state + float rot, speed; - public HeaterTileEntity(TileEntityType tileEntityTypeIn) { + public BlazeBurnerTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); activeFuel = FuelType.NONE; remainingBurnTime = 0; @@ -53,8 +60,11 @@ public class HeaterTileEntity extends SmartTileEntity { @Override public void tick() { super.tick(); + if (world.isRemote) { + tickRotation(); + } - spawnParticles(getHeatLevel()); + spawnParticles(getHeatLevel(), 1); if (remainingBurnTime <= 0) { return; @@ -71,6 +81,68 @@ public class HeaterTileEntity extends SmartTileEntity { } markDirty(); } + + private static final float MAX_ROT_SPEED = 5; + private static final float ROT_DAMPING = 15; + + private void tickRotation() { + ClientPlayerEntity player = Minecraft.getInstance().player; + Angle target; + if (player == null) { + target = new Angle(360, 0); + } else { + double dx = player.getX() - (getPos().getX() + 0.5); + double dz = player.getZ() - (getPos().getZ() + 0.5); + target = new Angle(360, (float) (MathHelper.atan2(dz, dx) * 180.0 / Math.PI + 90)); + } + + Angle current = new Angle(360, rot); + float diff = new Angle(180, current.get() - target.get()).get(); + if (diff > 0.1 || diff < -0.1) { + // Inverse function https://www.desmos.com/calculator/kiaberb6sf + speed = MAX_ROT_SPEED + (-MAX_ROT_SPEED / ((Math.abs(diff) / ROT_DAMPING) + 1)); + if (diff > 0) { + current.add(-Math.min(diff, speed)); + speed = Math.min(diff, speed); + } else { + current.add(Math.min(-diff, speed)); + speed = Math.min(-diff, -speed); + } + } else { + speed = 0; + } + + rot = current.get(); + } + + // From EnderIO with <3 + private static class Angle { + private final float offset; + private float a; + + Angle(float offset, float a) { + this.offset = offset; + set(a); + } + + void set(float a) { + while (a >= offset) { + a -= 360; + } + while (a < (offset - 360)) { + a += 360; + } + this.a = a; + } + + void add(float b) { + set(a + b); + } + + float get() { + return a; + } + } @Override public void lazyTick() { @@ -83,18 +155,17 @@ public class HeaterTileEntity extends SmartTileEntity { public void addBehaviours(List behaviours) {} @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("fuelLevel", activeFuel.ordinal()); compound.putInt("burnTimeRemaining", remainingBurnTime); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { activeFuel = FuelType.values()[compound.getInt("fuelLevel")]; remainingBurnTime = compound.getInt("burnTimeRemaining"); - super.read(compound); - updateHeatLevel(); + super.read(compound, clientPacket); } /** @@ -124,56 +195,60 @@ public class HeaterTileEntity extends SmartTileEntity { } updateHeatLevel(); + HeatLevel level = getHeatLevel(); + for (int i = 0; i < 20; i++) { + spawnParticles(level, 1 + (.25 * (i / 4))); + } return true; } - public HeaterBlock.HeatLevel getHeatLevel() { - return HeaterBlock.getHeaterLevel(getBlockState()); + public BlazeBurnerBlock.HeatLevel getHeatLevel() { + return BlazeBurnerBlock.getHeatLevelOf(getBlockState()); } private void updateHeatLevel() { switch (activeFuel) { case SPECIAL: - HeaterBlock.setBlazeLevel(world, pos, HeaterBlock.HeatLevel.SEETHING); + BlazeBurnerBlock.setBlazeLevel(world, pos, BlazeBurnerBlock.HeatLevel.SEETHING); break; case NORMAL: boolean lowPercent = (double) remainingBurnTime / maxHeatCapacity < 0.1; - HeaterBlock.setBlazeLevel(world, pos, lowPercent ? HeaterBlock.HeatLevel.FADING : HeaterBlock.HeatLevel.KINDLED); + BlazeBurnerBlock.setBlazeLevel(world, pos, lowPercent ? BlazeBurnerBlock.HeatLevel.FADING : BlazeBurnerBlock.HeatLevel.KINDLED); break; case NONE: - HeaterBlock.setBlazeLevel(world, pos, HeaterBlock.HeatLevel.SMOULDERING); + BlazeBurnerBlock.setBlazeLevel(world, pos, BlazeBurnerBlock.HeatLevel.SMOULDERING); } } - private void spawnParticles(HeaterBlock.HeatLevel heatLevel) { + private void spawnParticles(BlazeBurnerBlock.HeatLevel heatLevel, double burstMult) { if (world == null) return; - if (heatLevel == HeaterBlock.HeatLevel.NONE) + if (heatLevel == BlazeBurnerBlock.HeatLevel.NONE) return; Random r = world.getRandom(); - if (heatLevel == HeaterBlock.HeatLevel.SMOULDERING) { + if (heatLevel == BlazeBurnerBlock.HeatLevel.SMOULDERING) { if (r.nextDouble() > 0.25) return; - Vector3d color = randomColor(heatLevel); - spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.03F, 15), 0.015, 0.1); - } else if (heatLevel == HeaterBlock.HeatLevel.FADING) { + Vec3d color = randomColor(heatLevel); + spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.03F, 15, false), 0.015 * burstMult, 0.1 * burstMult); + } else if (heatLevel == BlazeBurnerBlock.HeatLevel.FADING) { if (r.nextDouble() > 0.5) return; - Vector3d color = randomColor(heatLevel); - spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.035F, 18), 0.03, 0.15); - } else if (heatLevel == HeaterBlock.HeatLevel.KINDLED) { - Vector3d color = randomColor(heatLevel); - spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.04F, 21), 0.05, 0.2); - }else if (heatLevel == HeaterBlock.HeatLevel.SEETHING) { + Vec3d color = randomColor(heatLevel); + spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.035F, 18, false), 0.03 * burstMult, 0.15 * burstMult); + } else if (heatLevel == BlazeBurnerBlock.HeatLevel.KINDLED) { + Vec3d color = randomColor(heatLevel); + spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.04F, 35, true), 0.05 * burstMult, 0.2 * burstMult); + }else if (heatLevel == BlazeBurnerBlock.HeatLevel.SEETHING) { for (int i = 0; i < 2; i++) { if (r.nextDouble() > 0.6) return; - Vector3d color = randomColor(heatLevel); - spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.045F, 24), 0.06, 0.22); + Vec3d color = randomColor(heatLevel); + spawnParticle(new CubeParticleData((float) color.x,(float) color.y,(float) color.z, 0.045F, 35, true), 0.06 * burstMult, 0.22 * burstMult); } } } @@ -184,16 +259,16 @@ public class HeaterTileEntity extends SmartTileEntity { world.addOptionalParticle( particleData, (double) pos.getX() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, - (double) pos.getY() + 0.6D + random.nextDouble() / 10.0, + (double) pos.getY() + 0.6D + (random.nextDouble() / 4.0), (double) pos.getZ() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, 0.0D, speed, 0.0D); } - private static Vector3d randomColor(HeaterBlock.HeatLevel heatLevel) { - if (heatLevel == HeaterBlock.HeatLevel.NONE) - return new Vector3d(0,0,0); + private static Vec3d randomColor(BlazeBurnerBlock.HeatLevel heatLevel) { + if (heatLevel == BlazeBurnerBlock.HeatLevel.NONE) + return new Vec3d(0,0,0); return ColorHelper.getRGB(heatParticleColors[heatLevel.ordinal()-1][(int) (Math.random()*4)]); } @@ -207,15 +282,15 @@ public class HeaterTileEntity extends SmartTileEntity { return; TileEntity tile = event.getThrowable().world.getTileEntity(new BlockPos(event.getRayTraceResult().getHitVec())); - if (!(tile instanceof HeaterTileEntity)) { + if (!(tile instanceof BlazeBurnerTileEntity)) { return; } event.setCanceled(true); - event.getThrowable().setMotion(Vector3d.ZERO); + event.getThrowable().setMotion(Vec3d.ZERO); event.getThrowable().remove(); - HeaterTileEntity heater = (HeaterTileEntity) tile; + BlazeBurnerTileEntity heater = (BlazeBurnerTileEntity) tile; if (heater.activeFuel != FuelType.SPECIAL) { heater.activeFuel = FuelType.NORMAL; heater.remainingBurnTime = MathHelper.clamp(heater.remainingBurnTime + 80, 0, maxHeatCapacity); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java index eeabcbd29..0932fe187 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java @@ -1,8 +1,5 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; -import java.util.Vector; - -import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -11,14 +8,15 @@ import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.Lang; - import net.minecraft.item.ItemStack; import net.minecraft.nbt.ListNBT; import net.minecraft.util.math.BlockPos; +import java.util.Vector; + public class SequencedGearshiftScreen extends AbstractSimiScreen { - private final ItemStack renderedItem = new ItemStack(AllBlocks.SEQUENCED_GEARSHIFT.get()); + private final ItemStack renderedItem = AllBlocks.SEQUENCED_GEARSHIFT.asStack(); private final AllGuiTextures background = AllGuiTextures.SEQUENCER; private final String title = Lang.translate("gui.sequenced_gearshift.title"); @@ -144,12 +142,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { font.drawStringWithShadow(title, guiLeft - 3 + (background.width - font.getStringWidth(title)) / 2, guiTop + 10, hFontColor); - RenderSystem.pushMatrix(); - RenderSystem.translated(guiLeft + background.width + 20, guiTop + 50, 0); GuiGameElement.of(renderedItem) + .at(guiLeft + background.width + 20, guiTop + 50) .scale(5) .render(); - RenderSystem.popMatrix(); } private void label(int x, int y, String text) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index 717436fd8..b52e47ee2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -103,21 +103,21 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("InstructionIndex", currentInstruction); compound.putInt("InstructionDuration", currentInstructionDuration); compound.putInt("Timer", timer); compound.put("Instructions", Instruction.serializeAll(instructions)); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { currentInstruction = compound.getInt("InstructionIndex"); currentInstructionDuration = compound.getInt("InstructionDuration"); timer = compound.getInt("Timer"); instructions = Instruction.deserializeAll(compound.getList("Instructions", NBT.TAG_COMPOUND)); - super.read(compound); + super.read(compound, clientPacket); } @Override 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 a29629416..1bea353f8 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 @@ -1,17 +1,14 @@ package com.simibubi.create.content.contraptions.relays.belt; import java.util.ArrayList; -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.base.KineticTileEntity; 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; @@ -19,6 +16,8 @@ import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; 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.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; @@ -26,7 +25,6 @@ import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.material.Material; -import net.minecraft.client.particle.DiggingParticle; import net.minecraft.client.particle.ParticleManager; import net.minecraft.entity.Entity; import net.minecraft.entity.MobEntity; @@ -52,7 +50,6 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -251,7 +248,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { player.inventory.placeItemBackInInventory(world, transportedItemStack.stack); - return Collections.emptyList(); + return TransportedResult.removeItem(); }); } @@ -327,40 +324,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE amtBoxes.increment()); - double chance = 1d / amtBoxes.getValue(); - - voxelshape.forEachBox((x1, y1, z1, x2, y2, z2) -> { - double d1 = Math.min(1.0D, x2 - x1); - double d2 = Math.min(1.0D, y2 - y1); - double d3 = Math.min(1.0D, z2 - z1); - int i = Math.max(2, MathHelper.ceil(d1 / 0.25D)); - int j = Math.max(2, MathHelper.ceil(d2 / 0.25D)); - int k = Math.max(2, MathHelper.ceil(d3 / 0.25D)); - - for (int l = 0; l < i; ++l) { - for (int i1 = 0; i1 < j; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - if (world.rand.nextDouble() > chance) - continue; - - double d4 = ((double) l + 0.5D) / (double) i; - double d5 = ((double) i1 + 0.5D) / (double) j; - double d6 = ((double) j1 + 0.5D) / (double) k; - double d7 = d4 * d1 + x1; - double d8 = d5 * d2 + y1; - double d9 = d6 * d3 + z1; - manager - .addEffect((new DiggingParticle(world, (double) pos.getX() + d7, (double) pos.getY() + d8, - (double) pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D, state)).setBlockPos(pos)); - } - } - } - - }); + BlockHelper.addReducedDestroyEffects(state, world, pos, manager); return true; } @@ -500,17 +464,19 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { BeltPart part = blockState.get(BeltBlock.PART); Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); AxisDirection axisDirection = facing.getAxisDirection(); - + boolean downward = beltSlope == BeltSlope.DOWNWARD; boolean upward = beltSlope == BeltSlope.UPWARD; boolean diagonal = downward || upward; @@ -108,8 +109,6 @@ public class BeltRenderer extends SafeTileEntityRenderer { textureIndex += cycleLength; beltBuffer.shiftUVtoSheet(spriteShift, (textureIndex % 4) / 4f, (textureIndex / 4) / 4f, 4); - } else { - beltBuffer.dontShiftUV(); } beltBuffer.renderInto(ms, vb); @@ -202,8 +201,12 @@ public class BeltRenderer extends SafeTileEntityRenderer { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); + boolean renderUpright = BeltHelper.isItemUpright(transported.stack); boolean blockItem = itemRenderer.getItemModelWithOverrides(transported.stack, te.getWorld(), null) .isGui3d(); + int count = (int) (MathHelper.log2((int) (transported.stack.getCount()))) / 2; + Random r = new Random(transported.angle); + if (Minecraft.getInstance().gameSettings.fancyGraphics) { Vector3d shadowPos = Vector3d.of(te.getPos()).add(beltStartOffset.scale(1) .add(offsetVec) @@ -211,17 +214,28 @@ public class BeltRenderer extends SafeTileEntityRenderer { ShadowRenderHelper.renderShadow(ms, buffer, shadowPos, .75f, blockItem ? .2f : .2f); } - int count = (int) (MathHelper.log2((int) (transported.stack.getCount()))) / 2; - ms.multiply(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).getDegreesQuaternion(slopeAngle)); + if (renderUpright) { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + if (renderViewEntity != null) { + Vec3d positionVec = renderViewEntity.getPositionVec(); + Vec3d vectorForOffset = BeltHelper.getVectorForOffset(te, offset); + Vec3d diff = vectorForOffset.subtract(positionVec); + float yRot = (float) MathHelper.atan2(diff.z, -diff.x); + ms.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (yRot + Math.PI / 2))); + } + ms.translate(0, 3 / 32d, 1 / 16f); + } + if (!renderUpright) + ms.multiply(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).getDegreesQuaternion(slopeAngle)); + if (onSlope) ms.translate(0, 1 / 8f, 0); - Random r = new Random(transported.angle); for (int i = 0; i <= count; i++) { ms.push(); ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(transported.angle)); - if (!blockItem) { + if (!blockItem && !renderUpright) { ms.translate(0, -.09375, 0); ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); } @@ -234,9 +248,12 @@ public class BeltRenderer extends SafeTileEntityRenderer { itemRenderer.renderItem(transported.stack, TransformType.FIXED, light, overlay, ms, buffer); ms.pop(); - if (!blockItem) - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(10)); - ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + if (!renderUpright) { + if (!blockItem) + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(10)); + ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + } else + ms.translate(0, 0, -1 / 16f); } 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 ef8209a63..64a09757f 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 @@ -23,6 +23,7 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileE import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.NBTHelper; @@ -79,7 +80,7 @@ public class BeltTileEntity extends KineticTileEntity { @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - behaviours.add(new DirectBeltInputBehaviour(this) + behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen(this::canInsertFrom) .setInsertionHandler(this::tryInsertingFromSide)); behaviours.add(new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) .withStackPlacement(this::getWorldPositionOf)); @@ -175,7 +176,7 @@ public class BeltTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { if (controller != null) compound.put("Controller", NBTUtil.writeBlockPos(controller)); compound.putBoolean("IsController", isController()); @@ -186,23 +187,12 @@ public class BeltTileEntity extends KineticTileEntity { if (isController()) compound.put("Inventory", getInventory().write()); - return super.write(compound); + super.write(compound, clientPacket); } @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); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); if (compound.getBoolean("IsController")) controller = pos; @@ -219,7 +209,16 @@ public class BeltTileEntity extends KineticTileEntity { if (isController()) getInventory().read(compound.getCompound("Inventory")); + CasingType casingBefore = casing; casing = NBTHelper.readEnum(compound, "Casing", CasingType.class); + + if (!clientPacket) + return; + if (casingBefore == casing) + return; + requestModelDataUpdate(); + if (hasWorld()) + world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); } @Override @@ -359,11 +358,13 @@ public class BeltTileEntity extends KineticTileEntity { } private void applyToAllItems(float maxDistanceFromCenter, - Function> processFunction) { + Function processFunction) { BeltTileEntity controller = getControllerTE(); - if (controller != null) - controller.getInventory() - .applyToEachWithin(index + .5f, maxDistanceFromCenter, processFunction); + if (controller == null) + return; + BeltInventory inventory = controller.getInventory(); + if (inventory != null) + inventory.applyToEachWithin(index + .5f, maxDistanceFromCenter, processFunction); } private Vector3d getWorldPositionOf(TransportedItemStack transported) { @@ -385,28 +386,27 @@ public class BeltTileEntity extends KineticTileEntity { sendData(); } - /** - * always target a DirectBeltInsertionBehaviour - */ - @Deprecated - public boolean tryInsertingFromSide(Direction side, ItemStack stack, boolean simulate) { - return tryInsertingFromSide(new TransportedItemStack(stack), side, simulate).isEmpty(); + private boolean canInsertFrom(Direction side) { + if (getSpeed() == 0) + return false; + return getMovementFacing() != side.getOpposite(); } private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) { BeltTileEntity nextBeltController = getControllerTE(); ItemStack inserted = transportedStack.stack; ItemStack empty = ItemStack.EMPTY; - + if (nextBeltController == null) 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()) + if (!tunnelTE.getStackToDistribute() + .isEmpty()) return inserted; if (!tunnelTE.testFlapFilter(side.getOpposite(), inserted)) return inserted; 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 index 7a5b372f4..ad2d4e10f 100644 --- 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 @@ -3,13 +3,13 @@ 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 com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; @@ -31,36 +31,38 @@ public class BeltFunnelInteractionHandler { BlockState funnelState = world.getBlockState(funnelPos); if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) continue; - if (funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) != beltInventory.belt.getMovementFacing() - .getOpposite()) + Direction funnelFacing = funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING); + Direction movementFacing = beltInventory.belt.getMovementFacing(); + boolean blocking = funnelFacing == movementFacing.getOpposite(); + if (funnelFacing == movementFacing) continue; currentItem.beltPosition = segment + .5f; if (world.isRemote) - return true; + return blocking; if (funnelState.get(BeltFunnelBlock.PUSHING)) - return true; + return blocking; if (funnelState.has(BeltFunnelBlock.POWERED) && funnelState.get(BeltFunnelBlock.POWERED)) - return true; + return blocking; 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); + InvManipulationBehaviour inserting = funnelTE.getBehaviour(InvManipulationBehaviour.TYPE); + FilteringBehaviour filtering = funnelTE.getBehaviour(FilteringBehaviour.TYPE); if (inserting == null) - return true; + return blocking; if (filtering != null && !filtering.test(currentItem.stack)) - return true; + return blocking; ItemStack before = currentItem.stack.copy(); - ItemStack remainder = inserting.insert(before, false); + ItemStack remainder = inserting.insert(before); if (before.equals(remainder, false)) - return true; + return blocking; funnelTE.flap(true); currentItem.stack = remainder; 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 134b4c41b..e3e70261b 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 @@ -2,7 +2,6 @@ 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; import java.util.LinkedList; @@ -12,13 +11,14 @@ import java.util.function.Function; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.block.Block; @@ -37,6 +37,7 @@ public class BeltInventory { final BeltTileEntity belt; private final List items; final List toInsert; + final List toRemove; boolean beltMovementPositive; final float SEGMENT_WINDOW = .75f; @@ -44,6 +45,7 @@ public class BeltInventory { this.belt = te; items = new LinkedList<>(); toInsert = new LinkedList<>(); + toRemove = new LinkedList<>(); } public void tick() { @@ -56,10 +58,12 @@ public class BeltInventory { belt.sendData(); } - // Add items from previous cycle - if (!toInsert.isEmpty()) { + // Added/Removed items from previous cycle + if (!toInsert.isEmpty() || !toRemove.isEmpty()) { toInsert.forEach(this::insert); toInsert.clear(); + items.removeAll(toRemove); + toRemove.clear(); belt.markDirty(); belt.sendData(); } @@ -248,7 +252,7 @@ public class BeltInventory { return true; if (result == ProcessingResult.HOLD) { - currentItem.beltPosition = segment + .5f + (beltMovementPositive ? 1 / 64f : -1 / 64f); + currentItem.beltPosition = segment + .5f + (beltMovementPositive ? 1 / 512f : -1 / 512f); currentItem.locked = true; belt.sendData(); return false; @@ -400,24 +404,25 @@ public class BeltInventory { } public void applyToEachWithin(float position, float maxDistanceToPosition, - Function> processFunction) { - List toBeAdded = new ArrayList<>(); + Function processFunction) { boolean dirty = false; - for (Iterator iterator = items.iterator(); iterator.hasNext();) { - TransportedItemStack transportedItemStack = iterator.next(); - 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(); + for (TransportedItemStack transforted : items) { + ItemStack stackBefore = transforted.stack.copy(); + if (Math.abs(position - transforted.beltPosition) >= maxDistanceToPosition) + continue; + TransportedResult result = processFunction.apply(transforted); + if (result.didntChangeFrom(stackBefore)) + continue; + + dirty = true; + if (result.hasHeldOutput()) { + TransportedItemStack held = result.getHeldOutput(); + held.beltPosition = ((int) position) + .5f - (beltMovementPositive ? 1 / 512f : -1 / 512f); + toInsert.add(held); } + toInsert.addAll(result.getOutputs()); + toRemove.add(transforted); } - toBeAdded.forEach(this::insert); if (dirty) { belt.markDirty(); belt.sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java index b916628dc..0ad9792fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java @@ -37,8 +37,7 @@ public class BeltTunnelInteractionHandler { if (nextTunnel instanceof BrassTunnelTileEntity) { BrassTunnelTileEntity brassTunnel = (BrassTunnelTileEntity) nextTunnel; if (brassTunnel.hasDistributionBehaviour()) { - if (!brassTunnel.getStackToDistribute() - .isEmpty()) + if (!brassTunnel.canTakeItems()) return true; if (onServer) { brassTunnel.setStackToDistribute(current.stack); 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 d0d9d5a7b..6dffb5056 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 @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.relays.belt.transport; import java.util.Random; +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.logistics.InWorldProcessing; import net.minecraft.item.ItemStack; @@ -9,9 +10,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; @@ -28,7 +29,8 @@ public class TransportedItemStack implements Comparable { public TransportedItemStack(ItemStack stack) { this.stack = stack; - angle = R.nextInt(360); + boolean centered = BeltHelper.isItemUpright(stack); + angle = centered ? 180 : R.nextInt(360); sideOffset = prevSideOffset = getTargetSideOffset(); insertedFrom = Direction.UP; } @@ -41,7 +43,7 @@ public class TransportedItemStack implements Comparable { public int compareTo(TransportedItemStack o) { return beltPosition < o.beltPosition ? 1 : beltPosition > o.beltPosition ? -1 : 0; } - + public TransportedItemStack getSimilar() { TransportedItemStack copy = new TransportedItemStack(stack.copy()); copy.beltPosition = beltPosition; @@ -53,7 +55,7 @@ public class TransportedItemStack implements Comparable { copy.processingTime = processingTime; return copy; } - + public TransportedItemStack copy() { TransportedItemStack copy = getSimilar(); copy.angle = angle; 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 08cffc2eb..3ba62ce5e 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 @@ -3,12 +3,15 @@ package com.simibubi.create.content.contraptions.relays.elementary; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; +import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; 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.entity.player.PlayerEntity; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.FluidState; import net.minecraft.item.BlockItemUseContext; @@ -17,15 +20,19 @@ 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.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Hand; import net.minecraft.util.NonNullList; 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 ShaftBlock extends RotatedPillarKineticBlock implements IWaterLoggable { @@ -73,6 +80,26 @@ public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLogga super.fillItemGroup(group, items); } + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult p_225533_6_) { + if (player.isSneaking() || !player.isAllowEdit()) + return ActionResultType.PASS; + + ItemStack heldItem = player.getHeldItem(hand); + + for (EncasedShaftBlock.Casing casing : EncasedShaftBlock.Casing.values()) { + if (casing.getCasingEntry().isIn(heldItem)) { + if (world.isRemote) + return ActionResultType.SUCCESS; + + KineticTileEntity.switchToBlockState(world, pos, AllBlocks.ENCASED_SHAFT.getDefaultState().with(EncasedShaftBlock.CASING, casing).with(AXIS, state.get(AXIS))); + return ActionResultType.SUCCESS; + } + } + + return ActionResultType.PASS; + } + // IRotate: @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java new file mode 100644 index 000000000..df29e6e41 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java @@ -0,0 +1,58 @@ +package com.simibubi.create.content.contraptions.relays.encased; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; + +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.material.PushReaction; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.StateContainer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorldReader; + +@MethodsReturnNonnullByDefault +public abstract class AbstractEncasedShaftBlock extends RotatedPillarKineticBlock { + public AbstractEncasedShaftBlock(Properties properties) { + super(properties); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + } + + @Override + public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) { + return false; + } + + @Override + public PushReaction getPushReaction(@Nullable BlockState state) { + return PushReaction.NORMAL; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + if (context.getPlayer() != null && context.getPlayer() + .isSneaking()) + return super.getStateForPlacement(context); + Direction.Axis preferredAxis = getPreferredAxis(context); + return this.getDefaultState() + .with(AXIS, preferredAxis == null ? context.getNearestLookingDirection() + .getAxis() : preferredAxis); + } + + @Override + public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == state.get(AXIS); + } + + @Override + public Direction.Axis getRotationAxis(BlockState state) { + return state.get(AXIS); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java index c86f92362..80d831b84 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java @@ -17,15 +17,15 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("Signal", signal); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { signal = compound.getInt("Signal"); - super.read(compound); + super.read(compound, clientPacket); } public float getModifier() { 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 ef275df56..553dc46bf 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 @@ -1,27 +1,45 @@ package com.simibubi.create.content.contraptions.relays.encased; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; +import com.simibubi.create.content.contraptions.base.CasingBlock; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.utility.Lang; +import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.material.PushReaction; -import net.minecraft.item.BlockItemUseContext; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.Property; +import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorldReader; -public class EncasedShaftBlock extends RotatedPillarKineticBlock { +public class EncasedShaftBlock extends AbstractEncasedShaftBlock { + + public static final Property CASING = EnumProperty.create("casing", Casing.class); public EncasedShaftBlock(Properties properties) { super(properties); + this.setDefaultState(this.getDefaultState().with(CASING, Casing.ANDESITE)); } @Override - public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) { - return false; + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(CASING); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { + return new ItemStack(state.get(CASING).getCasingEntry().get().asItem()); } @Override @@ -30,29 +48,35 @@ public class EncasedShaftBlock extends RotatedPillarKineticBlock { } @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.PUSH_ONLY; + public ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) { + if (context.getWorld().isRemote) + return ActionResultType.SUCCESS; + + KineticTileEntity.switchToBlockState(context.getWorld(), context.getPos(), AllBlocks.SHAFT.getDefaultState().with(AXIS, state.get(AXIS))); + return ActionResultType.SUCCESS; } - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - 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); - } + public enum Casing implements IStringSerializable { + ANDESITE(AllBlocks.ANDESITE_CASING), + BRASS(AllBlocks.BRASS_CASING), + //COPPER(AllBlocks.COPPER_CASING) - @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); + private final BlockEntry casingEntry; + + Casing(BlockEntry casingEntry) { + this.casingEntry = casingEntry; + } + + public BlockEntry getCasingEntry() { + return casingEntry; + } + + @Override + public String getString() { + return Lang.asId(name()); + } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java index 5a235677b..9e381f491 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java @@ -15,15 +15,13 @@ import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorldReader; import net.minecraft.world.TickPriority; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class GearshiftBlock extends EncasedShaftBlock implements ITE { +public class GearshiftBlock extends AbstractEncasedShaftBlock implements ITE { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -46,7 +44,7 @@ public class GearshiftBlock extends EncasedShaftBlock implements ITE getTileEntityClass() { return GearshiftTileEntity.class; @@ -90,5 +84,4 @@ public class GearshiftBlock extends EncasedShaftBlock implements ITE 0) { - testPos.move(Direction.DOWN); - BlockState state = world.getBlockState(testPos); - if (state.getOpacity(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK) - break; - if (state.getBlock() == Blocks.BEACON) { - TileEntity te = world.getTileEntity(testPos); - if (!(te instanceof BeaconTileEntity)) + int entityX = MathHelper.floor(entity.getX()); + int entityZ = MathHelper.floor(entity.getZ()); + int localWorldHeight = world.getHeight(Heightmap.Type.WORLD_SURFACE, entityX, entityZ); + if (entity.getY() > localWorldHeight) { + BlockPos.Mutable testPos = new BlockPos.Mutable(entityX, localWorldHeight, entityZ); + while (testPos.getY() > 0) { + testPos.move(Direction.DOWN); + BlockState state = world.getBlockState(testPos); + if (state.getOpacity(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK) break; - BeaconTileEntity bte = (BeaconTileEntity) te; - if (bte.getLevels() != 0) - isOverBeacon = true; - break; + if (state.getBlock() == Blocks.BEACON) { + TileEntity te = world.getTileEntity(testPos); + if (!(te instanceof BeaconTileEntity)) + break; + BeaconTileEntity bte = (BeaconTileEntity) te; + if (bte.getLevels() != 0) + isOverBeacon = true; + break; + } } } @@ -141,7 +145,7 @@ public class ChromaticCompoundItem extends Item { entity.setItem(newStack); List players = - world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(entity.getPosition()).grow(8)); + world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(entity.getBlockPos()).grow(8)); players.forEach(AllTriggers.ABSORBED_LIGHT::trigger); return false; 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 f450b272f..116bcce47 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 @@ -273,9 +273,7 @@ public class SymmetryWandItem extends Item { continue; BlockState blockstate = world.getBlockState(position); - if (blockstate.isAir(world, position)) { - continue; - } else { + if (!blockstate.isAir(world, position)) { targets.add(position); world.playEvent(2001, position, Block.getStateId(blockstate)); world.setBlockState(position, air, 3); @@ -286,7 +284,7 @@ public class SymmetryWandItem extends Item { player.getHeldItemMainhand() .onBlockDestroyed(world, blockstate, position, player); TileEntity tileentity = blockstate.hasTileEntity() ? world.getTileEntity(position) : null; - Block.spawnDrops(blockstate, world, pos, tileentity); + Block.spawnDrops(blockstate, world, pos, tileentity, player, player.getHeldItemMainhand()); // Add fortune, silk touch and other loot modifiers } } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java index 04916432c..36b6d2c83 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java @@ -2,11 +2,7 @@ package com.simibubi.create.content.curiosities.symmetry; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.content.curiosities.symmetry.mirror.CrossPlaneMirror; -import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; -import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; -import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror; -import com.simibubi.create.content.curiosities.symmetry.mirror.TriplePlaneMirror; +import com.simibubi.create.content.curiosities.symmetry.mirror.*; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.GuiGameElement; @@ -119,14 +115,11 @@ public class SymmetryWandScreen extends AbstractSimiScreen { renderBlock(); - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 200); - RenderSystem.rotatef(-20, -3.5f, 1, 1); GuiGameElement.of(wand) - .at(guiLeft + 220, guiTop + 220) - .scale(4) - .render(); - RenderSystem.popMatrix(); + .at(guiLeft + 200, guiTop + 170) + .scale(4) + .rotate(-70, 20, 20) + .render(); } protected void renderBlock() { diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index 92165ed8d..bc1259b77 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -157,7 +157,7 @@ public class ExtendoGripItem extends Item { if (!isHoldingExtendoGrip(player)) return; Entity target = event.getTarget(); - if (!target.attackEntityFrom(DamageSource.causePlayerDamage(player), 0)) + if (target instanceof ItemFrameEntity || !target.attackEntityFrom(DamageSource.causePlayerDamage(player), 0)) return; int strength = 2; float yaw = entity.rotationYaw * ((float) Math.PI / 180F); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java index f5b924abf..b949f1f94 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java @@ -1,27 +1,42 @@ package com.simibubi.create.content.curiosities.tools; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; -import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv; + import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; - @ParametersAreNonnullByDefault public class SandPaperPolishingRecipe extends ProcessingRecipe { - public SandPaperPolishingRecipe(ResourceLocation id, String group, List ingredients, - List results, int processingDuration) { - super(AllRecipeTypes.SANDPAPER_POLISHING, id, group, ingredients, results, processingDuration); + public SandPaperPolishingRecipe(ProcessingRecipeParams params) { + super(AllRecipeTypes.SANDPAPER_POLISHING, params); + } + + @Override + public boolean matches(SandPaperInv inv, World worldIn) { + return ingredients.get(0) + .test(inv.getStackInSlot(0)); + } + + @Override + protected int getMaxInputCount() { + return 1; + } + + @Override + protected int getMaxOutputCount() { + return 1; } public static boolean canPolish(World world, ItemStack stack) { @@ -42,17 +57,6 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { .getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world); } - @Override - public boolean matches(SandPaperInv inv, World worldIn) { - return ingredients.get(0) - .test(inv.getStackInSlot(0)); - } - - @Override - protected int getMaxOutputCount() { - return 1; - } - public static class SandPaperInv extends RecipeWrapper { public SandPaperInv(ItemStack stack) { 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 51ba4e83d..16c4fb5b5 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 @@ -5,6 +5,7 @@ import java.util.List; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; @@ -147,6 +148,7 @@ public abstract class ZapperItem extends Item { BlockState stateToUse = Blocks.AIR.getDefaultState(); if (nbt.contains("BlockUsed")) stateToUse = NBTUtil.readBlockState(nbt.getCompound("BlockUsed")); + stateToUse = BlockHelper.setZeroAge(stateToUse); // Raytrace - Find the target Vector3d start = player.getPositionVec() 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 51de3c0f8..1866e54a2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics; +import static com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.getHeatLevelOf; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -7,11 +9,12 @@ 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.HeaterBlock; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.block.BlockState; @@ -40,8 +43,6 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; -import static com.simibubi.create.content.contraptions.processing.HeaterBlock.getHeaterLevel; - public class InWorldProcessing { public static class SplashingInv extends RecipeWrapper { @@ -63,9 +64,11 @@ 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)) || getHeaterLevel(blockState) == HeaterBlock.HeatLevel.SMOULDERING) + || (blockState.getBlock() == Blocks.CAMPFIRE && blockState.get(CampfireBlock.LIT)) + || getHeatLevelOf(blockState) == BlazeBurnerBlock.HeatLevel.SMOULDERING) return Type.SMOKING; - if (blockState.getBlock() == Blocks.LAVA || getHeaterLevel(blockState).min(HeaterBlock.HeatLevel.FADING)) + if (blockState.getBlock() == Blocks.LAVA + || getHeatLevelOf(blockState).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) return Type.BLASTING; return null; } @@ -140,8 +143,8 @@ public class InWorldProcessing { } } - public static List applyProcessing(TransportedItemStack transported, - World world, Type type) { + public static TransportedResult applyProcessing(TransportedItemStack transported, World world, Type type) { + TransportedResult ignore = TransportedResult.doNothing(); if (transported.processedBy != type) { transported.processedBy = type; int timeModifierForStackSize = ((transported.stack.getCount() - 1) / 16) + 1; @@ -150,16 +153,16 @@ public class InWorldProcessing { transported.processingTime = processingTime; if (!canProcess(transported.stack, type, world)) transported.processingTime = -1; - return null; + return ignore; } if (transported.processingTime == -1) - return null; + return ignore; if (transported.processingTime-- > 0) - return null; + return ignore; List stacks = process(transported.stack, type, world); if (stacks == null) - return null; + return ignore; List transportedStacks = new ArrayList<>(); for (ItemStack additional : stacks) { @@ -167,7 +170,7 @@ public class InWorldProcessing { newTransported.stack = additional.copy(); transportedStacks.add(newTransported); } - return transportedStacks; + return TransportedResult.convertTo(transportedStacks); } private static List process(ItemStack stack, Type type, World world) { @@ -266,7 +269,7 @@ public class InWorldProcessing { if (recipe instanceof ProcessingRecipe) { stacks = new ArrayList<>(); for (int i = 0; i < stackIn.getCount(); i++) { - List rollResults = ((ProcessingRecipe) recipe).rollResults().getItemStacks(); + List rollResults = ((ProcessingRecipe) recipe).rollResults(); for (ItemStack stack : rollResults) { for (ItemStack previouslyRolled : stacks) { if (stack.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/AttachedLogisticalBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/AttachedLogisticalBlock.java deleted file mode 100644 index dc4ea4dc3..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/AttachedLogisticalBlock.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.simibubi.create.content.logistics.block; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; - -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.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.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.IWorldReader; -import net.minecraft.world.World; - -public abstract class AttachedLogisticalBlock extends HorizontalBlock implements IWrenchable { - - public static final BooleanProperty UPWARD = BooleanProperty.create("upward"); - - public AttachedLogisticalBlock(Properties properties) { - super(properties); - } - - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - return ActionResultType.FAIL; - } - - protected abstract boolean isVertical(); - - protected abstract BlockState getVerticalDefaultState(); - - protected abstract BlockState getHorizontalDefaultState(); - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = getDefaultState(); - - if (context.getFace().getAxis().isHorizontal()) { - state = state.with(HORIZONTAL_FACING, context.getFace().getOpposite()); - } else { - state = getVerticalDefaultState(); - state = state.with(UPWARD, context.getFace() != Direction.UP); - state = state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()); - } - - return state; - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, - PlayerEntity player) { - if (isVertical()) - return getHorizontalDefaultState().getBlock().getPickBlock(state, target, world, pos, player); - return super.getPickBlock(state, target, world, pos, player); - } - - @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - Direction facing = getBlockFacing(state); - return canAttachToSide(worldIn, pos, facing); - } - - protected boolean canAttachToSide(IWorldReader worldIn, BlockPos pos, Direction facing) { - BlockPos neighbourPos = pos.offset(facing); - BlockState neighbour = worldIn.getBlockState(neighbourPos); - - if (neighbour.getBlock() instanceof TransposerBlock) - return false; - if (AllBlocks.BELT.has(neighbour)) - return BeltBlock.canAccessFromSide(facing, neighbour); - return !neighbour.getShape(worldIn, pos).isEmpty(); - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (worldIn.isRemote) - return; - - Direction blockFacing = getBlockFacing(state); - if (fromPos.equals(pos.offset(blockFacing))) { - if (!isValidPosition(state, worldIn, pos)) { - worldIn.destroyBlock(pos, true); - return; - } - } - } - - public static Direction getBlockFacing(BlockState state) { - if (isVertical(state)) - return state.get(UPWARD) ? Direction.UP : Direction.DOWN; - return state.get(HORIZONTAL_FACING); - } - - @Override - protected void fillStateContainer(Builder builder) { - if (isVertical()) - builder.add(UPWARD); - super.fillStateContainer(builder.add(HORIZONTAL_FACING)); - } - - public static boolean isVertical(BlockState state) { - Block block = state.getBlock(); - return ((block instanceof AttachedLogisticalBlock) - && (((AttachedLogisticalBlock) state.getBlock())).isVertical()); - } - - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.BLOCK; - } - -} 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 deleted file mode 100644 index 7f5da2547..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/BeltAttachableLogisticalBlock.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.content.logistics.block.belts; - -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 net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public abstract class BeltAttachableLogisticalBlock extends AttachedLogisticalBlock { - - public BeltAttachableLogisticalBlock(Properties properties) { - super(properties); - } - - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); - } - } - -} 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 0ab4808ca..b865c8fce 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 @@ -73,15 +73,15 @@ public class BeltObserverTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("TurnOff", turnOffTicks); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { turnOffTicks = compound.getInt("TurnOff"); - super.read(compound); + super.read(compound, clientPacket); } } 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 263b0dc89..73f5debe8 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 @@ -168,10 +168,14 @@ public class BeltTunnelBlock extends Block implements ITE, Direction fw = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); BlockState blockState1 = reader.getBlockState(pos.offset(fw)); BlockState blockState2 = reader.getBlockState(pos.offset(fw.getOpposite())); + boolean funnel1 = blockState1.getBlock() instanceof BeltFunnelBlock + && blockState1.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED && blockState1.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw.getOpposite(); boolean funnel2 = blockState2.getBlock() instanceof BeltFunnelBlock + && blockState2.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED && blockState2.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw; + boolean valid1 = blockState1.getBlock() instanceof BeltTunnelBlock || funnel1; boolean valid2 = blockState2.getBlock() instanceof BeltTunnelBlock || funnel2; boolean canHaveWindow = valid1 && valid2 && !(funnel1 && funnel2); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 123476662..768a34ad5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -52,38 +52,18 @@ public class BeltTunnelTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { ListNBT flapsNBT = new ListNBT(); for (Direction direction : flaps.keySet()) flapsNBT.add(IntNBT.of(direction.getIndex())); compound.put("Flaps", flapsNBT); - return super.write(compound); - } + super.write(compound, clientPacket); - @Override - public void read(CompoundNBT compound) { - 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())); - - 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)); + if (!clientPacket) + return; - super.read(compound); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT tag) { - CompoundNBT writeToClient = super.writeToClient(tag); + flapsNBT = new ListNBT(); if (!flapsToSend.isEmpty()) { - ListNBT flapsNBT = new ListNBT(); for (Pair pair : flapsToSend) { CompoundNBT flap = new CompoundNBT(); flap.putInt("Flap", pair.getKey() @@ -91,22 +71,38 @@ public class BeltTunnelTileEntity extends SmartTileEntity { flap.putBoolean("FlapInward", pair.getValue()); flapsNBT.add(flap); } - writeToClient.put("TriggerFlaps", flapsNBT); + compound.put("TriggerFlaps", flapsNBT); flapsToSend.clear(); } - return writeToClient; } @Override - public void readClientUpdate(CompoundNBT tag) { - super.readClientUpdate(tag); - 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")); - } + protected void read(CompoundNBT compound, boolean clientPacket) { + 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())); + + 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, clientPacket); + + if (!clientPacket) + return; + if (!compound.contains("TriggerFlaps")) + return; + flapsNBT = compound.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")); } } @@ -131,12 +127,13 @@ public class BeltTunnelTileEntity extends SmartTileEntity { if (!positive && shape == Shape.T_RIGHT) continue; } - + BlockState funnelState = world.getBlockState(getPos().offset(direction)); - if (funnelState.getBlock() instanceof BeltFunnelBlock) - if (funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) == direction.getOpposite()) + if (funnelState.getBlock() instanceof BeltFunnelBlock) + if (funnelState.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED + && funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) == direction.getOpposite()) continue; - + flaps.put(direction, new InterpolatedChasingValue().start(.25f) .target(0) .withSpeed(.05f)); 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 index b103dd5ae..317457f24 100644 --- 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 @@ -31,7 +31,7 @@ public class BrassTunnelItemHandler implements IItemHandler { return beltCapability.orElse(null).insertItem(slot, stack, simulate); } - if (!te.stackToDistribute.isEmpty()) + if (!te.canTakeItems()) return stack; if (!simulate) te.setStackToDistribute(stack); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index a4956d9b3..fe0afadf4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -1,7 +1,10 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Random; +import java.util.Set; import javax.annotation.Nullable; @@ -11,11 +14,16 @@ 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.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; 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.tileEntity.behaviour.scrollvalue.INamedIconOptions; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.Block; @@ -36,6 +44,7 @@ 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 BrassTunnelTileEntity extends BeltTunnelTileEntity { @@ -49,16 +58,44 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { List> distributionTargets; int distributionDistanceLeft; int distributionDistanceRight; + int previousOutputIndex; + private boolean syncedOutputActive; + private Set syncSet; + + protected ScrollOptionBehaviour selectionMode; private LazyOptional beltCapability; private LazyOptional tunnelCapability; public BrassTunnelTileEntity(TileEntityType type) { super(type); distributionTargets = new ArrayList<>(); + syncSet = new HashSet<>(); stackToDistribute = ItemStack.EMPTY; beltCapability = LazyOptional.empty(); tunnelCapability = LazyOptional.of(() -> new BrassTunnelItemHandler(this)); + previousOutputIndex = 0; + syncedOutputActive = false; + } + + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours.add(selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class, + Lang.translate("logistics.when_multiple_outputs_available"), this, + new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP))); + selectionMode.requiresWrench(); + + // Propagate settings across connected tunnels + selectionMode.withCallback(setting -> { + for (boolean side : Iterate.trueAndFalse) { + if (!isConnected(side)) + continue; + BrassTunnelTileEntity adjacent = getAdjacent(side); + if (adjacent != null) + adjacent.selectionMode.setValue(setting); + } + }); } @Override @@ -66,9 +103,11 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { super.tick(); BeltTileEntity beltBelow = BeltHelper.getSegmentTE(world, pos.down()); + if (distributionProgress > 0) + distributionProgress--; if (beltBelow == null || beltBelow.getSpeed() == 0) return; - if (stackToDistribute.isEmpty()) + if (stackToDistribute.isEmpty() && !syncedOutputActive) return; if (world.isRemote) return; @@ -77,10 +116,31 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { distributionTargets.clear(); distributionDistanceLeft = 0; distributionDistanceRight = 0; - for (Pair pair : gatherValidOutputs()) { + + syncSet.clear(); + List> validOutputs = gatherValidOutputs(); + if (selectionMode.get() == SelectionMode.SYNCHRONIZE) { + boolean allEmpty = true; + boolean allFull = true; + for (BrassTunnelTileEntity te : syncSet) { + boolean hasStack = !te.stackToDistribute.isEmpty(); + allEmpty &= !hasStack; + allFull &= hasStack; + } + final boolean notifySyncedOut = !allEmpty; + if (allFull || allEmpty) + syncSet.forEach(te -> te.syncedOutputActive = notifySyncedOut); + } + + if (validOutputs == null) + return; + if (stackToDistribute.isEmpty()) + return; + + for (Pair pair : validOutputs) { BrassTunnelTileEntity tunnel = pair.getKey(); Direction output = pair.getValue(); - if (!insertIntoTunnel(tunnel, output, stackToDistribute, true).isEmpty()) + if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) continue; distributionTargets.add(Pair.of(tunnel.pos, output)); int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); @@ -93,12 +153,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (distributionTargets.isEmpty()) return; - distributionProgress = 0; - sendData(); + if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) { + distributionProgress = 10; + sendData(); + } return; } - // TODO this is instant for now if (distributionProgress == 0) { List> validTargets = new ArrayList<>(); for (Pair pair : distributionTargets) { @@ -110,36 +171,73 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { 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--; - } - + distribute(validTargets); distributionProgress = -1; - markDirty(); - sendData(); return; } } + private static Random rand = new Random(); + + private void distribute(List> validTargets) { + final int amountTargets = validTargets.size(); + if (amountTargets == 0) + return; + + int indexStart = previousOutputIndex % amountTargets; + SelectionMode mode = selectionMode.get(); + boolean force = mode == SelectionMode.FORCED_ROUND_ROBIN || mode == SelectionMode.FORCED_SPLIT; + boolean split = mode == SelectionMode.FORCED_SPLIT || mode == SelectionMode.SPLIT; + + if (mode == SelectionMode.RANDOMIZE) + indexStart = rand.nextInt(amountTargets); + if (mode == SelectionMode.PREFER_NEAREST || mode == SelectionMode.SYNCHRONIZE) + indexStart = 0; + + ItemStack toDistribute = null; + for (boolean simulate : Iterate.trueAndFalse) { + int index = indexStart; + int stackSize = stackToDistribute.getCount(); + int splitStackSize = stackSize / amountTargets; + int splitRemainder = stackSize % amountTargets; + int visited = 0; + + toDistribute = stackToDistribute.copy(); + if (!force && simulate) + continue; + while (visited < amountTargets) { + Pair pair = validTargets.get(index); + BrassTunnelTileEntity tunnel = pair.getKey(); + Direction side = pair.getValue(); + index = (index + 1) % amountTargets; + visited++; + + int count = split ? splitStackSize + (splitRemainder > 0 ? 1 : 0) : stackSize; + ItemStack toOutput = ItemHandlerHelper.copyStackWithSize(toDistribute, count); + ItemStack remainder = insertIntoTunnel(tunnel, side, toOutput, simulate); + + if (remainder == null || !remainder.isEmpty()) { + if (force) + return; + continue; + } + + toDistribute.shrink(count); + if (toDistribute.isEmpty()) + break; + splitRemainder--; + if (!split) + break; + } + } + + stackToDistribute = toDistribute.copy(); + previousOutputIndex++; + previousOutputIndex %= amountTargets; + notifyUpdate(); + } + public void setStackToDistribute(ItemStack stack) { stackToDistribute = stack; distributionProgress = -1; @@ -151,21 +249,24 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return stackToDistribute; } + @Nullable protected ItemStack insertIntoTunnel(BrassTunnelTileEntity tunnel, Direction side, ItemStack stack, boolean simulate) { if (stack.isEmpty()) return stack; if (!tunnel.testFlapFilter(side, stack)) - return stack; + return null; BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnel.pos.down()); if (below == null) - return stack; + return null; BlockPos offset = tunnel.getPos() .down() .offset(side); DirectBeltInputBehaviour sideOutput = TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); if (sideOutput != null) { + if (!sideOutput.canInsertFromSide(side)) + return null; ItemStack result = sideOutput.handleInsertion(stack, side, simulate); if (result.isEmpty() && !simulate) tunnel.flap(side, true); @@ -177,8 +278,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (!Block.hasSolidSide(world.getBlockState(offset), world, offset, side.getOpposite())) { BeltTileEntity controllerTE = below.getControllerTE(); if (controllerTE == null) - return stack; - + return null; + if (!simulate) { tunnel.flap(side, true); ItemStack ejected = stack; @@ -195,11 +296,11 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { entity.velocityChanged = true; world.addEntity(entity); } - + return ItemStack.EMPTY; } - return stack; + return null; } public boolean testFlapFilter(Direction side, ItemStack stack) { @@ -219,7 +320,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { public void initialize() { if (filtering == null) { filtering = createSidedFilter(); - putBehaviour(filtering); + attachBehaviourLate(filtering); } super.initialize(); } @@ -251,22 +352,29 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { private List> gatherValidOutputs() { List> validOutputs = new ArrayList<>(); + boolean synchronize = selectionMode.get() == SelectionMode.SYNCHRONIZE; 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); + if (adjacent == null) + continue; + addValidOutputsOf(adjacent, validOutputs); } } + + if (!syncedOutputActive && synchronize) + return null; return validOutputs; } private void addValidOutputsOf(BrassTunnelTileEntity tunnelTE, List> validOutputs) { + syncSet.add(tunnelTE); BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnelTE.pos.down()); if (below == null) return; @@ -328,12 +436,14 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putBoolean("SyncedOutput", syncedOutputActive); compound.putBoolean("ConnectedLeft", connectedLeft); compound.putBoolean("ConnectedRight", connectedRight); compound.put("StackToDistribute", stackToDistribute.serializeNBT()); compound.putFloat("DistributionProgress", distributionProgress); + compound.putInt("PreviousIndex", previousOutputIndex); compound.putInt("DistanceLeft", distributionDistanceLeft); compound.putInt("DistanceRight", distributionDistanceRight); compound.put("Targets", NBTHelper.writeCompoundList(distributionTargets, pair -> { @@ -344,16 +454,20 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return nbt; })); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { + boolean wasConnectedLeft = connectedLeft; + boolean wasConnectedRight = connectedRight; + + syncedOutputActive = compound.getBoolean("SyncedOutput"); connectedLeft = compound.getBoolean("ConnectedLeft"); connectedRight = compound.getBoolean("ConnectedRight"); - stackToDistribute = ItemStack.read(compound.getCompound("StackToDistribute")); distributionProgress = compound.getFloat("DistributionProgress"); + previousOutputIndex = compound.getInt("PreviousIndex"); distributionDistanceLeft = compound.getInt("DistanceLeft"); distributionDistanceRight = compound.getInt("DistanceRight"); distributionTargets = NBTHelper.readCompoundList(compound.getList("Targets", NBT.TAG_COMPOUND), nbt -> { @@ -362,14 +476,10 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return Pair.of(pos, face); }); - super.read(compound); - } + super.read(compound, clientPacket); - @Override - public void readClientUpdate(CompoundNBT tag) { - boolean wasConnectedLeft = connectedLeft; - boolean wasConnectedRight = connectedRight; - super.readClientUpdate(tag); + if (!clientPacket) + return; if (wasConnectedLeft != connectedLeft || wasConnectedRight != connectedRight) { requestModelDataUpdate(); if (hasWorld()) @@ -393,15 +503,20 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { connectedLeft = nowConnectedLeft; connectivityChanged = true; BrassTunnelTileEntity adjacent = getAdjacent(true); - if (adjacent != null && !world.isRemote) + if (adjacent != null && !world.isRemote) { adjacent.updateTunnelConnections(); + adjacent.selectionMode.setValue(selectionMode.getValue()); + } } + if (connectedRight != nowConnectedRight) { connectedRight = nowConnectedRight; connectivityChanged = true; BrassTunnelTileEntity adjacent = getAdjacent(false); - if (adjacent != null && !world.isRemote) + if (adjacent != null && !world.isRemote) { adjacent.updateTunnelConnections(); + adjacent.selectionMode.setValue(selectionMode.getValue()); + } } if (filtering != null) @@ -437,6 +552,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (adjacentBlockState.get(BrassTunnelBlock.HORIZONTAL_AXIS) != axis) return null; TileEntity adjacentTE = world.getTileEntity(adjacentPos); + if (adjacentTE.isRemoved()) + return null; if (!(adjacentTE instanceof BrassTunnelTileEntity)) return null; return (BrassTunnelTileEntity) adjacentTE; @@ -464,4 +581,38 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return beltCapability; } + public enum SelectionMode implements INamedIconOptions { + SPLIT(AllIcons.I_TUNNEL_SPLIT), + FORCED_SPLIT(AllIcons.I_TUNNEL_FORCED_SPLIT), + ROUND_ROBIN(AllIcons.I_TUNNEL_ROUND_ROBIN), + FORCED_ROUND_ROBIN(AllIcons.I_TUNNEL_FORCED_ROUND_ROBIN), + PREFER_NEAREST(AllIcons.I_TUNNEL_PREFER_NEAREST), + RANDOMIZE(AllIcons.I_TUNNEL_RANDOMIZE), + SYNCHRONIZE(AllIcons.I_TUNNEL_SYNCHRONIZE), + + ; + + private final String translationKey; + private final AllIcons icon; + + SelectionMode(AllIcons icon) { + this.icon = icon; + this.translationKey = "tunnel.selection_mode." + Lang.asId(name()); + } + + @Override + public AllIcons getIcon() { + return icon; + } + + @Override + public String getTranslationKey() { + return translationKey; + } + } + + public boolean canTakeItems() { + return stackToDistribute.isEmpty() && !syncedOutputActive; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java index 161a04a15..a1d8867b5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -3,17 +3,18 @@ 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.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.client.particle.ParticleManager; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -38,13 +39,15 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class ChuteBlock extends Block implements IWrenchable, ITE { public static final Property SHAPE = EnumProperty.create("shape", Shape.class); public static final DirectionProperty FACING = BlockStateProperties.FACING_EXCEPT_UP; public enum Shape implements IStringSerializable { - START(), WINDOW_STRAIGHT(), NORMAL(); + INTERSECTION, WINDOW, NORMAL; @Override public String getString() { @@ -144,6 +147,13 @@ public class ChuteBlock extends Block implements IWrenchable, ITE connections = new HashMap<>(); int amtConnections = 0; Direction facing = state.get(FACING); + boolean vertical = facing == Direction.DOWN; - 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); + if (!vertical) { + 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() @@ -189,31 +200,51 @@ public class ChuteBlock extends Block implements IWrenchable, ITE { BlockState blockState = te.getBlockState(); if (blockState.get(ChuteBlock.FACING) != Direction.DOWN) return; - if (blockState.get(ChuteBlock.SHAPE) != Shape.WINDOW_STRAIGHT) + if (blockState.get(ChuteBlock.SHAPE) != Shape.WINDOW + && (te.bottomPullDistance == 0 || te.itemPosition.get(partialTicks) > .5f)) return; ItemRenderer itemRenderer = Minecraft.getInstance() diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java new file mode 100644 index 000000000..aa8710fbb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java @@ -0,0 +1,66 @@ +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.content.logistics.block.chute.ChuteBlock.Shape; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.shapes.IBooleanFunction; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; + +public class ChuteShapes { + + static Map cache = new HashMap<>(); + static Map collisionCache = new HashMap<>(); + + public static final VoxelShape INTERSECTION_MASK = Block.makeCuboidShape(0, -16, 0, 16, 16, 16); + public static final VoxelShape COLLISION_MASK = Block.makeCuboidShape(0, 0, 0, 16, 24, 16); + + public static VoxelShape createShape(BlockState state) { + Direction direction = state.get(ChuteBlock.FACING); + Shape shape = state.get(ChuteBlock.SHAPE); + + boolean intersection = shape == Shape.INTERSECTION; + if (direction == Direction.DOWN) + return intersection ? VoxelShapes.fullCube() : AllShapes.CHUTE; + + VoxelShape combineWith = intersection ? VoxelShapes.fullCube() : VoxelShapes.empty(); + VoxelShape result = VoxelShapes.or(combineWith, AllShapes.CHUTE_SLOPE.get(direction)); + if (intersection) + result = VoxelShapes.combine(INTERSECTION_MASK, result, IBooleanFunction.AND); + return result; + } + + public static VoxelShape getShape(BlockState state) { + if (cache.containsKey(state)) + return cache.get(state); + VoxelShape createdShape = createShape(state); + cache.put(state, createdShape); + return createdShape; + } + + public static VoxelShape getCollisionShape(BlockState state) { + if (collisionCache.containsKey(state)) + return collisionCache.get(state); + VoxelShape createdShape = VoxelShapes.combine(COLLISION_MASK, getShape(state), IBooleanFunction.AND); + collisionCache.put(state, createdShape); + return createdShape; + } + + public static final VoxelShape PANEL = Block.makeCuboidShape(1, -15, 0, 15, 4, 1); + + public static VoxelShape createSlope() { + VoxelShape shape = VoxelShapes.empty(); + for (int i = 0; i < 16; i++) { + float offset = i / 16f; + shape = VoxelShapes.combineAndSimplify(shape, PANEL.withOffset(0, offset, offset), IBooleanFunction.OR); + } + return shape; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index c968bbdfc..8ea439a51 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -5,18 +5,27 @@ import java.util.List; import javax.annotation.Nullable; +import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.fan.AirCurrent; import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; +import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.ChuteFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode; 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.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; @@ -31,6 +40,7 @@ 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.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -39,6 +49,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation { @@ -51,6 +62,16 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor LazyOptional lazyHandler; boolean canPickUpItems; + float bottomPullDistance; + int airCurrentUpdateCooldown; + int entitySearchCooldown; + boolean updateAirFlow; + TransportedItemStackHandlerBehaviour beltBelow; + float beltBelowOffset; + + LazyOptional capAbove; + LazyOptional capBelow; + public ChuteTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); item = ItemStack.EMPTY; @@ -58,6 +79,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor itemHandler = new ChuteItemHandler(this); lazyHandler = LazyOptional.of(() -> itemHandler); canPickUpItems = false; + capAbove = LazyOptional.empty(); + capBelow = LazyOptional.empty(); + bottomPullDistance = 0; + updateAirFlow = true; } @Override @@ -79,29 +104,46 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return false; if (getItemMotion() > 0 && getInputChutes().isEmpty()) return false; - return blockState.get(ChuteBlock.FACING) == Direction.DOWN || blockState.get(ChuteBlock.SHAPE) == Shape.START; + return blockState.get(ChuteBlock.FACING) == Direction.DOWN + || blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION; } @Override public void initialize() { super.initialize(); + onAdded(); + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return new AxisAlignedBB(pos).expand(0, -3, 0); } @Override public void tick() { super.tick(); + canPickUpItems = canDirectlyInsert(); - if (item.isEmpty()) - return; + float itemMotion = getItemMotion(); + if (itemMotion != 0 && world.isRemote) + spawnParticles(itemMotion); + if (itemMotion > 0) + tickAirStreamFromBelow(itemMotion); + + if (item.isEmpty()) { + if (itemMotion < 0) + handleInputFromAbove(); + if (itemMotion > 0) + handleInputFromBelow(); + return; + } + float nextOffset = itemPosition.value + itemMotion; if (itemMotion < 0) { if (nextOffset < .5f) { - if (handleSideOutput()) - return; - boolean success = handleDownwardOutput(true); - if (!success) + if (!handleDownwardOutput(true)) nextOffset = .5f; else if (nextOffset < 0) { handleDownwardOutput(world.isRemote); @@ -112,10 +154,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (itemMotion > 0) { if (nextOffset > .5f) { - if (handleSideOutput()) - return; - boolean success = handleUpwardOutput(true); - if (!success) + if (!handleUpwardOutput(true)) nextOffset = .5f; else if (nextOffset > 1) { handleUpwardOutput(world.isRemote); @@ -127,6 +166,143 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor itemPosition.set(nextOffset); } + private void tickAirStreamFromBelow(float itemSpeed) { + if (world.isRemote) + return; + + if (airCurrentUpdateCooldown-- <= 0) { + airCurrentUpdateCooldown = AllConfigs.SERVER.kinetics.fanBlockCheckRate.get(); + updateAirFlow = true; + } + + if (bottomPullDistance > 0 && getItem().isEmpty() && entitySearchCooldown-- <= 0) { + entitySearchCooldown = 5; + Vec3d center = VecHelper.getCenterOf(pos); + AxisAlignedBB searchArea = + new AxisAlignedBB(center.add(0, -bottomPullDistance - 0.5, 0), center.add(0, -0.5, 0)).grow(.45f); + for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, searchArea)) { + setItem(itemEntity.getItem() + .copy(), + (float) (itemEntity.getBoundingBox() + .getCenter().y - pos.getY())); + itemEntity.remove(); + break; + } + } + + if (getItem().isEmpty() && beltBelow != null) { + beltBelow.handleCenteredProcessingOnAllItems(.5f, ts -> { + if (getItem().isEmpty()) { + setItem(ts.stack.copy(), -beltBelowOffset); + return TransportedResult.removeItem(); + } + return TransportedResult.doNothing(); + }); + } + + if (!updateAirFlow) + return; + + float speed = pull - push; + float flowLimit = 0; + updateAirFlow = false; + beltBelow = null; + + float maxPullDistance; + if (speed >= 128) + maxPullDistance = 3; + else if (speed >= 64) + maxPullDistance = 2; + else if (speed >= 32) + maxPullDistance = 1; + else + maxPullDistance = MathHelper.lerp(speed / 32, 0, 1); + + if (AllBlocks.CHUTE.has(world.getBlockState(pos.down()))) + maxPullDistance = 0; + flowLimit = maxPullDistance; + if (flowLimit > 0) + flowLimit = AirCurrent.getFlowLimit(world, pos, maxPullDistance, Direction.DOWN); + + for (int i = 1; i <= flowLimit + 1; i++) { + TransportedItemStackHandlerBehaviour behaviour = + TileEntityBehaviour.get(world, pos.down(i), TransportedItemStackHandlerBehaviour.TYPE); + if (behaviour == null) + continue; + beltBelow = behaviour; + beltBelowOffset = i - 1; + break; + } + + if (bottomPullDistance == flowLimit) + return; + + this.bottomPullDistance = flowLimit; + sendData(); + } + + public void blockBelowChanged() { + updateAirFlow = true; + } + + private void spawnParticles(float itemMotion) { + BlockState blockState = getBlockState(); + boolean up = itemMotion > 0; + float absMotion = up ? itemMotion : -itemMotion; + if (blockState == null || !(blockState.getBlock() instanceof ChuteBlock)) + return; + if (push == 0 && pull == 0) + return; + + if (up + && (blockState.get(ChuteBlock.FACING) == Direction.DOWN + || blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION) + && BlockHelper.noCollisionInSpace(world, pos.up())) + spawnAirFlow(1, 2, absMotion, .5f); + + if (blockState.get(ChuteBlock.FACING) != Direction.DOWN) + return; + + if (blockState.get(ChuteBlock.SHAPE) == Shape.WINDOW) + spawnAirFlow(up ? 0 : 1, up ? 1 : 0, absMotion, 1); + + if (!up && BlockHelper.noCollisionInSpace(world, pos.down())) + spawnAirFlow(0, -1, absMotion, .5f); + + if (up && bottomPullDistance > 0) { + spawnAirFlow(-bottomPullDistance, 0, absMotion, 2); + spawnAirFlow(-bottomPullDistance, 0, absMotion, 2); + } + } + + private void spawnAirFlow(float verticalStart, float verticalEnd, float motion, float drag) { + AirParticleData airParticleData = new AirParticleData(drag, motion); + Vec3d origin = new Vec3d(pos); + float xOff = Create.random.nextFloat() * .5f + .25f; + float zOff = Create.random.nextFloat() * .5f + .25f; + Vec3d v = origin.add(xOff, verticalStart, zOff); + Vec3d d = origin.add(xOff, verticalEnd, zOff) + .subtract(v); + if (Create.random.nextFloat() < 2 * motion) + world.addOptionalParticle(airParticleData, v.x, v.y, v.z, d.x, d.y, d.z); + } + + private void handleInputFromAbove() { + if (!capAbove.isPresent()) + capAbove = grabCapability(Direction.UP); + if (capAbove.isPresent()) + item = + ItemHelper.extract(capAbove.orElse(null), Predicates.alwaysTrue(), ExtractionCountMode.UPTO, 16, false); + } + + private void handleInputFromBelow() { + if (!capBelow.isPresent()) + capBelow = grabCapability(Direction.DOWN); + if (capBelow.isPresent()) + item = + ItemHelper.extract(capBelow.orElse(null), Predicates.alwaysTrue(), ExtractionCountMode.UPTO, 16, false); + } + private boolean handleDownwardOutput(boolean simulate) { BlockState blockState = getBlockState(); ChuteTileEntity targetChute = getTargetChute(blockState); @@ -169,6 +345,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return remainder.isEmpty(); } + if (!capBelow.isPresent()) + capBelow = grabCapability(Direction.DOWN); + if (capBelow.isPresent()) { + ItemStack remainder = ItemHandlerHelper.insertItemStacked(capBelow.orElse(null), item, simulate); + if (!simulate) + setItem(ItemStack.EMPTY); + return remainder.isEmpty(); + } + if (Block.hasSolidSideOnTop(world, pos.down())) return false; @@ -220,6 +405,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return true; } + if (!capAbove.isPresent()) + capAbove = grabCapability(Direction.UP); + if (capAbove.isPresent()) { + ItemStack remainder = ItemHandlerHelper.insertItemStacked(capAbove.orElse(null), item, simulate); + if (!simulate) + setItem(ItemStack.EMPTY); + return remainder.isEmpty(); + } + if (Block.hasSolidSide(stateAbove, world, pos.up(), Direction.DOWN)) return false; if (!inputChutes.isEmpty()) @@ -237,25 +431,12 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor 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(); + private LazyOptional grabCapability(Direction side) { + BlockPos pos = this.pos.offset(side); + TileEntity te = world.getTileEntity(pos); + if (te == null || te instanceof ChuteTileEntity) + return LazyOptional.empty(); + return te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()); } public void setItem(ItemStack stack) { @@ -277,22 +458,24 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.put("Item", item.serializeNBT()); compound.putFloat("ItemPosition", itemPosition.value); compound.putFloat("Pull", pull); compound.putFloat("Push", push); - return super.write(compound); + compound.putFloat("BottomAirFlowDistance", bottomPullDistance); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { 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); + bottomPullDistance = compound.getFloat("BottomAirFlowDistance"); + super.read(compound, clientPacket); if (hasWorld() && world.isRemote && !previousItem.equals(item, false) && !item.isEmpty()) { if (world.rand.nextInt(3) != 0) @@ -307,11 +490,11 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public float getItemMotion() { // Chutes per second final float fanSpeedModifier = 1 / 64f; - final float maxUpwardItemSpeed = 20f; + final float maxItemSpeed = 20f; final float gravity = 4f; - float upwardMotion = (push + pull) * fanSpeedModifier; - return (upwardMotion == 0 ? -gravity : MathHelper.clamp(upwardMotion, 0, maxUpwardItemSpeed)) / 20f; + float motion = (push + pull) * fanSpeedModifier; + return (MathHelper.clamp(motion, -maxItemSpeed, maxItemSpeed) + (motion <= 0 ? -gravity : 0)) / 20f; } public void onRemoved(BlockState chuteState) { @@ -319,7 +502,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor List inputChutes = getInputChutes(); if (!item.isEmpty()) InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), item); - super.remove(); + remove(); if (targetChute != null) { targetChute.updatePull(); targetChute.propagatePush(); @@ -342,6 +525,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (pull == totalPull) return; pull = totalPull; + updateAirFlow = true; sendData(); ChuteTileEntity targetChute = getTargetChute(getBlockState()); if (targetChute != null) @@ -352,6 +536,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor float totalPush = calculatePush(branchCount); if (push == totalPush) return; + updateAirFlow = true; push = totalPush; sendData(); propagatePush(); @@ -369,7 +554,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor TileEntity te = world.getTileEntity(pos.up()); if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { EncasedFanTileEntity fan = (EncasedFanTileEntity) te; - return Math.abs(fan.getSpeed()); + return fan.getSpeed(); } } @@ -389,7 +574,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor TileEntity te = world.getTileEntity(pos.down()); if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { EncasedFanTileEntity fan = (EncasedFanTileEntity) te; - return Math.abs(fan.getSpeed()); + return fan.getSpeed(); } } 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 index 68fab50ad..0cf487c4d 100644 --- 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 @@ -3,15 +3,19 @@ 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.BeltHelper; 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 com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.MathHelper; @@ -29,6 +33,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { TransportedItemStack transported = te.heldItem; MatrixStacker msr = MatrixStacker.of(ms); + Vec3d itemPosition = VecHelper.getCenterOf(te.getPos()); ms.push(); ms.translate(.5f, 15 / 16f, .5f); @@ -55,7 +60,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { ItemStack itemStack = transported.stack; int angle = transported.angle; Random r = new Random(0); - renderItem(ms, buffer, light, overlay, itemStack, angle, r); + renderItem(ms, buffer, light, overlay, itemStack, angle, r, itemPosition); ms.pop(); } @@ -66,11 +71,15 @@ public class DepotRenderer extends SafeTileEntityRenderer { continue; ms.push(); msr.nudge(i); + + boolean renderUpright = BeltHelper.isItemUpright(stack); msr.rotateY(360 / 8f * i); ms.translate(.35f, 0, 0); + if (renderUpright) + msr.rotateY(-(360 / 8f * i)); Random r = new Random(i + 1); int angle = (int) (360 * r.nextFloat()); - renderItem(ms, buffer, light, overlay, stack, angle, r); + renderItem(ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, itemPosition); ms.pop(); } @@ -78,30 +87,51 @@ public class DepotRenderer extends SafeTileEntityRenderer { } protected void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack itemStack, - int angle, Random r) { + int angle, Random r, Vec3d itemPosition) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); MatrixStacker msr = MatrixStacker.of(ms); int count = (int) (MathHelper.log2((int) (itemStack.getCount()))) / 2; + boolean renderUpright = BeltHelper.isItemUpright(itemStack); boolean blockItem = itemRenderer.getItemModelWithOverrides(itemStack, null, null) .isGui3d(); + + ms.push(); + msr.rotateY(angle); + + if (renderUpright) { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + if (renderViewEntity != null) { + Vec3d positionVec = renderViewEntity.getPositionVec(); + Vec3d vectorForOffset = itemPosition; + Vec3d diff = vectorForOffset.subtract(positionVec); + float yRot = (float) MathHelper.atan2(diff.z, -diff.x); + ms.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (yRot - Math.PI / 2))); + } + ms.translate(0, 3 / 32d, 1 / 16f); + } + 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); + if (!blockItem && !renderUpright) { + ms.translate(0, -3 / 16f, 0); + msr.rotateX(90); + } 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); + if (!renderUpright) { + if (!blockItem) + msr.rotateY(10); + ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + } else + ms.translate(0, 0, -1 / 16f); } + + ms.pop(); } } 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 index 2f6c021fd..f004aa239 100644 --- 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 @@ -1,9 +1,9 @@ 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.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -11,7 +11,10 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; @@ -20,6 +23,7 @@ import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; public class DepotTileEntity extends SmartTileEntity { @@ -29,6 +33,7 @@ public class DepotTileEntity extends SmartTileEntity { DepotItemHandler itemHandler; LazyOptional lazyItemHandler; + private TransportedItemStackHandlerBehaviour transportedHandler; public DepotTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); @@ -52,7 +57,7 @@ public class DepotTileEntity extends SmartTileEntity { heldItem.prevSideOffset = heldItem.sideOffset; float diff = .5f - heldItem.beltPosition; if (diff > 1 / 512f) { - if (diff > 1 / 32f) + if (diff > 1 / 32f && !BeltHelper.isItemUpright(heldItem.stack)) heldItem.angle += 1; heldItem.beltPosition += diff / 4f; } @@ -71,9 +76,8 @@ public class DepotTileEntity extends SmartTileEntity { boolean wasLocked = heldItem.locked; ItemStack previousItem = heldItem.stack; - TransportedItemStackHandlerBehaviour handler = getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); - ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, handler) - : processingBehaviour.handleReceivedItem(heldItem, handler); + ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, transportedHandler) + : processingBehaviour.handleReceivedItem(heldItem, transportedHandler); if (result == ProcessingResult.REMOVE) { heldItem = null; sendData(); @@ -84,7 +88,7 @@ public class DepotTileEntity extends SmartTileEntity { if (heldItem.locked != wasLocked || !previousItem.equals(heldItem.stack, false)) sendData(); } - + @Override public void remove() { super.remove(); @@ -93,27 +97,28 @@ public class DepotTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { if (heldItem != null) compound.put("HeldItem", heldItem.serializeNBT()); compound.put("OutputBuffer", processingOutputBuffer.serializeNBT()); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { heldItem = null; if (compound.contains("HeldItem")) heldItem = TransportedItemStack.read(compound.getCompound("HeldItem")); processingOutputBuffer.deserializeNBT(compound.getCompound("OutputBuffer")); - super.read(compound); + super.read(compound, clientPacket); } @Override public void addBehaviours(List behaviours) { behaviours.add(new DirectBeltInputBehaviour(this).setInsertionHandler(this::tryInsertingFromSide)); - behaviours.add(new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) - .withStackPlacement(this::getWorldPositionOf)); + transportedHandler = new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) + .withStackPlacement(this::getWorldPositionOf); + behaviours.add(transportedHandler); } public ItemStack getHeldItemStack() { @@ -124,6 +129,12 @@ public class DepotTileEntity extends SmartTileEntity { this.heldItem = heldItem; } + public void setCenteredHeldItem(TransportedItemStack heldItem) { + this.heldItem = heldItem; + this.heldItem.beltPosition = 0.5f; + this.heldItem.prevBeltPosition = 0.5f; + } + @Override public LazyOptional getCapability(Capability cap, Direction side) { if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) @@ -156,40 +167,32 @@ public class DepotTileEntity extends SmartTileEntity { } private void applyToAllItems(float maxDistanceFromCentre, - Function> processFunction) { + 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)) + TransportedResult result = processFunction.apply(transportedItemStack); + if (result.didntChangeFrom(stackBefore)) 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; + if (result.hasHeldOutput()) + setCenteredHeldItem(result.getHeldOutput()); + + for (TransportedItemStack added : result.getOutputs()) { + if (getHeldItemStack().isEmpty()) { + setCenteredHeldItem(added); continue; } - for (int i = 0; i < processingOutputBuffer.getSlots(); i++) { - ItemStack stackInSlot = processingOutputBuffer.getStackInSlot(i); - if (!stackInSlot.isEmpty()) - continue; - processingOutputBuffer.setStackInSlot(i, added.stack); - break; - } + ItemStack remainder = ItemHandlerHelper.insertItemStacked(processingOutputBuffer, added.stack, false); + Vec3d vec = VecHelper.getCenterOf(pos); + InventoryHelper.spawnItemStack(world, vec.x, vec.y + .5f, vec.z, remainder); } if (dirty) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java index 96daf1994..7c4515a1c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java @@ -43,17 +43,17 @@ public class AdjustableRepeaterTileEntity extends SmartTileEntity { } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { state = compound.getInt("State"); charging = compound.getBoolean("Charging"); - super.read(compound); + super.read(compound, clientPacket); } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("State", state); compound.putBoolean("Charging", charging); - return super.write(compound); + super.write(compound, clientPacket); } private int step(StepContext context) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorBlock.java deleted file mode 100644 index a2094ee5e..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorBlock.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -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.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.content.logistics.block.belts.BeltAttachableLogisticalBlock; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.BooleanProperty; -import net.minecraft.state.StateContainer.Builder; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; - -public class ExtractorBlock extends BeltAttachableLogisticalBlock implements IPortableBlock { - - public static BooleanProperty POWERED = BlockStateProperties.POWERED; - private static final MovementBehaviour MOVEMENT = new ExtractorMovementBehaviour(); - - public ExtractorBlock(Properties properties) { - super(properties); - setDefaultState(getDefaultState().with(POWERED, false)); - } - - @Override - protected boolean isVertical() { - return false; - } - - @Override - protected BlockState getVerticalDefaultState() { - return AllBlocks.VERTICAL_EXTRACTOR.getDefaultState(); - } - - @Override - protected BlockState getHorizontalDefaultState() { - return AllBlocks.EXTRACTOR.getDefaultState(); - } - - @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POWERED)); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.EXTRACTOR.create(); - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - return super.getStateForPlacement(context).with(POWERED, reactsToRedstone() && context.getWorld() - .isBlockPowered(context.getPos())); - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); - - if (worldIn.isRemote) - return; - if (!reactsToRedstone()) - return; - - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); - } - - protected boolean reactsToRedstone() { - return true; - } - - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.EXTRACTOR.get(getBlockFacing(state)); - } - - public static Vector3d getFilterSlotPosition(BlockState state) { - float verticalOffset = (state.getBlock() instanceof ExtractorBlock) ? 10.5f : 12.5f; - - Vector3d offsetForHorizontal = VecHelper.voxelSpace(8f, verticalOffset, 14f); - Vector3d offsetForUpward = VecHelper.voxelSpace(8f, 14.15f, 3.5f); - Vector3d offsetForDownward = VecHelper.voxelSpace(8f, 1.85f, 3.5f); - Vector3d vec = offsetForHorizontal; - - float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - if (AttachedLogisticalBlock.isVertical(state)) - vec = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward; - - return VecHelper.rotateCentered(vec, yRot, Axis.Y); - } - - public static Vector3d getFilterSlotOrientation(BlockState state) { - float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - float zRot = (AttachedLogisticalBlock.isVertical(state)) ? 0 : 90; - return new Vector3d(0, yRot, zRot); - } - - public static class Vertical extends ExtractorBlock { - public Vertical(Properties properties) { - super(properties); - } - - @Override - protected boolean isVertical() { - return true; - } - } - - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorMovementBehaviour.java deleted file mode 100644 index fa1465daa..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorMovementBehaviour.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.content.logistics.item.filter.FilterItem; -import com.simibubi.create.foundation.item.ItemHelper; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -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.vector.Vector3d; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.world.World; - -public class ExtractorMovementBehaviour extends MovementBehaviour { - - @Override - public void visitNewPosition(MovementContext context, BlockPos pos) { - super.visitNewPosition(context, pos); - - World world = context.world; - VoxelShape collisionShape = world.getBlockState(pos).getCollisionShape(world, pos); - if (!collisionShape.isEmpty()) - return; - if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)).isEmpty()) - return; - - ItemStack filter = getFilter(context); - int amount = getFilterAmount(context); - ItemStack dropped = ItemHelper.extract(context.contraption.inventory, - stack -> FilterItem.test(context.world, stack, filter), amount == 0 ? 64 : amount, false); - - if (dropped.isEmpty()) - return; - if (world.isRemote) - return; - - Vector3d entityPos = context.position; - Entity entityIn = null; - Direction facing = AttachedLogisticalBlock.getBlockFacing(context.state); - if (facing != Direction.DOWN) - entityPos = entityPos.add(0, -0.5f, 0); - - entityIn = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, dropped); - entityIn.setMotion(Vector3d.ZERO); - ((ItemEntity) entityIn).setPickupDelay(5); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); - world.addEntity(entityIn); - } - - private ItemStack getFilter(MovementContext context) { - return ItemStack.read(context.tileData.getCompound("Filter")); - } - - private int getFilterAmount(MovementContext context) { - return context.tileData.getInt("FilterAmount"); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorSlots.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorSlots.java deleted file mode 100644 index 41e689e36..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorSlots.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; -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.Axis; -import net.minecraft.util.math.vector.Vector3d; - -public class ExtractorSlots { - - static class Filter extends ValueBoxTransform { - - Vector3d offsetForHorizontal = VecHelper.voxelSpace(8f, 10.5f, 14f); - Vector3d offsetForUpward = VecHelper.voxelSpace(8f, 14.15f, 3.5f); - Vector3d offsetForDownward = VecHelper.voxelSpace(8f, 1.85f, 3.5f); - - @Override - protected Vector3d getLocalOffset(BlockState state) { - Vector3d location = offsetForHorizontal; - if (state.getBlock() instanceof TransposerBlock) - location = location.add(0, 2 / 16f, 0); - if (AttachedLogisticalBlock.isVertical(state)) - location = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward; - return rotateHorizontally(state, location); - } - - @Override - protected void rotate(BlockState state, MatrixStack ms) { - float yRot = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING)); - float xRot = (AttachedLogisticalBlock.isVertical(state)) ? 0 : 90; - MatrixStacker.of(ms) - .rotateY(yRot) - .rotateX(xRot); - } - - } - - public static class Link extends ValueBoxTransform.Dual { - - public Link(boolean first) { - super(first); - } - - Vector3d offsetForHorizontal = VecHelper.voxelSpace(11.5f, 4f, 14f); - Vector3d offsetForUpward = VecHelper.voxelSpace(10f, 14f, 11.5f); - Vector3d offsetForDownward = VecHelper.voxelSpace(10f, 2f, 11.5f); - - @Override - protected Vector3d getLocalOffset(BlockState state) { - Vector3d location = offsetForHorizontal; - if (state.getBlock() instanceof TransposerBlock) - location = location.add(0, 2 / 16f, 0); - if (!isFirst()) - location = location.add(0, 4 / 16f, 0); - - if (AttachedLogisticalBlock.isVertical(state)) { - location = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward; - if (!isFirst()) - location = location.add(-4 / 16f, 0, 0); - } - - float yRot = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING)); - location = VecHelper.rotateCentered(location, yRot, Axis.Y); - return location; - } - - @Override - protected void rotate(BlockState state, MatrixStack ms) { - float horizontalAngle = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING)); - boolean vertical = AttachedLogisticalBlock.isVertical(state); - float yRot = vertical ? horizontalAngle + 180 : horizontalAngle + 270; - float zRot = vertical ? (state.get(AttachedLogisticalBlock.UPWARD) ? 90 : 270) : 0; - MatrixStacker.of(ms) - .rotateY(yRot) - .rotateZ(zRot); - } - - } - -} 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 deleted file mode 100644 index 9edfeff9f..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/ExtractorTileEntity.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -import java.util.List; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.AutoExtractingBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.ExtractingBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.vector.Vector3d; - -public class ExtractorTileEntity extends SmartTileEntity { - - protected ExtractingBehaviour extracting; - protected FilteringBehaviour filtering; - protected boolean extractingToBelt; - - public ExtractorTileEntity(TileEntityType tileEntityTypeIn) { - super(tileEntityTypeIn); - } - - @Override - public void addBehaviours(List behaviours) { - int delay = AllConfigs.SERVER.logistics.extractorDelay.get(); - extracting = - new SingleTargetAutoExtractingBehaviour(this, () -> AttachedLogisticalBlock.getBlockFacing(getBlockState()), - this::onExtract, delay).pauseWhen(this::isPowered).waitUntil(this::canExtract); - behaviours.add(extracting); - - filtering = new FilteringBehaviour(this, new ExtractorSlots.Filter()).withCallback(this::filterChanged); - filtering.showCount(); - behaviours.add(filtering); - } - - protected void onExtract(ItemStack stack) { - if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) { - TileEntity te = world.getTileEntity(pos.down()); - if (te instanceof BeltTileEntity) { - if (((BeltTileEntity) te).tryInsertingFromSide(Direction.UP, stack, false)) - return; - } - } - - Vector3d entityPos = VecHelper.getCenterOf(getPos()).add(0, -0.5f, 0); - Entity entityIn = null; - Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()); - if (facing == Direction.DOWN) - entityPos = entityPos.add(0, .5, 0); - - entityIn = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, stack); - entityIn.setMotion(Vector3d.ZERO); - ((ItemEntity) entityIn).setPickupDelay(5); - world.playSound(null, getPos(), SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .125f, .1f); - world.addEntity(entityIn); - } - - protected boolean isAttachedToBelt() { - Direction blockFacing = AttachedLogisticalBlock.getBlockFacing(getBlockState()); - return AllBlocks.BELT.has(world.getBlockState(pos.offset(blockFacing))); - } - - protected boolean isTargetingBelt() { - if (!AllBlocks.BELT.has(world.getBlockState(pos.down()))) - return false; - TileEntity te = world.getTileEntity(pos.down()); - if (te == null || !(te instanceof BeltTileEntity)) - return false; - return ((KineticTileEntity) te).getSpeed() != 0; - } - - protected boolean isPowered() { - return getBlockState().get(ExtractorBlock.POWERED); - } - - private void filterChanged(ItemStack stack) { - - } - - protected boolean canExtract() { - if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) { - TileEntity te = world.getTileEntity(pos.down()); - if (te instanceof BeltTileEntity) { - BeltTileEntity belt = (BeltTileEntity) te; - if (belt.getSpeed() == 0) - return false; - BeltTileEntity controller = belt.getControllerTE(); - if (controller != null) { - BeltInventory inventory = controller.getInventory(); - if (inventory == null) - return false; - if (!inventory.canInsertAtFromSide(belt.index, Direction.UP)) - return false; - } - } - return true; - } - - List entitiesWithinAABBExcludingEntity = - world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(getPos())); - return entitiesWithinAABBExcludingEntity.isEmpty(); - } - - @Override - public void tick() { - ((AutoExtractingBehaviour) extracting).setTicking(!isAttachedToBelt()); - super.tick(); - boolean onBelt = isTargetingBelt(); - if (extractingToBelt != onBelt) { - extractingToBelt = onBelt; - ((AutoExtractingBehaviour) extracting) - .setDelay(onBelt ? 0 : AllConfigs.SERVER.logistics.extractorDelay.get()); - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorBlock.java deleted file mode 100644 index 5df46e135..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorBlock.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -import org.apache.commons.lang3.tuple.Pair; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.world.IBlockReader; - -public class LinkedExtractorBlock extends ExtractorBlock { - - public LinkedExtractorBlock(Properties properties) { - super(properties); - } - - @Override - protected BlockState getVerticalDefaultState() { - return AllBlocks.VERTICAL_LINKED_EXTRACTOR.getDefaultState(); - } - - @Override - protected BlockState getHorizontalDefaultState() { - return AllBlocks.LINKED_EXTRACTOR.getDefaultState(); - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.LINKED_EXTRACTOR.create(); - } - - @Override - protected boolean reactsToRedstone() { - return false; - } - - public static Pair getFrequencySlotPosition(BlockState state) { - float verticalOffset = (state.getBlock() instanceof ExtractorBlock) ? 4f : 6f; - - Vector3d first = VecHelper.voxelSpace(11.5f, verticalOffset, 14f); - Vector3d second = VecHelper.voxelSpace(11.5f, 4f + verticalOffset, 14f); - - Vector3d firstUpward = VecHelper.voxelSpace(10f, 14f, 11.5f); - Vector3d secondUpward = VecHelper.voxelSpace(6f, 14f, 11.5f); - Vector3d firstDownward = VecHelper.voxelSpace(10f, 2f, 11.5f); - Vector3d secondDownward = VecHelper.voxelSpace(6f, 2f, 11.5f); - - float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - if (AttachedLogisticalBlock.isVertical(state)) { - Boolean up = state.get(AttachedLogisticalBlock.UPWARD); - first = up ? firstUpward : firstDownward; - second = up ? secondUpward : secondDownward; - } - - first = VecHelper.rotateCentered(first, yRot, Axis.Y); - second = VecHelper.rotateCentered(second, yRot, Axis.Y); - return Pair.of(first, second); - } - - public static Vector3d getFrequencySlotOrientation(BlockState state) { - boolean vertical = AttachedLogisticalBlock.isVertical(state); - float horizontalAngle = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - - float xRot = vertical ? (state.get(UPWARD) ? 90 : 270) : 0; - float yRot = vertical ? horizontalAngle + 180 : horizontalAngle + 270; - float zRot = vertical ? 0 : 0; - - return new Vector3d(xRot, yRot, zRot); - } - - public static class Vertical extends LinkedExtractorBlock { - public Vertical(Properties properties) { - super(properties); - } - - @Override - protected boolean isVertical() { - return true; - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorTileEntity.java deleted file mode 100644 index 096246ca3..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/LinkedExtractorTileEntity.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -import static net.minecraft.state.properties.BlockStateProperties.POWERED; - -import java.util.List; - -import org.apache.commons.lang3.tuple.Pair; - -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; - -import net.minecraft.tileentity.TileEntityType; - -public class LinkedExtractorTileEntity extends ExtractorTileEntity { - - public boolean receivedSignal; - public LinkBehaviour receiver; - - public LinkedExtractorTileEntity(TileEntityType type) { - super(type); - } - - @Override - public void addBehaviours(List behaviours) { - Pair slots = ValueBoxTransform.Dual.makeSlots(ExtractorSlots.Link::new); - receiver = LinkBehaviour.receiver(this, slots, this::setSignal); - behaviours.add(receiver); - super.addBehaviours(behaviours); - } - - public void setSignal(int powered) { - receivedSignal = powered > 0; - } - - @Override - public void tick() { - super.tick(); - if (world.isRemote) - return; - if (receivedSignal != getBlockState().get(POWERED)) - world.setBlockState(pos, getBlockState().cycle(POWERED)); - } - -} 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 deleted file mode 100644 index 6a78f11e4..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/extractor/VerticalExtractorGenerator.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.simibubi.create.content.logistics.block.extractor; - -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.minecraftforge.client.model.generators.ModelFile; - -public class VerticalExtractorGenerator extends SpecialBlockStateGen { - - private boolean linked; - - public VerticalExtractorGenerator(boolean linked) { - this.linked = linked; - } - - @Override - protected int getXRotation(BlockState state) { - return state.get(ExtractorBlock.Vertical.UPWARD) ? 180 : 0; - } - - @Override - protected int getYRotation(BlockState state) { - return (state.get(ExtractorBlock.UPWARD) ? 0 : 180) + horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING)); - } - - @Override - public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, - BlockState state) { - return AssetLookup.forPowered(ctx, prov, "extractor/vertical" + (linked ? "_linked" : "")) - .apply(state); - } - -} 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 index 8ce624cd4..9bf729408 100644 --- 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 @@ -10,7 +10,7 @@ public class AndesiteBeltFunnelBlock extends BeltFunnelBlock { @Override public boolean hasPoweredProperty() { - return false; + return true; } } 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 deleted file mode 100644 index 80bfc2baf..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteChuteFunnelBlock.java +++ /dev/null @@ -1,16 +0,0 @@ -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 index 87a3c1705..b4389e5ab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java @@ -17,14 +17,8 @@ public class AndesiteFunnelBlock extends FunnelBlock { 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); + .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) + .with(POWERED, state.get(POWERED)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 83e38be78..920756862 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -101,16 +101,19 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { 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))); + Direction horizontalFacing = state.get(HORIZONTAL_FACING); + + BlockState below = world.getBlockState(pos.down()); + if (below.getBlock() instanceof BeltBlock && below.get(BeltBlock.HORIZONTAL_FACING) + .getAxis() != horizontalFacing.getAxis()) + return state; + + BlockState neighbour = world.getBlockState(pos.offset(horizontalFacing)); if (canConnectTo(state, neighbour)) return state.with(SHAPE, Shape.EXTENDED); return state; 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 index 05fb003b2..e047e1d0f 100644 --- 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 @@ -6,14 +6,18 @@ import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ModelFile; public class BeltFunnelGenerator extends SpecialBlockStateGen { private String type; + private ResourceLocation materialBlockTexture; - public BeltFunnelGenerator(String type) { + public BeltFunnelGenerator(String type, ResourceLocation materialBlockTexture) { this.type = type; + this.materialBlockTexture = materialBlockTexture; } @Override @@ -30,18 +34,23 @@ public class BeltFunnelGenerator extends SpecialBlockStateGen { 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); + boolean powered = state.has(BlockStateProperties.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; + + String pushingSuffix = (pushing ? "push" : "pull") ; + String poweredSuffix = powered ? "_powered" : ""; + String name = ctx.getName() + "_" + pushingSuffix + poweredSuffix; + String textureName = type + "_funnel_" + pushingSuffix; + return prov.models() .withExistingParent(name + "_" + shapeName, prov.modLoc("block/belt_funnel/block_" + shapeName)) - .texture("particle", prov.modLoc("block/" + type + "_casing")) + .texture("particle", materialBlockTexture) .texture("2", prov.modLoc("block/" + textureName)) .texture("3", prov.modLoc("block/" + type + "_funnel_back")) - .texture("4", prov.modLoc("block/" + type + "_funnel_plating")); + .texture("5", prov.modLoc("block/" + type + "_funnel_tall" + poweredSuffix)) + .texture("6", prov.modLoc("block/" + type + "_funnel" + poweredSuffix)) + .texture("7", prov.modLoc("block/" + type + "_funnel_plating")); } } 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 deleted file mode 100644 index cba22d4e5..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassChuteFunnelBlock.java +++ /dev/null @@ -1,16 +0,0 @@ -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 index 96d4bce9c..6ad5e81f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java @@ -2,50 +2,15 @@ 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 @@ -56,12 +21,4 @@ public class BrassFunnelBlock extends FunnelBlock { .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 deleted file mode 100644 index f059f6861..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelBlock.java +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index 1bc7fa6c2..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/ChuteFunnelGenerator.java +++ /dev/null @@ -1,45 +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 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 108272edb..bf00c3e37 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 @@ -5,12 +5,11 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; -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.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; @@ -20,6 +19,8 @@ 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; @@ -38,24 +39,35 @@ import net.minecraft.world.World; public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE { + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public FunnelBlock(Properties p_i48415_1_) { super(p_i48415_1_); + setDefaultState(getDefaultState().with(POWERED, false)); } @Override 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); - + return getDefaultState().with(FACING, facing).with(POWERED, context.getWorld() + .isBlockPowered(context.getPos())); } + @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 ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { @@ -106,13 +118,14 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< 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); + InvManipulationBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); if (inserter == null) return toInsert; if (filter != null && !filter.test(toInsert)) return toInsert; - ItemStack remainder = inserter.insert(toInsert, simulate); - return remainder; + if (simulate) + inserter.simulate(); + return inserter.insert(toInsert); } @Override @@ -148,22 +161,10 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< 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; } - public abstract BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state); - public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state); @Override @@ -194,7 +195,7 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< } protected boolean canInsertIntoFunnel(BlockState state) { - return true; + return !state.get(POWERED); } @Nullable diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index 1ea967c79..abb149f26 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -19,26 +19,44 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { @Override protected Vector3d getLocalOffset(BlockState state) { + Direction side = getSide(); + float horizontalAngle = AngleHelper.horizontalAngle(side); + Direction funnelFacing = FunnelBlock.getFunnelFacing(state); + float stateAngle = AngleHelper.horizontalAngle(funnelFacing); + 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); + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 13, 7.5f), horizontalAngle, Axis.Y); + else + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 13), stateAngle, Axis.Y); - Vector3d localOffset = - getSide() == Direction.UP ? VecHelper.voxelSpace(8, 14.5f, 8) : VecHelper.voxelSpace(8, 1.5f, 8); - - if (getSide().getAxis() + if (!funnelFacing.getAxis() .isHorizontal()) { - Vector3d southLocation = VecHelper.voxelSpace(8, 8, 14.5f); - localOffset = VecHelper.rotateCentered(southLocation, AngleHelper.horizontalAngle(getSide()), Axis.Y); + Vector3d southLocation = VecHelper.voxelSpace(8, 13, 15.5f); + return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); } - if (AllBlocks.BRASS_CHUTE_FUNNEL.has(state)) { - Direction facing = state.get(ChuteFunnelBlock.HORIZONTAL_FACING); - localOffset = localOffset.subtract(Vector3d.of(facing.getDirectionVec()).scale(2 / 16f)); - } - - return localOffset; + Direction verticalDirection = DirectionHelper.rotateAround(getSide(), funnelFacing.rotateY() + .getAxis()); + if (funnelFacing.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 = funnelFacing.getAxis() == Axis.X; + float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; + if (reverse) + zRotLast += 180; + + Vector3d vec = VecHelper.voxelSpace(8, 13, .5f); + vec = vec.subtract(.5, .5, .5); + vec = VecHelper.rotate(vec, zRotLast, Axis.Z); + vec = VecHelper.rotate(vec, yRot, Axis.Y); + vec = VecHelper.rotate(vec, alongX ? 0 : xRot, Axis.X); + vec = VecHelper.rotate(vec, alongX ? xRot : 0, Axis.Z); + vec = vec.add(.5, .5, .5); + return vec; } @Override @@ -83,7 +101,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (AllBlocks.BRASS_BELT_FUNNEL.has(state)) return state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED ? direction == facing - : direction != Direction.DOWN && direction.getAxis() != facing.getAxis(); + : direction == Direction.UP; return direction.getAxis() != facing.getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java index 9167aa479..8afae31c4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -5,7 +5,6 @@ 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; @@ -44,22 +43,10 @@ public class FunnelItem extends BlockItem { 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/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java index c0cc9deef..5cf5e0d39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java @@ -10,11 +10,32 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.items.ItemHandlerHelper; public class FunnelMovementBehaviour extends MovementBehaviour { + private final boolean hasFilter; + + public static FunnelMovementBehaviour andesite() { + return new FunnelMovementBehaviour(false); + } + + public static FunnelMovementBehaviour brass() { + return new FunnelMovementBehaviour(true); + } + + private FunnelMovementBehaviour(boolean hasFilter) { + this.hasFilter = hasFilter; + } + + @Override + public Vec3d getActiveAreaOffset(MovementContext context) { + return new Vec3d(FunnelBlock.getFunnelFacing(context.state) + .getDirectionVec()).scale(.65); + } + @Override public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); @@ -42,7 +63,7 @@ public class FunnelMovementBehaviour extends MovementBehaviour { } private ItemStack getFilter(MovementContext context) { - return ItemStack.read(context.tileData.getCompound("Filter")); + return hasFilter ? ItemStack.read(context.tileData.getCompound("Filter")) : ItemStack.EMPTY; } } 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 007898fe3..c606f8bf4 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,50 +1,47 @@ 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 java.util.function.Function; +import java.util.function.Predicate; import com.simibubi.create.AllBlocks; 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.config.AllConfigs; 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.belt.TransportedItemStackHandlerBehaviour.TransportedResult; 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.tileEntity.behaviour.inventory.InvManipulationBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; public class FunnelTileEntity extends SmartTileEntity { private FilteringBehaviour filtering; - private InsertingBehaviour inserting; - private ExtractingBehaviour extracting; - private DirectBeltInputBehaviour beltInputBehaviour; + private InvManipulationBehaviour invManipulation; + private InvManipulationBehaviour autoExtractor; + private int extractionCooldown; int sendFlap; InterpolatedChasingValue flap; static enum Mode { - INVALID, PAUSED, COLLECT, BELT, CHUTE_SIDE, CHUTE_END + INVALID, PAUSED, COLLECT, PUSHING_TO_BELT, TAKING_FROM_BELT, HOPPER } public FunnelTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); + extractionCooldown = 0; flap = new InterpolatedChasingValue().start(.25f) .target(0) .withSpeed(.05f); @@ -56,148 +53,159 @@ public class FunnelTileEntity extends SmartTileEntity { 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; - - Direction facing = FunnelBlock.getFunnelFacing(state); - BlockState input = world.getBlockState(pos.offset(facing)); - - if (AllBlocks.CHUTE.has(input)) - return Mode.CHUTE_END; + if (FunnelBlock.getFunnelFacing(state) == Direction.UP && autoExtractor.hasInventory()) + return Mode.HOPPER; + if (state.getBlock() instanceof BeltFunnelBlock) { + boolean pushing = state.get(BeltFunnelBlock.PUSHING); + return pushing ? Mode.PUSHING_TO_BELT : Mode.TAKING_FROM_BELT; + } return Mode.COLLECT; } @Override public void tick() { super.tick(); - 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 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(); - } - - 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(); + Mode mode = determineCurrentMode(); 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); + // Redstone resets the extraction cooldown + if (mode == Mode.PAUSED) + extractionCooldown = 0; + if (mode == Mode.TAKING_FROM_BELT) + tickAsPullingBeltFunnel(); + + if (extractionCooldown > 0) { + extractionCooldown--; return; } + if (mode == Mode.PUSHING_TO_BELT) + activateExtractingBeltFunnel(); + if (mode == Mode.HOPPER) + activateHopper(); + } + + private void activateHopper() { + if (!invManipulation.hasInventory()) + return; + int amountToExtract = autoExtractor.getAmountFromFilter(); + if (!filtering.isActive()) + amountToExtract = 1; + + Predicate filter = s -> !filtering.isActive() || filtering.test(s); + Function amountThreshold = s -> s.getMaxStackSize() - invManipulation.simulate() + .insert(s) + .getCount(); + + if (amountToExtract != -1 && !invManipulation.simulate() + .insert(autoExtractor.simulate() + .extract(amountToExtract, filter)) + .isEmpty()) + return; + + ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold); + if (stack.isEmpty()) + return; + invManipulation.insert(stack); + startCooldown(); + } + + private void tickAsPullingBeltFunnel() { + // 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); + } + + private void activateExtractingBeltFunnel() { + BlockState blockState = getBlockState(); + Direction facing = blockState.get(BeltFunnelBlock.HORIZONTAL_FACING); 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) + int amountToExtract = invManipulation.getAmountFromFilter(); + if (!filtering.isActive()) + amountToExtract = 1; + ItemStack stack = invManipulation.extract(amountToExtract, s -> inputBehaviour.handleInsertion(s, facing, true) .isEmpty()); - extracting.extract(); + if (stack.isEmpty()) + return; + flap(false); + inputBehaviour.handleInsertion(stack, facing, false); + startCooldown(); } - private List collectFromHandler(TransportedItemStack stack) { + private int startCooldown() { + return extractionCooldown = AllConfigs.SERVER.logistics.defaultExtractionTimer.get(); + } + + private TransportedResult collectFromHandler(TransportedItemStack stack) { + TransportedResult ignore = TransportedResult.doNothing(); ItemStack toInsert = stack.stack.copy(); if (!filtering.test(toInsert)) - return null; - ItemStack remainder = inserting.insert(toInsert, false); + return ignore; + ItemStack remainder = invManipulation.insert(toInsert); if (remainder.equals(stack.stack, false)) - return null; - List list = new ArrayList<>(); + return ignore; + flap(true); + if (remainder.isEmpty()) - return list; + return TransportedResult.removeItem(); TransportedItemStack changed = stack.copy(); changed.stack = remainder; - list.add(changed); - return list; + return TransportedResult.convertTo(changed); } @Override public void addBehaviours(List behaviours) { - Supplier>> direction = - Attachments.toward(() -> FunnelBlock.getFunnelFacing(getBlockState()) - .getOpposite()); + invManipulation = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing()); + behaviours.add(invManipulation); + autoExtractor = InvManipulationBehaviour.forExtraction(this, InterfaceProvider.towardBlockFacing()); + behaviours.add(autoExtractor); - 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 = new FilteringBehaviour(this, new FunnelFilterSlotPositioning()); + filtering.showCountWhen(this::supportsAmountOnFilter); filtering.onlyActiveWhen(this::supportsFiltering); behaviours.add(filtering); - beltInputBehaviour = new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput) - .setInsertionHandler(this::handleDirectBeltInput); - behaviours.add(beltInputBehaviour); + behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput) + .setInsertionHandler(this::handleDirectBeltInput)); + } + + private boolean supportsAmountOnFilter() { + BlockState blockState = getBlockState(); + boolean pushingToBelt = blockState.getBlock() instanceof HorizontalInteractionFunnelBlock + && blockState.get(HorizontalInteractionFunnelBlock.PUSHING); + boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && invManipulation.hasInventory() + && autoExtractor.hasInventory(); + return pushingToBelt || hopper; } private boolean supportsDirectBeltInput(Direction side) { BlockState blockState = getBlockState(); - return blockState != null && blockState.getBlock() instanceof FunnelBlock - && blockState.get(FunnelBlock.FACING) == Direction.UP; + if (blockState == null) + return false; + if (!(blockState.getBlock() instanceof FunnelBlock)) + return false; + Direction direction = blockState.get(FunnelBlock.FACING); + return direction == Direction.UP || direction == side.getOpposite(); } private boolean supportsFiltering() { BlockState blockState = getBlockState(); - return blockState != null && blockState.has(BlockStateProperties.POWERED); + return AllBlocks.BRASS_BELT_FUNNEL.has(blockState) || AllBlocks.BRASS_FUNNEL.has(blockState); } private ItemStack handleDirectBeltInput(TransportedItemStack stack, Direction side, boolean simulate) { @@ -206,7 +214,9 @@ public class FunnelTileEntity extends SmartTileEntity { return inserted; if (determineCurrentMode() == Mode.PAUSED) return inserted; - return inserting.insert(inserted, simulate); + if (simulate) + invManipulation.simulate(); + return invManipulation.insert(inserted); } public void flap(boolean inward) { @@ -220,21 +230,23 @@ public class FunnelTileEntity extends SmartTileEntity { } @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - if (sendFlap != 0) { + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.putInt("TransferCooldown", extractionCooldown); + if (clientPacket && 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"); + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + extractionCooldown = compound.getInt("TransferCooldown"); + if (clientPacket && compound.contains("Flap")) { + int direction = compound.getInt("Flap"); flap.set(direction); } - super.readClientUpdate(tag); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java index 6868123e3..2a58b5e08 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java @@ -7,7 +7,6 @@ import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; @@ -32,7 +31,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen extraAreas; - private final ItemStack renderedItem = new ItemStack(AllBlocks.ADJUSTABLE_CRATE.get()); + private final ItemStack renderedItem = AllBlocks.ADJUSTABLE_CRATE.asStack(); private final String title = Lang.translate("gui.adjustable_crate.title"); private final String storageSpace = Lang.translate("gui.adjustable_crate.storageSpace"); @@ -97,12 +96,10 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen suppliedItemStack; + + public BottomlessItemHandler(Supplier suppliedItemStack) { + this.suppliedItemStack = suppliedItemStack; + } + + @Override + public int getSlots() { + return 2; + } + + @Override + public ItemStack getStackInSlot(int slot) { + ItemStack stack = suppliedItemStack.get(); + if (slot == 1) + return ItemStack.EMPTY; + if (stack == null) + return ItemStack.EMPTY; + if (!stack.isEmpty()) + return ItemHandlerHelper.copyStackWithSize(stack, stack.getMaxStackSize()); + return stack; + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + return ItemStack.EMPTY; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack stack = suppliedItemStack.get(); + if (slot == 1) + return ItemStack.EMPTY; + if (stack == null) + return ItemStack.EMPTY; + if (!stack.isEmpty()) + return ItemHandlerHelper.copyStackWithSize(stack, Math.min(stack.getMaxStackSize(), amount)); + return ItemStack.EMPTY; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return true; + } +} 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 deleted file mode 100644 index e8da1b86d..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateInventory.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.content.logistics.block.inventories; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.items.IItemHandler; - -public class CreativeCrateInventory implements IItemHandler { - - private CreativeCrateTileEntity te; - - public CreativeCrateInventory(CreativeCrateTileEntity te) { - this.te = te; - } - - @Override - public int getSlots() { - return 2; - } - - @Override - public ItemStack getStackInSlot(int slot) { - if (slot == 1) - return ItemStack.EMPTY; - ItemStack filter = te.filter.getFilter().copy(); - if (!filter.isEmpty()) - filter.setCount(filter.getMaxStackSize()); - return filter; - } - - @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - return ItemStack.EMPTY; - } - - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - ItemStack filter = te.filter.getFilter().copy(); - if (!filter.isEmpty()) - filter.setCount(Math.min(filter.getMaxStackSize(), amount)); - return filter; - } - - @Override - public int getSlotLimit(int slot) { - return 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/inventories/CreativeCrateTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateTileEntity.java index 44d9f10e6..341689f11 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 @@ -24,20 +24,18 @@ public class CreativeCrateTileEntity extends CrateTileEntity { public CreativeCrateTileEntity(TileEntityType type) { super(type); - inv = new CreativeCrateInventory(this); + inv = new BottomlessItemHandler(filtering::getFilter); itemHandler = LazyOptional.of(() -> inv); } - FilteringBehaviour filter; + FilteringBehaviour filtering; LazyOptional itemHandler; - private CreativeCrateInventory inv; + private BottomlessItemHandler inv; @Override public void addBehaviours(List behaviours) { - filter = createFilter(); - filter.onlyActiveWhen(this::filterVisible); - filter.withCallback(this::filterChanged); - behaviours.add(filter); + behaviours.add(filtering = createFilter().onlyActiveWhen(this::filterVisible) + .withCallback(this::filterChanged)); } private boolean filterVisible() { @@ -52,13 +50,14 @@ public class CreativeCrateTileEntity extends CrateTileEntity { CreativeCrateTileEntity otherCrate = getOtherCrate(); if (otherCrate == null) return; - if (ItemStack.areItemsEqual(filter, otherCrate.filter.getFilter())) + if (ItemStack.areItemsEqual(filter, otherCrate.filtering.getFilter())) return; - otherCrate.filter.setFilter(filter); + otherCrate.filtering.setFilter(filter); } @Override public void remove() { + super.remove(); if (itemHandler != null) itemHandler.invalidate(); } @@ -79,10 +78,10 @@ public class CreativeCrateTileEntity extends CrateTileEntity { if (otherCrate == null) return; - filter.withCallback($ -> { + filtering.withCallback($ -> { }); - filter.setFilter(otherCrate.filter.getFilter()); - filter.withCallback(this::filterChanged); + filtering.setFilter(otherCrate.filtering.getFilter()); + filtering.withCallback(this::filterChanged); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index a41985373..78e8c6ba0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -14,7 +14,7 @@ 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.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -336,7 +336,7 @@ public abstract class ArmInteractionPoint { @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); + InvManipulationBehaviour inserter = TileEntityBehaviour.get(world, pos, InvManipulationBehaviour.TYPE); BlockState state = world.getBlockState(pos); if (state.has(BlockStateProperties.POWERED) && state.get(BlockStateProperties.POWERED)) return stack; @@ -344,7 +344,9 @@ public abstract class ArmInteractionPoint { return stack; if (filtering != null && !filtering.test(stack)) return stack; - return inserter.insert(stack, simulate); + if (simulate) + inserter.simulate(); + return inserter.insert(stack); } @Override 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 index 7a5a181cc..573bc1c28 100644 --- 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 @@ -10,6 +10,7 @@ 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 com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -21,6 +22,9 @@ 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.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -55,6 +59,17 @@ public class ArmInteractionPointHandler { } selected.cycleMode(); + PlayerEntity player = event.getPlayer(); + if (player != null) { + String key = selected.mode == Mode.DEPOSIT ? "mechanical_arm.deposit_to" : "mechanical_arm.extract_from"; + TextFormatting colour = selected.mode == Mode.DEPOSIT ? TextFormatting.GOLD : TextFormatting.AQUA; + String translatedBlock = new TranslationTextComponent(selected.state.getBlock() + .getTranslationKey()).getFormattedText(); + player.sendStatusMessage( + new StringTextComponent(colour + Lang.translate(key, TextFormatting.WHITE + translatedBlock + colour)), + true); + } + event.setCanceled(true); event.setCancellationResult(ActionResultType.SUCCESS); } @@ -75,6 +90,20 @@ public class ArmInteractionPointHandler { public static void flushSettings(BlockPos pos) { if (currentItem == null) return; + + int removed = 0; + for (Iterator iterator = currentSelection.iterator(); iterator.hasNext();) { + ArmInteractionPoint point = iterator.next(); + if (point.pos.withinDistance(pos, ArmTileEntity.getRange())) + continue; + iterator.remove(); + removed++; + } + + if (removed > 0) + Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent( + TextFormatting.RED + Lang.translate("mechanical_arm.points_outside_range", removed)), true); + AllPackets.channel.sendToServer(new ArmPlacementPacket(currentSelection, pos)); currentSelection.clear(); currentItem = null; 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 77be7ffc7..93d21dea1 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 @@ -9,9 +9,17 @@ 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.config.AllConfigs; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widgets.InterpolatedAngle; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.JukeboxBlock; @@ -20,7 +28,9 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.util.Constants.NBT; public class ArmTileEntity extends KineticTileEntity { @@ -46,6 +56,11 @@ public class ArmTileEntity extends KineticTileEntity { float previousBaseAngle; boolean updateInteractionPoints; + // + protected ScrollOptionBehaviour selectionMode; + protected int lastInputIndex = -1; + protected int lastOutputIndex = -1; + enum Phase { SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING } @@ -66,6 +81,16 @@ public class ArmTileEntity extends KineticTileEntity { updateInteractionPoints = true; } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + + selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class, + Lang.translate("logistics.when_multiple_outputs_available"), this, new SelectionModeValueBox()); + selectionMode.requiresWrench(); + behaviours.add(selectionMode); + } + @Override public void tick() { super.tick(); @@ -142,7 +167,7 @@ public class ArmTileEntity extends KineticTileEntity { 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)); } @@ -163,37 +188,86 @@ public class ArmTileEntity extends KineticTileEntity { } 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) + boolean foundInput = false; + // for round robin, we start looking after the last used index, for default we + // start at 0; + int startIndex = selectionMode.get() == SelectionMode.PREFER_FIRST ? 0 : lastInputIndex + 1; + + // if we enforce round robin, only look at the next input in the list, + // otherwise, look at all inputs + int scanRange = selectionMode.get() == SelectionMode.FORCED_ROUND_ROBIN ? lastInputIndex + 2 : inputs.size(); + if (scanRange > inputs.size()) + scanRange = inputs.size(); + + InteractionPoints: for (int i = startIndex; i < scanRange; i++) { + ArmInteractionPoint armInteractionPoint = inputs.get(i); + for (int j = 0; j < armInteractionPoint.getSlotCount(world); j++) { + if (getDistributableAmount(armInteractionPoint, j) == 0) continue; - phase = Phase.MOVE_TO_INPUT; - chasedPointIndex = index; - chasedPointProgress = 0; - sendData(); - markDirty(); - return; + selectIndex(true, i); + foundInput = true; + break InteractionPoints; } } + if (!foundInput && selectionMode.get() == SelectionMode.ROUND_ROBIN) { + // if we didn't find an input, but don't want to enforce round robin, reset the + // last index + lastInputIndex = -1; + } + if (lastInputIndex == inputs.size() - 1) { + // if we reached the last input in the list, reset the last index + lastInputIndex = -1; + } } protected void searchForDestination() { ItemStack held = heldItem.copy(); - for (int index = 0; index < outputs.size(); index++) { - ArmInteractionPoint armInteractionPoint = outputs.get(index); + + boolean foundOutput = false; + // for round robin, we start looking after the last used index, for default we + // start at 0; + int startIndex = selectionMode.get() == SelectionMode.PREFER_FIRST ? 0 : lastOutputIndex + 1; + + // if we enforce round robin, only look at the next index in the list, + // otherwise, look at all + int scanRange = selectionMode.get() == SelectionMode.FORCED_ROUND_ROBIN ? lastOutputIndex + 2 : outputs.size(); + if (scanRange > outputs.size()) + scanRange = outputs.size(); + + for (int i = startIndex; i < scanRange; i++) { + ArmInteractionPoint armInteractionPoint = outputs.get(i); 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; + selectIndex(false, i); + foundOutput = true; + break; } + + if (!foundOutput && selectionMode.get() == SelectionMode.ROUND_ROBIN) { + // if we didn't find an input, but don't want to enforce round robin, reset the + // last index + lastOutputIndex = -1; + } + if (lastOutputIndex == outputs.size() - 1) { + // if we reached the last input in the list, reset the last index + lastOutputIndex = -1; + } + } + + // input == true => select input, false => select output + private void selectIndex(boolean input, int index) { + phase = input ? Phase.MOVE_TO_INPUT : Phase.MOVE_TO_OUTPUT; + chasedPointIndex = index; + chasedPointProgress = 0; + if (input) + lastInputIndex = index; + else + lastOutputIndex = index; + sendData(); + markDirty(); } protected int getDistributableAmount(ArmInteractionPoint armInteractionPoint, int i) { @@ -255,6 +329,8 @@ public class ArmTileEntity extends KineticTileEntity { protected void initInteractionPoints() { if (!updateInteractionPoints || interactionPointTag == null) return; + if (!world.isAreaLoaded(pos, getRange() + 1)) + return; inputs.clear(); outputs.clear(); for (INBT inbt : interactionPointTag) { @@ -272,47 +348,44 @@ public class ArmTileEntity extends KineticTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { - super.write(compound); + public void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); - ListNBT pointsNBT = new ListNBT(); - inputs.stream() - .map(ArmInteractionPoint::serialize) - .forEach(pointsNBT::add); - outputs.stream() - .map(ArmInteractionPoint::serialize) - .forEach(pointsNBT::add); + if (updateInteractionPoints) { + compound.put("InteractionPoints", interactionPointTag); + + } else { + ListNBT pointsNBT = new ListNBT(); + inputs.stream() + .map(ArmInteractionPoint::serialize) + .forEach(pointsNBT::add); + outputs.stream() + .map(ArmInteractionPoint::serialize) + .forEach(pointsNBT::add); + compound.put("InteractionPoints", pointsNBT); + } 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; - } + protected void read(CompoundNBT compound, boolean clientPacket) { + int previousIndex = chasedPointIndex; + Phase previousPhase = phase; + ListNBT interactionPointTagBefore = interactionPointTag; - @Override - public void read(CompoundNBT compound) { - super.read(compound); + super.read(compound, clientPacket); 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); + if (!clientPacket) + return; boolean ceiling = isOnCeiling(); if (interactionPointTagBefore == null || interactionPointTagBefore.size() != interactionPointTag.size()) @@ -330,4 +403,55 @@ public class ArmTileEntity extends KineticTileEntity { } } + public static int getRange() { + return AllConfigs.SERVER.logistics.mechanicalArmRange.get(); + } + + private class SelectionModeValueBox extends CenteredSideValueBoxTransform { + + public SelectionModeValueBox() { + super((blockState, direction) -> direction != Direction.DOWN && direction != Direction.UP); + } + + @Override + protected Vec3d getLocalOffset(BlockState state) { + int yPos = state.get(ArmBlock.CEILING) ? 16 - 3 : 3; + Vec3d location = VecHelper.voxelSpace(8, yPos, 14.5); + location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); + return location; + } + + @Override + protected float getScale() { + return .3f; + } + + } + + public enum SelectionMode implements INamedIconOptions { + ROUND_ROBIN(AllIcons.I_ARM_ROUND_ROBIN), + FORCED_ROUND_ROBIN(AllIcons.I_ARM_FORCED_ROUND_ROBIN), + PREFER_FIRST(AllIcons.I_ARM_PREFER_FIRST), + + ; + + private final String translationKey; + private final AllIcons icon; + + SelectionMode(AllIcons icon) { + this.icon = icon; + this.translationKey = "mechanical_arm.selection_mode." + Lang.asId(name()); + } + + @Override + public AllIcons getIcon() { + return icon; + } + + @Override + public String getTranslationKey() { + return translationKey; + } + } + } 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 deleted file mode 100644 index 8fff2fd09..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index eb43f54fd..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 89738885a..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerTileEntity.java +++ /dev/null @@ -1,13 +0,0 @@ -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/AnalogLeverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java index 2e32a5f5e..99558c5d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java @@ -23,18 +23,18 @@ public class AnalogLeverTileEntity extends SmartTileEntity implements IHaveGoggl } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("State", state); compound.putInt("ChangeTimer", lastChange); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { state = compound.getInt("State"); lastChange = compound.getInt("ChangeTimer"); clientState.target(state); - super.read(compound); + super.read(compound, clientPacket); } @Override 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 72ea19d51..6f4286162 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 @@ -3,8 +3,6 @@ package com.simibubi.create.content.logistics.block.redstone; import java.util.Random; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.components.structureMovement.IPortableBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ProperDirectionalBlock; @@ -21,10 +19,15 @@ import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class RedstoneContactBlock extends ProperDirectionalBlock implements IPortableBlock, IWrenchable { +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import mcp.MethodsReturnNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class RedstoneContactBlock extends ProperDirectionalBlock implements IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; - public static MovementBehaviour MOVEMENT = new ContactMovementBehaviour(); public RedstoneContactBlock(Properties properties) { super(properties); @@ -94,7 +97,7 @@ public class RedstoneContactBlock extends ProperDirectionalBlock implements IPor } @Override - public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { + public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, @Nullable Direction side) { if (side == null) return true; return state.get(FACING) != side.getOpposite(); @@ -105,9 +108,4 @@ public class RedstoneContactBlock extends ProperDirectionalBlock implements IPor return state.get(POWERED) ? 15 : 0; } - @Override - public MovementBehaviour getMovementBehaviour() { - return MOVEMENT; - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java index 45840b246..f6e4e9d6b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java @@ -64,18 +64,18 @@ public class RedstoneLinkTileEntity extends SmartTileEntity { } @Override - public CompoundNBT write(CompoundNBT compound) { + public void write(CompoundNBT compound, boolean clientPacket) { compound.putBoolean("Transmitter", transmitter); compound.putInt("Receive", getReceivedSignal()); compound.putBoolean("ReceivedChanged", receivedSignalChanged); compound.putInt("Transmit", transmittedSignal); - return super.write(compound); + super.write(compound, clientPacket); } @Override - public void read(CompoundNBT compound) { + protected void read(CompoundNBT compound, boolean clientPacket) { transmitter = compound.getBoolean("Transmitter"); - super.read(compound); + super.read(compound, clientPacket); receivedSignal = compound.getInt("Receive"); receivedSignalChanged = compound.getBoolean("ReceivedChanged"); @@ -93,7 +93,7 @@ public class RedstoneLinkTileEntity extends SmartTileEntity { removeBehaviour(LinkBehaviour.TYPE); createLink(); link.copyItemsFrom(prevlink); - putBehaviour(link); + attachBehaviourLate(link); } if (transmitter) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java index 3a1b924a3..af7e59e8d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java @@ -36,25 +36,23 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { } @Override - public void read(CompoundNBT compound) { - + protected void read(CompoundNBT compound, boolean clientPacket) { onWhenAbove = compound.getFloat("OnAbove"); offWhenBelow = compound.getFloat("OffBelow"); currentLevel = compound.getFloat("Current"); powered = compound.getBoolean("Powered"); - super.read(compound); + super.read(compound, clientPacket); } @Override - public CompoundNBT write(CompoundNBT compound) { - + public void write(CompoundNBT compound, boolean clientPacket) { compound.putFloat("OnAbove", onWhenAbove); compound.putFloat("OffBelow", offWhenBelow); compound.putFloat("Current", currentLevel); compound.putBoolean("Powered", powered); - return super.write(compound); + super.write(compound, clientPacket); } public float getLevel() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerBlock.java deleted file mode 100644 index c86246796..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerBlock.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.simibubi.create.content.logistics.block.transposer; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllTileEntities; - -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockReader; - -public class LinkedTransposerBlock extends TransposerBlock { - - public LinkedTransposerBlock(Properties properties) { - super(properties); - } - - @Override - protected BlockState getVerticalDefaultState() { - return AllBlocks.VERTICAL_LINKED_TRANSPOSER.getDefaultState(); - } - - @Override - protected BlockState getHorizontalDefaultState() { - return AllBlocks.LINKED_TRANSPOSER.getDefaultState(); - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.LINKED_TRANSPOSER.create(); - } - - @Override - protected boolean reactsToRedstone() { - return false; - } - - public static class Vertical extends LinkedTransposerBlock { - public Vertical(Properties properties) { - super(properties); - } - - @Override - protected boolean isVertical() { - return true; - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerTileEntity.java deleted file mode 100644 index df24df53a..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/transposer/LinkedTransposerTileEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.simibubi.create.content.logistics.block.transposer; - -import static net.minecraft.state.properties.BlockStateProperties.POWERED; - -import java.util.List; - -import org.apache.commons.lang3.tuple.Pair; - -import com.simibubi.create.content.logistics.block.extractor.ExtractorSlots; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; - -import net.minecraft.tileentity.TileEntityType; - -public class LinkedTransposerTileEntity extends TransposerTileEntity { - - public boolean receivedSignal; - public LinkBehaviour receiver; - - public LinkedTransposerTileEntity(TileEntityType type) { - super(type); - } - - @Override - public void addBehaviours(List behaviours) { - Pair slots = ValueBoxTransform.Dual.makeSlots(ExtractorSlots.Link::new); - receiver = LinkBehaviour.receiver(this, slots, this::setSignal); - behaviours.add(receiver); - super.addBehaviours(behaviours); - } - - public void setSignal(int powered) { - receivedSignal = powered > 0; - } - - @Override - public void tick() { - super.tick(); - if (world.isRemote) - return; - if (receivedSignal != getBlockState().get(POWERED)) { - world.setBlockState(pos, getBlockState().cycle(POWERED)); - return; - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerBlock.java deleted file mode 100644 index 750df6a95..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerBlock.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.simibubi.create.content.logistics.block.transposer; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllShapes; -import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.logistics.block.belts.BeltAttachableLogisticalBlock; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; -import net.minecraft.nbt.CompoundNBT; -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.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; - -public class TransposerBlock extends BeltAttachableLogisticalBlock { - - public static BooleanProperty POWERED = BlockStateProperties.POWERED; - - public TransposerBlock(Properties properties) { - super(properties); - setDefaultState(getDefaultState().with(POWERED, false)); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.TRANSPOSER.create(); - } - - @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POWERED)); - } - - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.TRANSPOSER.get(getBlockFacing(state)); - } - - @Override - protected boolean isVertical() { - return false; - } - - @Override - protected BlockState getVerticalDefaultState() { - return AllBlocks.VERTICAL_TRANSPOSER.getDefaultState(); - } - - @Override - protected BlockState getHorizontalDefaultState() { - return AllBlocks.TRANSPOSER.getDefaultState(); - } - - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (world.isRemote) - return ActionResultType.SUCCESS; - Direction blockFacing = getBlockFacing(state); - BlockState newState = state; - if (blockFacing.getAxis() - .isHorizontal()) - newState = state.with(HORIZONTAL_FACING, blockFacing.getOpposite()); - else - newState = state.cycle(UPWARD); - BlockPos pos = context.getPos(); - world.setBlockState(pos, newState); - TileEntity te = world.getTileEntity(pos); - if (te instanceof TransposerTileEntity) { - TransposerTileEntity transposer = (TransposerTileEntity) te; - CompoundNBT compound = new CompoundNBT(); - transposer.write(compound); - world.removeTileEntity(pos); - world.setTileEntity(pos, TileEntity.create(compound)); - } - return ActionResultType.SUCCESS; - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState stateForPlacement = super.getStateForPlacement(context); - return stateForPlacement.with(POWERED, Boolean.valueOf(context.getWorld() - .isBlockPowered(context.getPos()))); - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (worldIn.isRemote) - return; - - Direction blockFacing = getBlockFacing(state); - if (fromPos.equals(pos.offset(blockFacing)) || fromPos.equals(pos.offset(blockFacing.getOpposite()))) { - if (!isValidPosition(state, worldIn, pos)) { - worldIn.destroyBlock(pos, true); - return; - } - } - - if (!reactsToRedstone()) - return; - - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) { - worldIn.setBlockState(pos, state.cycle(POWERED), 2); - } - } - - @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - return true; - } - - protected boolean reactsToRedstone() { - return true; - } - - public static class Vertical extends TransposerBlock { - public Vertical(Properties properties) { - super(properties); - } - - @Override - protected boolean isVertical() { - return true; - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerTileEntity.java deleted file mode 100644 index 06f1fc549..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/transposer/TransposerTileEntity.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.simibubi.create.content.logistics.block.transposer; - -import java.util.List; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock; -import com.simibubi.create.content.logistics.block.extractor.ExtractorTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.items.ItemHandlerHelper; - -public class TransposerTileEntity extends ExtractorTileEntity { - - private InsertingBehaviour inserting; - - public TransposerTileEntity(TileEntityType tileEntityTypeIn) { - super(tileEntityTypeIn); - } - - @Override - public void addBehaviours(List behaviours) { - super.addBehaviours(behaviours); - inserting = new InsertingBehaviour(this, - Attachments.toward(() -> AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite())); - behaviours.add(inserting); - applyFilteringCallbacks(); - } - - public void applyFilteringCallbacks() { - extracting.withAmountThreshold(this::amountToExtract).withAdditionalFilter(this::shouldExtract); - } - - public void filterChanged(ItemStack stack) { - } - - public int amountToExtract(ItemStack stack) { - ItemStack tester = stack.copy(); - tester.setCount(64); - return 64 - inserting.insert(tester, true).getCount(); - } - - public boolean shouldExtract(ItemStack stack) { - if (isTargetingBelt()) { - Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite(); - BlockPos targetPos = pos.offset(facing); - BeltTileEntity te = (BeltTileEntity) world.getTileEntity(targetPos); - return te.tryInsertingFromSide(facing, stack, true); - } - - if (filtering.anyAmount()) - return true; - return inserting.insert(stack, true).isEmpty(); - } - - @Override - protected boolean isTargetingBelt() { - BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite()); - if (!AllBlocks.BELT.has(world.getBlockState(targetPos))) - return false; - TileEntity te = world.getTileEntity(targetPos); - if (te == null || !(te instanceof BeltTileEntity)) - return false; - return ((KineticTileEntity) te).getSpeed() != 0; - } - - @Override - protected boolean canExtract() { - return inserting.getInventory() != null; - } - - @Override - public void onExtract(ItemStack stack) { - if (isTargetingBelt()) { - Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite(); - BlockPos targetPos = pos.offset(facing); - BeltTileEntity te = (BeltTileEntity) world.getTileEntity(targetPos); - if (te.tryInsertingFromSide(facing, stack, false)) - return; - } - - ItemStack remainder = inserting.insert(stack, false); - if (!remainder.isEmpty()) - remainder = ItemHandlerHelper.insertItemStacked(extracting.getInventory(), remainder, false); - if (!remainder.isEmpty()) - super.onExtract(remainder); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/transposer/VerticalTransposerGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/transposer/VerticalTransposerGenerator.java deleted file mode 100644 index d1f648f9a..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/transposer/VerticalTransposerGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.content.logistics.block.transposer; - -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.minecraftforge.client.model.generators.ModelFile; - -public class VerticalTransposerGenerator extends SpecialBlockStateGen { - - private boolean linked; - - public VerticalTransposerGenerator(boolean linked) { - this.linked = linked; - } - - @Override - protected int getXRotation(BlockState state) { - return state.get(TransposerBlock.Vertical.UPWARD) ? 270 : 90; - } - - @Override - protected int getYRotation(BlockState state) { - return (state.get(TransposerBlock.Vertical.UPWARD) ? 180 : 0) - + horizontalAngle(state.get(TransposerBlock.Vertical.HORIZONTAL_FACING)); - } - - @Override - public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, - BlockState state) { - return AssetLookup.forPowered(ctx, prov, "transposer/" + (linked ? "vertical_linked" : "block")) - .apply(state); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java index 7945d7a46..73e532dc4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java @@ -6,11 +6,11 @@ import static net.minecraft.util.text.TextFormatting.GRAY; import java.util.Collections; import java.util.List; -import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widgets.Indicator.State; @@ -19,7 +19,6 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import net.minecraft.client.gui.widget.Widget; -import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; @@ -62,12 +61,18 @@ public abstract class AbstractFilterScreen ex font.drawString(playerInventory.getDisplayName().getFormattedText(), invX + 7, invY + 6, 0x666666); font.drawString(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 9, 0x5B5037); - RenderHelper.enableGuiDepthLighting(); + /*RenderHelper.enableGuiDepthLighting(); RenderSystem.pushMatrix(); RenderSystem.translated(guiLeft + background.width + 0, guiTop + background.height - 60, 0); RenderSystem.scaled(5, 5, 5); itemRenderer.renderItemIntoGUI(container.filterItem, 0, 0); - RenderSystem.popMatrix(); + RenderSystem.popMatrix();*/ + + GuiGameElement.of(container.filterItem) + .at(guiLeft + background.width, guiTop +background.height -60) + .scale(5) + .render(); + } @Override diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java index eb76550c4..55ecf229c 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java @@ -40,9 +40,15 @@ public class PaletteBlockPatterns { COBBLESTONE = create("cobblestone", Suffix, AllPartials), - POLISHED = create("polished", Prefix, ForPolished).addRecipes(v -> (c, - p) -> p.square(DataIngredient.items(v.getBaseBlock() - .get()), c::get, true)), + POLISHED = create("polished", Prefix, ForPolished) + .addRecipes(v -> (c, + p) -> { + DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get()); + ShapedRecipeBuilder.shapedRecipe(c.get(), 4).key('X', ingredient) + .patternLine("XX").patternLine("XX") + .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)).build(p, p.safeId(c.get())); + } + ), BRICKS = create("bricks", Suffix, AllPartials), FANCY_BRICKS = create("fancy_bricks", Wrap, AllPartials), diff --git a/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java index 6220d871c..1d8602b6c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java @@ -4,22 +4,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SeaPickleBlock; -import net.minecraft.block.SnowBlock; -import net.minecraft.block.TurtleEggBlock; +import net.minecraft.block.*; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ArmorStandEntity; import net.minecraft.entity.item.BoatEntity; import net.minecraft.entity.item.ItemFrameEntity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.SlabType; @@ -65,6 +57,10 @@ public class ItemRequirement { return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.get(SeaPickleBlock.PICKLES).intValue()))); if (block instanceof SnowBlock) return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.get(SnowBlock.LAYERS).intValue()))); + if (block instanceof GrassPathBlock) + return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(Items.GRASS_BLOCK))); + if (block instanceof FarmlandBlock) + return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(Items.DIRT))); return item == Items.AIR ? INVALID : new ItemRequirement(ItemUseType.CONSUME, item); } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java index 92ce288d8..9212c0aa5 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java @@ -1,11 +1,5 @@ package com.simibubi.create.content.schematics.block; -import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE; -import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE_PROGRESS; - -import java.nio.file.Paths; -import java.util.List; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; @@ -19,13 +13,19 @@ import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.utility.Lang; - import net.minecraft.client.gui.IHasContainer; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; +import java.nio.file.Paths; +import java.util.List; + +import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE; +import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE_PROGRESS; + public class SchematicTableScreen extends AbstractSimiContainerScreen implements IHasContainer { @@ -40,6 +40,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen { protected Vector replaceLevelIndicators; @@ -60,6 +58,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { +public class ResourceReloadHandler extends ReloadListener { @Override - protected String prepare(IResourceManager resourceManagerIn, IProfiler profilerIn) { - return ""; + protected Object prepare(IResourceManager resourceManagerIn, IProfiler profilerIn) { + return new Object(); } @Override - protected void apply(String splashList, IResourceManager resourceManagerIn, IProfiler profilerIn) { + protected void apply(Object $, IResourceManager resourceManagerIn, IProfiler profilerIn) { SpriteShifter.reloadUVs(); CreateClient.bufferCache.invalidate(); } 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 87f2f5c3a..4b1ec3d84 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -308,7 +308,7 @@ public class AllAdvancements implements IDataProvider { @Override public String getName() { - return "CreateAdvancements"; + return "Create's Advancements"; } public PlacedBlockTrigger.Instance placeBlock(Block block) { diff --git a/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java similarity index 58% rename from src/main/java/com/simibubi/create/foundation/command/CreateCommand.java rename to src/main/java/com/simibubi/create/foundation/command/AllCommands.java index 9126dedba..e726181f4 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CreateCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -1,18 +1,22 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.CommandDispatcher; - import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; -public class CreateCommand { +public class AllCommands { - public CreateCommand(CommandDispatcher dispatcher) { + public static void register(CommandDispatcher dispatcher) { dispatcher.register(Commands.literal("create") + //general purpose .then(ToggleDebugCommand.register()) .then(OverlayConfigCommand.register()) + + //dev-util + //Comment out for release .then(ClearBufferCacheCommand.register()) - //.then(KillTPSCommand.register()) //Commented out for release - ); + .then(ChunkUtilCommand.register()) + // .then(KillTPSCommand.register()) + ); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java b/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java new file mode 100644 index 000000000..f88e9ab3d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java @@ -0,0 +1,103 @@ +package com.simibubi.create.foundation.command; + +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.server.ChunkHolder; +import net.minecraft.world.server.ServerChunkProvider; +import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.EnumSet; +import java.util.LinkedList; +import java.util.List; + +public class ChunkUtil { + private static final Logger LOGGER = LogManager.getLogger("Create/ChunkUtil"); + final EnumSet POST_FEATURES = EnumSet.of(Heightmap.Type.OCEAN_FLOOR, Heightmap.Type.WORLD_SURFACE, Heightmap.Type.MOTION_BLOCKING, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES); + + private final List markedChunks; + private final List interestingChunks; + + public ChunkUtil() { + LOGGER.debug("Chunk Util constructed"); + markedChunks = new LinkedList<>(); + interestingChunks = new LinkedList<>(); + } + + public void init() { + ChunkStatus.FULL = new ChunkStatus("full", ChunkStatus.HEIGHTMAPS, 0, POST_FEATURES, ChunkStatus.Type.LEVELCHUNK, + (_0, _1, _2, _3, _4, future, _6, chunk) -> future.apply(chunk), + (_0, _1, _2, _3, future, chunk) -> { + if (markedChunks.contains(chunk.getPos().asLong())) { + LOGGER.debug("trying to load unforced chunk " + chunk.getPos().toString() + ", returning chunk loading error"); + //this.reloadChunk(world.getChunkProvider(), chunk.getPos()); + return ChunkHolder.MISSING_CHUNK_FUTURE; + } else { + //LOGGER.debug("regular, chunkStatus: " + chunk.getStatus().toString()); + return future.apply(chunk); + } + }); + + } + + public boolean reloadChunk(ServerChunkProvider provider, ChunkPos pos) { + ChunkHolder holder = provider.chunkManager.loadedChunks.remove(pos.asLong()); + provider.chunkManager.immutableLoadedChunksDirty = true; + if (holder != null) { + provider.chunkManager.chunksToUnload.put(pos.asLong(), holder); + provider.chunkManager.scheduleSave(pos.asLong(), holder); + return true; + } else { + return false; + } + } + + public boolean unloadChunk(ServerChunkProvider provider, ChunkPos pos) { + this.interestingChunks.add(pos.asLong()); + this.markedChunks.add(pos.asLong()); + + return this.reloadChunk(provider, pos); + } + + public int clear(ServerChunkProvider provider) { + LinkedList copy = new LinkedList<>(this.markedChunks); + + int size = this.markedChunks.size(); + this.markedChunks.clear(); + + copy.forEach(l -> reForce(provider, new ChunkPos(l))); + + return size; + } + + public void reForce(ServerChunkProvider provider, ChunkPos pos) { + provider.forceChunk(pos, true); + provider.forceChunk(pos, false); + } + + @SubscribeEvent + public void chunkUnload(ChunkEvent.Unload event) { + //LOGGER.debug("Chunk Unload: " + event.getChunk().getPos().toString()); + if (interestingChunks.contains(event.getChunk().getPos().asLong())) { + LOGGER.info("Interesting Chunk Unload: " + event.getChunk().getPos().toString()); + } + } + + @SubscribeEvent + public void chunkLoad(ChunkEvent.Load event) { + //LOGGER.debug("Chunk Load: " + event.getChunk().getPos().toString()); + + ChunkPos pos = event.getChunk().getPos(); + if (interestingChunks.contains(pos.asLong())) { + LOGGER.info("Interesting Chunk Load: " + pos.toString()); + if (!markedChunks.contains(pos.asLong())) + interestingChunks.remove(pos.asLong()); + } + + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java b/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java new file mode 100644 index 000000000..48272f723 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java @@ -0,0 +1,66 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.Create; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.ColumnPosArgument; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.ColumnPos; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.server.ServerChunkProvider; + +public class ChunkUtilCommand { + + public static ArgumentBuilder register() { + return Commands.literal("chunk") + .requires(cs -> cs.hasPermissionLevel(2)) + .then(Commands.literal("reload").then(Commands.argument("pos", ColumnPosArgument.columnPos()) + .executes(ctx -> { + //chunk reload + ColumnPos columnPos = ColumnPosArgument.fromBlockPos(ctx, "pos"); + ChunkPos chunkPos = new ChunkPos(columnPos.x >> 4, columnPos.z >> 4); + ServerChunkProvider chunkProvider = ctx.getSource().getWorld().getChunkProvider(); + + boolean success = Create.chunkUtil.reloadChunk(chunkProvider, chunkPos); + + if (success) { + ctx.getSource().sendFeedback(new StringTextComponent("scheduled unload for chunk " + chunkPos.toString() + ", might need to repeat command"), true); + return 1; + } else { + ctx.getSource().sendFeedback(new StringTextComponent("unable to schedule unload, is chunk " + chunkPos.toString() + " loaded?"), true); + return 0; + } + }) + )) + .then(Commands.literal("unload").then(Commands.argument("pos", ColumnPosArgument.columnPos()) + .executes(ctx -> { + //chunk unload + ColumnPos columnPos = ColumnPosArgument.fromBlockPos(ctx, "pos"); + ChunkPos chunkPos = new ChunkPos(columnPos.x >> 4, columnPos.z >> 4); + ServerChunkProvider chunkProvider = ctx.getSource().getWorld().getChunkProvider(); + + boolean success = Create.chunkUtil.unloadChunk(chunkProvider, chunkPos); + ctx.getSource().sendFeedback(new StringTextComponent("added chunk " + chunkPos.toString() + " to unload list"), true); + + if (success) { + ctx.getSource().sendFeedback(new StringTextComponent("scheduled unload for chunk " + chunkPos.toString() + ", might need to repeat command"), true); + return 1; + } else { + ctx.getSource().sendFeedback(new StringTextComponent("unable to schedule unload, is chunk " + chunkPos.toString() + " loaded?"), true); + return 0; + } + }) + )) + .then(Commands.literal("clear") + .executes(ctx -> { + //chunk clear + int count = Create.chunkUtil.clear(ctx.getSource().getWorld().getChunkProvider()); + ctx.getSource().sendFeedback(new StringTextComponent("removed " + count + " entries from unload list"), false); + + return 1; + }) + ); + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/config/CFluids.java b/src/main/java/com/simibubi/create/foundation/config/CFluids.java index 580fec6ad..d90eaa7a4 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CFluids.java +++ b/src/main/java/com/simibubi/create/foundation/config/CFluids.java @@ -4,6 +4,7 @@ public class CFluids extends ConfigBase { public ConfigInt fluidTankCapacity = i(8, 1, "fluidTankCapacity", Comments.buckets, Comments.fluidTankCapacity); public ConfigInt fluidTankMaxHeight = i(32, 1, "fluidTankMaxHeight", Comments.blocks, Comments.fluidTankMaxHeight); + public ConfigInt mechanicalPumpRange = i(16, 1, "mechanicalPumpRange", Comments.blocks, Comments.mechanicalPumpRange); @Override public String getName() { @@ -15,6 +16,7 @@ public class CFluids extends ConfigBase { static String buckets = "[in Buckets]"; static String fluidTankCapacity = "The amount of liquid a tank can hold per block."; static String fluidTankMaxHeight = "The maximum height a fluid tank can reach."; + static String mechanicalPumpRange = "The maximum distance a mechanical pump can push or pull liquids on either side."; } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index 0b5436ac2..3f83c62f2 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -26,6 +26,7 @@ public class CKinetics extends ConfigBase { public ConfigInt maxChassisRange = i(16, 1, "maxChassisRange", Comments.maxChassisRange); public ConfigInt maxPistonPoles = i(64, 1, "maxPistonPoles", Comments.maxPistonPoles); public ConfigInt maxRopeLength = i(128, 1, "maxRopeLength", Comments.maxRopeLength); + public ConfigInt maxCartCouplingLength = i(32, 1, "maxCartCouplingLength", Comments.maxCartCouplingLength); public ConfigGroup state = group(0, "stats", Comments.stats); public ConfigFloat mediumSpeed = f(30, 0, 4096, "mediumSpeed", Comments.rpm, Comments.mediumSpeed); @@ -58,6 +59,7 @@ public class CKinetics extends ConfigBase { static String maxChassisRange = "Maximum value of a chassis attachment range."; static String maxPistonPoles = "Maximum amount of extension poles behind a Mechanical Piston."; static String maxRopeLength = "Max length of rope available off a Rope Pulley."; + static String maxCartCouplingLength = "Maximum allowed distance of two coupled minecarts."; static String stats = "Configure speed/capacity levels for requirements and indicators."; static String rpm = "[in Revolutions per Minute]"; static String su = "[in Stress Units]"; diff --git a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java index 90b7dd853..a784769cc 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java @@ -2,21 +2,23 @@ package com.simibubi.create.foundation.config; public class CLogistics extends ConfigBase { - public ConfigInt extractorDelay = i(20, 10, "extractorDelay", Comments.extractorDelay); - public ConfigInt extractorInventoryScanDelay = i(40, 10, "extractorInventoryScanDelay", Comments.extractorInventoryScanDelay); - public ConfigInt extractorAmount = i(16, 1, 64, "extractorAmount", Comments.extractorAmount); + public ConfigInt defaultExtractionLimit = i(64, 1, 64, "defaultExtractionLimit", Comments.defaultExtractionLimit); + public ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); + public ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); public ConfigInt linkRange = i(128, 1, "linkRange", Comments.linkRange); - + @Override public String getName() { return "logistics"; } private static class Comments { - static String extractorDelay = "The amount of game ticks an Extractor waits after pulling an item successfully."; - static String extractorInventoryScanDelay = "The amount of game ticks an Extractor waits before checking again if the attached inventory contains items to extract."; - static String extractorAmount = "The amount of items an extractor pulls at a time without an applied filter."; + static String defaultExtractionLimit = + "The maximum amount of items a funnel pulls at a time without an applied filter."; + static String defaultExtractionTimer = + "The amount of ticks a funnel waits between item transferrals, when it is not re-activated by redstone."; static String linkRange = "Maximum possible range in blocks of redstone link connections."; + static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; } } 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 4216d5c04..6cf438249 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -19,8 +19,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock; -import com.simibubi.create.content.contraptions.fluids.FluidPipeBlock; -import com.simibubi.create.content.contraptions.processing.HeaterBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock; import com.simibubi.create.content.palettes.PavedBlock; import com.simibubi.create.foundation.utility.Iterate; @@ -58,7 +58,7 @@ 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)); @@ -212,9 +212,12 @@ public class BlockStateGen { .build(); }); } - - public static NonNullBiConsumer, RegistrateBlockstateProvider> blazeHeater(){ - return (c, p) -> ConfiguredModel.builder().modelFile(p.models().getExistingFile(p.modLoc("block/" + c.getName() + "/block"))).build(); + + public static NonNullBiConsumer, RegistrateBlockstateProvider> blazeHeater() { + return (c, p) -> ConfiguredModel.builder() + .modelFile(p.models() + .getExistingFile(p.modLoc("block/" + c.getName() + "/block"))) + .build(); } public static NonNullBiConsumer, RegistrateBlockstateProvider> reinforcedRail() { 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 ad2624a80..e437fba6b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -61,20 +61,20 @@ public class BuilderTransformers { 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); + .texture("0", p.modLoc("block/" + type + "_funnel_plating")) + .texture("1", particleTexture) + .texture("2", p.modLoc("block/" + type + "_funnel" + powered)) + .texture("3", p.modLoc("block/" + type + "_funnel_back")); }; 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); + .texture("0", p.modLoc("block/" + type + "_funnel_plating")) + .texture("1", particleTexture) + .texture("2", p.modLoc("block/" + type + "_funnel")) + .texture("3", p.modLoc("block/" + type + "_funnel_back")); }) .build(); }; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java new file mode 100644 index 000000000..22ba2e61e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java @@ -0,0 +1,158 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllTags; +import com.simibubi.create.Create; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.data.RecipeProvider; +import net.minecraft.item.Item; +import net.minecraft.tags.Tag; +import net.minecraft.util.IItemProvider; +import net.minecraftforge.common.Tags; + +public abstract class CreateRecipeProvider extends RecipeProvider { + + final List all = new ArrayList<>(); + + public CreateRecipeProvider(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected void registerRecipes(Consumer p_200404_1_) { + all.forEach(c -> c.register(p_200404_1_)); + Create.logger.info(getName() + " registered " + all.size() + " recipe" + (all.size() == 1 ? "" : "s")); + } + + @FunctionalInterface + interface GeneratedRecipe { + void register(Consumer consumer); + } + + protected GeneratedRecipe register(GeneratedRecipe recipe) { + all.add(recipe); + return recipe; + } + + protected static class Marker { + } + + protected static class I { + + static Tag redstone() { + return Tags.Items.DUSTS_REDSTONE; + } + + static Tag gold() { + return AllTags.forgeItemTag("ingots/gold"); + } + + static Tag goldSheet() { + return AllTags.forgeItemTag("plates/gold"); + } + + static Tag stone() { + return Tags.Items.STONE; + } + + static IItemProvider andesite() { + return AllItems.ANDESITE_ALLOY.get(); + } + + static IItemProvider shaft() { + return AllBlocks.SHAFT.get(); + } + + static IItemProvider cog() { + return AllBlocks.COGWHEEL.get(); + } + + static IItemProvider andesiteCasing() { + return AllBlocks.ANDESITE_CASING.get(); + } + + static Tag brass() { + return AllTags.forgeItemTag("ingots/brass"); + } + + static Tag brassSheet() { + return AllTags.forgeItemTag("plates/brass"); + } + + static Tag iron() { + return Tags.Items.INGOTS_IRON; + } + + static Tag zinc() { + return AllTags.forgeItemTag("ingots/zinc"); + } + + static Tag ironSheet() { + return AllTags.forgeItemTag("plates/iron"); + } + + static IItemProvider brassCasing() { + return AllBlocks.BRASS_CASING.get(); + } + + static IItemProvider electronTube() { + return AllItems.ELECTRON_TUBE.get(); + } + + static IItemProvider circuit() { + return AllItems.INTEGRATED_CIRCUIT.get(); + } + + static Tag copperBlock() { + return AllTags.forgeItemTag("storage_blocks/copper"); + } + + static Tag brassBlock() { + return AllTags.forgeItemTag("storage_blocks/brass"); + } + + static Tag zincBlock() { + return AllTags.forgeItemTag("storage_blocks/zinc"); + } + + static Tag copper() { + return AllTags.forgeItemTag("ingots/copper"); + } + + static Tag copperSheet() { + return AllTags.forgeItemTag("plates/copper"); + } + + static Tag copperNugget() { + return AllTags.forgeItemTag("nuggets/copper"); + } + + static Tag brassNugget() { + return AllTags.forgeItemTag("nuggets/brass"); + } + + static Tag zincNugget() { + return AllTags.forgeItemTag("nuggets/zinc"); + } + + static IItemProvider copperCasing() { + return AllBlocks.COPPER_CASING.get(); + } + + static IItemProvider refinedRadiance() { + return AllItems.REFINED_RADIANCE.get(); + } + + static IItemProvider shadowSteel() { + return AllItems.SHADOW_STEEL.get(); + } + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java new file mode 100644 index 000000000..ef148afa9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java @@ -0,0 +1,149 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.palettes.AllPaletteBlocks; +import com.tterrag.registrate.util.entry.ItemEntry; + +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.tags.ItemTags; + +public class CrushingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + BLAZE_ROD = create(() -> Items.BLAZE_ROD, b -> b.duration(100) + .output(Items.BLAZE_POWDER, 3) + .output(.25f, Items.BLAZE_POWDER, 3)), + + PRISMARINE_CRYSTALS = create(() -> Items.PRISMARINE_CRYSTALS, b -> b.duration(150) + .output(Items.PRISMARINE_SHARD, 2) + .output(.75f, Items.QUARTZ, 2) + .output(.25f, Items.PRISMARINE_SHARD, 2) + .output(.1f, Items.GLOWSTONE_DUST, 2)), + + OBSIDIAN = create(() -> Blocks.OBSIDIAN, b -> b.duration(500) + .output(AllItems.POWDERED_OBSIDIAN.get()) + .output(.75f, Blocks.OBSIDIAN)), + + WOOL = create("wool", b -> b.duration(100) + .require(ItemTags.WOOL) + .output(Items.STRING, 2) + .output(.5f, Items.STRING)), + + COPPER_BLOCK = create("copper_block", b -> b.duration(400) + .require(I.copperBlock()) + .output(AllItems.CRUSHED_COPPER.get(), 5)), + + ZINC_BLOCK = create("zinc_block", b -> b.duration(400) + .require(I.zincBlock()) + .output(AllItems.CRUSHED_ZINC.get(), 5)), + + BRASS_BLOCK = create("brass_block", b -> b.duration(400) + .require(I.brassBlock()) + .output(AllItems.CRUSHED_BRASS.get(), 5)), + + COPPER_ORE = metalOre("copper", AllItems.CRUSHED_COPPER, 350), + ZINC_ORE = metalOre("zinc", AllItems.CRUSHED_ZINC, 350), + IRON_ORE = metalOre("iron", AllItems.CRUSHED_IRON, 400), + GOLD_ORE = metalOre("gold", AllItems.CRUSHED_GOLD, 300), + + NETHER_QUARTZ_ORE = create(() -> Blocks.NETHER_QUARTZ_ORE, b -> b.duration(350) + .output(Items.QUARTZ, 2) + .output(.5f, Items.QUARTZ, 4) + .output(.125f, Blocks.NETHERRACK)), + + REDSTONE_ORE = create(() -> Blocks.REDSTONE_ORE, b -> b.duration(300) + .output(Items.REDSTONE, 8) + .output(.25f, Items.REDSTONE, 6) + .output(.125f, Blocks.COBBLESTONE)), + + LAPIS_ORE = create(() -> Blocks.LAPIS_ORE, b -> b.duration(300) + .output(Items.LAPIS_LAZULI, 12) + .output(.25f, Items.LAPIS_LAZULI, 8) + .output(.125f, Blocks.COBBLESTONE)), + + COAL_ORE = create(() -> Blocks.COAL_ORE, b -> b.duration(300) + .output(Items.COAL, 2) + .output(.5f, Items.COAL, 2) + .output(.125f, Blocks.COBBLESTONE)), + + EMERALD_ORE = create(() -> Blocks.EMERALD_ORE, b -> b.duration(500) + .output(Items.EMERALD, 2) + .output(.25f, Items.EMERALD, 1) + .output(.125f, Blocks.COBBLESTONE)), + + NETHER_WART_NO_QUARK = create("nether_wart_block_no_quark", b -> b.duration(150) + .require(Blocks.NETHER_WART_BLOCK) + .output(Items.NETHER_WART, 6) + .output(.5f, Items.NETHER_WART, 2) + .whenModMissing("quark")), + + NETHER_WART_QUARK = create("nether_wart_block_quark", b -> b.duration(150) + .require(Blocks.NETHER_WART_BLOCK) + .output(Items.NETHER_WART, 2) + .output(.5f, Items.NETHER_WART, 2) + .whenModLoaded("quark")), + + GLOWSTONE = create(() -> Blocks.GLOWSTONE, b -> b.duration(150) + .output(Items.GLOWSTONE_DUST, 3) + .output(.5f, Items.GLOWSTONE_DUST)), + + LEATHER_HORSE_ARMOR = create(() -> Items.LEATHER_HORSE_ARMOR, b -> b.duration(200) + .output(Items.LEATHER, 2) + .output(.5f, Items.LEATHER, 2)), + + IRON_HORSE_ARMOR = create(() -> Items.IRON_HORSE_ARMOR, b -> b.duration(200) + .output(Items.IRON_INGOT, 2) + .output(.5f, Items.LEATHER, 1) + .output(.5f, Items.IRON_INGOT, 1) + .output(.25f, Items.STRING, 2) + .output(.25f, Items.IRON_NUGGET, 4)), + + GOLDEN_HORSE_ARMOR = create(() -> Items.GOLDEN_HORSE_ARMOR, b -> b.duration(200) + .output(Items.GOLD_INGOT, 2) + .output(.5f, Items.LEATHER, 2) + .output(.5f, Items.GOLD_INGOT, 2) + .output(.25f, Items.STRING, 2) + .output(.25f, Items.GOLD_NUGGET, 8)), + + DIAMOND_HORSE_ARMOR = create(() -> Items.DIAMOND_HORSE_ARMOR, b -> b.duration(200) + .output(Items.DIAMOND, 1) + .output(.5f, Items.LEATHER, 2) + .output(.1f, Items.DIAMOND, 3) + .output(.25f, Items.STRING, 2)), + + GRAVEL = create(() -> Blocks.GRAVEL, b -> b.duration(250) + .output(Blocks.SAND) + .output(.1f, Items.FLINT) + .output(.05f, Items.CLAY_BALL)), + + SAND = create(() -> Blocks.SAND, b -> b.duration(150) + .output(AllPaletteBlocks.LIMESAND.get()) + .output(.5f, AllPaletteBlocks.LIMESAND.get()) + .output(.05f, Items.BONE_MEAL)) + + ; + + protected GeneratedRecipe metalOre(String name, ItemEntry crushed, int duration) { + return create(name + "_ore", b -> b.duration(duration) + .require(AllTags.forgeItemTag("ores/" + name)) + .output(crushed.get()) + .output(.3f, crushed.get(), 2) + .output(.125f, Blocks.COBBLESTONE)); + } + + public CrushingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.CRUSHING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java new file mode 100644 index 000000000..4ab5e1400 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllRecipeTypes; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; + +public class CuttingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + ANDESITE_ALLOY = create(I::andesite, b -> b.duration(200) + .output(AllBlocks.SHAFT.get(), 6)), + + OAK_WOOD = stripAndMakePlanks(Blocks.OAK_WOOD, Blocks.STRIPPED_OAK_WOOD, Blocks.OAK_PLANKS), + SPRUCE_WOOD = stripAndMakePlanks(Blocks.SPRUCE_WOOD, Blocks.STRIPPED_SPRUCE_WOOD, Blocks.SPRUCE_PLANKS), + BIRCH_WOOD = stripAndMakePlanks(Blocks.BIRCH_WOOD, Blocks.STRIPPED_BIRCH_WOOD, Blocks.BIRCH_PLANKS), + JUNGLE_WOOD = stripAndMakePlanks(Blocks.JUNGLE_WOOD, Blocks.STRIPPED_JUNGLE_WOOD, Blocks.JUNGLE_PLANKS), + ACACIA_WOOD = stripAndMakePlanks(Blocks.ACACIA_WOOD, Blocks.STRIPPED_ACACIA_WOOD, Blocks.ACACIA_PLANKS), + DARK_OAK_WOOD = stripAndMakePlanks(Blocks.DARK_OAK_WOOD, Blocks.STRIPPED_DARK_OAK_WOOD, Blocks.DARK_OAK_PLANKS), + + OAK_LOG = stripAndMakePlanks(Blocks.OAK_LOG, Blocks.STRIPPED_OAK_LOG, Blocks.OAK_PLANKS), + SPRUCE_LOG = stripAndMakePlanks(Blocks.SPRUCE_LOG, Blocks.STRIPPED_SPRUCE_LOG, Blocks.SPRUCE_PLANKS), + BIRCH_LOG = stripAndMakePlanks(Blocks.BIRCH_LOG, Blocks.STRIPPED_BIRCH_LOG, Blocks.BIRCH_PLANKS), + JUNGLE_LOG = stripAndMakePlanks(Blocks.JUNGLE_LOG, Blocks.STRIPPED_JUNGLE_LOG, Blocks.JUNGLE_PLANKS), + ACACIA_LOG = stripAndMakePlanks(Blocks.ACACIA_LOG, Blocks.STRIPPED_ACACIA_LOG, Blocks.ACACIA_PLANKS), + DARK_OAK_LOG = stripAndMakePlanks(Blocks.DARK_OAK_LOG, Blocks.STRIPPED_DARK_OAK_LOG, Blocks.DARK_OAK_PLANKS) + + ; + + GeneratedRecipe stripAndMakePlanks(Block wood, Block stripped, Block planks) { + create(() -> wood, b -> b.duration(50) + .output(stripped)); + return create(() -> stripped, b -> b.duration(100) + .output(planks, 5)); + } + + public CuttingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.CUTTING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java new file mode 100644 index 000000000..1f2a26e01 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java @@ -0,0 +1,31 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllRecipeTypes; + +import net.minecraft.data.DataGenerator; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.tags.FluidTags; + +public class FillingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + WATER_BOTTLE = create("water_bottle", b -> b.require(Items.GLASS_BOTTLE) + .require(FluidTags.WATER, 250) + .output(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER))) + + ; + + public FillingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.FILLING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java new file mode 100644 index 000000000..1bc1314c7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java @@ -0,0 +1,204 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Consumer; + +import javax.annotation.Nullable; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.simibubi.create.AllRecipeTypes; + +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.Tag; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; + +public class MechanicalCraftingRecipeBuilder { + + private final Item result; + private final int count; + private final List pattern = Lists.newArrayList(); + private final Map key = Maps.newLinkedHashMap(); + + public MechanicalCraftingRecipeBuilder(IItemProvider p_i48261_1_, int p_i48261_2_) { + result = p_i48261_1_.asItem(); + count = p_i48261_2_; + } + + /** + * Creates a new builder for a shaped recipe. + */ + public static MechanicalCraftingRecipeBuilder shapedRecipe(IItemProvider p_200470_0_) { + return shapedRecipe(p_200470_0_, 1); + } + + /** + * Creates a new builder for a shaped recipe. + */ + public static MechanicalCraftingRecipeBuilder shapedRecipe(IItemProvider p_200468_0_, int p_200468_1_) { + return new MechanicalCraftingRecipeBuilder(p_200468_0_, p_200468_1_); + } + + /** + * Adds a key to the recipe pattern. + */ + public MechanicalCraftingRecipeBuilder key(Character p_200469_1_, Tag p_200469_2_) { + return this.key(p_200469_1_, Ingredient.fromTag(p_200469_2_)); + } + + /** + * Adds a key to the recipe pattern. + */ + public MechanicalCraftingRecipeBuilder key(Character p_200462_1_, IItemProvider p_200462_2_) { + return this.key(p_200462_1_, Ingredient.fromItems(p_200462_2_)); + } + + /** + * Adds a key to the recipe pattern. + */ + public MechanicalCraftingRecipeBuilder key(Character p_200471_1_, Ingredient p_200471_2_) { + if (this.key.containsKey(p_200471_1_)) { + throw new IllegalArgumentException("Symbol '" + p_200471_1_ + "' is already defined!"); + } else if (p_200471_1_ == ' ') { + throw new IllegalArgumentException("Symbol ' ' (whitespace) is reserved and cannot be defined"); + } else { + this.key.put(p_200471_1_, p_200471_2_); + return this; + } + } + + /** + * Adds a new entry to the patterns for this recipe. + */ + public MechanicalCraftingRecipeBuilder patternLine(String p_200472_1_) { + if (!this.pattern.isEmpty() && p_200472_1_.length() != this.pattern.get(0) + .length()) { + throw new IllegalArgumentException("Pattern must be the same width on every line!"); + } else { + this.pattern.add(p_200472_1_); + return this; + } + } + + /** + * Builds this recipe into an {@link IFinishedRecipe}. + */ + public void build(Consumer p_200464_1_) { + this.build(p_200464_1_, ForgeRegistries.ITEMS.getKey(this.result)); + } + + /** + * Builds this recipe into an {@link IFinishedRecipe}. Use + * {@link #build(Consumer)} if save is the same as the ID for the result. + */ + public void build(Consumer p_200466_1_, String p_200466_2_) { + ResourceLocation resourcelocation = ForgeRegistries.ITEMS.getKey(this.result); + if ((new ResourceLocation(p_200466_2_)).equals(resourcelocation)) { + throw new IllegalStateException("Shaped Recipe " + p_200466_2_ + " should remove its 'save' argument"); + } else { + this.build(p_200466_1_, new ResourceLocation(p_200466_2_)); + } + } + + /** + * Builds this recipe into an {@link IFinishedRecipe}. + */ + public void build(Consumer p_200467_1_, ResourceLocation p_200467_2_) { + validate(p_200467_2_); + p_200467_1_.accept(new MechanicalCraftingRecipeBuilder.Result(p_200467_2_, result, count, pattern, key)); + } + + /** + * Makes sure that this recipe is valid. + */ + private void validate(ResourceLocation p_200463_1_) { + if (pattern.isEmpty()) { + throw new IllegalStateException("No pattern is defined for shaped recipe " + p_200463_1_ + "!"); + } else { + Set set = Sets.newHashSet(key.keySet()); + set.remove(' '); + + for (String s : pattern) { + for (int i = 0; i < s.length(); ++i) { + char c0 = s.charAt(i); + if (!key.containsKey(c0) && c0 != ' ') + throw new IllegalStateException( + "Pattern in recipe " + p_200463_1_ + " uses undefined symbol '" + c0 + "'"); + set.remove(c0); + } + } + + if (!set.isEmpty()) + throw new IllegalStateException( + "Ingredients are defined but not used in pattern for recipe " + p_200463_1_); + } + } + + public class Result implements IFinishedRecipe { + private final ResourceLocation id; + private final Item result; + private final int count; + private final List pattern; + private final Map key; + + public Result(ResourceLocation p_i48271_2_, Item p_i48271_3_, int p_i48271_4_, List p_i48271_6_, + Map p_i48271_7_) { + this.id = p_i48271_2_; + this.result = p_i48271_3_; + this.count = p_i48271_4_; + this.pattern = p_i48271_6_; + this.key = p_i48271_7_; + } + + public void serialize(JsonObject p_218610_1_) { + JsonArray jsonarray = new JsonArray(); + for (String s : this.pattern) + jsonarray.add(s); + + p_218610_1_.add("pattern", jsonarray); + JsonObject jsonobject = new JsonObject(); + for (Entry entry : this.key.entrySet()) + jsonobject.add(String.valueOf(entry.getKey()), entry.getValue() + .serialize()); + + p_218610_1_.add("key", jsonobject); + JsonObject jsonobject1 = new JsonObject(); + jsonobject1.addProperty("item", ForgeRegistries.ITEMS.getKey(this.result) + .toString()); + if (this.count > 1) + jsonobject1.addProperty("count", this.count); + + p_218610_1_.add("result", jsonobject1); + } + + public IRecipeSerializer getSerializer() { + return AllRecipeTypes.MECHANICAL_CRAFTING.serializer; + } + + public ResourceLocation getID() { + return this.id; + } + + @Nullable + public JsonObject getAdvancementJson() { + return null; + } + + @Nullable + public ResourceLocation getAdvancementID() { + return null; + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java new file mode 100644 index 000000000..51defc089 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java @@ -0,0 +1,135 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.util.function.UnaryOperator; + +import com.google.common.base.Supplier; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.Create; + +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.Tags; + +public class MechanicalCraftingRecipeGen extends CreateRecipeProvider { + + GeneratedRecipe + + CRUSHING_WHEEL = create(AllBlocks.CRUSHING_WHEEL::get).returns(2) + .recipe(b -> b.key('P', ItemTags.PLANKS) + .key('S', I.stone()) + .key('A', I.andesite()) + .patternLine(" AAA ") + .patternLine("AAPAA") + .patternLine("APSPA") + .patternLine("AAPAA") + .patternLine(" AAA ")), + + INTEGRATED_CIRCUIT = create(AllItems.INTEGRATED_CIRCUIT::get).returns(1) + .recipe(b -> b.key('L', AllItems.LAPIS_SHEET.get()) + .key('R', I.redstone()) + .key('Q', AllItems.POLISHED_ROSE_QUARTZ.get()) + .key('C', Tags.Items.NUGGETS_GOLD) + .patternLine(" L ") + .patternLine("RRQRR") + .patternLine(" CCC ")), + + EXTENDO_GRIP = create(AllItems.EXTENDO_GRIP::get).returns(1) + .recipe(b -> b.key('L', I.brass()) + .key('R', I.cog()) + .key('H', AllItems.BRASS_HAND.get()) + .key('S', Tags.Items.RODS_WOODEN) + .patternLine(" L ") + .patternLine(" R ") + .patternLine("SSS") + .patternLine("SSS") + .patternLine(" H ")), + + FURNACE_ENGINE = create(AllBlocks.FURNACE_ENGINE::get).returns(1) + .recipe(b -> b.key('P', I.brassSheet()) + .key('B', I.brass()) + .key('I', Ingredient.fromItems(Blocks.PISTON, Blocks.STICKY_PISTON)) + .key('C', I.brassCasing()) + .patternLine("PPB") + .patternLine("PCI") + .patternLine("PPB")), + + FLYWHEEL = create(AllBlocks.FLYWHEEL::get).returns(1) + .recipe(b -> b.key('B', I.brass()) + .key('C', I.brassCasing()) + .patternLine(" BBB") + .patternLine("CB B") + .patternLine(" BBB")), + + NIXIE_TUBE = create(AllBlocks.NIXIE_TUBE::get).returns(1) + .recipe(b -> b.key('E', I.electronTube()) + .key('B', I.brassCasing()) + .patternLine("EBE")), + + MECHANICAL_ARM = create(AllBlocks.MECHANICAL_ARM::get).returns(1) + .recipe(b -> b.key('L', I.brassSheet()) + .key('R', I.cog()) + .key('I', I.circuit()) + .key('A', I.andesite()) + .key('C', I.brassCasing()) + .patternLine("LLA") + .patternLine("L ") + .patternLine("LL ") + .patternLine(" I ") + .patternLine("RCR")) + + ; + + public MechanicalCraftingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + GeneratedRecipeBuilder create(Supplier result) { + return new GeneratedRecipeBuilder(result); + } + + class GeneratedRecipeBuilder { + + private String suffix; + private Supplier result; + private int amount; + + public GeneratedRecipeBuilder(Supplier result) { + this.suffix = ""; + this.result = result; + this.amount = 1; + } + + GeneratedRecipeBuilder returns(int amount) { + this.amount = amount; + return this; + } + + GeneratedRecipeBuilder withSuffix(String suffix) { + this.suffix = suffix; + return this; + } + + GeneratedRecipe recipe(UnaryOperator builder) { + return register(consumer -> { + MechanicalCraftingRecipeBuilder b = + builder.apply(MechanicalCraftingRecipeBuilder.shapedRecipe(result.get(), amount)); + ResourceLocation location = Create.asResource("mechanical_crafting/" + result.get() + .asItem() + .getRegistryName() + .getPath() + suffix); + b.build(consumer, location); + }); + } + } + + @Override + public String getName() { + return "Create's Mechanical Crafting Recipes"; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java new file mode 100644 index 000000000..2064e4103 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java @@ -0,0 +1,200 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.palettes.AllPaletteBlocks; +import com.tterrag.registrate.util.entry.ItemEntry; + +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.tags.ItemTags; + +public class MillingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + GRANITE = create(() -> Blocks.GRANITE, b -> b.duration(200) + .output(Blocks.RED_SAND)), + + WOOL = create("wool", b -> b.duration(100) + .require(ItemTags.WOOL) + .output(Items.STRING)), + + CLAY = create(() -> Blocks.CLAY, b -> b.duration(50) + .output(Items.CLAY_BALL, 3) + .output(.5f, Items.CLAY_BALL)), + + TERRACOTTA = create(() -> Blocks.TERRACOTTA, b -> b.duration(200) + .output(Blocks.RED_SAND)), + ANDESITE = create(() -> Blocks.ANDESITE, b -> b.duration(200) + .output(Blocks.COBBLESTONE)), + COBBLESTONE = create(() -> Blocks.COBBLESTONE, b -> b.duration(250) + .output(Blocks.GRAVEL)), + GRAVEL = create(() -> Blocks.GRAVEL, b -> b.duration(250) + .output(Items.FLINT)), + SAND = create(() -> Blocks.SAND, b -> b.duration(150) + .output(AllPaletteBlocks.LIMESAND.get())), + DIORITE = create(() -> Blocks.DIORITE, b -> b.duration(200) + .output(AllPaletteBlocks.LIMESAND.get())), + + COPPER_ORE = metalOre("copper", AllItems.CRUSHED_COPPER, 350), + ZINC_ORE = metalOre("zinc", AllItems.CRUSHED_ZINC, 350), + IRON_ORE = metalOre("iron", AllItems.CRUSHED_IRON, 400), + GOLD_ORE = metalOre("gold", AllItems.CRUSHED_GOLD, 300), + + WHEAT = create(() -> Items.WHEAT, b -> b.duration(150) + .output(AllItems.WHEAT_FLOUR.get()) + .output(.25f, AllItems.WHEAT_FLOUR.get(), 2) + .output(.25f, Items.WHEAT_SEEDS)), + + BONE = create(() -> Items.BONE, b -> b.duration(100) + .output(Items.BONE_MEAL, 3) + .output(.25f, Items.WHITE_DYE, 1) + .output(.25f, Items.BONE_MEAL, 3)), + + CACTUS = create(() -> Blocks.CACTUS, b -> b.duration(50) + .output(Items.GREEN_DYE, 2) + .output(.1f, Items.GREEN_DYE, 1) + .whenModMissing("quark")), + + BONE_MEAL = create(() -> Items.BONE_MEAL, b -> b.duration(70) + .output(Items.WHITE_DYE, 2) + .output(.1f, Items.LIGHT_GRAY_DYE, 1)), + + COCOA_BEANS = create(() -> Items.COCOA_BEANS, b -> b.duration(70) + .output(Items.BROWN_DYE, 2) + .output(.1f, Items.BROWN_DYE, 1)), + + SADDLE = create(() -> Items.SADDLE, b -> b.duration(200) + .output(Items.LEATHER, 2) + .output(.5f, Items.LEATHER, 2)), + + SUGAR_CANE = create(() -> Items.SUGAR_CANE, b -> b.duration(50) + .output(Items.SUGAR, 2) + .output(.1f, Items.SUGAR)), + + INK_SAC = create(() -> Items.INK_SAC, b -> b.duration(100) + .output(Items.BLACK_DYE, 2) + .output(.1f, Items.GRAY_DYE)), + + CHARCOAL = create(() -> Items.CHARCOAL, b -> b.duration(100) + .output(Items.BLACK_DYE, 1) + .output(.1f, Items.GRAY_DYE, 2)), + + COAL = create(() -> Items.COAL, b -> b.duration(100) + .output(Items.BLACK_DYE, 2) + .output(.1f, Items.GRAY_DYE, 1)), + + LAPIS_LAZULI = create(() -> Items.LAPIS_LAZULI, b -> b.duration(100) + .output(Items.BLUE_DYE, 2) + .output(.1f, Items.BLUE_DYE)), + + AZURE_BLUET = create(() -> Blocks.AZURE_BLUET, b -> b.duration(50) + .output(Items.LIGHT_GRAY_DYE, 2) + .output(.1f, Items.WHITE_DYE, 2)), + + BLUE_ORCHID = create(() -> Blocks.BLUE_ORCHID, b -> b.duration(50) + .output(Items.LIGHT_BLUE_DYE, 2) + .output(.05f, Items.LIGHT_GRAY_DYE, 1)), + + FERN = create(() -> Blocks.FERN, b -> b.duration(50) + .output(Items.GREEN_DYE) + .output(.1f, Items.WHEAT_SEEDS)), + + LARGE_FERN = create(() -> Blocks.LARGE_FERN, b -> b.duration(50) + .output(Items.GREEN_DYE, 2) + .output(.5f, Items.GREEN_DYE) + .output(.1f, Items.WHEAT_SEEDS)), + + LILAC = create(() -> Blocks.LILAC, b -> b.duration(100) + .output(Items.MAGENTA_DYE, 3) + .output(.25f, Items.MAGENTA_DYE) + .output(.25f, Items.PURPLE_DYE)), + + PEONY = create(() -> Blocks.PEONY, b -> b.duration(100) + .output(Items.PINK_DYE, 3) + .output(.25f, Items.MAGENTA_DYE) + .output(.25f, Items.PINK_DYE)), + + ALLIUM = create(() -> Blocks.ALLIUM, b -> b.duration(50) + .output(Items.MAGENTA_DYE, 2) + .output(.1f, Items.PURPLE_DYE, 2) + .output(.1f, Items.PINK_DYE)), + + LILY_OF_THE_VALLEY = create(() -> Blocks.LILY_OF_THE_VALLEY, b -> b.duration(50) + .output(Items.WHITE_DYE, 2) + .output(.1f, Items.LIME_DYE) + .output(.1f, Items.WHITE_DYE)), + + ROSE_BUSH = create(() -> Blocks.ROSE_BUSH, b -> b.duration(50) + .output(Items.RED_DYE, 3) + .output(.05f, Items.GREEN_DYE, 2) + .output(.25f, Items.RED_DYE, 2)), + + SUNFLOWER = create(() -> Blocks.SUNFLOWER, b -> b.duration(100) + .output(Items.YELLOW_DYE, 3) + .output(.25f, Items.ORANGE_DYE) + .output(.25f, Items.YELLOW_DYE)), + + OXEYE_DAISY = create(() -> Blocks.OXEYE_DAISY, b -> b.duration(50) + .output(Items.LIGHT_GRAY_DYE, 2) + .output(.2f, Items.WHITE_DYE) + .output(.05f, Items.YELLOW_DYE)), + + POPPY = create(() -> Blocks.POPPY, b -> b.duration(50) + .output(Items.RED_DYE, 2) + .output(.05f, Items.GREEN_DYE)), + + DANDELION = create(() -> Blocks.DANDELION, b -> b.duration(50) + .output(Items.YELLOW_DYE, 2) + .output(.05f, Items.YELLOW_DYE)), + + CORNFLOWER = create(() -> Blocks.CORNFLOWER, b -> b.duration(50) + .output(Items.BLUE_DYE, 2)), + + WITHER_ROSE = create(() -> Blocks.WITHER_ROSE, b -> b.duration(50) + .output(Items.BLACK_DYE, 2) + .output(.1f, Items.BLACK_DYE)), + + ORANGE_TULIP = create(() -> Blocks.ORANGE_TULIP, b -> b.duration(50) + .output(Items.ORANGE_DYE, 2) + .output(.1f, Items.LIME_DYE)), + + RED_TULIP = create(() -> Blocks.RED_TULIP, b -> b.duration(50) + .output(Items.RED_DYE, 2) + .output(.1f, Items.LIME_DYE)), + + WHITE_TULIP = create(() -> Blocks.WHITE_TULIP, b -> b.duration(50) + .output(Items.WHITE_DYE, 2) + .output(.1f, Items.LIME_DYE)), + + PINK_TULIP = create(() -> Blocks.PINK_TULIP, b -> b.duration(50) + .output(Items.PINK_DYE, 2) + .output(.1f, Items.LIME_DYE)), + + TALL_GRASS = create(() -> Blocks.TALL_GRASS, b -> b.duration(100) + .output(.5f, Items.WHEAT_SEEDS)), + GRASS = create(() -> Blocks.GRASS, b -> b.duration(50) + .output(.25f, Items.WHEAT_SEEDS)) + + ; + + protected GeneratedRecipe metalOre(String name, ItemEntry crushed, int duration) { + return create(name + "_ore", b -> b.duration(duration) + .require(AllTags.forgeItemTag("ores/" + name)) + .output(crushed.get())); + } + + public MillingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.MILLING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java new file mode 100644 index 000000000..524846b60 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -0,0 +1,63 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.contraptions.processing.HeatCondition; + +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Items; +import net.minecraft.tags.ItemTags; +import net.minecraftforge.common.Tags; + +public class MixingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + BRASS_INGOT = create("brass_ingot", b -> b.require(I.copper()) + .require(I.zinc()) + .output(AllItems.BRASS_INGOT.get(), 2) + .requiresHeat(HeatCondition.HEATED)), + + CRUSHED_BRASS = create("crushed_brass", b -> b.require(AllItems.CRUSHED_COPPER.get()) + .require(AllItems.CRUSHED_ZINC.get()) + .output(AllItems.CRUSHED_BRASS.get(), 2) + .requiresHeat(HeatCondition.HEATED)), + + GUNPOWDER = create("gunpowder", b -> b.require(ItemTags.COALS) + .require(AllItems.CRUSHED_ZINC.get()) + .require(Items.GUNPOWDER) + .output(Items.GUNPOWDER, 2) + .requiresHeat(HeatCondition.HEATED)), + + CHROMATIC_COMPOUND = create("chromatic_compound", b -> b.require(Tags.Items.DUSTS_GLOWSTONE) + .require(Tags.Items.DUSTS_GLOWSTONE) + .require(Tags.Items.DUSTS_GLOWSTONE) + .require(AllItems.POWDERED_OBSIDIAN.get()) + .require(AllItems.POWDERED_OBSIDIAN.get()) + .require(AllItems.POWDERED_OBSIDIAN.get()) + .require(AllItems.POLISHED_ROSE_QUARTZ.get()) + .output(AllItems.CHROMATIC_COMPOUND.get(), 1) + .requiresHeat(HeatCondition.SUPERHEATED)), + + ANDESITE_ALLOY = create("andesite_alloy", b -> b.require(Blocks.ANDESITE) + .require(AllTags.forgeItemTag("nuggets/iron")) + .output(I.andesite(), 1)), + + ANDESITE_ALLOY_FROM_ZINC = create("andesite_alloy_from_zinc", b -> b.require(Blocks.ANDESITE) + .require(I.zincNugget()) + .output(I.andesite(), 1)) + + ; + + public MixingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.MIXING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PolishingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PolishingRecipeGen.java new file mode 100644 index 000000000..8f1ea96aa --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PolishingRecipeGen.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; + +import net.minecraft.data.DataGenerator; + +public class PolishingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + ROSE_QUARTZ = create(AllItems.ROSE_QUARTZ::get, b -> b.output(AllItems.POLISHED_ROSE_QUARTZ.get())) + + ; + + public PolishingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.SANDPAPER_POLISHING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java new file mode 100644 index 000000000..2fff1d3ea --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -0,0 +1,38 @@ +package com.simibubi.create.foundation.data.recipe; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; + +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Items; + +public class PressingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + SUGAR_CANE = create(() -> Items.SUGAR_CANE, b -> b.output(Items.PAPER)), + + IRON = create("iron_ingot", b -> b.require(I.iron()) + .output(AllItems.IRON_SHEET.get())), + GOLD = create("gold_ingot", b -> b.require(I.gold()) + .output(AllItems.GOLDEN_SHEET.get())), + COPPER = create("copper_ingot", b -> b.require(I.copper()) + .output(AllItems.COPPER_SHEET.get())), + LAPIS = create("lapis_block", b -> b.require(Blocks.LAPIS_BLOCK) + .output(AllItems.LAPIS_SHEET.get())), + BRASS = create("brass_ingot", b -> b.require(I.brass()) + .output(AllItems.BRASS_SHEET.get())) + + ; + + public PressingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.PRESSING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java new file mode 100644 index 000000000..a5daca809 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java @@ -0,0 +1,108 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DirectoryCache; +import net.minecraft.data.IDataProvider; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.IItemProvider; +import net.minecraftforge.fluids.FluidAttributes; + +public abstract class ProcessingRecipeGen extends CreateRecipeProvider { + + protected static List generators = new ArrayList<>(); + protected static final int BUCKET = FluidAttributes.BUCKET_VOLUME; + protected static final int BOTTLE = 250; + + public static void registerAll(DataGenerator gen) { + generators.add(new CrushingRecipeGen(gen)); + generators.add(new MillingRecipeGen(gen)); + generators.add(new CuttingRecipeGen(gen)); + generators.add(new WashingRecipeGen(gen)); + generators.add(new PolishingRecipeGen(gen)); + generators.add(new MixingRecipeGen(gen)); + generators.add(new PressingRecipeGen(gen)); + generators.add(new FillingRecipeGen(gen)); + + gen.addProvider(new IDataProvider() { + + @Override + public String getName() { + return "Create's Processing Recipes"; + } + + @Override + public void act(DirectoryCache dc) throws IOException { + generators.forEach(g -> { + try { + g.act(dc); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + }); + } + + public ProcessingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + /** + * Create a processing recipe with a single itemstack ingredient, using its id + * as the name of the recipe + */ + protected > GeneratedRecipe create(Supplier singleIngredient, + UnaryOperator> transform) { + ProcessingRecipeSerializer serializer = getSerializer(); + GeneratedRecipe generatedRecipe = c -> { + IItemProvider iItemProvider = singleIngredient.get(); + transform + .apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), Create.asResource(iItemProvider.asItem() + .getRegistryName() + .getPath())).withItemIngredients(Ingredient.fromItems(iItemProvider))) + .build(c); + }; + all.add(generatedRecipe); + return generatedRecipe; + } + + /** + * Create a new processing recipe, with recipe definitions provided by the + * function + */ + protected > GeneratedRecipe create(String name, + UnaryOperator> transform) { + ProcessingRecipeSerializer serializer = getSerializer(); + GeneratedRecipe generatedRecipe = + c -> transform.apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), Create.asResource(name))) + .build(c); + all.add(generatedRecipe); + return generatedRecipe; + } + + @SuppressWarnings("unchecked") + private > ProcessingRecipeSerializer getSerializer() { + ProcessingRecipeSerializer serializer = (ProcessingRecipeSerializer) getRecipeType().serializer; + return serializer; + } + + @Override + public final String getName() { + return "Create's Processing Recipes: " + getRecipeType(); + } + + protected abstract AllRecipeTypes getRecipeType(); + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java new file mode 100644 index 000000000..cd8f69208 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -0,0 +1,1085 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.util.List; +import java.util.function.UnaryOperator; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableList; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllTags; +import com.simibubi.create.Create; +import com.simibubi.create.content.AllSections; +import com.simibubi.create.content.palettes.AllPaletteBlocks; +import com.simibubi.create.foundation.utility.Lang; +import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.entry.ItemProviderEntry; + +import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.data.CookingRecipeBuilder; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.ShapedRecipeBuilder; +import net.minecraft.data.ShapelessRecipeBuilder; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.CookingRecipeSerializer; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.Tags; + +@SuppressWarnings("unused") +public class StandardRecipeGen extends CreateRecipeProvider { + + /* + * Recipes are added through fields, so one can navigate to the right one easily + * + * (Ctrl-o) in Eclipse + */ + + private Marker MATERIALS = enterSection(AllSections.MATERIALS); + + GeneratedRecipe + + COPPER_COMPACTING = + metalCompacting(ImmutableList.of(AllItems.COPPER_NUGGET, AllItems.COPPER_INGOT, AllBlocks.COPPER_BLOCK), + ImmutableList.of(I::copperNugget, I::copper, I::copperBlock)), + + BRASS_COMPACTING = + metalCompacting(ImmutableList.of(AllItems.BRASS_NUGGET, AllItems.BRASS_INGOT, AllBlocks.BRASS_BLOCK), + ImmutableList.of(I::brassNugget, I::brass, I::brassBlock)), + + ZINC_COMPACTING = + metalCompacting(ImmutableList.of(AllItems.ZINC_NUGGET, AllItems.ZINC_INGOT, AllBlocks.ZINC_BLOCK), + ImmutableList.of(I::zincNugget, I::zinc, I::zincBlock)), + + ANDESITE_ALLOY = create(AllItems.ANDESITE_ALLOY).unlockedByTag(I::iron) + .viaShaped(b -> b.key('A', Blocks.ANDESITE) + .key('B', Tags.Items.NUGGETS_IRON) + .patternLine("BA") + .patternLine("AB")), + + ANDESITE_ALLOY_FROM_ZINC = create(AllItems.ANDESITE_ALLOY).withSuffix("_from_zinc") + .unlockedByTag(I::zinc) + .viaShaped(b -> b.key('A', Blocks.ANDESITE) + .key('B', I.zincNugget()) + .patternLine("BA") + .patternLine("AB")), + + ANDESITE_CASING = create(AllBlocks.ANDESITE_CASING).returns(4) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', ItemTags.PLANKS) + .key('C', I.andesite()) + .key('S', ItemTags.LOGS) + .patternLine("AAA") + .patternLine("CSC") + .patternLine("AAA")), + + BRASS_CASING = create(AllBlocks.BRASS_CASING).returns(4) + .unlockedByTag(I::brass) + .viaShaped(b -> b.key('A', ItemTags.PLANKS) + .key('C', I.brassSheet()) + .key('S', ItemTags.LOGS) + .patternLine("AAA") + .patternLine("CSC") + .patternLine("AAA")), + + COPPER_CASING = create(AllBlocks.COPPER_CASING).returns(4) + .unlockedByTag(I::copper) + .viaShaped(b -> b.key('A', ItemTags.PLANKS) + .key('C', I.copperSheet()) + .key('S', ItemTags.LOGS) + .patternLine("AAA") + .patternLine("CSC") + .patternLine("AAA")), + + RADIANT_CASING = create(AllBlocks.REFINED_RADIANCE_CASING).returns(4) + .unlockedBy(I::refinedRadiance) + .viaShaped(b -> b.key('A', ItemTags.PLANKS) + .key('C', I.refinedRadiance()) + .key('S', Tags.Items.GLASS_COLORLESS) + .patternLine("AAA") + .patternLine("CSC") + .patternLine("AAA")), + + SHADOW_CASING = create(AllBlocks.SHADOW_STEEL_CASING).returns(4) + .unlockedBy(I::shadowSteel) + .viaShaped(b -> b.key('A', ItemTags.PLANKS) + .key('C', I.shadowSteel()) + .key('S', Tags.Items.OBSIDIAN) + .patternLine("AAA") + .patternLine("CSC") + .patternLine("AAA")), + + ELECTRON_TUBE = create(AllItems.ELECTRON_TUBE).unlockedBy(AllItems.ROSE_QUARTZ::get) + .viaShaped(b -> b.key('L', AllItems.POLISHED_ROSE_QUARTZ.get()) + .key('R', Items.REDSTONE_TORCH) + .key('N', Tags.Items.NUGGETS_IRON) + .patternLine("L") + .patternLine("R") + .patternLine("N")), + + ROSE_QUARTZ = create(AllItems.ROSE_QUARTZ).unlockedBy(() -> Items.REDSTONE) + .viaShapeless(b -> b.addIngredient(Tags.Items.GEMS_QUARTZ) + .addIngredient(Ingredient.fromTag(I.redstone()), 8)), + + SAND_PAPER = create(AllItems.SAND_PAPER).unlockedBy(() -> Items.PAPER) + .viaShapeless(b -> b.addIngredient(Items.PAPER) + .addIngredient(Tags.Items.SAND_COLORLESS)), + + RED_SAND_PAPER = create(AllItems.RED_SAND_PAPER).unlockedBy(() -> Items.PAPER) + .viaShapeless(b -> b.addIngredient(Items.PAPER) + .addIngredient(Tags.Items.SAND_RED)) + + ; + + private Marker CURIOSITIES = enterSection(AllSections.CURIOSITIES); + + GeneratedRecipe DEFORESTER = create(AllItems.DEFORESTER).unlockedBy(I::refinedRadiance) + .viaShaped(b -> b.key('E', I.refinedRadiance()) + .key('G', I.cog()) + .key('O', Tags.Items.OBSIDIAN) + .patternLine("EG") + .patternLine("EO") + .patternLine(" O")), + + WAND_OF_SYMMETRY = create(AllItems.WAND_OF_SYMMETRY).unlockedBy(I::refinedRadiance) + .viaShaped(b -> b.key('E', I.refinedRadiance()) + .key('G', Tags.Items.GLASS_PANES_WHITE) + .key('O', Tags.Items.OBSIDIAN) + .key('L', I.brass()) + .patternLine(" GE") + .patternLine("LEG") + .patternLine("OL ")), + + MINECART_COUPLING = create(AllItems.MINECART_COUPLING).unlockedBy(I::andesite) + .viaShaped(b -> b.key('E', I.andesite()) + .key('O', I.ironSheet()) + .patternLine(" E") + .patternLine(" O ") + .patternLine("E ")), + + BLOCKZAPPER = create(AllItems.BLOCKZAPPER).unlockedBy(I::refinedRadiance) + .viaShaped(b -> b.key('E', I.refinedRadiance()) + .key('A', I.andesite()) + .key('O', Tags.Items.OBSIDIAN) + .patternLine(" E") + .patternLine(" O ") + .patternLine("OA ")) + + ; + + private Marker KINETICS = enterSection(AllSections.KINETICS); + + GeneratedRecipe BASIN = create(AllBlocks.BASIN).unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .patternLine("A A") + .patternLine("AAA")), + + GOGGLES = create(AllItems.GOGGLES).unlockedBy(I::andesite) + .viaShaped(b -> b.key('G', Tags.Items.GLASS) + .key('P', I.goldSheet()) + .key('S', Tags.Items.STRING) + .patternLine(" S ") + .patternLine("GPG")), + + WRENCH = create(AllItems.WRENCH).unlockedBy(I::andesite) + .viaShaped(b -> b.key('G', I.goldSheet()) + .key('P', I.cog()) + .key('S', Tags.Items.RODS_WOODEN) + .patternLine("GG") + .patternLine("GP") + .patternLine(" S")), + + FILTER = create(AllItems.FILTER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.WOOL) + .key('A', Tags.Items.NUGGETS_IRON) + .patternLine("ASA")), + + ATTRIBUTE_FILTER = create(AllItems.ATTRIBUTE_FILTER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.WOOL) + .key('A', I.copperNugget()) + .patternLine("ASA")), + + BRASS_HAND = create(AllItems.BRASS_HAND).unlockedByTag(I::brass) + .viaShaped(b -> b.key('A', I.andesite()) + .key('B', I.brassSheet()) + .patternLine(" A ") + .patternLine("BBB") + .patternLine(" B ")), + + SUPER_GLUE = create(AllItems.SUPER_GLUE).unlockedByTag(I::ironSheet) + .viaShaped(b -> b.key('A', Tags.Items.SLIMEBALLS) + .key('S', I.ironSheet()) + .key('N', Tags.Items.NUGGETS_IRON) + .patternLine("AS") + .patternLine("NA")), + + CRAFTER_SLOT_COVER = create(AllItems.CRAFTER_SLOT_COVER).unlockedBy(AllBlocks.MECHANICAL_CRAFTER::get) + .viaShaped(b -> b.key('A', I.brassNugget()) + .patternLine("AAA")), + + COGWHEEL = create(AllBlocks.COGWHEEL).returns(8) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.WOODEN_BUTTONS) + .key('C', I.andesite()) + .patternLine("SSS") + .patternLine("SCS") + .patternLine("SSS")), + + LARGE_COGWHEEL = create(AllBlocks.LARGE_COGWHEEL).returns(2) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.WOODEN_BUTTONS) + .key('C', I.andesite()) + .key('D', ItemTags.PLANKS) + .patternLine("SDS") + .patternLine("DCD") + .patternLine("SDS")), + + WATER_WHEEL = create(AllBlocks.WATER_WHEEL).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.WOODEN_SLABS) + .key('C', AllBlocks.LARGE_COGWHEEL.get()) + .patternLine("SSS") + .patternLine("SCS") + .patternLine("SSS")), + + SHAFT = create(AllBlocks.SHAFT).returns(8) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .patternLine("A") + .patternLine("A")), + + MECHANICAL_PRESS = create(AllBlocks.MECHANICAL_PRESS).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('B', I.andesite()) + .key('S', I.cog()) + .key('C', I.andesiteCasing()) + .key('I', AllTags.forgeItemTag("storage_blocks/iron")) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + MILLSTONE = create(AllBlocks.MILLSTONE).unlockedBy(I::andesite) + .viaShaped(b -> b.key('B', ItemTags.PLANKS) + .key('S', I.andesite()) + .key('C', I.cog()) + .key('I', I.stone()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + MECHANICAL_PISTON = create(AllBlocks.MECHANICAL_PISTON).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('B', ItemTags.PLANKS) + .key('S', I.cog()) + .key('C', I.andesiteCasing()) + .key('I', AllBlocks.PISTON_EXTENSION_POLE.get()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + STICKY_MECHANICAL_PISTON = create(AllBlocks.STICKY_MECHANICAL_PISTON).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', Tags.Items.SLIMEBALLS) + .key('P', AllBlocks.MECHANICAL_PISTON.get()) + .patternLine("S") + .patternLine("P")), + + TURNTABLE = create(AllBlocks.TURNTABLE).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.shaft()) + .key('P', ItemTags.WOODEN_SLABS) + .patternLine("P") + .patternLine("S")), + + PISTON_EXTENSION_POLE = create(AllBlocks.PISTON_EXTENSION_POLE).returns(8) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .key('P', ItemTags.PLANKS) + .patternLine("P") + .patternLine("A") + .patternLine("P")), + + ANALOG_LEVER = create(AllBlocks.ANALOG_LEVER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.andesiteCasing()) + .key('P', Tags.Items.RODS_WOODEN) + .patternLine("P") + .patternLine("S")), + + BELT_CONNECTOR = create(AllItems.BELT_CONNECTOR).unlockedBy(I::andesite) + .viaShaped(b -> b.key('D', Items.DRIED_KELP) + .patternLine("DDD") + .patternLine("DDD")), + + ADJUSTABLE_PULLEY = create(AllBlocks.ADJUSTABLE_PULLEY).unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('A', I.electronTube()) + .key('B', AllBlocks.ENCASED_BELT.get()) + .key('C', AllBlocks.LARGE_COGWHEEL.get()) + .patternLine("A") + .patternLine("B") + .patternLine("C")), + + CART_ASSEMBLER = create(AllBlocks.CART_ASSEMBLER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('L', ItemTags.LOGS) + .key('R', I.redstone()) + .key('C', I.andesite()) + .patternLine(" L ") + .patternLine("CRC") + .patternLine("L L")), + + HAND_CRANK = create(AllBlocks.HAND_CRANK).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.andesite()) + .key('C', ItemTags.PLANKS) + .key('B', I.brass()) + .patternLine(" B ") + .patternLine("CCC") + .patternLine(" S")), + + NOZZLE = create(AllBlocks.NOZZLE).unlockedBy(AllBlocks.ENCASED_FAN::get) + .viaShaped(b -> b.key('S', I.andesite()) + .key('C', ItemTags.WOOL) + .patternLine(" S ") + .patternLine(" C ") + .patternLine("SSS")), + + PROPELLER = create(AllItems.PROPELLER).unlockedByTag(I::ironSheet) + .viaShaped(b -> b.key('S', I.ironSheet()) + .key('C', I.andesite()) + .patternLine(" S ") + .patternLine("SCS") + .patternLine(" S ")), + + WHISK = create(AllItems.WHISK).unlockedByTag(I::ironSheet) + .viaShaped(b -> b.key('S', I.ironSheet()) + .key('C', I.andesite()) + .patternLine(" C ") + .patternLine("SCS") + .patternLine("SSS")), + + ENCASED_FAN = create(AllBlocks.ENCASED_FAN).unlockedByTag(I::ironSheet) + .viaShaped(b -> b.key('S', I.shaft()) + .key('A', I.andesite()) + .key('R', ItemTags.PLANKS) + .key('B', Items.IRON_BARS) + .key('P', AllItems.PROPELLER.get()) + .patternLine(" S ") + .patternLine("RAR") + .patternLine("BPB")), + + CUCKOO_CLOCK = create(AllBlocks.CUCKOO_CLOCK).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', ItemTags.PLANKS) + .key('A', Items.CLOCK) + .key('B', ItemTags.LOGS) + .key('P', I.cog()) + .patternLine(" S ") + .patternLine("SAS") + .patternLine("BPB")), + + MECHANICAL_CRAFTER = create(AllBlocks.MECHANICAL_CRAFTER).returns(3) + .unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('B', I.electronTube()) + .key('R', Blocks.CRAFTING_TABLE) + .key('C', I.brassCasing()) + .key('S', I.cog()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" R ")), + + MECHANICAL_BEARING = create(AllBlocks.MECHANICAL_BEARING).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('I', I.shaft()) + .key('S', I.andesite()) + .key('B', AllBlocks.TURNTABLE.get()) + .key('C', I.andesiteCasing()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + CLOCKWORK_BEARING = create(AllBlocks.CLOCKWORK_BEARING).unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('I', I.shaft()) + .key('S', I.electronTube()) + .key('B', AllBlocks.TURNTABLE.get()) + .key('C', I.brassCasing()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + FLUID_PIPE = create(AllBlocks.FLUID_PIPE).returns(16) + .unlockedByTag(I::copper) + .viaShaped(b -> b.key('S', I.copperSheet()) + .key('C', I.copper()) + .patternLine("SCS")), + + MECHANICAL_PUMP = create(AllBlocks.MECHANICAL_PUMP).unlockedByTag(I::copper) + .viaShaped(b -> b.key('P', I.cog()) + .key('S', AllBlocks.FLUID_PIPE.get()) + .patternLine("P") + .patternLine("S")), + + SPOUT = create(AllBlocks.SPOUT).unlockedBy(I::copperCasing) + .viaShaped(b -> b.key('T', AllBlocks.FLUID_TANK.get()) + .key('P', Items.DRIED_KELP) + .key('S', I.copperNugget()) + .patternLine("T") + .patternLine("P") + .patternLine("S")), + + FLUID_TANK = create(AllBlocks.FLUID_TANK).returns(2) + .unlockedBy(I::copperCasing) + .viaShaped(b -> b.key('B', I.copperCasing()) + .key('S', I.copperNugget()) + .key('C', Tags.Items.GLASS) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" B ")), + + DEPLOYER = create(AllBlocks.DEPLOYER).unlockedBy(I::electronTube) + .viaShaped(b -> b.key('I', AllItems.BRASS_HAND.get()) + .key('B', I.electronTube()) + .key('S', I.cog()) + .key('C', I.andesiteCasing()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + ROPE_PULLEY = create(AllBlocks.ROPE_PULLEY).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.shaft()) + .key('B', I.andesiteCasing()) + .key('C', ItemTags.WOOL) + .key('I', I.ironSheet()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + EMPTY_BLAZE_BURNER = create(AllItems.EMPTY_BLAZE_BURNER).unlockedByTag(I::iron) + .viaShaped(b -> b.key('A', Blocks.IRON_BARS) + .key('I', I.ironSheet()) + .patternLine("II") + .patternLine("AA")), + + CHUTE = create(AllBlocks.CHUTE).unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.ironSheet()) + .key('I', I.andesite()) + .patternLine("II") + .patternLine("AA")), + + DEPOT = create(AllBlocks.DEPOT).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('A', I.andesite()) + .key('I', I.andesiteCasing()) + .patternLine("A") + .patternLine("I")), + + MECHANICAL_MIXER = create(AllBlocks.MECHANICAL_MIXER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.cog()) + .key('B', I.andesite()) + .key('C', I.andesiteCasing()) + .key('I', AllItems.WHISK.get()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")), + + CLUTCH = create(AllBlocks.CLUTCH).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.shaft()) + .key('B', I.redstone()) + .key('C', I.andesiteCasing()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" B ")), + + GEARSHIFT = create(AllBlocks.GEARSHIFT).unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', I.cog()) + .key('B', I.redstone()) + .key('C', I.andesiteCasing()) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" B ")), + + RADIAL_CHASIS = create(AllBlocks.RADIAL_CHASSIS).returns(3) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('P', I.andesite()) + .key('L', ItemTags.LOGS) + .patternLine(" L ") + .patternLine("PLP") + .patternLine(" L ")), + + LINEAR_CHASIS = create(AllBlocks.LINEAR_CHASSIS).returns(3) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('P', I.andesite()) + .key('L', ItemTags.LOGS) + .patternLine(" P ") + .patternLine("LLL") + .patternLine(" P ")), + + LINEAR_CHASSIS_CYCLE = + conversionCycle(ImmutableList.of(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)), + + MINECART = create(() -> Items.MINECART).withSuffix("_from_contraption_cart") + .unlockedBy(AllBlocks.CART_ASSEMBLER::get) + .viaShapeless(b -> b.addIngredient(AllItems.MINECART_CONTRAPTION.get())), + + FURNACE_MINECART = create(() -> Items.FURNACE_MINECART).withSuffix("_from_contraption_cart") + .unlockedBy(AllBlocks.CART_ASSEMBLER::get) + .viaShapeless(b -> b.addIngredient(AllItems.FURNACE_MINECART_CONTRAPTION.get())), + + GEARBOX = create(AllBlocks.GEARBOX).unlockedBy(I::cog) + .viaShaped(b -> b.key('C', I.cog()) + .key('B', I.andesiteCasing()) + .patternLine(" C ") + .patternLine("CBC") + .patternLine(" C ")), + + GEARBOX_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX)), + + MYSTERIOUS_CUCKOO_CLOCK = create(AllBlocks.MYSTERIOUS_CUCKOO_CLOCK).unlockedBy(AllBlocks.CUCKOO_CLOCK::get) + .viaShaped(b -> b.key('C', Tags.Items.GUNPOWDER) + .key('B', AllBlocks.CUCKOO_CLOCK.get()) + .patternLine(" C ") + .patternLine("CBC") + .patternLine(" C ")), + + ENCASED_BELT = create(AllBlocks.ENCASED_BELT).returns(4) + .unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('C', I.andesiteCasing()) + .key('B', Items.DRIED_KELP) + .patternLine(" C ") + .patternLine("CBC") + .patternLine(" C ")), + + SPEEDOMETER = create(AllBlocks.SPEEDOMETER).unlockedBy(I::andesite) + .viaShaped(b -> b.key('C', Items.COMPASS) + .key('A', I.andesiteCasing()) + .key('S', I.shaft()) + .patternLine(" C ") + .patternLine("SAS")), + + GAUGE_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.SPEEDOMETER, AllBlocks.STRESSOMETER)), + + ROTATION_SPEED_CONTROLLER = create(AllBlocks.ROTATION_SPEED_CONTROLLER).unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('B', I.circuit()) + .key('C', I.brassCasing()) + .key('S', I.shaft()) + .patternLine(" B ") + .patternLine("SCS")), + + MECHANICAL_SAW = create(AllBlocks.MECHANICAL_SAW).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('C', I.andesiteCasing()) + .key('A', I.ironSheet()) + .key('I', I.iron()) + .patternLine(" A ") + .patternLine("AIA") + .patternLine(" C ")), + + MECHANICAL_HARVESTER = create(AllBlocks.MECHANICAL_HARVESTER).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('C', I.andesiteCasing()) + .key('A', I.andesite()) + .key('I', I.ironSheet()) + .patternLine("AIA") + .patternLine("AIA") + .patternLine(" C ")), + + MECHANICAL_PLOUGH = create(AllBlocks.MECHANICAL_PLOUGH).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('C', I.andesiteCasing()) + .key('A', I.andesite()) + .key('I', I.ironSheet()) + .patternLine("III") + .patternLine("AAA") + .patternLine(" C ")), + + MECHANICAL_DRILL = create(AllBlocks.MECHANICAL_DRILL).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('C', I.andesiteCasing()) + .key('A', I.andesite()) + .key('I', I.iron()) + .patternLine(" A ") + .patternLine("AIA") + .patternLine(" C ")), + + SEQUENCED_GEARSHIFT = create(AllBlocks.SEQUENCED_GEARSHIFT).unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('B', I.electronTube()) + .key('S', I.cog()) + .key('C', I.brassCasing()) + .key('I', Items.CLOCK) + .patternLine(" B ") + .patternLine("SCS") + .patternLine(" I ")) + + ; + + private Marker LOGISTICS = enterSection(AllSections.LOGISTICS); + + GeneratedRecipe + + REDSTONE_CONTACT = create(AllBlocks.REDSTONE_CONTACT).returns(2) + .unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('W', I.redstone()) + .key('D', I.brassCasing()) + .key('S', I.iron()) + .patternLine("WDW") + .patternLine(" S ") + .patternLine("WDW")), + + ANDESITE_FUNNEL = create(AllBlocks.ANDESITE_FUNNEL).returns(2) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .key('K', Items.DRIED_KELP) + .patternLine("AKA") + .patternLine(" K ")), + + BRASS_FUNNEL = create(AllBlocks.BRASS_FUNNEL).returns(2) + .unlockedByTag(I::brass) + .viaShaped(b -> b.key('A', I.brass()) + .key('K', Items.DRIED_KELP) + .key('E', I.electronTube()) + .patternLine("AEA") + .patternLine(" K ")), + + ANDESITE_TUNNEL = create(AllBlocks.ANDESITE_TUNNEL).returns(2) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .key('K', Items.DRIED_KELP) + .patternLine("AA") + .patternLine("KK")), + + BRASS_TUNNEL = create(AllBlocks.BRASS_TUNNEL).returns(2) + .unlockedByTag(I::brass) + .viaShaped(b -> b.key('A', I.brass()) + .key('K', Items.DRIED_KELP) + .key('E', I.electronTube()) + .patternLine("E ") + .patternLine("AA") + .patternLine("KK")), + + ADJUSTABLE_CRATE = create(AllBlocks.ADJUSTABLE_CRATE).returns(4) + .unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('B', I.brassCasing()) + .patternLine("BBB") + .patternLine("B B") + .patternLine("BBB")), + + BELT_OBSERVER = create(AllBlocks.BELT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get) + .viaShaped(b -> b.key('B', I.brassCasing()) + .key('R', I.redstone()) + .key('I', I.iron()) + .key('C', Blocks.OBSERVER) + .patternLine("RCI") + .patternLine(" B ")), + + STOCKPILE_SWITCH = create(AllBlocks.STOCKPILE_SWITCH).unlockedBy(I::brassCasing) + .viaShaped(b -> b.key('B', I.brassCasing()) + .key('R', I.redstone()) + .key('I', I.iron()) + .key('C', Blocks.COMPARATOR) + .patternLine("RCI") + .patternLine(" B ")), + + ADJUSTABLE_REPEATER = create(AllBlocks.ADJUSTABLE_REPEATER).unlockedByTag(I::redstone) + .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) + .key('C', Items.CLOCK) + .key('R', I.redstone()) + .key('S', I.stone()) + .patternLine("RCT") + .patternLine("SSS")), + + ADJUSTABLE_PULSE_REPEATER = create(AllBlocks.ADJUSTABLE_PULSE_REPEATER).unlockedByTag(I::redstone) + .viaShaped(b -> b.key('S', AllBlocks.PULSE_REPEATER.get()) + .key('P', AllBlocks.ADJUSTABLE_REPEATER.get()) + .patternLine("SP")), + + PULSE_REPEATER = create(AllBlocks.PULSE_REPEATER).unlockedByTag(I::redstone) + .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) + .key('R', I.redstone()) + .key('S', I.stone()) + .patternLine("RRT") + .patternLine("SSS")), + + POWERED_TOGGLE_LATCH = create(AllBlocks.POWERED_TOGGLE_LATCH).unlockedByTag(I::redstone) + .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) + .key('C', Blocks.LEVER) + .key('S', I.stone()) + .patternLine(" T ") + .patternLine(" C ") + .patternLine("SSS")), + + POWERED_LATCH = create(AllBlocks.POWERED_LATCH).unlockedByTag(I::redstone) + .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) + .key('C', Blocks.LEVER) + .key('R', I.redstone()) + .key('S', I.stone()) + .patternLine(" T ") + .patternLine("RCR") + .patternLine("SSS")), + + REDSTONE_LINK = create(AllBlocks.REDSTONE_LINK).returns(2) + .unlockedByTag(I::brass) + .viaShaped(b -> b.key('C', Blocks.REDSTONE_TORCH) + .key('S', I.brassSheet()) + .key('I', ItemTags.PLANKS) + .patternLine(" C") + .patternLine("SIS")) + + ; + + private Marker SCHEMATICS = enterSection(AllSections.SCHEMATICS); + + GeneratedRecipe + + SCHEMATIC_TABLE = create(AllBlocks.SCHEMATIC_TABLE).unlockedBy(AllItems.EMPTY_SCHEMATIC::get) + .viaShaped(b -> b.key('W', ItemTags.WOODEN_SLABS) + .key('S', Blocks.SMOOTH_STONE) + .patternLine("WWW") + .patternLine(" S ") + .patternLine(" S ")), + + SCHEMATICANNON = create(AllBlocks.SCHEMATICANNON).unlockedBy(AllItems.EMPTY_SCHEMATIC::get) + .viaShaped(b -> b.key('L', ItemTags.LOGS) + .key('D', Blocks.DISPENSER) + .key('C', Blocks.CAULDRON) + .key('S', Blocks.SMOOTH_STONE) + .key('I', Blocks.IRON_BLOCK) + .patternLine(" C ") + .patternLine("LDL") + .patternLine("SIS")), + + EMPTY_SCHEMATIC = create(AllItems.EMPTY_SCHEMATIC).unlockedBy(() -> Items.PAPER) + .viaShapeless(b -> b.addIngredient(Items.PAPER) + .addIngredient(Tags.Items.DYES_LIGHT_BLUE)), + + SCHEMATIC_AND_QUILL = create(AllItems.SCHEMATIC_AND_QUILL).unlockedBy(() -> Items.PAPER) + .viaShapeless(b -> b.addIngredient(AllItems.EMPTY_SCHEMATIC.get()) + .addIngredient(Tags.Items.FEATHERS)) + + ; + + private Marker PALETTES = enterSection(AllSections.PALETTES); + + GeneratedRecipe + + DARK_SCORIA = create(AllPaletteBlocks.DARK_SCORIA).returns(8) + .unlockedBy(() -> AllPaletteBlocks.SCORIA.get()) + .viaShaped(b -> b.key('#', AllPaletteBlocks.SCORIA.get()) + .key('D', Tags.Items.DYES_BLACK) + .patternLine("###") + .patternLine("#D#") + .patternLine("###")), + + COPPER_SHINGLES = create(AllBlocks.COPPER_SHINGLES).returns(16) + .unlockedByTag(I::copperSheet) + .viaShaped(b -> b.key('#', I.copperSheet()) + .patternLine("##") + .patternLine("##")), + + COPPER_SHINGLES_FROM_TILES = create(AllBlocks.COPPER_SHINGLES).withSuffix("_from_tiles") + .unlockedByTag(I::copperSheet) + .viaShapeless(b -> b.addIngredient(AllBlocks.COPPER_TILES.get())), + + COPPER_TILES = create(AllBlocks.COPPER_TILES).unlockedByTag(I::copperSheet) + .viaShapeless(b -> b.addIngredient(AllBlocks.COPPER_SHINGLES.get())) + + ; + + private Marker APPLIANCES = enterFolder("appliances"); + + GeneratedRecipe + + DOUGH = create(AllItems.DOUGH).unlockedBy(AllItems.WHEAT_FLOUR::get) + .viaShapeless(b -> b.addIngredient(AllItems.WHEAT_FLOUR.get()) + .addIngredient(Items.WATER_BUCKET)), + + SLIME_BALL = create(() -> Items.SLIME_BALL).unlockedBy(AllItems.DOUGH::get) + .viaShapeless(b -> b.addIngredient(AllItems.DOUGH.get()) + .addIngredient(Tags.Items.DYES_LIME)), + + TREE_FERTILIZER = create(AllItems.TREE_FERTILIZER).returns(2) + .unlockedBy(() -> Items.BONE_MEAL) + .viaShapeless(b -> b.addIngredient(Ingredient.fromTag(ItemTags.SMALL_FLOWERS), 2) + .addIngredient(Ingredient.fromItems(Items.HORN_CORAL, Items.BRAIN_CORAL, Items.TUBE_CORAL, + Items.BUBBLE_CORAL, Items.FIRE_CORAL)) + .addIngredient(Items.BONE_MEAL)) + + ; + + private Marker COOKING = enterFolder("/"); + + GeneratedRecipe + + DOUGH_TO_BREAD = create(() -> Items.BREAD).viaCooking(AllItems.DOUGH::get) + .inSmoker(), + + LIMESAND = create(AllPaletteBlocks.LIMESTONE::get).viaCooking(AllPaletteBlocks.LIMESAND::get) + .inFurnace(), + SOUL_SAND = create(AllPaletteBlocks.SCORIA::get).viaCooking(() -> Blocks.SOUL_SAND) + .inFurnace(), + DIORITE = create(AllPaletteBlocks.DOLOMITE::get).viaCooking(() -> Blocks.DIORITE) + .inFurnace(), + GRANITE = create(AllPaletteBlocks.GABBRO::get).viaCooking(() -> Blocks.GRANITE) + .inFurnace(), + + FRAMED_GLASS = recycleGlass(AllPaletteBlocks.FRAMED_GLASS), + TILED_GLASS = recycleGlass(AllPaletteBlocks.TILED_GLASS), + VERTICAL_FRAMED_GLASS = recycleGlass(AllPaletteBlocks.VERTICAL_FRAMED_GLASS), + HORIZONTAL_FRAMED_GLASS = recycleGlass(AllPaletteBlocks.HORIZONTAL_FRAMED_GLASS), + FRAMED_GLASS_PANE = recycleGlassPane(AllPaletteBlocks.FRAMED_GLASS_PANE), + TILED_GLASS_PANE = recycleGlassPane(AllPaletteBlocks.TILED_GLASS_PANE), + VERTICAL_FRAMED_GLASS_PANE = recycleGlassPane(AllPaletteBlocks.VERTICAL_FRAMED_GLASS_PANE), + HORIZONTAL_FRAMED_GLASS_PANE = recycleGlassPane(AllPaletteBlocks.HORIZONTAL_FRAMED_GLASS_PANE), + + COPPER_ORE = blastMetalOre(AllItems.COPPER_INGOT::get, AllTags.forgeItemTag("ores/copper")), + ZINC_ORE = blastMetalOre(AllItems.ZINC_INGOT::get, AllTags.forgeItemTag("ores/zinc")), + CRUSHED_IRON = blastCrushedMetal(() -> Items.IRON_INGOT, AllItems.CRUSHED_IRON::get), + CRUSHED_GOLD = blastCrushedMetal(() -> Items.GOLD_INGOT, AllItems.CRUSHED_GOLD::get), + CRUSHED_COPPER = blastCrushedMetal(AllItems.COPPER_INGOT::get, AllItems.CRUSHED_COPPER::get), + CRUSHED_ZINC = blastCrushedMetal(AllItems.ZINC_INGOT::get, AllItems.CRUSHED_ZINC::get), + CRUSHED_BRASS = blastCrushedMetal(AllItems.BRASS_INGOT::get, AllItems.CRUSHED_BRASS::get) + + ; + + /* + * End of recipe list + */ + + String currentFolder = ""; + + Marker enterSection(AllSections section) { + currentFolder = Lang.asId(section.name()); + return new Marker(); + } + + Marker enterFolder(String folder) { + currentFolder = folder; + return new Marker(); + } + + GeneratedRecipeBuilder create(Supplier result) { + return new GeneratedRecipeBuilder(currentFolder, result); + } + + GeneratedRecipeBuilder create(ItemProviderEntry result) { + return create(result::get); + } + + GeneratedRecipe blastCrushedMetal(Supplier result, + Supplier ingredient) { + return create(result::get).withSuffix("_from_crushed").viaCooking(ingredient::get) + .rewardXP(.1f) + .inBlastFurnace(); + } + + GeneratedRecipe blastMetalOre(Supplier result, Tag ore) { + return create(result::get).withSuffix("_from_ore").viaCookingTag(() -> ore) + .rewardXP(.1f) + .inBlastFurnace(); + } + + GeneratedRecipe recycleGlass(BlockEntry ingredient) { + return create(() -> Blocks.GLASS).withSuffix("_from_" + ingredient.getId() + .getPath()) + .viaCooking(ingredient::get) + .forDuration(50) + .inFurnace(); + } + + GeneratedRecipe recycleGlassPane(BlockEntry ingredient) { + return create(() -> Blocks.GLASS_PANE).withSuffix("_from_" + ingredient.getId() + .getPath()) + .viaCooking(ingredient::get) + .forDuration(50) + .inFurnace(); + } + + GeneratedRecipe metalCompacting(List> variants, + List>> ingredients) { + GeneratedRecipe result = null; + for (int i = 0; i + 1 < variants.size(); i++) { + ItemProviderEntry currentEntry = variants.get(i); + ItemProviderEntry nextEntry = variants.get(i + 1); + Supplier> currentIngredient = ingredients.get(i); + Supplier> nextIngredient = ingredients.get(i + 1); + + result = create(nextEntry).withSuffix("_from_compacting") + .unlockedBy(currentEntry::get) + .viaShaped(b -> b.patternLine("###") + .patternLine("###") + .patternLine("###") + .key('#', currentIngredient.get())); + + result = create(currentEntry).returns(9) + .withSuffix("_from_decompacting") + .unlockedBy(nextEntry::get) + .viaShapeless(b -> b.addIngredient(nextIngredient.get())); + } + return result; + } + + GeneratedRecipe conversionCycle(List> cycle) { + GeneratedRecipe result = null; + for (int i = 0; i < cycle.size(); i++) { + ItemProviderEntry currentEntry = cycle.get(i); + ItemProviderEntry nextEntry = cycle.get((i + 1) % cycle.size()); + result = create(nextEntry).withSuffix("from_conversion") + .unlockedBy(currentEntry::get) + .viaShapeless(b -> b.addIngredient(currentEntry.get())); + } + return result; + } + + class GeneratedRecipeBuilder { + + private String path; + private String suffix; + private Supplier result; + private Supplier unlockedBy; + private int amount; + + public GeneratedRecipeBuilder(String path, Supplier result) { + this.path = path; + this.suffix = ""; + this.result = result; + this.amount = 1; + } + + GeneratedRecipeBuilder returns(int amount) { + this.amount = amount; + return this; + } + + GeneratedRecipeBuilder unlockedBy(Supplier item) { + this.unlockedBy = () -> ItemPredicate.Builder.create() + .item(item.get()) + .build(); + return this; + } + + GeneratedRecipeBuilder unlockedByTag(Supplier> tag) { + this.unlockedBy = () -> ItemPredicate.Builder.create() + .tag(tag.get()) + .build(); + return this; + } + + GeneratedRecipeBuilder withSuffix(String suffix) { + this.suffix = suffix; + return this; + } + + GeneratedRecipe viaShaped(UnaryOperator builder) { + return register(consumer -> { + ShapedRecipeBuilder b = builder.apply(ShapedRecipeBuilder.shapedRecipe(result.get(), amount)); + if (unlockedBy != null) + b.addCriterion("has_item", hasItem(unlockedBy.get())); + b.build(consumer, createLocation("crafting")); + }); + } + + GeneratedRecipe viaShapeless(UnaryOperator builder) { + return register(consumer -> { + ShapelessRecipeBuilder b = builder.apply(ShapelessRecipeBuilder.shapelessRecipe(result.get(), amount)); + if (unlockedBy != null) + b.addCriterion("has_item", hasItem(unlockedBy.get())); + b.build(consumer, createLocation("crafting")); + }); + } + + private ResourceLocation createSimpleLocation(String recipeType) { + return Create.asResource(recipeType + "/" + result.get() + .asItem() + .getRegistryName() + .getPath() + suffix); + } + + private ResourceLocation createLocation(String recipeType) { + return Create.asResource(recipeType + "/" + path + "/" + result.get() + .asItem() + .getRegistryName() + .getPath() + suffix); + } + + GeneratedCookingRecipeBuilder viaCooking(Supplier item) { + return unlockedBy(item).viaCookingIngredient(() -> Ingredient.fromItems(item.get())); + } + + GeneratedCookingRecipeBuilder viaCookingTag(Supplier> tag) { + return unlockedByTag(tag).viaCookingIngredient(() -> Ingredient.fromTag(tag.get())); + } + + GeneratedCookingRecipeBuilder viaCookingIngredient(Supplier ingredient) { + return new GeneratedCookingRecipeBuilder(ingredient); + } + + class GeneratedCookingRecipeBuilder { + + private Supplier ingredient; + private float exp; + private int cookingTime; + + private final CookingRecipeSerializer FURNACE = IRecipeSerializer.SMELTING, + SMOKER = IRecipeSerializer.SMOKING, BLAST = IRecipeSerializer.BLASTING, + CAMPFIRE = IRecipeSerializer.CAMPFIRE_COOKING; + + GeneratedCookingRecipeBuilder(Supplier ingredient) { + this.ingredient = ingredient; + cookingTime = 200; + exp = 0; + } + + GeneratedCookingRecipeBuilder forDuration(int duration) { + cookingTime = duration; + return this; + } + + GeneratedCookingRecipeBuilder rewardXP(float xp) { + exp = xp; + return this; + } + + GeneratedRecipe inFurnace() { + return inFurnace(b -> b); + } + + GeneratedRecipe inFurnace(UnaryOperator builder) { + return create(FURNACE, builder, 1); + } + + GeneratedRecipe inSmoker() { + return inSmoker(b -> b); + } + + GeneratedRecipe inSmoker(UnaryOperator builder) { + create(FURNACE, builder, 1); + create(CAMPFIRE, builder, 3); + return create(SMOKER, builder, .5f); + } + + GeneratedRecipe inBlastFurnace() { + return inBlastFurnace(b -> b); + } + + GeneratedRecipe inBlastFurnace(UnaryOperator builder) { + create(FURNACE, builder, 1); + return create(BLAST, builder, .5f); + } + + private GeneratedRecipe create(CookingRecipeSerializer serializer, + UnaryOperator builder, float cookingTimeModifier) { + return register(consumer -> { + CookingRecipeBuilder b = builder.apply(CookingRecipeBuilder.cookingRecipe(ingredient.get(), + result.get(), exp, (int) (cookingTime * cookingTimeModifier), serializer)); + if (unlockedBy != null) + b.addCriterion("has_item", hasItem(unlockedBy.get())); + b.build(consumer, createSimpleLocation(serializer.getRegistryName() + .getPath())); + }); + } + + } + + } + + @Override + public String getName() { + return "Create's Standard Recipes"; + } + + public StandardRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java new file mode 100644 index 000000000..9efcdda26 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java @@ -0,0 +1,87 @@ +package com.simibubi.create.foundation.data.recipe; + +import java.util.function.Supplier; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.palettes.AllPaletteBlocks; +import com.tterrag.registrate.util.entry.ItemEntry; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.IItemProvider; +import net.minecraftforge.common.Tags; + +public class WashingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + WOOL = create("wool", b -> b.require(ItemTags.WOOL) + .output(Items.WHITE_WOOL)), + + STAINED_GLASS = create("stained_glass", b -> b.require(Tags.Items.STAINED_GLASS) + .output(Items.GLASS)), + STAINED_GLASS_PANE = create("stained_glass_pane", b -> b.require(Tags.Items.STAINED_GLASS_PANES) + .output(Items.GLASS_PANE)), + + GRAVEL = create(() -> Blocks.GRAVEL, b -> b.output(.25f, Items.FLINT) + .output(.125f, Items.IRON_NUGGET)), + SOUL_SAND = create(() -> Blocks.SOUL_SAND, b -> b.output(.125f, Items.QUARTZ, 4) + .output(.02f, Items.GOLD_NUGGET)), + RED_SAND = create(() -> Blocks.RED_SAND, b -> b.output(.125f, Items.GOLD_NUGGET, 3) + .output(.05f, Items.DEAD_BUSH)), + SAND = create(() -> Blocks.SAND, b -> b.output(.25f, Items.CLAY_BALL)), + + CRUSHED_COPPER = crushedOre(AllItems.CRUSHED_COPPER, AllItems.COPPER_NUGGET::get), + CRUSHED_ZINC = crushedOre(AllItems.CRUSHED_ZINC, AllItems.ZINC_NUGGET::get), + CRUSHED_BRASS = crushedOre(AllItems.CRUSHED_BRASS, AllItems.BRASS_NUGGET::get), + CRUSHED_GOLD = crushedOre(AllItems.CRUSHED_GOLD, () -> Items.GOLD_NUGGET), + CRUSHED_IRON = crushedOre(AllItems.CRUSHED_IRON, () -> Items.IRON_NUGGET), + + ICE = convert(Blocks.ICE, Blocks.PACKED_ICE), MAGMA_BLOCK = convert(Blocks.MAGMA_BLOCK, Blocks.OBSIDIAN), + + WHITE_CONCRETE = convert(Blocks.WHITE_CONCRETE_POWDER, Blocks.WHITE_CONCRETE), + ORANGE_CONCRETE = convert(Blocks.ORANGE_CONCRETE_POWDER, Blocks.ORANGE_CONCRETE), + MAGENTA_CONCRETE = convert(Blocks.MAGENTA_CONCRETE_POWDER, Blocks.MAGENTA_CONCRETE), + LIGHT_BLUE_CONCRETE = convert(Blocks.LIGHT_BLUE_CONCRETE_POWDER, Blocks.LIGHT_BLUE_CONCRETE), + LIME_CONCRETE = convert(Blocks.LIME_CONCRETE_POWDER, Blocks.LIME_CONCRETE), + YELLOW_CONCRETE = convert(Blocks.YELLOW_CONCRETE_POWDER, Blocks.YELLOW_CONCRETE), + PINK_CONCRETE = convert(Blocks.PINK_CONCRETE_POWDER, Blocks.PINK_CONCRETE), + LIGHT_GRAY_CONCRETE = convert(Blocks.LIGHT_GRAY_CONCRETE_POWDER, Blocks.LIGHT_GRAY_CONCRETE), + GRAY_CONCRETE = convert(Blocks.GRAY_CONCRETE_POWDER, Blocks.GRAY_CONCRETE), + PURPLE_CONCRETE = convert(Blocks.PURPLE_CONCRETE_POWDER, Blocks.PURPLE_CONCRETE), + GREEN_CONCRETE = convert(Blocks.GREEN_CONCRETE_POWDER, Blocks.GREEN_CONCRETE), + BROWN_CONCRETE = convert(Blocks.BROWN_CONCRETE_POWDER, Blocks.BROWN_CONCRETE), + RED_CONCRETE = convert(Blocks.RED_CONCRETE_POWDER, Blocks.RED_CONCRETE), + BLUE_CONCRETE = convert(Blocks.BLUE_CONCRETE_POWDER, Blocks.BLUE_CONCRETE), + CYAN_CONCRETE = convert(Blocks.CYAN_CONCRETE_POWDER, Blocks.CYAN_CONCRETE), + BLACK_CONCRETE = convert(Blocks.BLACK_CONCRETE_POWDER, Blocks.BLACK_CONCRETE), + + LIMESTONE = create(AllPaletteBlocks.LIMESTONE::get, b -> b.output(AllPaletteBlocks.WEATHERED_LIMESTONE.get())), + FLOUR = create(AllItems.WHEAT_FLOUR::get, b -> b.output(AllItems.DOUGH.get())) + + ; + + public GeneratedRecipe convert(Block block, Block result) { + return create(() -> block, b -> b.output(result)); + } + + public GeneratedRecipe crushedOre(ItemEntry crushed, Supplier nugget) { + return create(crushed::get, b -> b.output(nugget.get(), 10) + .output(.5f, nugget.get(), 5)); + } + + public WashingRecipeGen(DataGenerator p_i48262_1_) { + super(p_i48262_1_); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.SPLASHING; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index ad9fb00a6..774927b19 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -2,10 +2,23 @@ package com.simibubi.create.foundation.fluid; import javax.annotation.Nullable; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.simibubi.create.Create; + +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.ForgeFlowingFluid; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.registries.ForgeRegistries; public class FluidHelper { @@ -13,6 +26,66 @@ public class FluidHelper { ITEM_TO_TANK, TANK_TO_ITEM; } + public static boolean isWater(Fluid fluid) { + return convertToStill(fluid) == Fluids.WATER; + } + + public static boolean isLava(Fluid fluid) { + return convertToStill(fluid) == Fluids.LAVA; + } + + public static Fluid convertToFlowing(Fluid fluid) { + if (fluid == Fluids.WATER) + return Fluids.FLOWING_WATER; + if (fluid == Fluids.LAVA) + return Fluids.FLOWING_LAVA; + if (fluid instanceof ForgeFlowingFluid) + return ((ForgeFlowingFluid) fluid).getFlowingFluid(); + return fluid; + } + + public static Fluid convertToStill(Fluid fluid) { + if (fluid == Fluids.FLOWING_WATER) + return Fluids.WATER; + if (fluid == Fluids.FLOWING_LAVA) + return Fluids.LAVA; + if (fluid instanceof ForgeFlowingFluid) + return ((ForgeFlowingFluid) fluid).getStillFluid(); + return fluid; + } + + public static JsonElement serializeFluidStack(FluidStack stack) { + JsonObject json = new JsonObject(); + json.addProperty("fluid", stack.getFluid() + .getRegistryName() + .toString()); + json.addProperty("amount", stack.getAmount()); + if (stack.hasTag()) + json.addProperty("nbt", stack.getTag() + .toString()); + return json; + } + + public static FluidStack deserializeFluidStack(JsonObject json) { + ResourceLocation id = new ResourceLocation(JSONUtils.getString(json, "fluid")); + Fluid fluid = ForgeRegistries.FLUIDS.getValue(id); + if (fluid == null) + throw new JsonSyntaxException("Unknown fluid '" + id + "'"); + int amount = JSONUtils.getInt(json, "amount"); + FluidStack stack = new FluidStack(fluid, amount); + + try { + JsonElement element = json.get("nbt"); + stack.setTag(JsonToNBT.getTagFromJson( + element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.getString(element, "nbt"))); + + } catch (CommandSyntaxException e) { + e.printStackTrace(); + } + + return stack; + } + @Nullable public static FluidExchange exchange(IFluidHandler fluidTank, IFluidHandlerItem fluidItem, FluidExchange preferred, int maxAmount) { diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java new file mode 100644 index 000000000..6e097a0e4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -0,0 +1,198 @@ +package com.simibubi.create.foundation.fluid; + +import java.util.Objects; +import java.util.function.Predicate; + +import javax.annotation.Nullable; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; + +import net.minecraft.fluid.Fluid; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tags.FluidTags; +import net.minecraft.tags.Tag; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; + +public abstract class FluidIngredient implements Predicate { + + public static final FluidIngredient EMPTY = new FluidStackIngredient(); + + public static FluidIngredient fromTag(Tag tag, int amount) { + FluidTagIngredient ingredient = new FluidTagIngredient(); + ingredient.tag = tag; + ingredient.amountRequired = amount; + return ingredient; + } + + public static FluidIngredient fromFluid(Fluid fluid, int amount) { + FluidStackIngredient ingredient = new FluidStackIngredient(); + ingredient.fluid = fluid; + ingredient.amountRequired = amount; + return ingredient; + } + + protected int amountRequired; + + protected abstract boolean testInternal(FluidStack t); + + protected abstract void readInternal(PacketBuffer buffer); + + protected abstract void writeInternal(PacketBuffer buffer); + + protected abstract void readInternal(JsonObject json); + + protected abstract void writeInternal(JsonObject json); + + public int getRequiredAmount() { + return amountRequired; + } + + @Override + public boolean test(FluidStack t) { + if (t == null) + throw new IllegalArgumentException("FluidStack cannot be null"); + return testInternal(t); + } + + public void write(PacketBuffer buffer) { + buffer.writeBoolean(this instanceof FluidTagIngredient); + buffer.writeVarInt(amountRequired); + writeInternal(buffer); + } + + public static FluidIngredient read(PacketBuffer buffer) { + boolean isTagIngredient = buffer.readBoolean(); + FluidIngredient ingredient = isTagIngredient ? new FluidTagIngredient() : new FluidStackIngredient(); + ingredient.amountRequired = buffer.readVarInt(); + ingredient.readInternal(buffer); + return ingredient; + } + + public JsonObject serialize() { + JsonObject json = new JsonObject(); + writeInternal(json); + json.addProperty("amount", amountRequired); + return json; + } + + public static boolean isFluidIngredient(@Nullable JsonElement je) { + if (je == null || je.isJsonNull()) + return false; + if (!je.isJsonObject()) + return false; + JsonObject json = je.getAsJsonObject(); + if (json.has("fluidTag")) + return true; + else if (json.has("fluid")) + return true; + return false; + } + + public static FluidIngredient deserialize(@Nullable JsonElement je) { + if (!isFluidIngredient(je)) + throw new JsonSyntaxException("Invalid fluid ingredient: " + Objects.toString(je)); + + JsonObject json = je.getAsJsonObject(); + FluidIngredient ingredient = json.has("fluidTag") ? new FluidTagIngredient() : new FluidStackIngredient(); + ingredient.readInternal(json); + + if (!json.has("amount")) + throw new JsonSyntaxException("Fluid ingredient has to define an amount"); + ingredient.amountRequired = JSONUtils.getInt(json, "amount"); + return ingredient; + } + + public static class FluidStackIngredient extends FluidIngredient { + + protected Fluid fluid; + protected CompoundNBT tagToMatch; + + public FluidStackIngredient() { + tagToMatch = new CompoundNBT(); + } + + @Override + protected boolean testInternal(FluidStack t) { + if (!t.getFluid() + .isEquivalentTo(fluid)) + return false; + CompoundNBT tag = t.getTag() + .copy(); + return tag.merge(tagToMatch) + .equals(t.getTag()); + } + + @Override + protected void readInternal(PacketBuffer buffer) { + fluid = buffer.readRegistryId(); + tagToMatch = buffer.readCompoundTag(); + } + + @Override + protected void writeInternal(PacketBuffer buffer) { + buffer.writeRegistryId(fluid); + buffer.writeCompoundTag(tagToMatch); + } + + @Override + protected void readInternal(JsonObject json) { + FluidStack stack = FluidHelper.deserializeFluidStack(json); + fluid = stack.getFluid(); + tagToMatch = stack.getOrCreateTag(); + } + + @Override + protected void writeInternal(JsonObject json) { + json.addProperty("fluid", fluid.getRegistryName() + .toString()); + json.add("nbt", new JsonParser().parse(tagToMatch.toString())); + } + + } + + public static class FluidTagIngredient extends FluidIngredient { + + protected Tag tag; + + @Override + protected boolean testInternal(FluidStack t) { + return t.getFluid() + .isIn(tag); + } + + @Override + protected void readInternal(PacketBuffer buffer) { + ResourceLocation resourcelocation = buffer.readResourceLocation(); + tag = FluidTags.getContainer() + .get(resourcelocation); + } + + @Override + protected void writeInternal(PacketBuffer buffer) { + buffer.writeResourceLocation(tag.getId()); + } + + @Override + protected void readInternal(JsonObject json) { + ResourceLocation id = new ResourceLocation(JSONUtils.getString(json, "fluidTag")); + tag = FluidTags.getContainer() + .get(id); + if (tag == null) + throw new JsonSyntaxException("Unknown fluid tag '" + id + "'"); + } + + @Override + protected void writeInternal(JsonObject json) { + json.addProperty("fluidTag", tag.getId() + .toString()); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index b9d3a845e..eb46cbed5 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -1,8 +1,12 @@ package com.simibubi.create.foundation.fluid; +import java.util.function.Function; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack.Entry; import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -17,11 +21,62 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; public class FluidRenderer { + public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, + boolean inbound, IRenderTypeBuffer buffer, MatrixStack ms, int light) { + Fluid fluid = fluidStack.getFluid(); + FluidAttributes fluidAttributes = fluid.getAttributes(); + Function spriteAtlas = Minecraft.getInstance() + .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE); + TextureAtlasSprite flowTexture = spriteAtlas.apply(fluidAttributes.getFlowingTexture(fluidStack)); + TextureAtlasSprite stillTexture = spriteAtlas.apply(fluidAttributes.getStillTexture(fluidStack)); + + int color = fluidAttributes.getColor(fluidStack); + IVertexBuilder builder = buffer.getBuffer(RenderType.getTranslucent()); + MatrixStacker msr = MatrixStacker.of(ms); + int blockLightIn = (light >> 4) & 0xf; + int luminosity = Math.max(blockLightIn, fluidAttributes.getLuminosity(fluidStack)); + light = (light & 0xf00000) | luminosity << 4; + + if (inbound) + direction = direction.getOpposite(); + + ms.push(); + msr.centre() + .rotateY(AngleHelper.horizontalAngle(direction)) + .rotateX(direction == Direction.UP ? 0 : direction == Direction.DOWN ? 180 : 90) + .unCentre(); + ms.translate(.5, 0, .5); + + float h = (float) (radius); + float hMin = (float) (-radius); + float hMax = (float) (radius); + float y = inbound ? 0 : .5f; + float yMin = y; + float yMax = y + MathHelper.clamp(progress * .5f - 1e-6f, 0, 1); + + for (int i = 0; i < 4; i++) { + ms.push(); + renderTiledHorizontalFace(h, Direction.SOUTH, hMin, yMin, hMax, yMax, builder, ms, light, color, + flowTexture); + ms.pop(); + msr.rotateY(90); + } + + if (progress != 1) + renderTiledVerticalFace(yMax, Direction.UP, hMin, hMin, hMax, hMax, builder, ms, light, color, + stillTexture); + + ms.pop(); + + } + public static void renderTiledFluidBB(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, IRenderTypeBuffer buffer, MatrixStack ms, int light, boolean renderBottom) { Fluid fluid = fluidStack.getFluid(); @@ -62,8 +117,9 @@ public class FluidRenderer { .translateBack(center); boolean X = side.getAxis() == Axis.X; + int darkColor = ColorHelper.mixColors(color, 0xff000011, 1 / 4f); renderTiledHorizontalFace(X ? xMax : zMax, side, X ? zMin : xMin, yMin, X ? zMax : xMax, yMax, builder, - ms, light, color, fluidTexture); + ms, light, darkColor, fluidTexture); ms.pop(); continue; @@ -111,10 +167,11 @@ public class FluidRenderer { for (float y1 = yMin; y1 < yMax; y1 = y2) { y2 = Math.min((int) (y1 + 1), yMax); - float u1 = texture.getInterpolatedU(local(h1) * 16); - float v1 = texture.getInterpolatedV(local(y1) * 16); - float u2 = texture.getInterpolatedU(h2 == hMax ? local(h2) * 16 : 16); - float v2 = texture.getInterpolatedV(y2 == yMax ? local(y2) * 16 : 16); + int multiplier = texture.getWidth() == 32 ? 8 : 16; + float u1 = texture.getInterpolatedU(local(h1) * multiplier); + float v1 = texture.getInterpolatedV(local(y1) * multiplier); + float u2 = texture.getInterpolatedU(h2 == hMax ? local(h2) * multiplier : multiplier); + float v2 = texture.getInterpolatedV(y2 == yMax ? local(y2) * multiplier : multiplier); float x1 = X ? h : h1; float x2 = X ? h : h2; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index d28546da0..857614899 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -76,11 +76,22 @@ public class AllIcons { I_TOOL_DEPLOY = newRow(), I_SKIP_MISSING = next(), I_SKIP_TILES = next(), + I_DICE = next(), + I_TUNNEL_SPLIT = next(), + I_TUNNEL_FORCED_SPLIT = next(), + I_TUNNEL_ROUND_ROBIN = next(), + I_TUNNEL_FORCED_ROUND_ROBIN = next(), + I_TUNNEL_PREFER_NEAREST = next(), + I_TUNNEL_RANDOMIZE = next(), + I_TUNNEL_SYNCHRONIZE = next(), I_TOOL_MOVE_XZ = newRow(), I_TOOL_MOVE_Y = next(), I_TOOL_ROTATE = next(), I_TOOL_MIRROR = next(), + I_ARM_ROUND_ROBIN = next(), + I_ARM_FORCED_ROUND_ROBIN = next(), + I_ARM_PREFER_FIRST = next(), I_PLAY = newRow(), I_PAUSE = next(), diff --git a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java index 2df4f35f3..c690e6bfa 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java @@ -19,12 +19,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.FireBlock; import net.minecraft.block.FlowingFluidBlock; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Atlases; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.world.ClientWorld; @@ -126,12 +121,10 @@ public class GuiGameElement { } protected void transform() { - int verticalFlip = (this instanceof GuiItemRenderBuilder) ? 1 : -1; - RenderSystem.translated(xBeforeScale, yBeforeScale, 0); RenderSystem.scaled(scale, scale, scale); RenderSystem.translated(x, y, z); - RenderSystem.scaled(1, verticalFlip, 1); + RenderSystem.scaled(1, -1, 1); RenderSystem.translated(rotationOffset.x, rotationOffset.y, rotationOffset.z); RenderSystem.rotatef((float) zRot, 0, 0, 1); RenderSystem.rotatef((float) xRot, 1, 0, 0); @@ -257,7 +250,7 @@ public class GuiGameElement { public static class GuiItemRenderBuilder extends GuiRenderBuilder { - private ItemStack stack; + private final ItemStack stack; public GuiItemRenderBuilder(ItemStack stack) { this.stack = stack; @@ -271,9 +264,9 @@ public class GuiGameElement { public void render() { prepare(); transform(); - Minecraft.getInstance() - .getItemRenderer() - .renderItemIntoGUI(stack, 0, 0); + RenderSystem.scaled(1, -1, 1); + RenderSystem.translated(0, 0, -75); + Minecraft.getInstance().getItemRenderer().renderItemIntoGUI(stack, 0, 0); cleanUp(); } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index 59bcbacc4..da3a40a23 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -8,9 +8,9 @@ import java.util.function.Predicate; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableInt; -import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; @@ -97,17 +97,19 @@ public class ItemHelper { List> actualIngredients = new ArrayList<>(); Ingredients: for (Ingredient igd : recipeIngredients) { for (Pair pair : actualIngredients) { - ItemStack[] stacks1 = pair.getKey().getMatchingStacks(); + ItemStack[] stacks1 = pair.getFirst() + .getMatchingStacks(); ItemStack[] stacks2 = igd.getMatchingStacks(); - if (stacks1.length == stacks2.length) { - for (int i = 0; i <= stacks1.length; i++) { - if (i == stacks1.length) { - pair.getValue().increment(); - continue Ingredients; - } - if (!ItemStack.areItemsEqual(stacks1[i], stacks2[i])) - break; + if (stacks1.length != stacks2.length) + continue; + for (int i = 0; i <= stacks1.length; i++) { + if (i == stacks1.length) { + pair.getSecond() + .increment(); + continue Ingredients; } + if (!ItemStack.areItemsEqual(stacks1[i], stacks2[i])) + break; } } actualIngredients.add(Pair.of(igd, new MutableInt(1))); @@ -132,8 +134,8 @@ public class ItemHelper { } public static ItemStack extract(IItemHandler inv, Predicate test, boolean simulate) { - return extract(inv, test, ExtractionCountMode.UPTO, AllConfigs.SERVER.logistics.extractorAmount.get(), - simulate); + return extract(inv, test, ExtractionCountMode.UPTO, AllConfigs.SERVER.logistics.defaultExtractionLimit.get(), + simulate); } public static ItemStack extract(IItemHandler inv, Predicate test, int exactAmount, boolean simulate) { @@ -141,7 +143,7 @@ public class ItemHelper { } public static ItemStack extract(IItemHandler inv, Predicate test, ExtractionCountMode mode, int amount, - boolean simulate) { + boolean simulate) { ItemStack extracting = ItemStack.EMPTY; boolean amountRequired = mode == ExtractionCountMode.EXACTLY; boolean checkHasEnoughItems = amountRequired; @@ -203,9 +205,9 @@ public class ItemHelper { } public static ItemStack extract(IItemHandler inv, Predicate test, - Function amountFunction, boolean simulate) { + Function amountFunction, boolean simulate) { ItemStack extracting = ItemStack.EMPTY; - int maxExtractionCount = AllConfigs.SERVER.logistics.extractorAmount.get(); + int maxExtractionCount = AllConfigs.SERVER.logistics.defaultExtractionLimit.get(); for (int slot = 0; slot < inv.getSlots(); slot++) { if (extracting.isEmpty()) { @@ -239,4 +241,20 @@ public class ItemHelper { return extracting; } + public static ItemStack findFirstMatch(IItemHandler inv, Predicate test) { + int slot = findFirstMatchingSlotIndex(inv, test); + if (slot == -1) + return ItemStack.EMPTY; + else + return inv.getStackInSlot(slot); + } + + public static int findFirstMatchingSlotIndex(IItemHandler inv, Predicate test) { + for (int slot = 0; slot < inv.getSlots(); slot++) { + ItemStack toTest = inv.getStackInSlot(slot); + if (test.test(toTest)) + return slot; + } + return -1; + } } diff --git a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java new file mode 100644 index 000000000..71ddba451 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java @@ -0,0 +1,121 @@ +package com.simibubi.create.foundation.item; + +import javax.annotation.Nonnull; + +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class SmartInventory extends RecipeWrapper implements IItemHandlerModifiable, INBTSerializable { + + private boolean extractionAllowed; + private boolean insertionAllowed; + private int stackSize; + + public SmartInventory(int slots, SyncedTileEntity te) { + super(new SyncedStackHandler(slots, te)); + insertionAllowed = true; + extractionAllowed = true; + stackSize = 64; + } + + public SmartInventory allowInsertion() { + insertionAllowed = true; + return this; + } + + public SmartInventory allowExtraction() { + extractionAllowed = true; + return this; + } + + public SmartInventory forbidInsertion() { + insertionAllowed = false; + return this; + } + + public SmartInventory forbidExtraction() { + extractionAllowed = false; + return this; + } + + public SmartInventory withMaxStackSize(int stackSize) { + this.stackSize = stackSize; + return this; + } + + @Override + public int getSlots() { + return inv.getSlots(); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!insertionAllowed) + return stack; + return inv.insertItem(slot, stack, simulate); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (!extractionAllowed) + return ItemStack.EMPTY; + return inv.extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + return Math.min(inv.getSlotLimit(slot), stackSize); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return inv.isItemValid(slot, stack); + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + inv.setStackInSlot(slot, stack); + } + + public int getStackLimit(int slot, @Nonnull ItemStack stack) { + return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); + } + + @Override + public CompoundNBT serializeNBT() { + return getInv().serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundNBT nbt) { + getInv().deserializeNBT(nbt); + } + + private SyncedStackHandler getInv() { + return (SyncedStackHandler) inv; + } + + private static class SyncedStackHandler extends ItemStackHandler { + + private SyncedTileEntity te; + + public SyncedStackHandler(int slots, SyncedTileEntity te) { + super(slots); + this.te = te; + } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + te.notifyUpdate(); + } + + } + +} 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 bd2e888da..5200f3255 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -5,11 +5,15 @@ import java.util.function.Function; import java.util.function.Supplier; import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.components.structureMovement.ClientMotionPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionInteractionPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionSeatMappingPacket; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionStallPacket; import com.simibubi.create.content.contraptions.components.structureMovement.glue.GlueEffectPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionInteractionPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionSeatMappingPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingCreationPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingSyncPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.train.PersistantDataPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.train.PersistantDataPacketRequest; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket; import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; @@ -49,6 +53,8 @@ public enum AllPackets { CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new), CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new), PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new), + MINECART_COUPLING_CREATION(MinecartCouplingCreationPacket.class, MinecartCouplingCreationPacket::new), + PERSISTANT_DATA_REQUEST(PersistantDataPacketRequest.class, PersistantDataPacketRequest::new), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new), @@ -57,7 +63,9 @@ public enum AllPackets { CONFIGURE_CONFIG(ConfigureConfigPacket.class, ConfigureConfigPacket::new), CONTRAPTION_STALL(ContraptionStallPacket.class, ContraptionStallPacket::new), GLUE_EFFECT(GlueEffectPacket.class, GlueEffectPacket::new), + MINECART_COUPLING_SYNC(MinecartCouplingSyncPacket.class, MinecartCouplingSyncPacket::new), CONTRAPTION_SEAT_MAPPING(ContraptionSeatMappingPacket.class, ContraptionSeatMappingPacket::new), + PERSISTANT_DATA(PersistantDataPacket.class, PersistantDataPacket::new), ; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/PosBoundSmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/PosBoundSmartTileEntity.java deleted file mode 100644 index 2a3da1db6..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/PosBoundSmartTileEntity.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.simibubi.create.foundation.tileEntity; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; - -public abstract class PosBoundSmartTileEntity extends SmartTileEntity { - - private boolean newPositionVisited; - - public PosBoundSmartTileEntity(TileEntityType tileEntityTypeIn) { - super(tileEntityTypeIn); - newPositionVisited = true; - } - - @Override - public void initialize() { - if (!world.isRemote && newPositionVisited) { - newPositionVisited = false; - initInNewPosition(); - } - super.initialize(); - } - - @Override - public void read(CompoundNBT compound) { - long positionInTag = new BlockPos(compound.getInt("x"), compound.getInt("y"), compound.getInt("z")).toLong(); - long positionKey = compound.getLong("BoundPosition"); - - newPositionVisited = false; - if (!hasWorld() || !world.isRemote) { - if (positionInTag != positionKey) { - removePositionDependentData(compound); - newPositionVisited = true; - } - } - - super.read(compound); - } - - /** - * Server-only. When this TE realizes, that it's reading its tag in a different - * position, it should remove all position dependent information here. - * - * @param nbt - */ - protected void removePositionDependentData(CompoundNBT nbt) { - - } - - /** - * Server-only. When a TE has been created or moved, it will call this before the - * regular init. - */ - protected void initInNewPosition() { - - } - -} 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 eeb6663ce..bb1a42cdc 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -38,8 +38,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka * Gets called just before reading tile data for behaviours. Register anything * here that depends on your custom te data. */ - public void addBehavioursDeferred(List behaviours) { - } + public void addBehavioursDeferred(List behaviours) {} @Override public void tick() { @@ -53,44 +52,60 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka lazyTick(); } - behaviours.values().forEach(TileEntityBehaviour::tick); + behaviours.values() + .forEach(TileEntityBehaviour::tick); } public void initialize() { - behaviours.values().forEach(TileEntityBehaviour::initialize); + behaviours.values() + .forEach(TileEntityBehaviour::initialize); lazyTick(); } - public void updateClient(CompoundNBT compound) { - behaviours.values().forEach(tb -> tb.updateClient(compound)); + @Override + public final CompoundNBT write(CompoundNBT compound) { + write(compound, false); + return compound; } @Override - public CompoundNBT write(CompoundNBT compound) { - behaviours.values().forEach(tb -> tb.writeNBT(compound)); - return super.write(compound); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - behaviours.values().forEach(tb -> tb.writeToClient(compound)); - return super.writeToClient(compound); + public final CompoundNBT writeToClient(CompoundNBT compound) { + write(compound, true); + return compound; } @Override - public void read(CompoundNBT compound) { + public final void readClientUpdate(CompoundNBT tag) { + read(tag, true); + } + + @Override + public final void read(CompoundNBT tag) { + read(tag, false); + } + + /** + * Hook only these in future subclasses of STE + */ + protected void read(CompoundNBT compound, boolean clientPacket) { if (firstNbtRead) { firstNbtRead = false; ArrayList list = new ArrayList<>(); addBehavioursDeferred(list); list.forEach(b -> behaviours.put(b.getType(), b)); } - super.read(compound); - forEachBehaviour(tb -> tb.readNBT(compound)); - - if (world != null && world.isRemote) - updateClient(compound); + behaviours.values() + .forEach(tb -> tb.read(compound, clientPacket)); + } + + /** + * Hook only these in future subclasses of STE + */ + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound); + behaviours.values() + .forEach(tb -> tb.write(compound, clientPacket)); } @Override @@ -107,15 +122,13 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka public void lazyTick() { } - + protected void forEachBehaviour(Consumer action) { - behaviours.values().forEach(tb -> { - if (!tb.isPaused()) - action.accept(tb); - }); + behaviours.values() + .forEach(action); } - protected void putBehaviour(TileEntityBehaviour behaviour) { + protected void attachBehaviourLate(TileEntityBehaviour behaviour) { behaviours.put(behaviour.getType(), behaviour); behaviour.initialize(); } @@ -127,7 +140,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka } @SuppressWarnings("unchecked") - protected T getBehaviour(BehaviourType type) { + public 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/SyncedTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java index 4d0ce20c5..be1c6b74d 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java @@ -54,5 +54,10 @@ public abstract class SyncedTileEntity extends TileEntity { public CompoundNBT writeToClient(CompoundNBT tag) { return write(tag); } + + public void notifyUpdate() { + markDirty(); + sendData(); + } } 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 c6aa76d99..af79b9005 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java @@ -13,13 +13,11 @@ import net.minecraft.world.World; public abstract class TileEntityBehaviour { public SmartTileEntity tileEntity; - private boolean paused; private int lazyTickRate; private int lazyTickCounter; public TileEntityBehaviour(SmartTileEntity te) { tileEntity = te; - paused = false; setLazyTickRate(10); } @@ -34,18 +32,14 @@ public abstract class TileEntityBehaviour { lazyTickCounter = lazyTickRate; lazyTick(); } - - } - - public void readNBT(CompoundNBT nbt) { } - public void updateClient(CompoundNBT nbt) { + public void read(CompoundNBT nbt, boolean clientPacket) { } - public void writeNBT(CompoundNBT nbt) { + public void write(CompoundNBT nbt, boolean clientPacket) { } @@ -59,14 +53,10 @@ public abstract class TileEntityBehaviour { public void remove() { - } - - public void destroy() { - } - public boolean isPaused() { - return paused; + public void destroy() { + } public void setLazyTickRate(int slowTickRate) { @@ -78,10 +68,6 @@ public abstract class TileEntityBehaviour { } - public void setPaused(boolean paused) { - this.paused = paused; - } - public BlockPos getPos() { return tileEntity.getPos(); } @@ -111,8 +97,4 @@ public abstract class TileEntityBehaviour { return ste.getBehaviour(type); } - public CompoundNBT writeToClient(CompoundNBT compound) { - return compound; - } - } 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 index 02d995ded..56fcc5c91 100644 --- 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 @@ -3,12 +3,16 @@ package com.simibubi.create.foundation.tileEntity.behaviour.belt; import java.util.List; import java.util.function.Function; +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableList; 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.item.ItemStack; import net.minecraft.util.math.vector.Vector3d; public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { @@ -17,6 +21,68 @@ public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { private ProcessingCallback processingCallback; private PositionGetter positionGetter; + public static class TransportedResult { + List outputs; + TransportedItemStack heldOutput; + + private static final TransportedResult DO_NOTHING = new TransportedResult(null, null); + private static final TransportedResult REMOVE_ITEM = new TransportedResult(ImmutableList.of(), null); + + public static TransportedResult doNothing() { + return DO_NOTHING; + } + + public static TransportedResult removeItem() { + return REMOVE_ITEM; + } + + public static TransportedResult convertTo(TransportedItemStack output) { + return new TransportedResult(ImmutableList.of(output), null); + } + + public static TransportedResult convertTo(List outputs) { + return new TransportedResult(outputs, null); + } + + public static TransportedResult convertToAndLeaveHeld(List outputs, + TransportedItemStack heldOutput) { + return new TransportedResult(outputs, heldOutput); + } + + private TransportedResult(List outputs, TransportedItemStack heldOutput) { + this.outputs = outputs; + this.heldOutput = heldOutput; + } + + public boolean doesNothing() { + return outputs == null; + } + + public boolean didntChangeFrom(ItemStack stackBefore) { + return doesNothing() + || outputs.size() == 1 && outputs.get(0).stack.equals(stackBefore, false) && !hasHeldOutput(); + } + + public List getOutputs() { + if (outputs == null) + throw new IllegalStateException("Do not call getOutputs() on a Result that doesNothing()."); + return outputs; + } + + public boolean hasHeldOutput() { + return heldOutput != null; + } + + @Nullable + public TransportedItemStack getHeldOutput() { + if (heldOutput == null) + throw new IllegalStateException( + "Do not call getHeldOutput() on a Result with hasHeldOutput() == false."); + return heldOutput; + } + + } + public TransportedItemStackHandlerBehaviour(SmartTileEntity te, ProcessingCallback processingCallback) { super(te); this.processingCallback = processingCallback; @@ -28,12 +94,20 @@ public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { return this; } - public void handleProcessingOnAllItems(Function> processFunction) { + public void handleProcessingOnAllItems(Function processFunction) { handleCenteredProcessingOnAllItems(.51f, processFunction); } + public void handleProcessingOnItem(TransportedItemStack item, TransportedResult processOutput) { + handleCenteredProcessingOnAllItems(.51f, t -> { + if (t == item) + return processOutput; + return null; + }); + } + public void handleCenteredProcessingOnAllItems(float maxDistanceFromCenter, - Function> processFunction) { + Function processFunction) { this.processingCallback.applyToAllItems(maxDistanceFromCenter, processFunction); } @@ -49,7 +123,7 @@ public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { @FunctionalInterface public interface ProcessingCallback { public void applyToAllItems(float maxDistanceFromCenter, - Function> processFunction); + Function processFunction); } @FunctionalInterface 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 f03989122..00aaec3fe 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 @@ -36,6 +36,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { int scrollableValue; int ticksUntilScrollPacket; boolean forceClientState; + boolean recipeFilter; public FilteringBehaviour(SmartTileEntity te, ValueBoxTransform slot) { super(te); @@ -49,33 +50,30 @@ public class FilteringBehaviour extends TileEntityBehaviour { count = 0; ticksUntilScrollPacket = -1; showCountPredicate = () -> showCount; + recipeFilter = false; } @Override - public void writeNBT(CompoundNBT nbt) { + public void write(CompoundNBT nbt, boolean clientPacket) { nbt.put("Filter", getFilter().serializeNBT()); nbt.putInt("FilterAmount", count); - super.writeNBT(nbt); + + if (clientPacket && forceClientState) { + nbt.putBoolean("ForceScrollable", true); + forceClientState = false; + } + super.write(nbt, clientPacket); } @Override - public void readNBT(CompoundNBT nbt) { + public void read(CompoundNBT nbt, boolean clientPacket) { filter = ItemStack.read(nbt.getCompound("Filter")); count = nbt.getInt("FilterAmount"); if (nbt.contains("ForceScrollable")) { scrollableValue = count; ticksUntilScrollPacket = -1; } - super.readNBT(nbt); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - if (forceClientState) { - compound.putBoolean("ForceScrollable", true); - forceClientState = false; - } - return super.writeToClient(compound); + super.read(nbt, clientPacket); } @Override @@ -100,6 +98,11 @@ public class FilteringBehaviour extends TileEntityBehaviour { return this; } + public FilteringBehaviour forRecipes() { + recipeFilter = true; + return this; + } + public FilteringBehaviour onlyActiveWhen(Supplier condition) { isActive = condition; return this; @@ -129,7 +132,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public void setFilter(Direction face, ItemStack stack) { setFilter(stack); } - + public void setFilter(ItemStack stack) { filter = stack.copy(); callback.accept(filter); @@ -154,7 +157,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public ItemStack getFilter(Direction side) { return getFilter(); } - + public ItemStack getFilter() { return filter.copy(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java index e5be66eaf..d6548d1e8 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.tileEntity.behaviour.filtering; import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import net.minecraft.network.PacketBuffer; import net.minecraft.util.math.BlockPos; @@ -32,7 +31,7 @@ public class FilteringCountUpdatePacket extends TileEntityConfigurationPacket(); updateFilterPresence(); } - + @Override public void initialize() { super.initialize(); } - + public FilteringBehaviour get(Direction side) { return sidedFilters.get(side); } @@ -59,40 +59,27 @@ public class SidedFilteringBehaviour extends FilteringBehaviour { } @Override - public void writeNBT(CompoundNBT nbt) { + public void write(CompoundNBT nbt, boolean clientPacket) { nbt.put("Filters", NBTHelper.writeCompoundList(sidedFilters.entrySet(), entry -> { CompoundNBT compound = new CompoundNBT(); compound.putInt("Side", entry.getKey() .getIndex()); entry.getValue() - .writeNBT(compound); + .write(compound, clientPacket); return compound; })); - super.writeNBT(nbt); + super.write(nbt, clientPacket); } @Override - public void readNBT(CompoundNBT nbt) { + public void read(CompoundNBT nbt, boolean clientPacket) { 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); + .read(compound, clientPacket); }); - 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); + super.read(nbt, clientPacket); } @Override 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 deleted file mode 100644 index ee95b4a82..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/AutoExtractingBehaviour.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.List; -import java.util.function.Consumer; -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.BehaviourType; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -public class AutoExtractingBehaviour extends ExtractingBehaviour { - - public static BehaviourType TYPE = new BehaviourType<>(); - - private int delay; - private int timer; - Supplier shouldExtract; - Supplier shouldPause; - private boolean ticking; - - public AutoExtractingBehaviour(SmartTileEntity te, Supplier>> attachments, - Consumer onExtract, int delay) { - super(te, attachments, onExtract); - shouldPause = () -> false; - shouldExtract = () -> true; - ticking = true; - this.delay = delay; - } - - public AutoExtractingBehaviour pauseWhen(Supplier condition) { - shouldPause = condition; - return this; - } - - public ExtractingBehaviour waitUntil(Supplier condition) { - this.shouldExtract = condition; - return this; - } - - public void setDelay(int delay) { - this.delay = delay; - this.timer = delay; - } - - @Override - public boolean extract(int amount) { - timer = delay; - return super.extract(amount); - } - - @Override - public void tick() { - super.tick(); - - if (!ticking) - return; - - if (getWorld().isRemote) - return; - - if (getShouldPause().get()) { - timer = 0; - return; - } - - if (timer > 0) { - timer--; - return; - } - - if (!getShouldExtract().get()) - return; - - extract(); - } - - public void setTicking(boolean ticking) { - this.ticking = ticking; - } - - @Override - public BehaviourType getType() { - return TYPE; - } - - public Supplier getShouldExtract() { - return shouldExtract; - } - - public Supplier getShouldPause() { - return shouldPause; - } - -} 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 deleted file mode 100644 index aff1a79e1..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/ExtractingBehaviour.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; - -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.BehaviourType; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.items.IItemHandler; - -public class ExtractingBehaviour extends InventoryManagementBehaviour { - - 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) { - super(te, attachments); - customAmountFilter = stack -> 64; - customFilter = stack -> true; - setCallback(onExtract); - } - - public ExtractingBehaviour withAmountThreshold(Function filter) { - this.customAmountFilter = filter; - return this; - } - - public ExtractingBehaviour withAdditionalFilter(Predicate filter) { - this.customFilter = filter; - return this; - } - - public boolean extract() { - return extract(getAmountToExtract()); - } - - public int getAmountToExtract() { - int amount = -1; - FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE); - if (filter != null && !filter.anyAmount()) - amount = filter.getAmount(); - return amount; - } - - public boolean extract(int exactAmount) { - if (getWorld().isRemote) - return false; - if (AllConfigs.SERVER.control.freezeExtractors.get()) - return false; - - Predicate test = getFilterTest(); - for (IItemHandler inv : getInventories()) { - ItemStack extract = ItemStack.EMPTY; - if (exactAmount != -1) - extract = ItemHelper.extract(inv, test, exactAmount, false); - else - extract = ItemHelper.extract(inv, test, customAmountFilter, false); - - if (!extract.isEmpty()) { - callback.accept(extract); - return true; - } - } - - return false; - } - - public Predicate getFilterTest() { - Predicate test = customFilter; - FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE); - if (filter != null) - test = customFilter.and(filter::test); - return test; - } - - @Override - public BehaviourType getType() { - return TYPE; - } - - public void setCallback(Consumer callback) { - this.callback = callback; - } - -} 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 deleted file mode 100644 index 4b18aad01..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InsertingBehaviour.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.List; -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.BehaviourType; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - -public class InsertingBehaviour extends InventoryManagementBehaviour { - - public static BehaviourType TYPE = new BehaviourType<>(); - - public InsertingBehaviour(SmartTileEntity te, Supplier>> attachments) { - super(te, attachments); - } - - public ItemStack insert(ItemStack stack, boolean simulate) { - for (IItemHandler inv : getInventories()) { - stack = ItemHandlerHelper.insertItemStacked(inv, stack, simulate); - if (stack.isEmpty()) - break; - } - return stack; - } - - @Override - public BehaviourType getType() { - return TYPE; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java new file mode 100644 index 000000000..e8ca01bb1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -0,0 +1,189 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.inventory; + +import java.util.function.Function; +import java.util.function.Predicate; + +import com.google.common.base.Predicates; +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.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.BlockFace; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public class InvManipulationBehaviour extends TileEntityBehaviour { + + // Extra types available for multibehaviour + public static BehaviourType + + TYPE = new BehaviourType<>(), EXTRACT = new BehaviourType<>(), INSERT = new BehaviourType<>(); + + protected InterfaceProvider target; + protected LazyOptional targetCapability; + protected boolean simulateNext; + + private BehaviourType behaviourType; + + public static InvManipulationBehaviour forExtraction(SmartTileEntity te, InterfaceProvider target) { + return new InvManipulationBehaviour(EXTRACT, te, target); + } + + public static InvManipulationBehaviour forInsertion(SmartTileEntity te, InterfaceProvider target) { + return new InvManipulationBehaviour(INSERT, te, target); + } + + public InvManipulationBehaviour(SmartTileEntity te, InterfaceProvider target) { + this(TYPE, te, target); + } + + private InvManipulationBehaviour(BehaviourType type, SmartTileEntity te, + InterfaceProvider target) { + super(te); + behaviourType = type; + setLazyTickRate(40); + this.target = target; + this.targetCapability = LazyOptional.empty(); + simulateNext = false; + } + + /** + * Only simulate the upcoming operation + */ + public InvManipulationBehaviour simulate() { + simulateNext = true; + return this; + } + + public boolean hasInventory() { + return targetCapability.isPresent(); + } + + public ItemStack extract() { + return extract(getAmountFromFilter()); + } + + public ItemStack extract(int amount) { + return extract(amount, Predicates.alwaysTrue()); + } + + public ItemStack extract(int amount, Predicate filter) { + return extract(amount, filter, ItemStack::getMaxStackSize); + } + + public ItemStack extract(int amount, Predicate filter, Function amountThreshold) { + boolean shouldSimulate = simulateNext; + simulateNext = false; + + if (getWorld().isRemote) + return ItemStack.EMPTY; + if (AllConfigs.SERVER.control.freezeExtractors.get()) + return ItemStack.EMPTY; + IItemHandler inventory = targetCapability.orElse(null); + if (inventory == null) + return ItemStack.EMPTY; + + Predicate test = getFilterTest(filter); + ItemStack extract = ItemStack.EMPTY; + if (amount != -1) + extract = ItemHelper.extract(inventory, test, amount, shouldSimulate); + else + extract = ItemHelper.extract(inventory, test, amountThreshold, shouldSimulate); + return extract; + } + + public ItemStack insert(ItemStack stack) { + boolean shouldSimulate = simulateNext; + simulateNext = false; + IItemHandler inventory = targetCapability.orElse(null); + if (inventory == null) + return stack; + return ItemHandlerHelper.insertItemStacked(inventory, stack, shouldSimulate); + } + + protected Predicate getFilterTest(Predicate customFilter) { + Predicate test = customFilter; + FilteringBehaviour filter = tileEntity.getBehaviour(FilteringBehaviour.TYPE); + if (filter != null) + test = customFilter.and(filter::test); + return test; + } + + @Override + public void initialize() { + super.initialize(); + findNewCapability(); + } + + protected void onHandlerInvalidated(LazyOptional handler) { + findNewCapability(); + } + + @Override + public void lazyTick() { + super.lazyTick(); + if (!targetCapability.isPresent()) + findNewCapability(); + } + + public int getAmountFromFilter() { + int amount = -1; + FilteringBehaviour filter = tileEntity.getBehaviour(FilteringBehaviour.TYPE); + if (filter != null && !filter.anyAmount()) + amount = filter.getAmount(); + return amount; + } + + protected void findNewCapability() { + BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState()) + .getOpposite(); + BlockPos pos = targetBlockFace.getPos(); + World world = getWorld(); + + targetCapability = LazyOptional.empty(); + + if (!world.isBlockPresent(pos)) + return; + TileEntity invTE = world.getTileEntity(pos); + if (invTE == null) + return; + targetCapability = + invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace()); + if (targetCapability.isPresent()) + targetCapability.addListener(this::onHandlerInvalidated); + } + + @Override + public BehaviourType getType() { + return behaviourType; + } + + @FunctionalInterface + public interface InterfaceProvider { + + public static InterfaceProvider towardBlockFacing() { + return (w, p, s) -> new BlockFace(p, s.has(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING) + : s.get(BlockStateProperties.HORIZONTAL_FACING)); + } + + public static InterfaceProvider oppositeOfBlockFacing() { + return (w, p, s) -> new BlockFace(p, + (s.has(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING) + : s.get(BlockStateProperties.HORIZONTAL_FACING)).getOpposite()); + } + + public BlockFace getTarget(World world, BlockPos pos, BlockState blockState); + } + +} 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 deleted file mode 100644 index 0318f0375..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InventoryManagementBehaviour.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -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.BehaviourType; - -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.World; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -public class InventoryManagementBehaviour extends TileEntityBehaviour { - - Map, LazyOptional> inventories; - private Supplier>> attachments; - private List activeHandlers; - - public static BehaviourType TYPE = new BehaviourType<>(); - - public InventoryManagementBehaviour(SmartTileEntity te, Supplier>> attachments) { - super(te); - this.attachments = attachments; - setLazyTickRate(20); - activeHandlers = new ArrayList<>(); - inventories = new HashMap<>(); - } - - @Override - public void initialize() { - super.initialize(); - attachments.get().forEach(offset -> inventories.put(offset, findInventory(offset))); - lazyTick(); - } - - @Override - public void lazyTick() { - super.lazyTick(); - activeHandlers.clear(); - for (Pair pair : inventories.keySet()) { - LazyOptional lazyOptional = inventories.get(pair); - if (lazyOptional.isPresent()) { - activeHandlers.add(lazyOptional.orElse(null)); - continue; - } - - lazyOptional = findInventory(pair); - if (lazyOptional.isPresent()) - activeHandlers.add(lazyOptional.orElse(null)); - inventories.put(pair, lazyOptional); - } - } - - public List getInventories() { - return activeHandlers; - } - - public IItemHandler getInventory() { - if (activeHandlers.isEmpty()) - return null; - return activeHandlers.get(0); - } - - protected LazyOptional findInventory(Pair offset) { - BlockPos invPos = tileEntity.getPos().add(offset.getKey()); - World world = getWorld(); - - if (!world.isBlockPresent(invPos)) - return LazyOptional.empty(); - BlockState invState = world.getBlockState(invPos); - - if (!invState.hasTileEntity()) - return LazyOptional.empty(); - TileEntity invTE = world.getTileEntity(invPos); - if (invTE == null) - return LazyOptional.empty(); - - LazyOptional inventory = invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, - offset.getValue()); - if (inventory == null) { - return LazyOptional.empty(); - } - - return inventory; - } - - @Override - public BehaviourType getType() { - return TYPE; - } - - public static class Attachments { - public static final Supplier>> toward(Supplier facing) { - return () -> ImmutableList - .of(Pair.of(new BlockPos(facing.get().getDirectionVec()), facing.get().getOpposite())); - }; - } - -} 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 deleted file mode 100644 index 763b83034..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SingleTargetAutoExtractingBehaviour.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -public class SingleTargetAutoExtractingBehaviour extends AutoExtractingBehaviour { - - public static BehaviourType TYPE = new BehaviourType<>(); - - private Supplier attachmentDirection; - boolean synced; - boolean advantageOnNextSync; - - public SingleTargetAutoExtractingBehaviour(SmartTileEntity te, Supplier attachmentDirection, - Consumer onExtract, int delay) { - super(te, Attachments.toward(attachmentDirection), onExtract, delay); - this.attachmentDirection = attachmentDirection; - synced = true; - advantageOnNextSync = false; - } - - public SingleTargetAutoExtractingBehaviour setSynchronized(boolean sync) { - synced = sync; - return this; - } - - @Override - public void writeNBT(CompoundNBT nbt) { - nbt.putBoolean("Advantage", advantageOnNextSync); - super.writeNBT(nbt); - } - - @Override - public void readNBT(CompoundNBT nbt) { - advantageOnNextSync = nbt.getBoolean("Advantage"); - super.readNBT(nbt); - } - - @Override - public boolean extract() { - if (synced) { - BlockPos invPos = tileEntity.getPos() - .offset(attachmentDirection.get()); - return SynchronizedExtraction.extractSynchronized(getWorld(), invPos); - } else - return extractFromInventory(); - } - - public boolean extractFromInventory() { - return super.extract(); - } - - @Override - public BehaviourType getType() { - return TYPE; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SynchronizedExtraction.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SynchronizedExtraction.java deleted file mode 100644 index f4de43840..000000000 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/SynchronizedExtraction.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.simibubi.create.foundation.tileEntity.behaviour.inventory; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.block.inventories.CrateBlock; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; - -import net.minecraft.block.BlockState; -import net.minecraft.block.ChestBlock; -import net.minecraft.state.properties.ChestType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockDisplayReader; - -public class SynchronizedExtraction { - - static boolean extractSynchronized(IBlockDisplayReader reader, BlockPos inventoryPos) { - List actors = getAllSyncedExtractors(reader, inventoryPos); - int startIndex = actors.size() - 1; - boolean success = false; - - for (; startIndex > 0; startIndex--) - if (actors.get(startIndex).advantageOnNextSync) - break; - for (int i = 0; i < actors.size(); i++) - success |= actors.get((startIndex + i) % actors.size()).extractFromInventory(); - - if (success) { - actors.get(startIndex).advantageOnNextSync = false; - actors.get((startIndex + 1) % actors.size()).advantageOnNextSync = true; - } - - return success; - } - - private static List getAllSyncedExtractors(IBlockDisplayReader reader, - BlockPos inventoryPos) { - List list = new ArrayList<>(); - List inventoryPositions = new ArrayList<>(); - inventoryPositions.add(inventoryPos); - - // Sync across double chests - BlockState blockState = reader.getBlockState(inventoryPos); - if (blockState.getBlock() instanceof ChestBlock) - if (blockState.get(ChestBlock.TYPE) != ChestType.SINGLE) - inventoryPositions.add(inventoryPos.offset(ChestBlock.getDirectionToAttached(blockState))); - - // Sync across crates - if (blockState.getBlock() instanceof CrateBlock) - if (blockState.get(CrateBlock.DOUBLE)) - inventoryPositions.add(inventoryPos.offset(blockState.get(CrateBlock.FACING))); - - for (BlockPos pos : inventoryPositions) { - for (Direction direction : Direction.values()) { - SingleTargetAutoExtractingBehaviour behaviour = TileEntityBehaviour.get(reader, pos.offset(direction), - SingleTargetAutoExtractingBehaviour.TYPE); - if (behaviour == null) - continue; - if (!behaviour.synced) - continue; - if (behaviour.getShouldPause().get()) - continue; - if (!behaviour.getShouldExtract().get()) - continue; - if (!behaviour.inventories.keySet().stream() - .anyMatch(p -> p.getKey().add(behaviour.getPos()).equals(pos))) - continue; - - list.add(behaviour); - } - } - return list; - } - -} 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 49a7440c5..b31bc9b16 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 @@ -116,26 +116,26 @@ public class LinkBehaviour extends TileEntityBehaviour { } @Override - public void writeNBT(CompoundNBT compound) { - super.writeNBT(compound); - compound.put("FrequencyFirst", frequencyFirst.getStack() + public void write(CompoundNBT nbt, boolean clientPacket) { + super.write(nbt, clientPacket); + nbt.put("FrequencyFirst", frequencyFirst.getStack() .write(new CompoundNBT())); - compound.put("FrequencyLast", frequencyLast.getStack() + nbt.put("FrequencyLast", frequencyLast.getStack() .write(new CompoundNBT())); - compound.putLong("LastKnownPosition", tileEntity.getPos() + nbt.putLong("LastKnownPosition", tileEntity.getPos() .toLong()); } @Override - public void readNBT(CompoundNBT compound) { + public void read(CompoundNBT nbt, boolean clientPacket) { long positionInTag = tileEntity.getPos() .toLong(); - long positionKey = compound.getLong("LastKnownPosition"); + long positionKey = nbt.getLong("LastKnownPosition"); newPosition = positionInTag != positionKey; - super.readNBT(compound); - frequencyFirst = new Frequency(ItemStack.read(compound.getCompound("FrequencyFirst"))); - frequencyLast = new Frequency(ItemStack.read(compound.getCompound("FrequencyLast"))); + super.read(nbt, clientPacket); + frequencyFirst = new Frequency(ItemStack.read(nbt.getCompound("FrequencyFirst"))); + frequencyLast = new Frequency(ItemStack.read(nbt.getCompound("FrequencyLast"))); } public void setFrequency(boolean first, ItemStack stack) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java index 80aad562e..8a0a52664 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java @@ -57,12 +57,12 @@ public class LinkRenderer { } } - public static void renderOnTileEntity(SmartTileEntity tileEntityIn, float partialTicks, MatrixStack ms, + public static void renderOnTileEntity(SmartTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (tileEntityIn == null || tileEntityIn.isRemoved()) + if (te == null || te.isRemoved()) return; - LinkBehaviour behaviour = TileEntityBehaviour.get(tileEntityIn, LinkBehaviour.TYPE); + LinkBehaviour behaviour = te.getBehaviour(LinkBehaviour.TYPE); if (behaviour == null) return; @@ -71,7 +71,7 @@ public class LinkRenderer { ItemStack stack = first ? behaviour.frequencyFirst.getStack() : behaviour.frequencyLast.getStack(); ms.push(); - transform.transform(tileEntityIn.getBlockState(), ms); + transform.transform(te.getBlockState(), ms); ValueBoxRenderer.renderItemIntoValueBox(stack, ms, buffer, light, overlay); ms.pop(); } 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 5f4dab502..8724e6501 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 @@ -51,28 +51,23 @@ public class ScrollValueBehaviour extends TileEntityBehaviour { } @Override - public void writeNBT(CompoundNBT nbt) { + public void write(CompoundNBT nbt, boolean clientPacket) { nbt.putInt("ScrollValue", value); - super.writeNBT(nbt); + if (clientPacket && forceClientState) { + nbt.putBoolean("ForceScrollable", true); + forceClientState = false; + } + super.write(nbt, clientPacket); } @Override - public void readNBT(CompoundNBT nbt) { + public void read(CompoundNBT nbt, boolean clientPacket) { value = nbt.getInt("ScrollValue"); if (nbt.contains("ForceScrollable")) { ticksUntilScrollPacket = -1; scrollableValue = value; } - super.readNBT(nbt); - } - - @Override - public CompoundNBT writeToClient(CompoundNBT compound) { - if (forceClientState) { - compound.putBoolean("ForceScrollable", true); - forceClientState = false; - } - return super.writeToClient(compound); + super.read(nbt, clientPacket); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java index 4e0b46635..c614f07c6 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java @@ -45,8 +45,8 @@ public class ScrollValueHandler { if (scrolling instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { BulkScrollValueBehaviour bulkScrolling = (BulkScrollValueBehaviour) scrolling; - for (SmartTileEntity smartTileEntity : bulkScrolling.getBulk()) { - ScrollValueBehaviour other = TileEntityBehaviour.get(smartTileEntity, ScrollValueBehaviour.TYPE); + for (SmartTileEntity te : bulkScrolling.getBulk()) { + ScrollValueBehaviour other = te.getBehaviour(ScrollValueBehaviour.TYPE); if (other != null) applyTo(delta, other); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java index 628a8d92b..64aeb6d60 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java @@ -35,15 +35,14 @@ public class ScrollValueRenderer { ScrollValueBehaviour behaviour = TileEntityBehaviour.get(world, pos, ScrollValueBehaviour.TYPE); if (behaviour == null) return; - if (behaviour.needsWrench - && !AllItems.WRENCH.isIn(Minecraft.getInstance().player.getHeldItemMainhand())) + if (behaviour.needsWrench && !AllItems.WRENCH.isIn(Minecraft.getInstance().player.getHeldItemMainhand())) return; boolean highlight = behaviour.testHit(target.getHitVec()); if (behaviour instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { BulkScrollValueBehaviour bulkScrolling = (BulkScrollValueBehaviour) behaviour; for (SmartTileEntity smartTileEntity : bulkScrolling.getBulk()) { - ScrollValueBehaviour other = TileEntityBehaviour.get(smartTileEntity, ScrollValueBehaviour.TYPE); + ScrollValueBehaviour other = smartTileEntity.getBehaviour(ScrollValueBehaviour.TYPE); if (other != null) addBox(world, smartTileEntity.getPos(), face, other, highlight); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueUpdatePacket.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueUpdatePacket.java index 88f7433d9..3e4d0d90a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueUpdatePacket.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueUpdatePacket.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue; import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import net.minecraft.network.PacketBuffer; import net.minecraft.util.math.BlockPos; @@ -32,7 +31,7 @@ public class ScrollValueUpdatePacket extends TileEntityConfigurationPacket { + + public BlockFace(BlockPos first, Direction second) { + super(first, second); + } + + public boolean isEquivalent(BlockFace other) { + if (equals(other)) + return true; + return getConnectedPos().equals(other.getPos()) && getPos().equals(other.getConnectedPos()); + } + + public BlockPos getPos() { + return getFirst(); + } + + public Direction getFace() { + return getSecond(); + } + + public Direction getOppositeFace() { + return getSecond().getOpposite(); + } + + public BlockFace getOpposite() { + return new BlockFace(getConnectedPos(), getOppositeFace()); + } + + public BlockPos getConnectedPos() { + return getPos().offset(getFace()); + } + + public CompoundNBT serializeNBT() { + CompoundNBT compoundNBT = new CompoundNBT(); + compoundNBT.put("Pos", NBTUtil.writeBlockPos(getPos())); + NBTHelper.writeEnum(compoundNBT, "Face", getFace()); + return compoundNBT; + } + + public static BlockFace fromNBT(CompoundNBT compound) { + return new BlockFace(NBTUtil.readBlockPos(compound.getCompound("Pos")), + NBTHelper.readEnum(compound, "Face", Direction.class)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 45d90788d..d653d650a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -2,8 +2,13 @@ package com.simibubi.create.foundation.utility; import java.util.function.Consumer; +import net.minecraft.item.Items; +import org.apache.commons.lang3.mutable.MutableInt; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.client.particle.DiggingParticle; +import net.minecraft.client.particle.ParticleManager; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.item.Item; @@ -11,23 +16,96 @@ import net.minecraft.item.ItemStack; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.SlabType; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.GameRules; +import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class BlockHelper { + @OnlyIn(Dist.CLIENT) + public static void addReducedDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { + VoxelShape voxelshape = state.getShape(world, pos); + MutableInt amtBoxes = new MutableInt(0); + voxelshape.forEachBox((x1, y1, z1, x2, y2, z2) -> amtBoxes.increment()); + double chance = 1d / amtBoxes.getValue(); + + voxelshape.forEachBox((x1, y1, z1, x2, y2, z2) -> { + double d1 = Math.min(1.0D, x2 - x1); + double d2 = Math.min(1.0D, y2 - y1); + double d3 = Math.min(1.0D, z2 - z1); + int i = Math.max(2, MathHelper.ceil(d1 / 0.25D)); + int j = Math.max(2, MathHelper.ceil(d2 / 0.25D)); + int k = Math.max(2, MathHelper.ceil(d3 / 0.25D)); + + for (int l = 0; l < i; ++l) { + for (int i1 = 0; i1 < j; ++i1) { + for (int j1 = 0; j1 < k; ++j1) { + if (world.rand.nextDouble() > chance) + continue; + + double d4 = ((double) l + 0.5D) / (double) i; + double d5 = ((double) i1 + 0.5D) / (double) j; + double d6 = ((double) j1 + 0.5D) / (double) k; + double d7 = d4 * d1 + x1; + double d8 = d5 * d2 + y1; + double d9 = d6 * d3 + z1; + manager + .addEffect((new DiggingParticle(world, (double) pos.getX() + d7, (double) pos.getY() + d8, + (double) pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D, state)).setBlockPos(pos)); + } + } + } + + }); + } + + public static BlockState setZeroAge(BlockState blockState) { + if (blockState.has(BlockStateProperties.AGE_0_1)) + return blockState.with(BlockStateProperties.AGE_0_1, 0); + if (blockState.has(BlockStateProperties.AGE_0_2)) + return blockState.with(BlockStateProperties.AGE_0_2, 0); + if (blockState.has(BlockStateProperties.AGE_0_3)) + return blockState.with(BlockStateProperties.AGE_0_3, 0); + if (blockState.has(BlockStateProperties.AGE_0_5)) + return blockState.with(BlockStateProperties.AGE_0_5, 0); + if (blockState.has(BlockStateProperties.AGE_0_7)) + return blockState.with(BlockStateProperties.AGE_0_7, 0); + if (blockState.has(BlockStateProperties.AGE_0_15)) + return blockState.with(BlockStateProperties.AGE_0_15, 0); + if (blockState.has(BlockStateProperties.AGE_0_25)) + return blockState.with(BlockStateProperties.AGE_0_25, 0); + if (blockState.has(BlockStateProperties.HONEY_LEVEL)) + return blockState.with(BlockStateProperties.HONEY_LEVEL, 0); + if (blockState.has(BlockStateProperties.HATCH_0_2)) + return blockState.with(BlockStateProperties.HATCH_0_2, 0); + if (blockState.has(BlockStateProperties.STAGE_0_1)) + return blockState.with(BlockStateProperties.STAGE_0_1, 0); + return blockState; + } + public static int findAndRemoveInInventory(BlockState block, PlayerEntity player, int amount) { int amountFound = 0; Item required = getRequiredItem(block).getItem(); - boolean needsTwo = block.has(BlockStateProperties.SLAB_TYPE) - && block.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; + boolean needsTwo = + block.has(BlockStateProperties.SLAB_TYPE) && block.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; if (needsTwo) amount *= 2; + if (block.has(BlockStateProperties.EGGS_1_4)) + amount *= block.get(BlockStateProperties.EGGS_1_4); + + if (block.has(BlockStateProperties.PICKLES_1_4)) + amount *= block.get(BlockStateProperties.PICKLES_1_4); + { // Try held Item first int preferredSlot = player.inventory.currentItem; @@ -36,7 +114,7 @@ public class BlockHelper { if (itemstack.getItem() == required && count > 0) { int taken = Math.min(count, amount - amountFound); player.inventory.setInventorySlotContents(preferredSlot, - new ItemStack(itemstack.getItem(), count - taken)); + new ItemStack(itemstack.getItem(), count - taken)); amountFound += taken; } } @@ -67,6 +145,10 @@ public class BlockHelper { public static ItemStack getRequiredItem(BlockState state) { ItemStack itemStack = new ItemStack(state.getBlock()); + if (itemStack.getItem() == Items.FARMLAND) + itemStack = new ItemStack(Items.DIRT); + else if (itemStack.getItem() == Items.GRASS_PATH) + itemStack = new ItemStack(Items.GRASS_BLOCK); return itemStack; } @@ -75,14 +157,15 @@ public class BlockHelper { } public static void destroyBlock(World world, BlockPos pos, float effectChance, - Consumer droppedItemCallback) { + Consumer droppedItemCallback) { FluidState ifluidstate = world.getFluidState(pos); BlockState state = world.getBlockState(pos); if (world.rand.nextFloat() < effectChance) world.playEvent(2001, pos, Block.getStateId(state)); TileEntity tileentity = state.hasTileEntity() ? world.getTileEntity(pos) : null; - if (world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) && !world.restoringBlockSnapshots) { + if (world.getGameRules() + .getBoolean(GameRules.DO_TILE_DROPS) && !world.restoringBlockSnapshots) { for (ItemStack itemStack : Block.getDrops(state, (ServerWorld) world, pos, tileentity)) droppedItemCallback.accept(itemStack); state.spawnAdditionalDrops(world, pos, ItemStack.EMPTY); @@ -91,4 +174,13 @@ public class BlockHelper { world.setBlockState(pos, ifluidstate.getBlockState()); } + public static boolean isSolidWall(IBlockReader reader, BlockPos fromPos, Direction toDirection) { + return Block.hasSolidSide(reader.getBlockState(fromPos.offset(toDirection)), reader, + fromPos.offset(toDirection), toDirection.getOpposite()); + } + + public static boolean noCollisionInSpace(IBlockReader reader, BlockPos pos) { + return reader.getBlockState(pos).getCollisionShape(reader, pos).isEmpty(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java index d7f300c76..432f87431 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java @@ -70,7 +70,8 @@ public class ColorHelper { } public static int colorFromLong(long l) { - int rainbowColor = ColorHelper.rainbowColor(String.valueOf(l).hashCode()); + int rainbowColor = ColorHelper.rainbowColor(String.valueOf(l) + .hashCode()); return ColorHelper.mixColors(rainbowColor, 0xFFFFFF, .5f); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Couple.java b/src/main/java/com/simibubi/create/foundation/utility/Couple.java new file mode 100644 index 000000000..fd391dbef --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/Couple.java @@ -0,0 +1,92 @@ +package com.simibubi.create.foundation.utility; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableList; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; + +public class Couple extends Pair { + + private static Couple TRUE_AND_FALSE = Couple.create(true, false); + + protected Couple(T first, T second) { + super(first, second); + } + + public static Couple create(T first, T second) { + return new Couple<>(first, second); + } + + public static Couple create(Supplier factory) { + return new Couple<>(factory.get(), factory.get()); + } + + public T get(boolean first) { + return first ? getFirst() : getSecond(); + } + + public void set(boolean first, T value) { + if (first) + setFirst(value); + else + setSecond(value); + } + + @Override + public Couple copy() { + return create(first, second); + } + + public Couple map(Function function) { + return Couple.create(function.apply(first), function.apply(second)); + } + + public void replace(Function function) { + setFirst(function.apply(getFirst())); + setSecond(function.apply(getSecond())); + } + + public void replaceWithContext(BiFunction function) { + replaceWithParams(function, TRUE_AND_FALSE); + } + + public void replaceWithParams(BiFunction function, Couple values) { + setFirst(function.apply(getFirst(), values.getFirst())); + setSecond(function.apply(getSecond(), values.getSecond())); + } + + public void forEach(Consumer consumer) { + consumer.accept(getFirst()); + consumer.accept(getSecond()); + } + + public void forEachWithContext(BiConsumer consumer) { + forEachWithParams(consumer, TRUE_AND_FALSE); + } + + public void forEachWithParams(BiConsumer function, Couple values) { + function.accept(getFirst(), values.getFirst()); + function.accept(getSecond(), values.getSecond()); + } + + public Couple swap() { + return Couple.create(second, first); + } + + public ListNBT serializeEach(Function serializer) { + return NBTHelper.writeCompoundList(ImmutableList.of(first, second), serializer); + } + + public static Couple deserializeEach(ListNBT list, Function deserializer) { + List readCompoundList = NBTHelper.readCompoundList(list, deserializer); + return new Couple<>(readCompoundList.get(0), readCompoundList.get(1)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java new file mode 100644 index 000000000..c64ab8f68 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java @@ -0,0 +1,87 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraft.block.Blocks; +import net.minecraft.item.DyeColor; +import net.minecraft.item.Item; +import net.minecraft.tags.Tag; +import net.minecraft.util.IItemProvider; +import net.minecraftforge.common.Tags; + +public class DyeHelper { + + public static IItemProvider getWoolOfDye(DyeColor color) { + switch (color) { + case BLACK: + return Blocks.BLACK_WOOL; + case BLUE: + return Blocks.BLUE_WOOL; + case BROWN: + return Blocks.BROWN_WOOL; + case CYAN: + return Blocks.CYAN_WOOL; + case GRAY: + return Blocks.GRAY_WOOL; + case GREEN: + return Blocks.GREEN_WOOL; + case LIGHT_BLUE: + return Blocks.LIGHT_BLUE_WOOL; + case LIGHT_GRAY: + return Blocks.LIGHT_GRAY_WOOL; + case LIME: + return Blocks.LIME_WOOL; + case MAGENTA: + return Blocks.MAGENTA_WOOL; + case ORANGE: + return Blocks.ORANGE_WOOL; + case PINK: + return Blocks.PINK_WOOL; + case PURPLE: + return Blocks.PURPLE_WOOL; + case RED: + return Blocks.RED_WOOL; + case YELLOW: + return Blocks.YELLOW_WOOL; + case WHITE: + default: + return Blocks.WHITE_WOOL; + } + } + + public static Tag getTagOfDye(DyeColor color) { + switch (color) { + case BLACK: + return Tags.Items.DYES_BLACK; + case BLUE: + return Tags.Items.DYES_BLUE; + case BROWN: + return Tags.Items.DYES_BROWN; + case CYAN: + return Tags.Items.DYES_CYAN; + case GRAY: + return Tags.Items.DYES_GRAY; + case GREEN: + return Tags.Items.DYES_GREEN; + case LIGHT_BLUE: + return Tags.Items.DYES_LIGHT_BLUE; + case LIGHT_GRAY: + return Tags.Items.DYES_LIGHT_GRAY; + case LIME: + return Tags.Items.DYES_LIME; + case MAGENTA: + return Tags.Items.DYES_MAGENTA; + case ORANGE: + return Tags.Items.DYES_ORANGE; + case PINK: + return Tags.Items.DYES_PINK; + case PURPLE: + return Tags.Items.DYES_PURPLE; + case RED: + return Tags.Items.DYES_RED; + case YELLOW: + return Tags.Items.DYES_YELLOW; + case WHITE: + default: + return Tags.Items.DYES_WHITE; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java index 8f806562d..67bc3f1fa 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java @@ -51,6 +51,7 @@ public class FilesHelper { return Lang.asId(name) .replace(' ', '_') .replace('!', '_') + .replace(':', '_') .replace('?', '_'); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java new file mode 100644 index 000000000..073f2fc07 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java @@ -0,0 +1,128 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.MathHelper; + +// Can replace all Interpolated value classes +// InterpolatedChasingValue, InterpolatedValue, InterpolatedChasingAngle, InterpolatedAngle +public class LerpedFloat { + + Interpolater interpolater; + float previousValue; + float value; + + Chaser chaseFunction; + float chaseTarget; + float chaseSpeed; + + boolean forcedSync; + + public LerpedFloat(Interpolater interpolater) { + this.interpolater = interpolater; + startWithValue(0); + forcedSync = true; + } + + public static LerpedFloat linear() { + return new LerpedFloat((p, c, t) -> (float) MathHelper.lerp(p, c, t)); + } + + public static LerpedFloat angular() { + return new LerpedFloat(AngleHelper::angleLerp); + } + + public LerpedFloat startWithValue(double value) { + float f = (float) value; + this.previousValue = f; + this.chaseTarget = f; + this.value = f; + return this; + } + + public LerpedFloat chase(double value, double speed, Chaser chaseFunction) { + this.chaseTarget = (float) value; + this.chaseSpeed = (float) speed; + this.chaseFunction = chaseFunction; + return this; + } + + public boolean updateChaseSpeed(double speed) { + float prevSpeed = this.chaseSpeed; + this.chaseSpeed = (float) speed; + return !MathHelper.epsilonEquals(prevSpeed, speed); + } + + public void tickChaser() { + previousValue = value; + if (chaseFunction == null) + return; + if (MathHelper.epsilonEquals((double) value, chaseTarget)) { + value = chaseTarget; + return; + } + value = chaseFunction.chase(value, chaseSpeed, chaseTarget); + } + + public void setValue(double value) { + this.previousValue = this.value; + this.value = (float) value; + } + + public float getValue() { + return getValue(1); + } + + public float getValue(float partialTicks) { + return MathHelper.lerp(partialTicks, previousValue, value); + } + + public float getChaseTarget() { + return chaseTarget; + } + + public void forceNextSync() { + forcedSync = true; + } + + public CompoundNBT writeNBT() { + CompoundNBT compoundNBT = new CompoundNBT(); + compoundNBT.putFloat("Speed", chaseSpeed); + compoundNBT.putFloat("Target", chaseTarget); + compoundNBT.putFloat("Value", value); + if (forcedSync) + compoundNBT.putBoolean("Force", true); + forcedSync = false; + return compoundNBT; + } + + public void readNBT(CompoundNBT compoundNBT, boolean clientPacket) { + if (!clientPacket || compoundNBT.contains("Force")) + startWithValue(compoundNBT.getFloat("Value")); + readChaser(compoundNBT); + } + + private void readChaser(CompoundNBT compoundNBT) { + chaseSpeed = compoundNBT.getFloat("Speed"); + chaseTarget = compoundNBT.getFloat("Target"); + } + + @FunctionalInterface + public interface Interpolater { + float interpolate(double progress, double current, double target); + } + + @FunctionalInterface + public interface Chaser { + + public static final Chaser IDLE = (c, s, t) -> (float) c; + public static final Chaser EXP = exp(Double.MAX_VALUE); + public static final Chaser LINEAR = (c, s, t) -> (float) (c + MathHelper.clamp(t - c, -s, s)); + + public static Chaser exp(double maxEffectiveSpeed) { + return (c, s, t) -> (float) (c + MathHelper.clamp((t - c) * s, -maxEffectiveSpeed, maxEffectiveSpeed)); + } + + float chase(double current, double speed, double target); + } + +} 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 cdb413a78..37d6d532c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java @@ -13,6 +13,10 @@ import net.minecraft.util.math.AxisAlignedBB; public class NBTHelper { + public static void putMarker(CompoundNBT nbt, String marker) { + nbt.putBoolean(marker, true); + } + public static > T readEnum(CompoundNBT nbt, String key, Class enumClass) { T[] enumConstants = enumClass.getEnumConstants(); String name = nbt.getString(key); diff --git a/src/main/java/com/simibubi/create/foundation/utility/Pair.java b/src/main/java/com/simibubi/create/foundation/utility/Pair.java new file mode 100644 index 000000000..dbd1810a2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/Pair.java @@ -0,0 +1,64 @@ +package com.simibubi.create.foundation.utility; + +import java.util.Objects; + +public class Pair { + + F first; + S second; + + protected Pair(F first, S second) { + this.first = first; + this.second = second; + } + + public static Pair of(F first, S second) { + return new Pair<>(first, second); + } + + public F getFirst() { + return first; + } + + public S getSecond() { + return second; + } + + public void setFirst(F first) { + this.first = first; + } + + public void setSecond(S second) { + this.second = second; + } + + public Pair copy() { + return Pair.of(first, second); + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) + return true; + if (obj instanceof Pair) { + final Pair other = (Pair) obj; + return Objects.equals(first, other.first) && Objects.equals(second, other.second); + } + return false; + } + + @Override + public int hashCode() { + return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode()); + } + + @Override + public String toString() { + return "(" + first + ", " + second + ")"; + } + + public Pair swap() { + return Pair.of(second, first); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java index 2e3599132..3c6fad18a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java @@ -11,14 +11,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.network.PacketBuffer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.TickEvent.Phase; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.network.NetworkEvent.Context; import net.minecraftforge.fml.network.PacketDistributor; -@EventBusSubscriber public class ServerSpeedProvider { static int clientTimer = 0; @@ -26,33 +21,26 @@ public class ServerSpeedProvider { static boolean initialized = false; static InterpolatedChasingValue modifier = new InterpolatedChasingValue().withSpeed(.25f); - @SubscribeEvent - public static void onServerTick(TickEvent.ServerTickEvent event) { - if (event.phase == Phase.START) - return; + public static void serverTick() { serverTimer++; if (serverTimer > getSyncInterval()) { AllPackets.channel.send(PacketDistributor.ALL.noArg(), new Packet()); serverTimer = 0; } } + + @OnlyIn(Dist.CLIENT) + public static void clientTick() { + if (Minecraft.getInstance().isSingleplayer() && Minecraft.getInstance().isGamePaused()) + return; + modifier.tick(); + clientTimer++; + } public static Integer getSyncInterval() { return AllConfigs.SERVER.tickrateSyncTimer.get(); } - @OnlyIn(Dist.CLIENT) - @SubscribeEvent - public static void onClientTick(TickEvent.ClientTickEvent event) { - if (event.phase == Phase.START) - return; - if (Minecraft.getInstance().isSingleplayer() && Minecraft.getInstance().isGamePaused()) - return; - - modifier.tick(); - clientTimer++; - } - public static float get() { return modifier.value; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java index 50178e682..a59e976dd 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java @@ -15,7 +15,6 @@ import net.minecraft.client.renderer.GLAllocation; import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Vector4f; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; @@ -27,16 +26,14 @@ public class SuperByteBuffer { public int getPackedLight(float x, float y, float z); } - public static final int FORMAT_LENGTH = DefaultVertexFormats.BLOCK.getSize(); - protected ByteBuffer original; - protected ByteBuffer mutable; + protected ByteBuffer template; + protected int formatSize; // Vertex Position private MatrixStack transforms; // Vertex Texture Coords private boolean shouldShiftUV; - private boolean resetUV; private SpriteShiftEntry spriteShift; private float uTarget, vTarget; @@ -52,81 +49,23 @@ public class SuperByteBuffer { public SuperByteBuffer(BufferBuilder buf) { Pair state = buf.popData(); - ByteBuffer original = state.getSecond(); - original.order(ByteOrder.nativeOrder()); // Vanilla bug, endianness does not carry over into sliced buffers - this.original = original; - this.mutable = GLAllocation.createDirectByteBuffer(state.getFirst() - .getCount() - * buf.getVertexFormat() - .getSize()); - this.mutable.order(original.order()); - this.mutable.limit(original.limit()); - mutable.put(this.original); - mutable.rewind(); + ByteBuffer rendered = state.getSecond(); + rendered.order(ByteOrder.nativeOrder()); // Vanilla bug, endianness does not carry over into sliced buffers + + formatSize = buf.getVertexFormat() + .getSize(); + int size = state.getFirst() + .getCount() * formatSize; + + template = GLAllocation.createDirectByteBuffer(size); + template.order(rendered.order()); + template.limit(rendered.limit()); + template.put(rendered); + template.rewind(); transforms = new MatrixStack(); } - public ByteBuffer build(MatrixStack view) { - original.rewind(); - mutable.rewind(); - - Matrix4f t = view.peek() - .getModel() - .copy(); - Matrix4f localTransforms = transforms.peek() - .getModel(); - - t.multiply(localTransforms); - - for (int vertex = 0; vertex < vertexCount(original); vertex++) { - Vector4f pos = new Vector4f(getX(original, vertex), getY(original, vertex), getZ(original, vertex), 1F); - Vector4f lightPos = new Vector4f(pos.getX(), pos.getY(), pos.getZ(), pos.getW()); - - pos.transform(t); - lightPos.transform(localTransforms); - putPos(mutable, vertex, pos.getX(), pos.getY(), pos.getZ()); - - if (shouldColor) { - byte lumByte = getR(original, vertex); - float lum = (lumByte < 0 ? 255 + lumByte : lumByte) / 256f; - int r2 = (int) (r * lum); - int g2 = (int) (g * lum); - int b2 = (int) (b * lum); - putColor(mutable, vertex, (byte) r2, (byte) g2, (byte) b2, (byte) a); - } - - if (shouldShiftUV) { - float u = getU(original, vertex); - float v = getV(original, vertex); - float targetU = spriteShift.getTarget() - .getInterpolatedU((getUnInterpolatedU(spriteShift.getOriginal(), u) / sheetSize) + uTarget * 16); - float targetV = spriteShift.getTarget() - .getInterpolatedV((getUnInterpolatedV(spriteShift.getOriginal(), v) / sheetSize) + vTarget * 16); - putUV(mutable, vertex, targetU, targetV); - } - - if (resetUV) - putUV(mutable, vertex, getU(original, vertex), getV(original, vertex)); - - if (shouldLight) { - int light = packedLightCoords; - if (lightTransform != null) { - lightPos.transform(lightTransform); - light = getLight(Minecraft.getInstance().world, lightPos); - } - putLight(mutable, vertex, light); - } - } - - transforms = new MatrixStack(); - shouldShiftUV = false; - shouldColor = false; - shouldLight = false; - mutable.rewind(); - return mutable; - } - public static float getUnInterpolatedU(TextureAtlasSprite sprite, float u) { float f = sprite.getMaxU() - sprite.getMinU(); return (u - sprite.getMinU()) / f * 16.0F; @@ -137,31 +76,72 @@ public class SuperByteBuffer { return (v - sprite.getMinV()) / f * 16.0F; } - public void renderInto(MatrixStack input, IVertexBuilder buffer) { - if (original.limit() == 0) + public void renderInto(MatrixStack input, IVertexBuilder builder) { + ByteBuffer buffer = template; + if (buffer.limit() == 0) return; - if (!(buffer instanceof BufferBuilder)) { - Matrix4f t = input.peek() - .getModel() - .copy(); - Matrix4f localTransforms = transforms.peek() - .getModel(); - t.multiply(localTransforms); + buffer.rewind(); - ByteBuffer m = mutable; - for (int v = 0; v < vertexCount(m); v++) { - Vector4f pos = new Vector4f(getX(original, v), getY(original, v), getZ(original, v), 1F); - pos.transform(t); - buffer.vertex(pos.getX(), pos.getY(), pos.getZ()) - .color(getR(m, v), getG(m, v), getB(m, v), getA(m, v)) - .texture(getU(m, v), getV(m, v)) - .light(getLight(m, v)) - .normal(getNX(m, v), getNY(m, v), getNZ(m, v)) - .endVertex(); - } - transforms = new MatrixStack(); - } else - ((BufferBuilder) buffer).putBulkData(build(input)); + Matrix4f t = input.peek() + .getModel() + .copy(); + Matrix4f localTransforms = transforms.peek() + .getModel(); + t.multiply(localTransforms); + + for (int i = 0; i < vertexCount(buffer); i++) { + float x = getX(buffer, i); + float y = getY(buffer, i); + float z = getZ(buffer, i); + + Vector4f pos = new Vector4f(x, y, z, 1F); + Vector4f lightPos = new Vector4f(x, y, z, 1F); + pos.transform(t); + lightPos.transform(localTransforms); + + builder.vertex(pos.getX(), pos.getY(), pos.getZ()); + + byte r = getR(buffer, i); + byte g = getG(buffer, i); + byte b = getB(buffer, i); + byte a = getA(buffer, i); + + if (shouldColor) { + float lum = (r < 0 ? 255 + r : r) / 256f; + builder.color((int) (this.r * lum), (int) (this.g * lum), (int) (this.b * lum), this.a); + } else + builder.color(r, g, b, a); + + float u = getU(buffer, i); + float v = getV(buffer, i); + + if (shouldShiftUV) { + float targetU = spriteShift.getTarget() + .getInterpolatedU((getUnInterpolatedU(spriteShift.getOriginal(), u) / sheetSize) + uTarget * 16); + float targetV = spriteShift.getTarget() + .getInterpolatedV((getUnInterpolatedV(spriteShift.getOriginal(), v) / sheetSize) + vTarget * 16); + builder.texture(targetU, targetV); + } else + builder.texture(u, v); + + if (shouldLight) { + int light = packedLightCoords; + if (lightTransform != null) { + lightPos.transform(lightTransform); + light = getLight(Minecraft.getInstance().world, lightPos); + } + builder.light(light); + } else + builder.light(getLight(buffer, i)); + + builder.normal(getNX(buffer, i), getNY(buffer, i), getNZ(buffer, i)) + .endVertex(); + } + + transforms = new MatrixStack(); + shouldShiftUV = false; + shouldColor = false; + shouldLight = false; } public SuperByteBuffer translate(double x, double y, double z) { @@ -188,7 +168,6 @@ public class SuperByteBuffer { public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { shouldShiftUV = true; - resetUV = false; spriteShift = entry; uTarget = 0; vTarget = 0; @@ -198,7 +177,6 @@ public class SuperByteBuffer { public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { shouldShiftUV = true; - resetUV = false; spriteShift = entry; this.uTarget = uTarget; this.vTarget = vTarget; @@ -206,12 +184,6 @@ public class SuperByteBuffer { return this; } - public SuperByteBuffer dontShiftUV() { - shouldShiftUV = false; - resetUV = true; - return this; - } - public SuperByteBuffer light(int packedLightCoords) { shouldLight = true; lightTransform = null; @@ -235,11 +207,11 @@ public class SuperByteBuffer { } protected int vertexCount(ByteBuffer buffer) { - return buffer.limit() / FORMAT_LENGTH; + return buffer.limit() / formatSize; } protected int getBufferPosition(int vertexIndex) { - return vertexIndex * FORMAT_LENGTH; + return vertexIndex * formatSize; } protected float getX(ByteBuffer buffer, int index) { @@ -294,32 +266,6 @@ public class SuperByteBuffer { return buffer.get(getBufferPosition(index) + 30); } - protected void putPos(ByteBuffer buffer, int index, float x, float y, float z) { - int pos = getBufferPosition(index); - buffer.putFloat(pos, x); - buffer.putFloat(pos + 4, y); - buffer.putFloat(pos + 8, z); - } - - protected void putUV(ByteBuffer buffer, int index, float u, float v) { - int pos = getBufferPosition(index); - buffer.putFloat(pos + 16, u); - buffer.putFloat(pos + 20, v); - } - - protected void putLight(ByteBuffer buffer, int index, int packedLight) { - buffer.putShort(getBufferPosition(index) + 24, (short) (packedLight & 0xFF)); - buffer.putShort(getBufferPosition(index) + 26, (short) ((packedLight >> 16) & 0xFF)); - } - - protected void putColor(ByteBuffer buffer, int index, byte r, byte g, byte b, byte a) { - int bufferPosition = getBufferPosition(index); - buffer.put(bufferPosition + 12, r); - buffer.put(bufferPosition + 13, g); - buffer.put(bufferPosition + 14, b); - buffer.put(bufferPosition + 15, a); - } - private static int getLight(World world, Vector4f lightPos) { BlockPos.Mutable pos = new BlockPos.Mutable(); float sky = 0, block = 0; diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java index adb1a16cd..0a46c4c3a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility; import java.util.HashMap; import java.util.Map; -import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -52,17 +51,22 @@ public class SuperByteBufferCache { public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState) { return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState)); } - - public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, MatrixStack modelTransform) { + + public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, + MatrixStack modelTransform) { return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState, modelTransform)); } - - public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir) { - return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> standardModelRender(partial.get(), referenceState)); + + public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, + Direction dir) { + return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> standardModelRender(partial.get(), referenceState)); } - - public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir, MatrixStack modelTransform) { - return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> standardModelRender(partial.get(), referenceState, modelTransform)); + + public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir, + MatrixStack modelTransform) { + return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> standardModelRender(partial.get(), referenceState, modelTransform)); } public SuperByteBuffer renderBlockIn(Compartment compartment, BlockState toRender) { @@ -84,16 +88,19 @@ public class SuperByteBufferCache { } public void registerCompartment(Compartment instance) { - cache.put(instance, CacheBuilder.newBuilder().build()); + cache.put(instance, CacheBuilder.newBuilder() + .build()); } - public void registerCompartment(Compartment instance, long ticksTillExpired) { - cache.put(instance, - CacheBuilder.newBuilder().expireAfterAccess(ticksTillExpired * 50, TimeUnit.MILLISECONDS).build()); + public void registerCompartment(Compartment instance, long ticksUntilExpired) { + cache.put(instance, CacheBuilder.newBuilder() + .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) + .build()); } private SuperByteBuffer standardBlockRender(BlockState renderedState) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + BlockRendererDispatcher dispatcher = Minecraft.getInstance() + .getBlockRendererDispatcher(); return standardModelRender(dispatcher.getModelForState(renderedState), renderedState); } @@ -102,22 +109,21 @@ public class SuperByteBufferCache { } private SuperByteBuffer standardModelRender(IBakedModel model, BlockState referenceState, MatrixStack ms) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + Minecraft mc = Minecraft.getInstance(); + BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher(); BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); - BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); - Random random = new Random(); + BufferBuilder builder = new BufferBuilder(512); + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - blockRenderer.renderModelFlat(Minecraft.getInstance().world, model, referenceState, BlockPos.ZERO.up(255), ms, - builder, true, random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + blockRenderer.renderModel(mc.world, model, referenceState, BlockPos.ZERO.up(255), ms, builder, true, + mc.world.rand, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); builder.finishDrawing(); return new SuperByteBuffer(builder); } public void invalidate() { - cache.forEach((comp, cache) -> { - cache.invalidateAll(); - }); + cache.forEach((comp, cache) -> cache.invalidateAll()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index eb89ce5ed..e339e51af 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.utility; import java.util.Random; +import javax.annotation.Nullable; + import net.minecraft.nbt.DoubleNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.util.Direction; @@ -13,10 +15,12 @@ import net.minecraft.util.math.vector.Vector3i; public class VecHelper { + public static final Vector3d CENTER_OF_ORIGIN = new Vector3d(.5, .5, .5); + public static Vector3d rotate(Vector3d vec, Vector3d rotationVec) { return rotate(vec, rotationVec.x, rotationVec.y, rotationVec.z); } - + public static Vector3d rotate(Vector3d vec, double xRot, double yRot, double zRot) { return rotate(rotate(rotate(vec, xRot, Axis.X), yRot, Axis.Y), zRot, Axis.Z); } @@ -54,6 +58,8 @@ public class VecHelper { } public static Vector3d getCenterOf(Vector3i pos) { + if (pos.equals(Vector3i.NULL_VECTOR)) + return CENTER_OF_ORIGIN; return Vector3d.of(pos).add(.5f, .5f, .5f); } @@ -62,10 +68,14 @@ public class VecHelper { vec.z + (r.nextFloat() - .5f) * 2 * radius); } - public static Vector3d planeByNormal(Vector3d vec) { + public static Vector3d axisAlingedPlaneOf(Vector3d vec) { vec = vec.normalize(); return new Vector3d(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); } + + public static Vector3d axisAlingedPlaneOf(Direction face) { + return axisAlingedPlaneOf(Vector3d.of(face.getDirectionVec())); + } public static ListNBT writeNBT(Vector3d vec) { ListNBT listnbt = new ListNBT(); @@ -76,6 +86,8 @@ public class VecHelper { } public static Vector3d readNBT(ListNBT list) { + if (list.isEmpty()) + return Vector3d.ZERO; return new Vector3d(list.getDouble(0), list.getDouble(1), list.getDouble(2)); } @@ -101,4 +113,36 @@ public class VecHelper { return true; } + public static Vector3d clamp(Vector3d vec, float maxLength) { + return vec.length() > maxLength ? vec.normalize() + .scale(maxLength) : vec; + } + + public static Vector3d clampComponentWise(Vector3d vec, float maxLength) { + return new Vector3d(MathHelper.clamp(vec.x, -maxLength, maxLength), MathHelper.clamp(vec.y, -maxLength, maxLength), + MathHelper.clamp(vec.z, -maxLength, maxLength)); + } + + public static Vector3d project(Vector3d vec, Vector3d ontoVec) { + if (ontoVec.equals(Vector3d.ZERO)) + return Vector3d.ZERO; + return ontoVec.scale(vec.dotProduct(ontoVec) / ontoVec.lengthSquared()); + } + + @Nullable + public static Vector3d intersectSphere(Vector3d origin, Vector3d lineDirection, Vector3d sphereCenter, double radius) { + if (lineDirection.equals(Vector3d.ZERO)) + return null; + if (lineDirection.length() != 1) + lineDirection = lineDirection.normalize(); + + Vector3d diff = origin.subtract(sphereCenter); + double lineDotDiff = lineDirection.dotProduct(diff); + double delta = lineDotDiff * lineDotDiff - (diff.lengthSquared() - radius * radius); + if (delta < 0) + return null; + double t = -lineDotDiff + MathHelper.sqrt(delta); + return origin.add(lineDirection.scale(t)); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java new file mode 100644 index 000000000..99a84db53 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.utility; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import net.minecraft.world.IWorld; + +public class WorldAttached { + + static List> allMaps = new ArrayList<>(); + Map attached; + private Supplier factory; + + public WorldAttached(Supplier factory) { + this.factory = factory; + attached = new HashMap<>(); + allMaps.add(attached); + } + + public static void invalidateWorld(IWorld world) { + allMaps.forEach(m -> m.remove(world)); + } + + @Nullable + public T get(IWorld world) { + T t = attached.get(world); + if (t != null) + return t; + T entry = factory.get(); + put(world, entry); + return entry; + } + + public void put(IWorld world, T entry) { + attached.put(world, entry); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java index 6bdecac60..751a01554 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java @@ -58,7 +58,7 @@ public class BlockClusterOutline extends Outline { Vector3d center = VecHelper.getCenterOf(pos); Vector3d offset = Vector3d.of(face.getDirectionVec()); - Vector3d plane = VecHelper.planeByNormal(offset); + Vector3d plane = VecHelper.axisAlingedPlaneOf(offset); Axis axis = face.getAxis(); offset = offset.scale(1 / 2f + 1 / 64d); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java index 9e0acdd83..18ba7c560 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java @@ -20,7 +20,7 @@ public class LineOutline extends Outline { @Override public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - renderAACuboidLine(ms, buffer, start, end); + renderCuboidLine(ms, buffer, start, end); } public static class EndChasingLineOutline extends LineOutline { @@ -52,7 +52,7 @@ public class LineOutline extends Outline { float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress); Vector3d start = end.add(this.start.subtract(end) .scale(distanceToTarget)); - renderAACuboidLine(ms, buffer, start, end); + renderCuboidLine(ms, buffer, start, end); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java index 4ec758203..3eb7f42c7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java @@ -10,13 +10,16 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.foundation.renderState.RenderTypes; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.util.math.vector.Matrix3f; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; public abstract class Outline { @@ -30,7 +33,21 @@ public abstract class Outline { public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer); - public void renderAACuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vector3d start, Vector3d end) { + public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) { + Vec3d diff = end.subtract(start); + float hAngle = AngleHelper.deg(MathHelper.atan2(diff.x, diff.z)); + float hDistance = (float) diff.mul(1, 0, 1) + .length(); + float vAngle = AngleHelper.deg(MathHelper.atan2(hDistance, diff.y)) - 90; + ms.push(); + MatrixStacker.of(ms) + .translate(start) + .rotateY(hAngle).rotateX(vAngle); + renderAACuboidLine(ms, buffer, Vec3d.ZERO, new Vec3d(0, 0, diff.length())); + ms.pop(); + } + + public void renderAACuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) { IVertexBuilder builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); Vector3d diff = end.subtract(start); @@ -44,7 +61,7 @@ public abstract class Outline { float lineWidth = params.getLineWidth(); Vector3d extension = diff.normalize() .scale(lineWidth / 2); - Vector3d plane = VecHelper.planeByNormal(diff); + Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); Direction face = Direction.getFacingFromVector(diff.x, diff.y, diff.z); Axis axis = face.getAxis(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index f0adedc7f..cd1a22292 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.utility.outliner; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -110,7 +111,7 @@ public class Outliner { // Maintenance public Outliner() { - outlines = new HashMap<>(); + outlines = Collections.synchronizedMap(new HashMap<>()); } public void tickOutlines() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java index fa3b06eea..96e1ba2b6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java @@ -11,7 +11,10 @@ import javax.annotation.Nullable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import net.minecraft.client.resources.ReloadListener; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; import net.minecraft.world.World; /** @@ -23,7 +26,7 @@ import net.minecraft.world.World; * */ public class RecipeFinder { - + private static Cache>> cachedSearches = CacheBuilder.newBuilder().build(); /** @@ -55,4 +58,19 @@ public class RecipeFinder { return list; } + + public static final ReloadListener LISTENER = new ReloadListener() { + + @Override + protected Object prepare(IResourceManager p_212854_1_, IProfiler p_212854_2_) { + return new Object(); + } + + @Override + protected void apply(Object p_212853_1_, IResourceManager p_212853_2_, IProfiler p_212853_3_) { + cachedSearches.invalidateAll(); + } + + }; + } 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 e194a51ae..76dd50eb2 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java @@ -1,12 +1,7 @@ package com.simibubi.create.foundation.worldgen; -import java.util.LinkedList; -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; import net.minecraft.entity.player.PlayerEntity; @@ -21,6 +16,10 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; +import java.util.LinkedList; +import java.util.OptionalDouble; +import java.util.Random; + public class OxidizingBlock extends MetalBlock { public static final IntegerProperty OXIDIZATION = IntegerProperty.create("oxidization", 0, 7); @@ -56,6 +55,8 @@ public class OxidizingBlock extends MetalBlock { LinkedList neighbors = new LinkedList<>(); for (Direction facing : Direction.values()) { BlockPos neighbourPos = pos.offset(facing); + if (!worldIn.isAreaLoaded(neighbourPos, 0)) + continue; if (!worldIn.isBlockPresent(neighbourPos)) continue; BlockState neighborState = worldIn.getBlockState(neighbourPos); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 02bc0b9d4..549553b12 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1 +1,16 @@ -public net.minecraft.network.play.ServerPlayNetHandler field_147365_f # floatingTickCount \ No newline at end of file +public net.minecraft.network.play.ServerPlayNetHandler field_147365_f # floatingTickCount + +# CubeParticle +protected net.minecraft.client.particle.Particle field_228343_B_ # collidedY + +# Needed for ChunkUtil, maybe remove these for releases +# ChunkManager +public net.minecraft.world.server.ChunkManager func_219212_a(JLnet/minecraft/world/server/ChunkHolder;)V #scheduleSave +public net.minecraft.world.server.ChunkManager field_219251_e #loadedChunks +public net.minecraft.world.server.ChunkManager field_219262_p #immutableLoadedChunksDirty +public net.minecraft.world.server.ChunkManager field_219253_g #chunksToUnload + +# ChunkStatus +public-f net.minecraft.world.chunk.ChunkStatus field_222617_m #FULL +public net.minecraft.world.chunk.ChunkStatus$IGenerationWorker +public net.minecraft.world.chunk.ChunkStatus$ILoadingWorker \ 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 9efbca048..ea54a7ea9 100644 --- a/src/main/resources/assets/create/lang/default/advancements.json +++ b/src/main/resources/assets/create/lang/default/advancements.json @@ -39,7 +39,7 @@ "advancement.create.electron_tube": "Beep boop", "advancement.create.electron_tube.desc": "Make some Electron Tubes, useful in crafting less primitive machinery.", "advancement.create.mechanical_saw": "Stationary Chopping", - "advancement.create.mechanical_saw.desc": "Place and power a Mechanical mechanical_saw", + "advancement.create.mechanical_saw.desc": "Place and power a Mechanical Saw", "advancement.create.basin": "Basin Operation", "advancement.create.basin.desc": "Place a basin and try throwing items into it.", "advancement.create.mixer": "Mixin' it Up", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index bd91c8762..0c2536fc2 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -6,8 +6,8 @@ "death.attack.create.crush": "%1$s was processed by Crushing Wheels", "death.attack.create.fan_fire": "%1$s was burned to death by hot air", "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", - "death.attack.create.mechanical_drill": "%1$s was impaled by Mechanical mechanical_drill", - "death.attack.create.mechanical_saw": "%1$s got cut in half by Mechanical mechanical_saw", + "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", @@ -23,7 +23,7 @@ "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", "create.recipe.packing": "Compacting", - "create.recipe.mechanical_sawing": "mechanical_sawing", + "create.recipe.mechanical_sawing": "Sawing", "create.recipe.mechanical_crafting": "Mechanical Crafting", "create.recipe.block_cutting": "Block Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", @@ -135,6 +135,7 @@ "create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation", "create.logistics.filter": "Filter", + "create.logistics.recipe_filter": "Recipe Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", @@ -341,7 +342,24 @@ "create.tooltip.generationSpeed" : "Generates at %1$s %2$s", "create.tooltip.analogStrength": "Analog Strength: %1$s/15", - "create.mechanical_mixer.min_ingredients": "Min. Ingredients", + + "create.mechanical_arm.extract_from": "Take items from %1$s", + "create.mechanical_arm.deposit_to": "Deposit items to %1$s", + "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "Prefer First Target", + + "create.tunnel.selection_mode.split": "Split", + "create.tunnel.selection_mode.forced_split": "Forced Split", + "create.tunnel.selection_mode.round_robin": "Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "Prefer Nearest", + "create.tunnel.selection_mode.randomize": "Randomize", + "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index ffe31ce5f..53dfef154 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -396,24 +396,6 @@ "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "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": "_Takes_ _Items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_.", - "block.create.extractor.tooltip.condition1": "When Powered by Redstone", - "block.create.extractor.tooltip.behaviour1": "_Pauses_ the Extractor.", - "block.create.extractor.tooltip.condition2": "Active Belt pulling", - "block.create.extractor.tooltip.behaviour2": "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-Click on Filter Space", - "block.create.extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.", - - "block.create.transposer.tooltip": "TRANSPOSER", - "block.create.transposer.tooltip.summary": "_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": "When Powered by Redstone", - "block.create.transposer.tooltip.behaviour1": "_Pauses_ the Transposer.", - "block.create.transposer.tooltip.condition2": "Active Belt pulling", - "block.create.transposer.tooltip.behaviour2": "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": "R-Click on Filter Space", - "block.create.transposer.tooltip.action1": "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": "DEPLOYER", "block.create.deployer.tooltip.summary": "_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": "When Rotated", @@ -421,24 +403,6 @@ "block.create.deployer.tooltip.condition2": "R-Clicked with Wrench", "block.create.deployer.tooltip.behaviour2": "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": "_Takes_ _items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.", - "block.create.linked_extractor.tooltip.condition1": "When Redstone Link Active", - "block.create.linked_extractor.tooltip.behaviour1": "_Pauses_ the Extractor.", - "block.create.linked_extractor.tooltip.control1": "R-Click on Filter Space", - "block.create.linked_extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.", - "block.create.linked_extractor.tooltip.control2": "R-Click on Frequency Space", - "block.create.linked_extractor.tooltip.action2": "Assigns currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Extractor will pause.", - - "block.create.linked_transposer.tooltip": "LINKED TRANSPOSER", - "block.create.linked_transposer.tooltip.summary": "_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": "When Redstone Link Active", - "block.create.linked_transposer.tooltip.behaviour1": "_Pauses_ the Transposer.", - "block.create.linked_transposer.tooltip.control1": "R-Click on Filter Space", - "block.create.linked_transposer.tooltip.action1": "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": "R-Click on Frequency Space", - "block.create.linked_transposer.tooltip.action2": "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": "FUNNEL", "block.create.funnel.tooltip.summary": "_Collects_ _incoming_ _items_ and inserts them into the attached _Inventory_ if possible. Can collect items in the _world_ and items on a _belt_.", "block.create.funnel.tooltip.condition1": "Passive Belt pulling", diff --git a/src/main/resources/assets/create/models/block/basin.json b/src/main/resources/assets/create/models/block/basin.json index 95bc5feaa..aa5e251cd 100644 --- a/src/main/resources/assets/create/models/block/basin.json +++ b/src/main/resources/assets/create/models/block/basin.json @@ -10,13 +10,13 @@ { "name": "Side1", "from": [0, 2, 0], - "to": [2, 13, 16], + "to": [2, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]}, "faces": { - "north": {"uv": [14, 3, 16, 14], "texture": "#1"}, - "east": {"uv": [0, 3, 16, 14], "texture": "#1"}, - "south": {"uv": [0, 3, 2, 14], "texture": "#1"}, - "west": {"uv": [0, 3, 16, 14], "texture": "#1"}, + "north": {"uv": [14, 0, 16, 14], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 14], "texture": "#1"}, + "south": {"uv": [0, 0, 2, 14], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 14], "texture": "#1"}, "up": {"uv": [0, 0, 2, 16], "texture": "#12"}, "down": {"uv": [0, 0, 2, 16], "texture": "#12"} } @@ -38,11 +38,11 @@ { "name": "Side4", "from": [2, 2, 0], - "to": [14, 13, 2], + "to": [14, 16, 2], "rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]}, "faces": { - "north": {"uv": [2, 3, 14, 14], "texture": "#1"}, - "south": {"uv": [2, 3, 14, 14], "texture": "#1"}, + "north": {"uv": [2, 0, 14, 14], "texture": "#1"}, + "south": {"uv": [2, 0, 14, 14], "texture": "#1"}, "up": {"uv": [2, 0, 14, 2], "texture": "#12"}, "down": {"uv": [2, 14, 14, 16], "texture": "#12"} } @@ -50,11 +50,11 @@ { "name": "Side2", "from": [2, 2, 14], - "to": [14, 13, 16], + "to": [14, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]}, "faces": { - "north": {"uv": [2, 3, 14, 14], "texture": "#1"}, - "south": {"uv": [2, 3, 14, 14], "texture": "#1"}, + "north": {"uv": [2, 0, 14, 14], "texture": "#1"}, + "south": {"uv": [2, 0, 14, 14], "texture": "#1"}, "up": {"uv": [2, 14, 14, 16], "texture": "#12"}, "down": {"uv": [2, 0, 14, 2], "texture": "#12"} } @@ -62,13 +62,13 @@ { "name": "Side3", "from": [14, 2, 0], - "to": [16, 13, 16], + "to": [16, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 40, 8]}, "faces": { - "north": {"uv": [0, 3, 2, 14], "texture": "#1"}, - "east": {"uv": [0, 3, 16, 14], "texture": "#1"}, - "south": {"uv": [14, 3, 16, 14], "texture": "#1"}, - "west": {"uv": [0, 3, 16, 14], "texture": "#1"}, + "north": {"uv": [0, 0, 2, 14], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 14], "texture": "#1"}, + "south": {"uv": [14, 0, 16, 14], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 14], "texture": "#1"}, "up": {"uv": [14, 0, 16, 16], "texture": "#12"}, "down": {"uv": [14, 0, 16, 16], "texture": "#12"} } 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 index 769dac047..579fd216b 100644 --- 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 @@ -4,7 +4,9 @@ "textures": { "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", "particle": "create:block/brass_block" }, "elements": [ @@ -14,10 +16,11 @@ "to": [16, 0, 6], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, "faces": { - "north": {"uv": [8, 13.5, 9, 15], "texture": "#4"}, + "north": {"uv": [0, 8, 1, 9.5], "texture": "#7"}, "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"} + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [14, 10, 16, 16], "texture": "#particle"} } }, { @@ -26,10 +29,11 @@ "to": [2, 0, 6], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, "faces": { - "north": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "north": {"uv": [7, 8, 8, 9.5], "texture": "#7"}, "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"} + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 10, 2, 16], "texture": "#particle"} } }, { @@ -38,9 +42,9 @@ "to": [16, 16, 6], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, "faces": { - "north": {"uv": [8, 5.5, 9, 13.5], "texture": "#4"}, + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, "up": {"uv": [14, 0, 16, 6], "texture": "#2"} } @@ -51,9 +55,9 @@ "to": [2, 16, 6], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 0]}, "faces": { - "north": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [16, 5.5, 15, 13.5], "texture": "#4"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, "up": {"uv": [16, 0, 14, 6], "texture": "#2"} } @@ -64,10 +68,10 @@ "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"} + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "up": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2"} } }, { @@ -76,9 +80,10 @@ "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"} + "north": {"uv": [0, 9.5, 0.5, 10.5], "texture": "#7"}, + "east": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, { @@ -87,60 +92,62 @@ "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"} + "north": {"uv": [7.5, 9.5, 8, 10.5], "texture": "#7"}, + "east": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, { "name": "BackExtension", - "from": [2, -2, 10], - "to": [14, 14, 14], + "from": [3, -2, 10], + "to": [13, 13, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { - "east": {"uv": [9, 8, 11, 16], "texture": "#3"}, + "east": {"uv": [9, 6, 16, 8], "rotation": 90, "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"} + "west": {"uv": [9, 6, 16, 8], "rotation": 270, "texture": "#3"}, + "up": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} } }, { "name": "MidExtension", - "from": [1, -2, 6], - "to": [15, 15, 10], + "from": [2, -2, 6], + "to": [14, 14, 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"} + "north": {"uv": [0, 6, 6, 14], "texture": "#3"}, + "east": {"uv": [1, 6, 9, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 16, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [1, 8, 9, 6], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"} } }, { "name": "BackBottom", - "from": [3.9, -3, 16], - "to": [12.1, 7, 26], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -5, 17]}, + "from": [3.9, -2, 18], + "to": [12.1, 2, 26], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 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"} + "east": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, + "south": {"uv": [8, 13, 12, 15], "rotation": 180, "texture": "#7"}, + "west": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, + "up": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"}, + "down": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"} } }, { "name": "Back", - "from": [2.9, -4.1, 14], - "to": [13.1, 13.1, 17], + "from": [2.1, -2.1, 14], + "to": [13.9, 13.9, 17.9], "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"} + "north": {"uv": [0, 4, 16, 16], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} } }, { @@ -150,7 +157,7 @@ "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"}, + "south": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, "up": {"uv": [1, 5, 15, 16], "texture": "#particle"} } }, @@ -160,9 +167,10 @@ "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"} + "east": {"uv": [0, 14.5, 5, 16], "texture": "#7"}, + "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#7"}, + "up": {"uv": [0, 14.5, 5.5, 15], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 10], "texture": "#particle"} } }, { @@ -171,49 +179,13 @@ "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"} + "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#7"}, + "west": {"uv": [5, 14.5, 0, 16], "texture": "#7"}, + "up": {"uv": [0, 15, 5.5, 14.5], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 10], "texture": "#particle"} } } ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "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", 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 index ee59d4be2..e026af2fc 100644 --- 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 @@ -4,7 +4,9 @@ "textures": { "2": "create:block/brass_funnel_push", "3": "create:block/brass_funnel_back", - "4": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", "particle": "create:block/brass_block" }, "elements": [ @@ -14,10 +16,11 @@ "to": [16, 0, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [8, 13.5, 9, 15], "texture": "#4"}, + "north": {"uv": [0, 8, 1, 9.5], "texture": "#7"}, "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"} + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [14, 10, 16, 16], "texture": "#particle"} } }, { @@ -26,10 +29,11 @@ "to": [2, 0, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [15, 13.5, 16, 15], "texture": "#4"}, + "north": {"uv": [7, 8, 8, 9.5], "texture": "#7"}, "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"} + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 10, 2, 16], "texture": "#particle"} } }, { @@ -38,9 +42,9 @@ "to": [16, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [8, 5.5, 9, 13.5], "texture": "#4"}, + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, "up": {"uv": [14, 0, 16, 6], "texture": "#2"} } @@ -51,9 +55,9 @@ "to": [2, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [15, 5.5, 16, 13.5], "texture": "#4"}, + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [16, 5.5, 15, 13.5], "texture": "#4"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, "up": {"uv": [16, 0, 14, 6], "texture": "#2"} } @@ -64,10 +68,20 @@ "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"}, + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, "up": {"uv": [2, 0, 14, 6], "texture": "#2"}, - "down": {"uv": [2, 0, 14, 6], "texture": "#particle"} + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "Top", + "from": [2, -2, 12], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -14, 8]}, + "faces": { + "north": {"uv": [0, 8, 6, 14], "texture": "#3"}, + "south": {"uv": [9, 3, 15, 9.5], "texture": "#7"} } }, { @@ -76,9 +90,10 @@ "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"} + "north": {"uv": [0, 9.5, 0.5, 10.5], "texture": "#7"}, + "east": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, { @@ -87,61 +102,36 @@ "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"} + "north": {"uv": [7.5, 9.5, 8, 10.5], "texture": "#7"}, + "east": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, { "name": "BackBottom", - "from": [3.9, -5, 16], - "to": [12.1, 5, 26], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -5, 17]}, + "from": [3.9, -2, 18], + "to": [12.1, 2, 26], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 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"} + "east": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, + "south": {"uv": [8, 13, 12, 15], "rotation": 180, "texture": "#7"}, + "west": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, + "up": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"}, + "down": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"} } }, { "name": "Back", - "from": [2.9, -4.1, 16], - "to": [13.1, 13.1, 19], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2.1, -2.1, 14], + "to": [13.9, 13.9, 17.9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 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"} + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} } }, { @@ -151,7 +141,7 @@ "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"}, + "south": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, "up": {"uv": [1, 10, 15, 16], "texture": "#particle"} } }, @@ -159,62 +149,40 @@ "name": "BackPlateLeft", "from": [15, -5, 14], "to": [16, -2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "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"} + "east": {"uv": [0, 14.5, 1, 16], "texture": "#7"}, + "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#7"}, + "west": {"uv": [7, 14.5, 8, 16], "texture": "#7"}, + "up": {"uv": [0, 14.5, 5.5, 15], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} } }, { "name": "BackPlateLeft", "from": [0, -5, 14], "to": [1, -2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "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"} + "east": {"uv": [8, 14.5, 7, 16], "texture": "#7"}, + "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#7"}, + "west": {"uv": [1, 14.5, 0, 16], "texture": "#7"}, + "up": {"uv": [0, 15, 5.5, 14.5], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} + } + }, + { + "from": [1, -2, 14], + "to": [15, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 6, 22]}, + "faces": { + "east": {"uv": [1, 6, 9, 6.5], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 16, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 9, 6.5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 6.5, 6], "rotation": 90, "texture": "#3"} } } ], - "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", @@ -223,19 +191,13 @@ { "name": "FrontSection", "origin": [9, -4, 8], - "children": [0, 1, 2, 3, 4, 5, 6] - }, - { - "name": "Extension", - "origin": [9, -4, 8], - "children": [7, 8] + "children": [0, 1, 2, 3, 4, 5, 6, 7] }, { "name": "Base", "origin": [9, -4, 8], - "children": [9, 10, 11, 12, 13] + "children": [8, 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 index 328a8a1f5..2cc22b0b7 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/flap.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/flap.json @@ -1,6 +1,7 @@ { + "credit": "Made with Blockbench", "textures": { - "4": "create:block/brass_funnel_plating" + "4": "create:block/brass_funnel_back" }, "elements": [ { @@ -9,12 +10,12 @@ "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"} + "north": {"uv": [14, 8.5, 12.5, 15], "texture": "#4"}, + "east": {"uv": [13.5, 8.5, 14, 15], "texture": "#4"}, + "south": {"uv": [12.5, 8.5, 14, 15], "texture": "#4"}, + "west": {"uv": [12.5, 8.5, 13, 15], "texture": "#4"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#4"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#4"} } } ] diff --git a/src/main/resources/assets/create/models/block/blaze_burner/blaze/fading.json b/src/main/resources/assets/create/models/block/blaze_burner/blaze/fading.json new file mode 100644 index 000000000..d6f517fad --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/blaze/fading.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/blaze_smouldering", + "particle": "create:block/blaze_smouldering" + }, + "elements": [ + { + "name": "Blaze 3", + "from": [5, 6, 5], + "to": [11, 12, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 7]}, + "faces": { + "north": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#2"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#2"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#2"}, + "up": {"uv": [0, 6, 6, 12], "texture": "#2"}, + "down": {"uv": [6, 6, 12, 12], "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_burner/blaze/kindled.json b/src/main/resources/assets/create/models/block/blaze_burner/blaze/kindled.json new file mode 100644 index 000000000..5300221b8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/blaze/kindled.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/blaze_kindled", + "particle": "create:block/blaze_kindled" + }, + "elements": [ + { + "name": "Blaze 4", + "from": [4, 6, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_burner/blaze/seething.json b/src/main/resources/assets/create/models/block/blaze_burner/blaze/seething.json new file mode 100644 index 000000000..a7ba42fbd --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/blaze/seething.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/blaze_seething" + }, + "elements": [ + { + "name": "Blaze 5", + "from": [4, 6, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#1"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#1"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_burner/blaze/smouldering.json b/src/main/resources/assets/create/models/block/blaze_burner/blaze/smouldering.json new file mode 100644 index 000000000..e831fdbfb --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/blaze/smouldering.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/blaze_smouldering", + "particle": "create:block/blaze_smouldering" + }, + "elements": [ + { + "name": "Blaze", + "from": [6, 6, 6], + "to": [10, 10, 10], + "faces": { + "north": {"uv": [0, 12, 4, 16], "texture": "#2"}, + "east": {"uv": [8, 12, 4, 16], "texture": "#2"}, + "south": {"uv": [4, 12, 8, 16], "texture": "#2"}, + "west": {"uv": [4, 12, 8, 16], "texture": "#2"}, + "up": {"uv": [8, 12, 12, 16], "texture": "#2"}, + "down": {"uv": [12, 12, 16, 16], "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_heater/block.json b/src/main/resources/assets/create/models/block/blaze_burner/block.json similarity index 58% rename from src/main/resources/assets/create/models/block/blaze_heater/block.json rename to src/main/resources/assets/create/models/block/blaze_burner/block.json index 135de425a..c42a49e1e 100644 --- a/src/main/resources/assets/create/models/block/blaze_heater/block.json +++ b/src/main/resources/assets/create/models/block/blaze_burner/block.json @@ -2,8 +2,10 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/blaze_heater_brazier", - "particle": "create:block/blaze_heater_brazier" + "1": "create:block/blaze_burner_inner", + "2": "create:block/blaze_burner_side", + "3": "create:block/dark_metal_block", + "particle": "create:block/dark_metal_block" }, "elements": [ { @@ -11,10 +13,10 @@ "from": [2, 5, 2], "to": [14, 14, 14], "faces": { - "north": {"uv": [1, 1, 7, 5.5], "texture": "#0"}, - "east": {"uv": [1, 1, 7, 5.5], "texture": "#0"}, - "south": {"uv": [1, 1, 7, 5.5], "texture": "#0"}, - "west": {"uv": [1, 1, 7, 5.5], "texture": "#0"} + "north": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "east": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "south": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "west": {"uv": [0, 6, 12, 15], "texture": "#2"} } }, { @@ -22,7 +24,7 @@ "from": [2, 5, 14], "to": [14, 14, 15], "faces": { - "north": {"uv": [1, 1, 7, 5.5], "texture": "#0"} + "north": {"uv": [12, 6, 0, 15], "texture": "#2"} } }, { @@ -30,7 +32,7 @@ "from": [1, 5, 2], "to": [2, 14, 14], "faces": { - "east": {"uv": [1, 1, 7, 5.5], "texture": "#0"} + "east": {"uv": [12, 6, 0, 15], "texture": "#2"} } }, { @@ -38,7 +40,7 @@ "from": [2, 5, 1], "to": [14, 14, 2], "faces": { - "south": {"uv": [1, 1, 7, 5.5], "texture": "#0"} + "south": {"uv": [12, 6, 0, 15], "texture": "#2"} } }, { @@ -46,7 +48,7 @@ "from": [14, 5, 2], "to": [15, 14, 14], "faces": { - "west": {"uv": [1, 1, 7, 5.5], "texture": "#0"} + "west": {"uv": [12, 6, 0, 15], "texture": "#2"} } }, { @@ -55,7 +57,7 @@ "to": [14, 17, 14], "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]}, "faces": { - "south": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "south": {"uv": [0, 3, 12, 6], "texture": "#2"} } }, { @@ -64,7 +66,7 @@ "to": [3, 17, 14], "rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]}, "faces": { - "west": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "west": {"uv": [0, 3, 12, 6], "texture": "#2"} } }, { @@ -73,7 +75,7 @@ "to": [14, 17, 3], "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]}, "faces": { - "north": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "north": {"uv": [0, 3, 12, 6], "texture": "#2"} } }, { @@ -82,7 +84,7 @@ "to": [14, 17, 14], "rotation": {"angle": -45, "axis": "z", "origin": [14, 14, 8]}, "faces": { - "east": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "east": {"uv": [0, 3, 12, 6], "texture": "#2"} } }, { @@ -91,34 +93,34 @@ "to": [14, 17, 15], "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]}, "faces": { - "north": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "north": {"uv": [12, 3, 0, 6], "texture": "#2"} } }, { - "name": "Brazier Spikes 2b", + "name": "Brazier Spikes 1b", "from": [1, 14, 2], "to": [2, 17, 14], "rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]}, "faces": { - "east": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "east": {"uv": [12, 3, 0, 6], "texture": "#2"} } }, { - "name": "Brazier Spikes 3b", + "name": "Brazier Spikes 1b", "from": [2, 14, 1], "to": [14, 17, 2], "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]}, "faces": { - "south": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "south": {"uv": [12, 3, 0, 6], "texture": "#2"} } }, { - "name": "Brazier Spikes 4b", + "name": "Brazier Spikes 1b", "from": [14, 14, 2], "to": [15, 17, 14], "rotation": {"angle": -45, "axis": "z", "origin": [14, 14, 8]}, "faces": { - "west": {"uv": [8, 8, 14, 9.5], "texture": "#0"} + "west": {"uv": [12, 3, 0, 6], "texture": "#2"} } }, { @@ -127,12 +129,12 @@ "to": [16, 4, 16], "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 8, 0.5]}, "faces": { - "north": {"uv": [0, 6, 8, 8], "texture": "#0", "cullface": "north"}, - "east": {"uv": [0, 6, 8, 8], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0, 6, 8, 8], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0, 6, 8, 8], "texture": "#0", "cullface": "west"}, - "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#0", "cullface": "down"} + "north": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "east": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "south": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "west": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3", "cullface": "down"} } }, { @@ -141,11 +143,11 @@ "to": [14, 5, 14], "rotation": {"angle": 0, "axis": "y", "origin": [2.5, 8, 2.5]}, "faces": { - "north": {"uv": [1, 5.5, 7, 6], "texture": "#0"}, - "east": {"uv": [1, 5.5, 7, 6], "texture": "#0"}, - "south": {"uv": [1, 5.5, 7, 6], "texture": "#0"}, - "west": {"uv": [1, 5.5, 7, 6], "texture": "#0"}, - "up": {"uv": [9, 1, 15, 7], "texture": "#0"} + "north": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "east": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "south": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "west": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#1"} } } ], @@ -164,11 +166,6 @@ "origin": [0.5, 0.5, 0.5], "children": [5, 6, 7, 8, 9, 10, 11, 12] }, 13, 14] - }, - { - "name": "Blazes", - "origin": [8, 8, 8], - "children": [] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_burner/block_with_blaze.json b/src/main/resources/assets/create/models/block/blaze_burner/block_with_blaze.json new file mode 100644 index 000000000..8e20426fb --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/block_with_blaze.json @@ -0,0 +1,191 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/blaze_burner_inner", + "2": "create:block/blaze_burner_side", + "3": "create:block/dark_metal_block", + "particle": "create:block/dark_metal_block", + "2_2": "create:block/blaze_kindled" + }, + "elements": [ + { + "name": "Brazier Sides 1", + "from": [2, 5, 2], + "to": [14, 14, 14], + "faces": { + "north": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "east": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "south": {"uv": [0, 6, 12, 15], "texture": "#2"}, + "west": {"uv": [0, 6, 12, 15], "texture": "#2"} + } + }, + { + "name": "Brazier Sides 2", + "from": [2, 5, 14], + "to": [14, 14, 15], + "faces": { + "north": {"uv": [12, 6, 0, 15], "texture": "#2"} + } + }, + { + "name": "Brazier Sides 3", + "from": [1, 5, 2], + "to": [2, 14, 14], + "faces": { + "east": {"uv": [12, 6, 0, 15], "texture": "#2"} + } + }, + { + "name": "Brazier Sides 4", + "from": [2, 5, 1], + "to": [14, 14, 2], + "faces": { + "south": {"uv": [12, 6, 0, 15], "texture": "#2"} + } + }, + { + "name": "Brazier Sides 5", + "from": [14, 5, 2], + "to": [15, 14, 14], + "faces": { + "west": {"uv": [12, 6, 0, 15], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 1", + "from": [2, 14, 13], + "to": [14, 17, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]}, + "faces": { + "south": {"uv": [0, 3, 12, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 2", + "from": [2, 14, 2], + "to": [3, 17, 14], + "rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]}, + "faces": { + "west": {"uv": [0, 3, 12, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 3", + "from": [2, 14, 2], + "to": [14, 17, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]}, + "faces": { + "north": {"uv": [0, 3, 12, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 4", + "from": [13, 14, 2], + "to": [14, 17, 14], + "rotation": {"angle": -45, "axis": "z", "origin": [14, 14, 8]}, + "faces": { + "east": {"uv": [0, 3, 12, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 1b", + "from": [2, 14, 14], + "to": [14, 17, 15], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]}, + "faces": { + "north": {"uv": [12, 3, 0, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 1b", + "from": [1, 14, 2], + "to": [2, 17, 14], + "rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]}, + "faces": { + "east": {"uv": [12, 3, 0, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 1b", + "from": [2, 14, 1], + "to": [14, 17, 2], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]}, + "faces": { + "south": {"uv": [12, 3, 0, 6], "texture": "#2"} + } + }, + { + "name": "Brazier Spikes 1b", + "from": [14, 14, 2], + "to": [15, 17, 14], + "rotation": {"angle": -45, "axis": "z", "origin": [14, 14, 8]}, + "faces": { + "west": {"uv": [12, 3, 0, 6], "texture": "#2"} + } + }, + { + "name": "Base", + "from": [0, 0, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 8, 0.5]}, + "faces": { + "north": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "west"}, + "east": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "west"}, + "south": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "west"}, + "west": {"uv": [12, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3", "cullface": "down"} + } + }, + { + "name": "Brazier bottom", + "from": [2, 4, 2], + "to": [14, 5, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2.5, 8, 2.5]}, + "faces": { + "north": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "east": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "south": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "west": {"uv": [0, 15, 12, 16], "texture": "#2"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#1"} + } + }, + { + "name": "Blaze 4", + "from": [4, 6, 4], + "to": [12, 14, 12], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#2_2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2_2"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#2_2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2_2"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#2_2"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#2_2"} + } + } + ], + "groups": [ + { + "name": "Brazier", + "origin": [0.5, 0.5, 0.5], + "children": [ + { + "name": "Brazier Sides", + "origin": [0.5, 0.5, 0.5], + "children": [0, 1, 2, 3, 4] + }, + { + "name": "Brazier Spikes", + "origin": [0.5, 0.5, 0.5], + "children": [5, 6, 7, 8, 9, 10, 11, 12] + }, 13, 14] + }, + { + "name": "kindled", + "origin": [8, 8, 8], + "children": [15] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_heater/blaze/four.json b/src/main/resources/assets/create/models/block/blaze_heater/blaze/four.json deleted file mode 100644 index cc0f8c54f..000000000 --- a/src/main/resources/assets/create/models/block/blaze_heater/blaze/four.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/tamed_blaze" - }, - "elements": [ - { - "name": "Blaze 4", - "from": [4, 6, 4], - "to": [12, 14, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]}, - "faces": { - "north": {"uv": [12, 0, 16, 4], "texture": "#1"}, - "east": {"uv": [8, 0, 12, 4], "texture": "#1"}, - "south": {"uv": [8, 0, 12, 4], "texture": "#1"}, - "west": {"uv": [8, 0, 12, 4], "texture": "#1"}, - "up": {"uv": [8, 4, 12, 8], "texture": "#1"}, - "down": {"uv": [12, 4, 16, 8], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Blazes", - "origin": [8, 8, 8], - "children": [15, 16, 17, 18] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_heater/blaze/one.json b/src/main/resources/assets/create/models/block/blaze_heater/blaze/one.json deleted file mode 100644 index b0b318ff6..000000000 --- a/src/main/resources/assets/create/models/block/blaze_heater/blaze/one.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/tamed_blaze" - }, - "elements": [ - { - "name": "Blaze 1", - "from": [6, 6, 6], - "to": [10, 10, 10], - "faces": { - "north": {"uv": [8, 8, 10, 10], "texture": "#1"}, - "east": {"uv": [6, 8, 8, 10], "texture": "#1"}, - "south": {"uv": [6, 8, 8, 10], "texture": "#1"}, - "west": {"uv": [6, 8, 8, 10], "texture": "#1"}, - "up": {"uv": [6, 10, 8, 12], "texture": "#1"}, - "down": {"uv": [8, 10, 10, 12], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Blazes", - "origin": [8, 8, 8], - "children": [15, 16, 17, 18] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_heater/blaze/three.json b/src/main/resources/assets/create/models/block/blaze_heater/blaze/three.json deleted file mode 100644 index a9d78104f..000000000 --- a/src/main/resources/assets/create/models/block/blaze_heater/blaze/three.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/tamed_blaze" - }, - "elements": [ - { - "name": "Blaze 3", - "from": [4, 6, 4], - "to": [12, 14, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]}, - "faces": { - "north": {"uv": [4, 0, 8, 4], "texture": "#1"}, - "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, - "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, - "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, - "up": {"uv": [0, 4, 4, 8], "texture": "#1"}, - "down": {"uv": [4, 4, 8, 8], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Blazes", - "origin": [8, 8, 8], - "children": [15, 16, 17, 18] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_heater/blaze/two.json b/src/main/resources/assets/create/models/block/blaze_heater/blaze/two.json deleted file mode 100644 index ab5e5aea4..000000000 --- a/src/main/resources/assets/create/models/block/blaze_heater/blaze/two.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/tamed_blaze" - }, - "elements": [ - { - "name": "Blaze 2", - "from": [5, 6, 5], - "to": [11, 12, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 7]}, - "faces": { - "north": {"uv": [3, 8, 6, 11], "texture": "#1"}, - "east": {"uv": [0, 8, 3, 11], "texture": "#1"}, - "south": {"uv": [0, 8, 3, 11], "texture": "#1"}, - "west": {"uv": [0, 8, 3, 11], "texture": "#1"}, - "up": {"uv": [0, 11, 3, 14], "texture": "#1"}, - "down": {"uv": [3, 11, 6, 14], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Blazes", - "origin": [8, 8, 8], - "children": [15, 16, 17, 18] - } - ] -} \ 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 index 7f7428bce..d2bdace75 100644 --- a/src/main/resources/assets/create/models/block/chute/block_diagonal.json +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal.json @@ -2,151 +2,56 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "2": "create:block/chute_diagonal", - "13": "create:block/chute", - "particle": "block/hopper_outside" + "0": "create:block/chute", + "1": "create:block/chute_diagonal", + "particle": "block/hopper_inside" }, "elements": [ { - "from": [2, 8, 2], - "to": [14, 16, 14], + "from": [1.1, -11, 2], + "to": [14.9, 0, 16], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 0, 16]}, "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"} + "north": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "east": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "south": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "west": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#0"} } }, { - "from": [2, 5.5, 2], - "to": [14, 8, 14], + "from": [4, -16, -2], + "to": [12, -4.4, 0], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, "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"} + "east": {"uv": [6, 8.5, 7, 14.5], "texture": "#1"}, + "south": {"uv": [2, 8.5, 6, 14.5], "texture": "#1"}, + "west": {"uv": [1, 8.5, 2, 14.5], "texture": "#1"}, + "down": {"uv": [0, 0, 8, 2], "rotation": 180, "texture": "#1"} } }, { - "from": [1.9, -12, 7.9], - "to": [14.1, 10.666, 14.1], - "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, + "from": [2.1, -16, -7], + "to": [13.9, -4.4, -2], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, "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"} + "east": {"uv": [9, 1, 11.5, 7], "texture": "#1"}, + "south": {"uv": [9, 1, 15, 7], "texture": "#1"}, + "west": {"uv": [12.5, 1, 15, 7], "texture": "#1"}, + "down": {"uv": [9, 12.5, 15, 15], "rotation": 180, "texture": "#0"} } }, { - "from": [3, 13, 3], - "to": [13, 14, 13], + "from": [2.1, -16, -13], + "to": [13.9, -4.4, -7], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, "faces": { - "up": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#2"} + "north": {"uv": [9, 1, 15, 7], "texture": "#1"}, + "east": {"uv": [11.5, 1, 15, 7], "texture": "#1"}, + "west": {"uv": [9, 1, 12.5, 7], "texture": "#1"}, + "down": {"uv": [9, 9, 15, 12], "rotation": 180, "texture": "#0"} } - }, - { - "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_intersection.json b/src/main/resources/assets/create/models/block/chute/block_diagonal_intersection.json new file mode 100644 index 000000000..8dc512a03 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal_intersection.json @@ -0,0 +1,121 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/chute", + "1": "create:block/chute_diagonal", + "particle": "block/hopper_inside" + }, + "elements": [ + { + "from": [1.1, -11, 2], + "to": [14.9, 0, 16], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 0, 16]}, + "faces": { + "north": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "east": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "south": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "west": {"uv": [8.5, 8.5, 15.5, 14], "texture": "#1"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [4, -16, -2], + "to": [12, -4.4, 0], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, + "faces": { + "east": {"uv": [6, 8.5, 7, 14.5], "texture": "#1"}, + "south": {"uv": [2, 8.5, 6, 14.5], "texture": "#1"}, + "west": {"uv": [1, 8.5, 2, 14.5], "texture": "#1"}, + "down": {"uv": [0, 0, 8, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2.1, -16, -7], + "to": [13.9, -4.4, -2], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, + "faces": { + "east": {"uv": [9, 1, 11.5, 7], "texture": "#1"}, + "south": {"uv": [9, 1, 15, 7], "texture": "#1"}, + "west": {"uv": [12.5, 1, 15, 7], "texture": "#1"}, + "down": {"uv": [9, 12.5, 15, 15], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [2.1, -16, -13], + "to": [13.9, -4.4, -7], + "rotation": {"angle": 45, "axis": "x", "origin": [8, -16, 0]}, + "faces": { + "north": {"uv": [9, 1, 15, 7], "texture": "#1"}, + "east": {"uv": [11.5, 1, 15, 7], "texture": "#1"}, + "west": {"uv": [9, 1, 12.5, 7], "texture": "#1"}, + "down": {"uv": [9, 9, 15, 12], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 16, 16], + "faces": { + "north": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9.5, 16], "texture": "#0"}, + "down": {"uv": [14.5, 8, 16, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 8, 9.5, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14.5, 8, 16, 16], "texture": "#0"} + } + }, + { + "from": [3, 0, 0], + "to": [13, 16, 3], + "faces": { + "north": {"uv": [1.5, 0, 6.5, 8], "texture": "#1"}, + "east": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [9.5, 0, 14.5, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "up": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 270, "texture": "#0"}, + "down": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [3, 0, 13], + "to": [13, 16, 16], + "faces": { + "north": {"uv": [9.5, 0, 14.5, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "south": {"uv": [1.5, 0, 6.5, 8], "texture": "#1"}, + "west": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 8, 3], + "to": [13, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, -6, 11]}, + "faces": { + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"}, + "down": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"} + } + } + ], + "groups": [0, 1, 2, 3, + { + "name": "intersection", + "origin": [8, 8, 8], + "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_start.json b/src/main/resources/assets/create/models/block/chute/block_diagonal_start.json deleted file mode 100644 index 8b53f63c6..000000000 --- a/src/main/resources/assets/create/models/block/chute/block_diagonal_start.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "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 deleted file mode 100644 index d6d05dd68..000000000 --- a/src/main/resources/assets/create/models/block/chute/block_diagonal_straight.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "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_intersection.json b/src/main/resources/assets/create/models/block/chute/block_intersection.json new file mode 100644 index 000000000..0c2f7f382 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chute/block_intersection.json @@ -0,0 +1,67 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/chute", + "1": "create:block/chute_diagonal", + "particle": "block/hopper_inside" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [3, 16, 16], + "faces": { + "north": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9.5, 16], "texture": "#0"}, + "down": {"uv": [14.5, 8, 16, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 8, 9.5, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14.5, 8, 16, 16], "texture": "#0"} + } + }, + { + "from": [3, 0, 0], + "to": [13, 16, 3], + "faces": { + "north": {"uv": [1.5, 0, 6.5, 8], "texture": "#1"}, + "east": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [9.5, 0, 14.5, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "up": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 270, "texture": "#0"}, + "down": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [3, 0, 13], + "to": [13, 16, 16], + "faces": { + "north": {"uv": [9.5, 0, 14.5, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 1.5, 8], "texture": "#1"}, + "south": {"uv": [1.5, 0, 6.5, 8], "texture": "#1"}, + "west": {"uv": [6.5, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [14.5, 9.5, 16, 14.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 8, 3], + "to": [13, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, -6, 11]}, + "faces": { + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"}, + "down": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"} + } + } + ] +} \ 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 deleted file mode 100644 index 43a769f49..000000000 --- a/src/main/resources/assets/create/models/block/chute_funnel/block.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "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/cogwheel.json b/src/main/resources/assets/create/models/block/cogwheel.json index 44ce191be..a18d1655d 100644 --- a/src/main/resources/assets/create/models/block/cogwheel.json +++ b/src/main/resources/assets/create/models/block/cogwheel.json @@ -1,107 +1,107 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "parent": "block/block", - "textures": { + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "texture_size": [32, 32], + "textures": { + "0": "create:block/axis", + "3": "create:block/axis_top", "particle": "block/stripped_spruce_log", - "0": "create:block/axis", - "1": "block/stripped_spruce_log", - "2": "block/stripped_spruce_log_top", - "3": "create:block/axis_top" - }, - "elements": [ - { - "name": "Axis", - "from": [ 6.0, 0.0, 6.0 ], - "to": [ 10.0, 16.0, 10.0 ], + "1_2": "create:block/cogwheel" + }, + "elements": [ + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], "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": "#3", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, - "down": { "texture": "#3", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } - } - }, - { - "name": "Gear", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "faces": { - "north": { "texture": "#1", "uv": [ 6.0, 0.0, 9.0, 16.0 ], "rotation": 90 }, - "east": { "texture": "#1", "uv": [ 1.0, 3.0, 4.0, 6.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 5.0, 10.0, 8.0, 13.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear2", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear3", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear4", - "from": [ 6.5, 6.5, -1.0 ], - "to": [ 9.5, 9.5, 17.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] } - } - }, - { - "name": "GearCaseInner", - "from": [ 2.0, 7.0, 2.0 ], - "to": [ 14.0, 9.0, 14.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "up": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] }, - "down": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] } - } - }, - { - "name": "GearCaseOuter", - "from": [ 4.0, 6.0, 4.0 ], - "to": [ 12.0, 10.0, 12.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "up": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }, - "down": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] } - } - } - ] + "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": "#3"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#3"} + } + }, + { + "name": "Gear", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear2", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear3", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear4", + "from": [6.5, 6.5, -1], + "to": [9.5, 9.5, 17], + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "east": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "south": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "west": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"} + } + }, + { + "name": "GearCaseInner", + "from": [2, 7, 2], + "to": [14, 9, 14], + "faces": { + "north": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "east": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "south": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "west": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "up": {"uv": [4, 0, 10, 6], "texture": "#1_2"}, + "down": {"uv": [4, 0, 10, 6], "texture": "#1_2"} + } + }, + { + "name": "GearCaseOuter", + "from": [4, 6, 4], + "to": [12, 10, 12], + "faces": { + "north": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "south": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "west": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1_2"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1_2"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/cogwheel_shaftless.json b/src/main/resources/assets/create/models/block/cogwheel_shaftless.json index 10cac44dc..0d0f2c346 100644 --- a/src/main/resources/assets/create/models/block/cogwheel_shaftless.json +++ b/src/main/resources/assets/create/models/block/cogwheel_shaftless.json @@ -1,91 +1,91 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "parent": "block/block", - "textures": { - "particle": "block/stripped_spruce_log", - "1": "block/stripped_spruce_log", - "2": "block/stripped_spruce_log_top" - }, - "elements": [ - { - "name": "Gear", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "faces": { - "north": { "texture": "#1", "uv": [ 6.0, 0.0, 9.0, 16.0 ], "rotation": 90 }, - "east": { "texture": "#1", "uv": [ 1.0, 3.0, 4.0, 6.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 5.0, 10.0, 8.0, 13.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear2", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear3", - "from": [ -1.0, 6.5, 6.5 ], - "to": [ 17.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] } - } - }, - { - "name": "Gear4", - "from": [ 6.5, 6.5, -1.0 ], - "to": [ 9.5, 9.5, 17.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] } - } - }, - { - "name": "GearCaseInner", - "from": [ 2.0, 7.0, 2.0 ], - "to": [ 14.0, 9.0, 14.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "up": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] }, - "down": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] } - } - }, - { - "name": "GearCaseOuter", - "from": [ 4.0, 6.0, 4.0 ], - "to": [ 12.0, 10.0, 12.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] }, - "up": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }, - "down": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] } - } - } - ] + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "texture_size": [32, 32], + "textures": { + "particle": "create:block/cogwheel", + "1_2": "create:block/cogwheel" + }, + "elements": [ + { + "name": "Gear", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear2", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear3", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear4", + "from": [6.5, 6.5, -1], + "to": [9.5, 9.5, 17], + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "east": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "south": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "west": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"} + } + }, + { + "name": "GearCaseInner", + "from": [2, 7, 2], + "to": [14, 9, 14], + "faces": { + "north": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "east": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "south": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "west": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "up": {"uv": [4, 0, 10, 6], "texture": "#1_2"}, + "down": {"uv": [4, 0, 10, 6], "texture": "#1_2"} + } + }, + { + "name": "GearCaseOuter", + "from": [4, 6, 4], + "to": [12, 10, 12], + "faces": { + "north": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "south": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "west": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1_2"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1_2"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/creative_motor/block.json b/src/main/resources/assets/create/models/block/creative_motor/block.json index c331a7455..5c1420dae 100644 --- a/src/main/resources/assets/create/models/block/creative_motor/block.json +++ b/src/main/resources/assets/create/models/block/creative_motor/block.json @@ -42,11 +42,11 @@ "to": [11, 11, 13], "faces": { "north": {"uv": [14, 4, 20, 10], "texture": "#6"}, - "east": {"uv": [10, 6, 16, 10], "rotation": 90, "texture": "#6"}, + "east": {"uv": [10, 6, 16, 10], "rotation": 270, "texture": "#6"}, "south": {"uv": [10, 0, 16, 6], "texture": "#6"}, - "west": {"uv": [10, 6, 16, 10], "rotation": 270, "texture": "#6"}, - "up": {"uv": [10, 6, 16, 10], "texture": "#6"}, - "down": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"} + "west": {"uv": [10, 6, 16, 10], "rotation": 90, "texture": "#6"}, + "up": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"}, + "down": {"uv": [10, 6, 16, 10], "texture": "#6"} } }, { @@ -63,14 +63,14 @@ { "name": "Body", "from": [4, 4, 2], - "to": [12, 12, 10], + "to": [12, 12, 11], "faces": { "north": {"uv": [0, 4, 8, 14], "rotation": 180, "texture": "#5"}, - "east": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, + "east": {"uv": [4, 3, 12, 12], "rotation": 270, "texture": "#5"}, "south": {"uv": [3, 3, 11, 11], "rotation": 180, "texture": "#5"}, - "west": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, - "up": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"} + "west": {"uv": [4, 3, 12, 12], "rotation": 90, "texture": "#5"}, + "up": {"uv": [4, 3, 12, 12], "rotation": 180, "texture": "#5"}, + "down": {"uv": [4, 3, 12, 12], "rotation": 180, "texture": "#5"} } }, { diff --git a/src/main/resources/assets/create/models/block/creative_motor/block_vertical.json b/src/main/resources/assets/create/models/block/creative_motor/block_vertical.json index a1924a082..c76210cca 100644 --- a/src/main/resources/assets/create/models/block/creative_motor/block_vertical.json +++ b/src/main/resources/assets/create/models/block/creative_motor/block_vertical.json @@ -10,19 +10,6 @@ "particle": "#5" }, "elements": [ - { - "name": "Back", - "from": [3, 0.1, 3], - "to": [13, 2.1, 13], - "faces": { - "north": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#5"}, - "east": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#5"}, - "south": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#5"}, - "west": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 0, 10, 10], "texture": "#6"}, - "down": {"uv": [0, 0, 10, 10], "rotation": 180, "texture": "#6"} - } - }, { "name": "Back", "from": [3, 12, 3], @@ -41,18 +28,19 @@ "from": [5, 9, 5], "to": [11, 13, 11], "faces": { - "north": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"}, - "east": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"}, - "south": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"}, - "west": {"uv": [10, 6, 16, 10], "rotation": 180, "texture": "#6"}, + "north": {"uv": [10, 6, 16, 10], "texture": "#6"}, + "east": {"uv": [10, 6, 16, 10], "texture": "#6"}, + "south": {"uv": [10, 6, 16, 10], "texture": "#6"}, + "west": {"uv": [10, 6, 16, 10], "texture": "#6"}, "up": {"uv": [10, 0, 16, 6], "texture": "#6"}, "down": {"uv": [14, 4, 20, 10], "rotation": 180, "texture": "#6"} } }, { "name": "Between Rims", - "from": [3.5, 3, 3.5], - "to": [12.5, 6, 12.5], + "from": [3.5, 5, 3.5], + "to": [12.5, 8, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, "faces": { "north": {"uv": [3, 10, 12, 13], "texture": "#6"}, "east": {"uv": [3, 10, 12, 13], "texture": "#6"}, @@ -63,110 +51,74 @@ { "name": "Body", "from": [4, 2, 4], - "to": [12, 10, 12], + "to": [12, 11, 12], "faces": { - "north": {"uv": [4, 3, 12, 13], "texture": "#5"}, - "east": {"uv": [4, 3, 12, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, - "west": {"uv": [4, 3, 12, 13], "rotation": 90, "texture": "#5"}, + "north": {"uv": [4, 3, 12, 12], "texture": "#5"}, + "east": {"uv": [4, 3, 12, 12], "texture": "#5"}, + "south": {"uv": [4, 3, 12, 12], "texture": "#5"}, + "west": {"uv": [4, 3, 12, 12], "texture": "#5"}, "up": {"uv": [3, 3, 11, 11], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 4, 8, 14], "texture": "#5"} } }, { - "from": [12, 1, 2], - "to": [14, 15, 4], - "faces": { - "north": {"uv": [1, 0, 15, 2], "rotation": 270, "texture": "#7"}, - "east": {"uv": [14, 1, 16, 15], "texture": "#7"}, - "south": {"uv": [1, 14, 15, 16], "rotation": 90, "texture": "#7"}, - "west": {"uv": [0, 1, 2, 15], "rotation": 180, "texture": "#7"}, - "up": {"uv": [14, 10, 16, 12], "texture": "#6"}, - "down": {"uv": [14, 10, 16, 12], "rotation": 270, "texture": "#6"} - } - }, - { - "from": [12, 1, 12], - "to": [14, 15, 14], - "faces": { - "north": {"uv": [1, 16, 15, 14], "rotation": 90, "texture": "#7"}, - "east": {"uv": [16, 1, 14, 15], "texture": "#7"}, - "south": {"uv": [1, 2, 15, 0], "rotation": 270, "texture": "#7"}, - "west": {"uv": [2, 1, 0, 15], "rotation": 180, "texture": "#7"}, - "up": {"uv": [14, 12, 16, 10], "texture": "#6"}, - "down": {"uv": [16, 10, 14, 12], "rotation": 270, "texture": "#6"} - } - }, - { - "from": [2, 1, 2], - "to": [4, 15, 4], - "faces": { - "north": {"uv": [1, 2, 15, 0], "rotation": 270, "texture": "#7"}, - "east": {"uv": [2, 1, 0, 15], "rotation": 180, "texture": "#7"}, - "south": {"uv": [1, 16, 15, 14], "rotation": 90, "texture": "#7"}, - "west": {"uv": [16, 1, 14, 15], "texture": "#7"}, - "up": {"uv": [16, 10, 14, 12], "texture": "#6"}, - "down": {"uv": [14, 12, 16, 10], "rotation": 270, "texture": "#6"} - } - }, - { - "from": [2, 1, 12], + "from": [2, 0, 12], "to": [4, 15, 14], "faces": { - "north": {"uv": [1, 14, 15, 16], "rotation": 90, "texture": "#7"}, - "east": {"uv": [0, 1, 2, 15], "rotation": 180, "texture": "#7"}, - "south": {"uv": [1, 0, 15, 2], "rotation": 270, "texture": "#7"}, - "west": {"uv": [14, 1, 16, 15], "texture": "#7"}, + "north": {"uv": [1, 14, 16, 16], "rotation": 90, "texture": "#7"}, + "east": {"uv": [0, 0, 2, 15], "rotation": 180, "texture": "#7"}, + "south": {"uv": [0, 0, 15, 2], "rotation": 270, "texture": "#7"}, + "west": {"uv": [14, 1, 16, 16], "texture": "#7"}, "up": {"uv": [16, 12, 14, 10], "texture": "#6"}, "down": {"uv": [16, 12, 14, 10], "rotation": 270, "texture": "#6"} } }, { - "from": [11, 0, 11], - "to": [15, 4, 15], + "from": [2, 0, 2], + "to": [4, 15, 4], "faces": { - "north": {"uv": [8, 0, 12, 4], "texture": "#9"}, - "east": {"uv": [0, 0, 4, 4], "texture": "#9"}, - "south": {"uv": [8, 0, 12, 4], "texture": "#9"}, - "west": {"uv": [1, 0, 5, 4], "texture": "#9"}, - "up": {"uv": [1, 4, 5, 8], "rotation": 90, "texture": "#8"}, - "down": {"uv": [3, 3, 7, 7], "rotation": 180, "texture": "#8"} + "north": {"uv": [0, 2, 15, 0], "rotation": 270, "texture": "#7"}, + "east": {"uv": [2, 0, 0, 15], "rotation": 180, "texture": "#7"}, + "south": {"uv": [1, 16, 16, 14], "rotation": 90, "texture": "#7"}, + "west": {"uv": [16, 1, 14, 16], "texture": "#7"}, + "up": {"uv": [16, 10, 14, 12], "texture": "#6"}, + "down": {"uv": [14, 12, 16, 10], "rotation": 270, "texture": "#6"} } }, { - "from": [11, 0, 1], - "to": [15, 4, 5], + "from": [12, 0, 12], + "to": [14, 15, 14], "faces": { - "north": {"uv": [12, 0, 8, 4], "texture": "#9"}, - "east": {"uv": [4, 0, 0, 4], "texture": "#9"}, - "south": {"uv": [12, 0, 8, 4], "texture": "#9"}, - "west": {"uv": [5, 0, 1, 4], "texture": "#9"}, - "up": {"uv": [5, 4, 1, 8], "rotation": 90, "texture": "#8"}, - "down": {"uv": [3, 7, 7, 3], "rotation": 180, "texture": "#8"} + "north": {"uv": [1, 16, 16, 14], "rotation": 90, "texture": "#7"}, + "east": {"uv": [16, 1, 14, 16], "texture": "#7"}, + "south": {"uv": [0, 2, 15, 0], "rotation": 270, "texture": "#7"}, + "west": {"uv": [2, 0, 0, 15], "rotation": 180, "texture": "#7"}, + "up": {"uv": [14, 12, 16, 10], "texture": "#6"}, + "down": {"uv": [16, 10, 14, 12], "rotation": 270, "texture": "#6"} } }, { - "from": [1, 0, 11], - "to": [5, 4, 15], + "from": [12, 0, 2], + "to": [14, 15, 4], "faces": { - "north": {"uv": [12, 0, 8, 4], "texture": "#9"}, - "east": {"uv": [5, 0, 1, 4], "texture": "#9"}, - "south": {"uv": [12, 0, 8, 4], "texture": "#9"}, - "west": {"uv": [4, 0, 0, 4], "texture": "#9"}, - "up": {"uv": [1, 8, 5, 4], "rotation": 90, "texture": "#8"}, - "down": {"uv": [7, 3, 3, 7], "rotation": 180, "texture": "#8"} + "north": {"uv": [0, 0, 15, 2], "rotation": 270, "texture": "#7"}, + "east": {"uv": [14, 1, 16, 16], "texture": "#7"}, + "south": {"uv": [1, 14, 16, 16], "rotation": 90, "texture": "#7"}, + "west": {"uv": [0, 0, 2, 15], "rotation": 180, "texture": "#7"}, + "up": {"uv": [14, 10, 16, 12], "texture": "#6"}, + "down": {"uv": [14, 10, 16, 12], "rotation": 270, "texture": "#6"} } }, { - "from": [1, 0, 1], - "to": [5, 4, 5], + "from": [3, 0.2, 3], + "to": [13, 4, 13], "faces": { - "north": {"uv": [8, 0, 12, 4], "texture": "#9"}, - "east": {"uv": [1, 0, 5, 4], "texture": "#9"}, - "south": {"uv": [8, 0, 12, 4], "texture": "#9"}, - "west": {"uv": [0, 0, 4, 4], "texture": "#9"}, - "up": {"uv": [5, 8, 1, 4], "rotation": 90, "texture": "#8"}, - "down": {"uv": [7, 7, 3, 3], "rotation": 180, "texture": "#8"} + "north": {"uv": [5, 0, 15, 4], "texture": "#9"}, + "east": {"uv": [5, 0, 15, 4], "texture": "#9"}, + "south": {"uv": [5, 0, 15, 4], "texture": "#9"}, + "west": {"uv": [5, 0, 15, 4], "texture": "#9"}, + "up": {"uv": [11, 14, 1, 4], "rotation": 90, "texture": "#8"}, + "down": {"uv": [10, 10, 0, 0], "rotation": 180, "texture": "#6"} } } ] diff --git a/src/main/resources/assets/create/models/block/creative_motor/item.json b/src/main/resources/assets/create/models/block/creative_motor/item.json index 903ee9ec5..da44299a2 100644 --- a/src/main/resources/assets/create/models/block/creative_motor/item.json +++ b/src/main/resources/assets/create/models/block/creative_motor/item.json @@ -65,14 +65,14 @@ { "name": "Body", "from": [4, 4, 2], - "to": [12, 12, 10], + "to": [12, 12, 11], "faces": { "north": {"uv": [0, 4, 8, 14], "rotation": 180, "texture": "#5"}, - "east": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, + "east": {"uv": [4, 3, 12, 12], "rotation": 90, "texture": "#5"}, "south": {"uv": [3, 3, 11, 11], "rotation": 180, "texture": "#5"}, - "west": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, - "up": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [4, 3, 12, 13], "rotation": 180, "texture": "#5"} + "west": {"uv": [4, 3, 12, 12], "rotation": 90, "texture": "#5"}, + "up": {"uv": [4, 3, 12, 12], "rotation": 180, "texture": "#5"}, + "down": {"uv": [4, 3, 12, 12], "rotation": 180, "texture": "#5"} } }, { @@ -151,18 +151,17 @@ } } ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + } + }, "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, { "name": "shaft", "origin": [8, 8, 8], "children": [10] } - ], - "display": { - "gui": { - "rotation": [ 30, 45, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - } - } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/encased_fan/block.json b/src/main/resources/assets/create/models/block/encased_fan/block.json index cc03182de..1dce214f0 100644 --- a/src/main/resources/assets/create/models/block/encased_fan/block.json +++ b/src/main/resources/assets/create/models/block/encased_fan/block.json @@ -13,7 +13,7 @@ "from": [0, 0, 0], "to": [16, 16, 2], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#fan_side"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, "east": {"uv": [14, 0, 16, 16], "texture": "#fan_side"}, "south": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, "west": {"uv": [14, 0, 16, 16], "rotation": 180, "texture": "#fan_side"}, @@ -26,7 +26,7 @@ "from": [0, 0, 14], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#fan_side"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, "east": {"uv": [0, 0, 2, 16], "texture": "#fan_side"}, "south": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, "west": {"uv": [14, 0, 16, 16], "texture": "#fan_side"}, @@ -50,7 +50,7 @@ "from": [14, 0, 2], "to": [16, 16, 14], "faces": { - "east": {"uv": [2, 0, 14, 16], "rotation": 180, "texture": "#fan_side"}, + "east": {"uv": [2, 0, 14, 16], "texture": "#fan_side"}, "west": {"uv": [14, 0, 2, 16], "texture": "#fan_side"}, "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#fan_casing"}, "down": {"uv": [14, 2, 16, 14], "texture": "#fan_casing"} diff --git a/src/main/resources/assets/create/models/block/encased_fan/item.json b/src/main/resources/assets/create/models/block/encased_fan/item.json index 00f5a814e..fe80c3a0e 100644 --- a/src/main/resources/assets/create/models/block/encased_fan/item.json +++ b/src/main/resources/assets/create/models/block/encased_fan/item.json @@ -4,8 +4,8 @@ "textures": { "2": "create:block/gearbox", "fan_casing": "create:block/fan_casing", - "fan_side": "create:block/fan_side", "particle": "create:block/fan_side", + "fan_side": "create:block/fan_side", "axis_top": "create:block/axis_top", "fan_blades": "create:block/fan_blades", "axis": "create:block/axis" @@ -21,7 +21,7 @@ "south": {"uv": [0, 14, 16, 16], "texture": "#fan_casing"}, "west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#fan_side"}, "up": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#fan_side"} + "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#fan_side"} } }, { @@ -34,7 +34,7 @@ "south": {"uv": [0, 0, 16, 2], "texture": "#fan_casing"}, "west": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#fan_side"}, "up": {"uv": [0, 0, 16, 16], "texture": "#fan_side"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#fan_side"} + "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#fan_side"} } }, { @@ -54,7 +54,7 @@ "to": [16, 14, 16], "faces": { "north": {"uv": [0, 2, 2, 14], "texture": "#fan_casing"}, - "east": {"uv": [2, 0, 14, 16], "rotation": 270, "texture": "#fan_side"}, + "east": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#fan_side"}, "south": {"uv": [14, 2, 16, 14], "texture": "#fan_casing"}, "west": {"uv": [14, 0, 2, 16], "rotation": 270, "texture": "#fan_side"} } diff --git a/src/main/resources/assets/create/models/block/encased_shaft/andesite.json b/src/main/resources/assets/create/models/block/encased_shaft/andesite.json new file mode 100644 index 000000000..b30279387 --- /dev/null +++ b/src/main/resources/assets/create/models/block/encased_shaft/andesite.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/encased_shaft/base", + "textures": { + "casing": "create:block/andesite_casing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/encased_shaft/block.json b/src/main/resources/assets/create/models/block/encased_shaft/base.json similarity index 70% rename from src/main/resources/assets/create/models/block/encased_shaft/block.json rename to src/main/resources/assets/create/models/block/encased_shaft/base.json index 56fd88197..b280f78ab 100644 --- a/src/main/resources/assets/create/models/block/encased_shaft/block.json +++ b/src/main/resources/assets/create/models/block/encased_shaft/base.json @@ -2,7 +2,6 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/andesite_casing", "1": "create:block/gearbox", "particle": "create:block/andesite_casing" }, @@ -12,12 +11,12 @@ "from": [0, 0, 0], "to": [16, 16, 2], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#0"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "west": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#0"} + "north": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#casing"}, + "east": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#casing"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#casing"}, + "west": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#casing"}, + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#casing"} } }, { @@ -34,12 +33,12 @@ "from": [0, 0, 14], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"}, - "east": {"uv": [0, 0, 16, 2], "rotation": 270, "texture": "#0"}, - "south": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 0, 16, 2], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#0"} + "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#casing"}, + "east": {"uv": [0, 0, 16, 2], "rotation": 270, "texture": "#casing"}, + "south": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#casing"}, + "west": {"uv": [0, 0, 16, 2], "rotation": 90, "texture": "#casing"}, + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#casing"} } }, { @@ -47,10 +46,10 @@ "from": [0, 0, 2], "to": [2, 16, 14], "faces": { - "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#0"}, - "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 2, 2, 14], "texture": "#0"} + "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#casing"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#casing"}, + "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 2, 2, 14], "texture": "#casing"} } }, { @@ -58,10 +57,10 @@ "from": [14, 0, 2], "to": [16, 16, 14], "faces": { - "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#0"}, - "down": {"uv": [14, 2, 16, 14], "texture": "#0"} + "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#casing"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#casing"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [14, 2, 16, 14], "texture": "#casing"} } } ] diff --git a/src/main/resources/assets/create/models/block/encased_shaft/brass.json b/src/main/resources/assets/create/models/block/encased_shaft/brass.json new file mode 100644 index 000000000..2d2907d69 --- /dev/null +++ b/src/main/resources/assets/create/models/block/encased_shaft/brass.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/encased_shaft/base", + "textures": { + "casing": "create:block/brass_casing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/encased_shaft/copper.json b/src/main/resources/assets/create/models/block/encased_shaft/copper.json new file mode 100644 index 000000000..e9407b71c --- /dev/null +++ b/src/main/resources/assets/create/models/block/encased_shaft/copper.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/encased_shaft/base", + "textures": { + "casing": "create:block/copper_casing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/horizontal.json b/src/main/resources/assets/create/models/block/extractor/horizontal.json deleted file mode 100644 index aef3762c1..000000000 --- a/src/main/resources/assets/create/models/block/extractor/horizontal.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "1": "create:block/brass_casing", - "extractor": "create:block/extractor", - "particle": "#extractor" - }, - "elements": [ - { - "name": "Bottom", - "from": [4, 2, -1], - "to": [12, 3, 5], - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 9, -1], - "to": [12, 10, 5], - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 3, -1], - "to": [5, 9, 5], - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, 3, -1], - "to": [12, 9, 5], - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 3, 0], - "to": [11, 9, 4], - "faces": { - "north": {"uv": [5, 5, 11, 11], "texture": "#1"}, - "south": {"uv": [7, 1, 13, 7], "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, 10, -1], - "to": [11, 11.05, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, -1]}, - "faces": { - "north": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"}, - "east": {"uv": [0, 9, 5, 10], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, -0.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -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/extractor/horizontal_linked.json b/src/main/resources/assets/create/models/block/extractor/horizontal_linked.json deleted file mode 100644 index a83392dc4..000000000 --- a/src/main/resources/assets/create/models/block/extractor/horizontal_linked.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:block/extractor/horizontal", - "textures": { - "2": "create:block/brass_casing", - "redstone_antenna": "create:block/redstone_antenna", - "extractor": "create:block/extractor", - "particle": "#extractor" - }, - "elements": [ - { - "name": "Bottom", - "from": [5, 2, -1], - "to": [12, 3, 5], - "faces": { - "north": {"uv": [6, 7, 13, 8], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 7, 13, 8], "texture": "#extractor"}, - "west": {"uv": [6, 15, 12, 16], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 7], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 7], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [5, 9, -1], - "to": [12, 10, 5], - "faces": { - "north": {"uv": [6, 0, 13, 1], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 0, 13, 1], "texture": "#extractor"}, - "west": {"uv": [6, 8, 12, 9], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 7], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 7], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 2, -1], - "to": [5, 10, 5], - "faces": { - "north": {"uv": [13, 0, 14, 8], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 9], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 9], "texture": "#extractor"}, - "west": {"uv": [6, 8, 12, 16], "texture": "#extractor"}, - "up": {"uv": [6, 8, 12, 9], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [6, 15, 12, 16], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, 3, -1], - "to": [12, 9, 5], - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 3, 0], - "to": [11, 9, 4], - "faces": { - "north": {"uv": [5, 5, 11, 11], "texture": "#2"}, - "south": {"uv": [7, 1, 13, 7], "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, 10, -1], - "to": [11, 11.05, 4], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 11, -1]}, - "faces": { - "north": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"}, - "east": {"uv": [0, 14, 5, 15], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "AntennaX", - "from": [11, 7, 2], - "to": [14, 17, 3], - "faces": { - "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaZ", - "from": [12, 7, 1], - "to": [13, 17, 4], - "faces": { - "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaTop", - "from": [12, 15, 2], - "to": [13, 16, 3], - "faces": { - "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaDish", - "from": [10, 13, 0], - "to": [15, 13, 5], - "faces": { - "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, - "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/horizontal_linked_powered.json b/src/main/resources/assets/create/models/block/extractor/horizontal_linked_powered.json deleted file mode 100644 index 939bbe91e..000000000 --- a/src/main/resources/assets/create/models/block/extractor/horizontal_linked_powered.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/extractor/horizontal_linked", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "extractor": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/horizontal_powered.json b/src/main/resources/assets/create/models/block/extractor/horizontal_powered.json deleted file mode 100644 index 3bc488ffe..000000000 --- a/src/main/resources/assets/create/models/block/extractor/horizontal_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/extractor/horizontal", - "textures": { - "extractor": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/vertical.json b/src/main/resources/assets/create/models/block/extractor/vertical.json deleted file mode 100644 index 551978196..000000000 --- a/src/main/resources/assets/create/models/block/extractor/vertical.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "1": "create:block/brass_casing", - "extractor": "create:block/extractor", - "particle": "#extractor" - }, - "elements": [ - { - "name": "Bottom", - "from": [4, -1, 4], - "to": [12, 5, 5], - "faces": { - "north": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 7, 14, 8], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 7, 14, 8], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, -1, 11], - "to": [12, 5, 12], - "faces": { - "north": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 0, 14, 1], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 0, 14, 1], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, -1, 5], - "to": [12, 5, 11], - "faces": { - "east": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 1, 7, 7], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [13, 1, 14, 7], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, -1, 5], - "to": [5, 5, 11], - "faces": { - "east": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [13, 1, 14, 7], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 1, 7, 7], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 0, 5], - "to": [11, 4, 11], - "faces": { - "up": {"uv": [7, 1, 13, 7], "rotation": 180, "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, -1, 12], - "to": [11, 4, 13], - "faces": { - "east": {"uv": [0, 14, 5, 15], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "Extension", - "from": [4.9, -3, 4.9], - "to": [11.1, -1, 11.1], - "faces": { - "north": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [5, 5, 11, 11], "texture": "#1"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, -0.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -4.5], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "vertical", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/vertical_linked.json b/src/main/resources/assets/create/models/block/extractor/vertical_linked.json deleted file mode 100644 index f7a502df4..000000000 --- a/src/main/resources/assets/create/models/block/extractor/vertical_linked.json +++ /dev/null @@ -1,173 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:block/extractor/horizontal", - "textures": { - "1": "create:block/brass_casing", - "extractor": "create:block/extractor", - "redstone_antenna": "create:block/redstone_antenna", - "particle": "#extractor" - }, - "elements": [ - { - "name": "Bottom", - "from": [4, -1, 4], - "to": [12, 5, 5], - "faces": { - "north": {"uv": [6, 8, 12, 16], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [6, 15, 12, 16], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [6, 8, 12, 9], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 7, 14, 8], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 7, 14, 8], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, -1, 11], - "to": [12, 5, 12], - "faces": { - "north": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 0, 14, 1], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 0, 14, 1], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, -1, 5], - "to": [12, 5, 11], - "faces": { - "east": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [6, 1, 7, 7], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [13, 1, 14, 7], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, -1, 5], - "to": [5, 5, 11], - "faces": { - "east": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [13, 1, 14, 7], "rotation": 180, "texture": "#extractor"}, - "down": {"uv": [6, 1, 7, 7], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 0, 5], - "to": [11, 4, 11], - "faces": { - "up": {"uv": [7, 1, 13, 7], "rotation": 180, "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, -1, 12], - "to": [11, 4, 13], - "faces": { - "east": {"uv": [0, 14, 5, 15], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [0, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "AntennaX", - "from": [11, 3, 9], - "to": [14, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 15]}, - "faces": { - "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaZ", - "from": [12, 3, 8], - "to": [13, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 15]}, - "faces": { - "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaTop", - "from": [12, 11, 9], - "to": [13, 12, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 15]}, - "faces": { - "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaDish", - "from": [10, 9, 7], - "to": [15, 9, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 15]}, - "faces": { - "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, - "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} - } - }, - { - "name": "Extension", - "from": [4.9, -3, 4.9], - "to": [11.1, -1, 11.1], - "faces": { - "north": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [5, 5, 11, 11], "texture": "#1"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, -0.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -4.5], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "vertical", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/vertical_linked_powered.json b/src/main/resources/assets/create/models/block/extractor/vertical_linked_powered.json deleted file mode 100644 index d6334281f..000000000 --- a/src/main/resources/assets/create/models/block/extractor/vertical_linked_powered.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/extractor/vertical_linked", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "extractor": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/extractor/vertical_powered.json b/src/main/resources/assets/create/models/block/extractor/vertical_powered.json deleted file mode 100644 index 7b4c09a02..000000000 --- a/src/main/resources/assets/create/models/block/extractor/vertical_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/extractor/vertical", - "textures": { - "extractor": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json new file mode 100644 index 000000000..5da83c4d1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [4.5, -3.9, 4.5], + "to": [11.5, -0.9, 11.5], + "faces": { + "north": {"uv": [0, 0, 7, 3], "texture": "#0"}, + "east": {"uv": [0, 0, 7, 3], "texture": "#0"}, + "south": {"uv": [0, 0, 7, 3], "texture": "#0"}, + "west": {"uv": [0, 0, 7, 3], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 3, 7, 10], "texture": "#0"} + } + }, + { + "from": [3.1, -1.1, 3.1], + "to": [12.9, 1, 12.9], + "faces": { + "north": {"uv": [6, 5, 11, 6], "rotation": 180, "texture": "#1_0"}, + "east": {"uv": [11, 6, 6, 5], "texture": "#1_0"}, + "south": {"uv": [6, 5, 11, 6], "rotation": 180, "texture": "#1_0"}, + "west": {"uv": [11, 6, 6, 5], "texture": "#1_0"}, + "up": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "down": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json new file mode 100644 index 000000000..70b1659c3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [16.9, 4.5, 4.5], + "to": [19.9, 11.5, 11.5], + "faces": { + "north": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0, 3, 7, 10], "rotation": 180, "texture": "#0"}, + "south": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [15, 3.1, 3.1], + "to": [17.1, 12.9, 12.9], + "faces": { + "north": {"uv": [11, 6, 6, 5], "rotation": 90, "texture": "#1_0"}, + "east": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#1_0"}, + "south": {"uv": [11, 6, 6, 5], "rotation": 270, "texture": "#1_0"}, + "west": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "up": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1_0"}, + "down": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json new file mode 100644 index 000000000..ebf01b1b8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [4.5, 4.5, -3.9], + "to": [11.5, 11.5, -0.9], + "faces": { + "north": {"uv": [0, 3, 7, 10], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 7, 3], "texture": "#0"} + } + }, + { + "from": [3.1, 3.1, -1.1], + "to": [12.9, 12.9, 1], + "faces": { + "north": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#1_0"}, + "east": {"uv": [11, 6, 6, 5], "rotation": 270, "texture": "#1_0"}, + "south": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "west": {"uv": [11, 6, 6, 5], "rotation": 90, "texture": "#1_0"}, + "up": {"uv": [6, 5, 11, 6], "texture": "#1_0"}, + "down": {"uv": [6, 5, 11, 6], "rotation": 180, "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json new file mode 100644 index 000000000..df3dd6fc1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [4.5, 4.5, 16.9], + "to": [11.5, 11.5, 19.9], + "faces": { + "north": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 3, 7, 10], "texture": "#0"}, + "west": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 7, 3], "texture": "#0"}, + "down": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [3.1, 3.1, 15], + "to": [12.9, 12.9, 17.1], + "faces": { + "north": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#1_0"}, + "east": {"uv": [11, 6, 6, 5], "rotation": 90, "texture": "#1_0"}, + "south": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "west": {"uv": [11, 6, 6, 5], "rotation": 270, "texture": "#1_0"}, + "up": {"uv": [6, 5, 11, 6], "rotation": 180, "texture": "#1_0"}, + "down": {"uv": [6, 5, 11, 6], "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json new file mode 100644 index 000000000..327970657 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [4.5, 16.9, 4.5], + "to": [11.5, 19.9, 11.5], + "faces": { + "north": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"}, + "south": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"}, + "west": {"uv": [0, 0, 7, 3], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 3, 7, 10], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + } + }, + { + "from": [3.1, 15, 3.1], + "to": [12.9, 17.1, 12.9], + "faces": { + "north": {"uv": [6, 5, 11, 6], "texture": "#1_0"}, + "east": {"uv": [11, 6, 6, 5], "rotation": 180, "texture": "#1_0"}, + "south": {"uv": [6, 5, 11, 6], "texture": "#1_0"}, + "west": {"uv": [11, 6, 6, 5], "rotation": 180, "texture": "#1_0"}, + "up": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "down": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json new file mode 100644 index 000000000..0ae3c2d7d --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/pipe_drain", + "particle": "create:block/fluid_pipe", + "1_0": "create:block/fluid_pipe" + }, + "elements": [ + { + "from": [-3.9, 4.5, 4.5], + "to": [-0.9, 11.5, 11.5], + "faces": { + "north": {"uv": [0, 0, 7, 3], "rotation": 270, "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 3, 7, 10], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 7, 3], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [-1.1, 3.1, 3.1], + "to": [1, 12.9, 12.9], + "faces": { + "north": {"uv": [11, 6, 6, 5], "rotation": 270, "texture": "#1_0"}, + "east": {"uv": [6, 0, 11, 5], "rotation": 90, "texture": "#1_0"}, + "south": {"uv": [11, 6, 6, 5], "rotation": 90, "texture": "#1_0"}, + "west": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#1_0"}, + "up": {"uv": [6, 5, 11, 6], "rotation": 270, "texture": "#1_0"}, + "down": {"uv": [6, 5, 11, 6], "rotation": 270, "texture": "#1_0"} + } + } + ], + "groups": [0, + { + "name": "up", + "origin": [8, 8, 8], + "children": [1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/item.json b/src/main/resources/assets/create/models/block/fluid_pipe/item.json index 3d81b263b..3860db36a 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/item.json @@ -14,56 +14,56 @@ "east": {"uv": [4, 12, 8, 16], "rotation": 180, "texture": "#1"}, "south": {"uv": [4, 12, 8, 16], "rotation": 180, "texture": "#1"}, "west": {"uv": [4, 12, 8, 16], "rotation": 180, "texture": "#1"}, - "up": {"uv": [4, 12, 8, 16], "rotation": 180, "texture": "#1"}, - "down": {"uv": [4, 12, 8, 16], "rotation": 180, "texture": "#1"} + "up": {"uv": [4, 12, 8, 16], "rotation": 270, "texture": "#1"}, + "down": {"uv": [4, 12, 8, 16], "rotation": 90, "texture": "#1"} } }, { - "from": [0, 4, 4], - "to": [4, 12, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]}, + "from": [4, 4, 0], + "to": [12, 12, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, "faces": { - "north": {"uv": [0, 8, 4, 6], "rotation": 270, "texture": "#1"}, - "south": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#1"}, - "down": {"uv": [0, 8, 4, 6], "rotation": 270, "texture": "#1"} + "east": {"uv": [0, 8, 4, 6], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#1"}, + "up": {"uv": [0, 8, 4, 6], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 8, 4, 6], "rotation": 180, "texture": "#1"} } }, { - "from": [12, 4, 4], - "to": [16, 12, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 8, 8]}, + "from": [4, 4, 12], + "to": [12, 12, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 16]}, "faces": { - "north": {"uv": [0, 6, 4, 8], "rotation": 270, "texture": "#1"}, - "south": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#1"}, - "down": {"uv": [0, 6, 4, 8], "rotation": 270, "texture": "#1"} + "east": {"uv": [0, 6, 4, 8], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#1"} } }, { - "from": [0, 3, 3], - "to": [2, 13, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]}, + "from": [3, 3, 0], + "to": [13, 13, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, "faces": { - "north": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"}, - "east": {"uv": [6, 0, 11, 5], "rotation": 180, "texture": "#1"}, - "south": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"}, - "west": {"uv": [6, 0, 11, 5], "rotation": 180, "texture": "#1"}, - "up": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"}, - "down": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"} + "north": {"uv": [6, 0, 11, 5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [6, 0, 11, 5], "rotation": 180, "texture": "#1"}, + "west": {"uv": [6, 6, 11, 5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 6, 11, 5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 6, 11, 5], "texture": "#1"} } }, { - "from": [14, 3, 3], - "to": [16, 13, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 8, 8]}, + "from": [3, 3, 14], + "to": [13, 13, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 16]}, "faces": { - "north": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"}, - "east": {"uv": [11, 0, 6, 5], "rotation": 180, "texture": "#1"}, - "south": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"}, - "west": {"uv": [11, 0, 6, 5], "rotation": 180, "texture": "#1"}, - "up": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"}, - "down": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"} + "north": {"uv": [11, 0, 6, 5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"}, + "south": {"uv": [11, 0, 6, 5], "rotation": 180, "texture": "#1"}, + "west": {"uv": [6, 5, 11, 6], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 5, 11, 6], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 5, 11, 6], "texture": "#1"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/window.json b/src/main/resources/assets/create/models/block/fluid_pipe/window.json new file mode 100644 index 000000000..5cfccad79 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/window.json @@ -0,0 +1,58 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/glass_fluid_pipe", + "particle": "#0" + }, + "elements": [ + { + "name": "Outer", + "from": [4, 0, 4], + "to": [12, 16, 12], + "shade": false, + "faces": { + "north": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4, 0, 11.5], + "to": [12, 16, 11.5], + "shade": false, + "faces": { + "north": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4, 0, 4.5], + "to": [12, 16, 4.5], + "shade": false, + "faces": { + "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4.5, 0, 4], + "to": [4.5, 16, 12], + "shade": false, + "faces": { + "east": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [11.5, 0, 4], + "to": [11.5, 16, 12], + "shade": false, + "faces": { + "west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json b/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json new file mode 100644 index 000000000..6670d228d --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json @@ -0,0 +1,58 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/glass_fluid_pipe", + "particle": "#0" + }, + "elements": [ + { + "name": "Outer", + "from": [4, 0, 4], + "to": [12, 16, 12], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4, 0, 11.5], + "to": [12, 16, 11.5], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4, 0, 4.5], + "to": [12, 16, 4.5], + "shade": false, + "faces": { + "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [4.5, 0, 4], + "to": [4.5, 16, 12], + "shade": false, + "faces": { + "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [11.5, 0, 4], + "to": [11.5, 16, 12], + "shade": false, + "faces": { + "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} + } + } + ] +} \ 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 index c9dab296d..9f46b9da0 100644 --- a/src/main/resources/assets/create/models/block/funnel/block.json +++ b/src/main/resources/assets/create/models/block/funnel/block.json @@ -2,210 +2,104 @@ "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" + "0": "create:block/brass_funnel_plating", + "1": "create:block/brass_block", + "2": "create:block/brass_funnel", + "3": "create:block/brass_funnel_back", + "particle": "#1" }, "elements": [ { - "name": "RightWall", - "from": [0, 10, 0], - "to": [2, 16, 16], + "from": [2.1, -1.9, 2.1], + "to": [13.9, 2, 13.9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 10]}, "faces": { - "north": {"uv": [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"} + "north": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "east": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "west": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "up": {"uv": [0, 4, 12, 16], "texture": "#2"}, + "down": {"uv": [6, 8, 12, 14], "texture": "#3"} } }, { - "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]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, 12]}, "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"} + "north": {"uv": [2, 1, 14, 7], "texture": "#1"}, + "south": {"uv": [1, 0, 7, 3], "texture": "#0"}, + "up": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"} } }, { - "name": "Top", "from": [2, 10, 0], "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, -2]}, "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"} + "north": {"uv": [1, 0, 7, 3], "texture": "#0"}, + "south": {"uv": [2, 1, 14, 7], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "down": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"} } }, { - "name": "F4", - "from": [11, 14, 1.5], - "to": [14, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "from": [0, 10, 0], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 19, -2]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [7, 0, 8, 3], "texture": "#0"}, + "east": {"uv": [0, 1, 16, 7], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 3], "texture": "#0"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#1"} } }, { - "name": "F5", - "from": [5, 14, 1.5], - "to": [8, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "from": [14, 10, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 19, -2]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [0, 0, 1, 3], "texture": "#0"}, + "east": {"uv": [0, 0, 8, 3], "texture": "#0"}, + "south": {"uv": [7, 0, 8, 3], "texture": "#0"}, + "west": {"uv": [0, 1, 16, 7], "texture": "#1"}, + "up": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#1"} } }, { - "name": "F5", - "from": [8, 14, 1.5], - "to": [11, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "from": [2, 6, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 15, 10]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#3"} } }, { - "name": "F6", - "from": [2, 14, 1.5], - "to": [5, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "from": [2, 11, 2], + "to": [14, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 10]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "up": {"uv": [0, 8, 6, 14], "texture": "#3"} } }, { - "name": "BackExtension", - "from": [2, 2, 2], - "to": [14, 6, 14], + "from": [3, 2, 3], + "to": [13, 6, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, "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"} + "north": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "east": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "south": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "west": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} } - }, - { - "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/item.json b/src/main/resources/assets/create/models/block/funnel/item.json index e6d6c804e..62aa61fe0 100644 --- a/src/main/resources/assets/create/models/block/funnel/item.json +++ b/src/main/resources/assets/create/models/block/funnel/item.json @@ -2,133 +2,103 @@ "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" + "0": "create:block/brass_funnel_plating", + "1": "create:block/brass_block", + "2": "create:block/brass_funnel", + "3": "create:block/brass_funnel_back", + "particle": "#1" }, "elements": [ { - "name": "RightWall", - "from": [0, 10, 0], - "to": [2, 16, 16], + "from": [2.1, -1.9, 2.1], + "to": [13.9, 2, 13.9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 10]}, "faces": { - "north": {"uv": [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"} + "north": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "east": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "west": {"uv": [0, 0, 12, 4], "texture": "#2"}, + "up": {"uv": [0, 4, 12, 16], "texture": "#2"}, + "down": {"uv": [6, 8, 12, 14], "texture": "#3"} } }, { - "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]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, 12]}, "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"} + "north": {"uv": [2, 1, 14, 7], "texture": "#1"}, + "south": {"uv": [1, 0, 7, 3], "texture": "#0"}, + "up": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"} } }, { - "name": "Top", "from": [2, 10, 0], "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, -2]}, "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"} + "north": {"uv": [1, 0, 7, 3], "texture": "#0"}, + "south": {"uv": [2, 1, 14, 7], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "down": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"} } }, { - "name": "F4", - "from": [11, 14, 1.5], - "to": [14, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "from": [0, 10, 0], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 19, -2]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [7, 0, 8, 3], "texture": "#0"}, + "east": {"uv": [0, 1, 16, 7], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 3], "texture": "#0"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#1"} } }, { - "name": "F5", - "from": [5, 14, 1.5], - "to": [8, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "from": [14, 10, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 19, -2]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [0, 0, 1, 3], "texture": "#0"}, + "east": {"uv": [0, 0, 8, 3], "texture": "#0"}, + "south": {"uv": [7, 0, 8, 3], "texture": "#0"}, + "west": {"uv": [0, 1, 16, 7], "texture": "#1"}, + "up": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#1"} } }, { - "name": "F5", - "from": [8, 14, 1.5], - "to": [11, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [14, 8.5, 8]}, + "from": [2, 6, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 15, 10]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "north": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#3"} } }, { - "name": "F6", - "from": [2, 14, 1.5], - "to": [5, 15, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "from": [2, 11, 2], + "to": [14, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 10]}, "faces": { - "up": {"uv": [6.5, 0, 8, 6.5], "rotation": 180, "texture": "#4"} + "up": {"uv": [0, 8, 6, 14], "texture": "#3"} } }, { - "name": "BackExtension", - "from": [2, 2, 2], - "to": [14, 6, 14], + "from": [3, 2, 3], + "to": [13, 6, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, "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"} + "north": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "east": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "south": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, + "west": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} } } ], @@ -165,44 +135,5 @@ "fixed": { "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/large_cogwheel.json b/src/main/resources/assets/create/models/block/large_cogwheel.json index 8a84fed52..c21f61a1b 100644 --- a/src/main/resources/assets/create/models/block/large_cogwheel.json +++ b/src/main/resources/assets/create/models/block/large_cogwheel.json @@ -1,177 +1,229 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "parent": "create:block/large_wheels", - "textures": { + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "texture_size": [32, 32], + "textures": { + "0": "create:block/axis", + "3": "create:block/axis_top", "particle": "block/stripped_spruce_log", - "0": "create:block/axis", - "1": "block/stripped_spruce_log", - "2": "block/stripped_spruce_log_top", - "3": "create:block/axis_top" - }, - "elements": [ - { - "name": "Axis", - "from": [ 6.0, 0.0, 6.0 ], - "to": [ 10.0, 16.0, 10.0 ], + "4": "create:block/large_cogwheel" + }, + "elements": [ + { + "name": "GearCaseInnerRotated", + "from": [-2, 6.9, -2], + "to": [18, 8.9, 18], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "east": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "south": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "west": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "up": {"uv": [0, 0, 10, 10], "texture": "#4"}, + "down": {"uv": [0, 0, 10, 10], "texture": "#4"} + } + }, + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], "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": "#3", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, - "down": { "texture": "#3", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } - } - }, - { - "name": "Gear2", - "from": [ -7.0, 6.5, 6.5 ], - "to": [ 23.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 2.0, 16.0, 5.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 5.0, 16.0, 8.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] } - } - }, - { - "name": "Gear3", - "from": [ -7.0, 6.5, 6.5 ], - "to": [ 23.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 5.0, 16.0, 8.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 3.0, 16.0, 6.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 2.0, 16.0, 5.0 ] } - } - }, - { - "name": "Gear4", - "from": [ 6.5, 6.5, -7.0 ], - "to": [ 9.5, 9.5, 23.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 3.0, 16.0, 6.0 ], "rotation": 90 }, - "down": { "texture": "#1", "uv": [ 0.0, 5.0, 16.0, 8.0 ], "rotation": 90 } - } - }, - { - "name": "GearCaseInner", - "from": [ -2.0, 7.0, -2.0 ], - "to": [ 18.0, 9.0, 18.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, - "down": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } - } - }, - { - "name": "GearCaseOuter", - "from": [ 1.0, 5.5, 1.0 ], - "to": [ 15.0, 10.5, 15.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 5.0 ] }, - "east": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 5.0 ] }, - "south": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 5.0 ] }, - "west": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 5.0 ] }, - "up": { "texture": "#2", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }, - "down": { "texture": "#2", "uv": [ 1.0, 1.0, 15.0, 15.0 ] } - } - }, - { - "name": "Gear", - "from": [ 6.5, 6.5, -7.0 ], - "to": [ 9.5, 9.5, 23.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 8.0, 16.0, 11.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ], "rotation": 90 }, - "down": { "texture": "#1", "uv": [ 0.0, 5.0, 16.0, 8.0 ], "rotation": 90 } - } - }, - { - "name": "Gear5", - "from": [ -7.0, 6.5, 6.5 ], - "to": [ 23.0, 9.5, 9.5 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 4.0, 16.0, 7.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 4.0, 16.0, 7.0 ] } - } - }, - { - "name": "Gear6", - "from": [ 6.5, 6.5, -7.0 ], - "to": [ 9.5, 9.5, 23.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ], "rotation": 90 }, - "down": { "texture": "#1", "uv": [ 0.0, 5.0, 16.0, 8.0 ], "rotation": 90 } - } - }, - { - "name": "Gear7", - "from": [ -7.0, 6.5, 6.500000007450581 ], - "to": [ 23.0, 9.5, 9.50000000745058 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 4.0, 16.0, 7.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 3.0, 16.0, 6.0 ] } - } - }, - { - "name": "Gear8", - "from": [ 6.5, 6.5, -7.0 ], - "to": [ 9.5, 9.5, 23.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 9.0, 16.0, 12.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 6.0, 16.0, 9.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 8.0, 16.0, 11.0 ], "rotation": 90 }, - "down": { "texture": "#1", "uv": [ 0.0, 7.0, 16.0, 10.0 ], "rotation": 90 } - } - }, - { - "name": "GearCaseInnerRotated", - "from": [ -2.0, 6.9, -2.0 ], - "to": [ 18.0, 8.9, 18.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] }, - "up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, - "down": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } - } - } - ] + "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": "#3"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#3"} + } + }, + { + "name": "Gear2", + "from": [-7, 6.5, 6.5], + "to": [23, 9.5, 9.5], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "east": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "south": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "west": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "texture": "#4"} + } + }, + { + "name": "Gear3", + "from": [-7, 6.5, 6.5], + "to": [23, 9.5, 9.5], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "east": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "south": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "west": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "texture": "#4"} + } + }, + { + "name": "Gear4", + "from": [6.5, 6.5, -7], + "to": [9.5, 9.5, 23], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "east": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "south": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "west": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "GearCaseInner", + "from": [-2, 7, -2], + "to": [18, 9, 18], + "faces": { + "north": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "east": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "south": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "west": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "up": {"uv": [0, 0, 10, 10], "texture": "#4"}, + "down": {"uv": [0, 0, 10, 10], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, 1], + "to": [15, 10.5, 15], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [1.5, 1.5, 8.5, 8.5], "texture": "#4"}, + "down": {"uv": [1.5, 1.5, 8.5, 8.5], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [-1, 5.5, 1], + "to": [1, 10.5, 15], + "faces": { + "north": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [7, 15, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [7, 15, 14, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [15, 5.5, 1], + "to": [17, 10.5, 15], + "faces": { + "north": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 15, 7, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 15, 7, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, -1], + "to": [15, 10.5, 1], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [7, 14, 14, 15], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 14, 7, 15], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, 15], + "to": [15, 10.5, 17], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 14, 7, 15], "texture": "#4"}, + "down": {"uv": [7, 14, 14, 15], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "Gear", + "from": [6.5, 6.5, -7], + "to": [9.5, 9.5, 23], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "east": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "south": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "west": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Gear5", + "from": [-7, 6.5, 6.5], + "to": [23, 9.5, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "east": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "south": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "west": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "texture": "#4"} + } + }, + { + "name": "Gear6", + "from": [6.5, 6.5, -7], + "to": [9.5, 9.5, 23], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "east": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "south": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "west": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "Gear7", + "from": [-7, 6.5, 6.5], + "to": [23, 9.5, 9.5], + "faces": { + "north": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "east": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "south": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "west": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "texture": "#4"} + } + }, + { + "name": "Gear8", + "from": [6.5, 6.5, -7], + "to": [9.5, 9.5, 23], + "faces": { + "north": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "east": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "south": {"uv": [10, 9.5, 11.5, 11], "texture": "#4"}, + "west": {"uv": [0, 12.5, 15, 14], "texture": "#4"}, + "up": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 11, 15, 12.5], "rotation": 90, "texture": "#4"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/cog.json b/src/main/resources/assets/create/models/block/mechanical_arm/cog.json index 38d591111..75668cf1d 100644 --- a/src/main/resources/assets/create/models/block/mechanical_arm/cog.json +++ b/src/main/resources/assets/create/models/block/mechanical_arm/cog.json @@ -1,20 +1,23 @@ { "credit": "Made with Blockbench", "parent": "block/block", + "texture_size": [32, 32], "textures": { - "5": "create:block/mechanical_arm", - "particle": "create:block/crafter_top" + "5": "create:block/mechanical_arm" }, "elements": [ { "name": "GearCaseOuter", - "from": [4, 6, 4], - "to": [12, 10, 12], + "from": [4, 5.5, 4], + "to": [12, 10.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [7.5, 0, 9.5, 4], "rotation": 90, "texture": "#5"}, "east": {"uv": [7.5, 0, 9.5, 4], "rotation": 90, "texture": "#5"}, "south": {"uv": [7.5, 0, 9.5, 4], "rotation": 90, "texture": "#5"}, - "west": {"uv": [7.5, 0, 9.5, 4], "rotation": 90, "texture": "#5"} + "west": {"uv": [7.5, 0, 9.5, 4], "rotation": 90, "texture": "#5"}, + "up": {"uv": [1, 1, 5, 5], "texture": "#5"}, + "down": {"uv": [1, 1, 5, 5], "texture": "#5"} } }, { @@ -79,10 +82,10 @@ "to": [14, 9.5, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 8]}, "faces": { - "north": {"uv": [6, 0, 7.5, 6], "rotation": 90, "texture": "#5"}, - "east": {"uv": [6, 0, 7.5, 6], "rotation": 90, "texture": "#5"}, - "south": {"uv": [6, 0, 7.5, 6], "rotation": 90, "texture": "#5"}, - "west": {"uv": [6, 0, 7.5, 6], "rotation": 90, "texture": "#5"}, + "north": {"uv": [5.5, 0, 7, 6], "rotation": 90, "texture": "#5"}, + "east": {"uv": [5.5, 0, 7, 6], "rotation": 90, "texture": "#5"}, + "south": {"uv": [5.5, 0, 7, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [5.5, 0, 7, 6], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#5"} } diff --git a/src/main/resources/assets/create/models/block/mechanical_crafter/block.json b/src/main/resources/assets/create/models/block/mechanical_crafter/block.json index 66e82001a..42aeb0cb3 100644 --- a/src/main/resources/assets/create/models/block/mechanical_crafter/block.json +++ b/src/main/resources/assets/create/models/block/mechanical_crafter/block.json @@ -7,6 +7,7 @@ "5": "create:block/brass_casing", "6": "create:block/crafter_top", "7": "create:block/crafter_topunderside", + "8": "create:block/smooth_dark_log_top", "particle": "create:block/brass_casing" }, "elements": [ @@ -28,7 +29,7 @@ "from": [0, 0, 10], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#5"}, + "north": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#8"}, "east": {"uv": [0, 10, 16, 16], "rotation": 90, "texture": "#4"}, "south": {"uv": [0, 0, 16, 16], "texture": "#6"}, "west": {"uv": [16, 10, 0, 16], "rotation": 270, "texture": "#4"}, diff --git a/src/main/resources/assets/create/models/block/mechanical_crafter/item.json b/src/main/resources/assets/create/models/block/mechanical_crafter/item.json index d786976bd..f0a221f11 100644 --- a/src/main/resources/assets/create/models/block/mechanical_crafter/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_crafter/item.json @@ -2,14 +2,14 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "1": "block/stripped_spruce_log", - "2": "block/stripped_spruce_log_top", "3": "create:block/crafter_thingies", "4": "create:block/crafter_side", "5": "create:block/brass_casing", "6": "create:block/crafter_top", "7": "create:block/crafter_topunderside", - "particle": "block/stripped_spruce_log" + "8": "create:block/smooth_dark_log_top", + "particle": "create:block/crafter_top", + "1_2": "create:block/cogwheel" }, "elements": [ { @@ -34,7 +34,7 @@ "east": {"uv": [0, 10, 16, 16], "texture": "#4"}, "south": {"uv": [0, 10, 16, 16], "texture": "#4"}, "west": {"uv": [0, 10, 16, 16], "texture": "#4"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#5"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#8"}, "down": {"uv": [0, 0, 16, 16], "texture": "#6"} } }, @@ -45,7 +45,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [24, 8, 8]}, "faces": { "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "west": {"uv": [0, 6, 16, 10], "texture": "#4"} + "west": {"uv": [0, 3, 16, 7], "texture": "#4"} } }, { @@ -54,7 +54,7 @@ "to": [0, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 8]}, "faces": { - "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, + "east": {"uv": [0, 3, 16, 7], "texture": "#4"}, "west": {"uv": [0, 6, 16, 10], "texture": "#4"} } }, @@ -65,7 +65,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -8]}, "faces": { "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "south": {"uv": [0, 6, 16, 10], "texture": "#4"} + "south": {"uv": [0, 3, 16, 7], "texture": "#4"} } }, { @@ -74,7 +74,7 @@ "to": [16, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 24]}, "faces": { - "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, + "north": {"uv": [0, 3, 16, 7], "texture": "#4"}, "south": {"uv": [0, 6, 16, 10], "texture": "#4"} } }, @@ -83,9 +83,9 @@ "from": [4, 16, 4], "to": [5, 17, 12], "faces": { - "north": {"uv": [8, 2, 9, 3], "texture": "#5"}, - "east": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "south": {"uv": [7, 2, 8, 3], "texture": "#5"}, + "north": {"uv": [5, 2, 6, 3], "texture": "#5"}, + "east": {"uv": [2, 1, 10, 2], "texture": "#5"}, + "south": {"uv": [3, 2, 4, 3], "texture": "#5"}, "west": {"uv": [4, 2, 12, 3], "texture": "#5"}, "up": {"uv": [2, 4, 3, 12], "texture": "#5"} } @@ -95,10 +95,10 @@ "from": [11, 16, 4], "to": [12, 17, 12], "faces": { - "north": {"uv": [8, 2, 9, 3], "texture": "#5"}, - "east": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "south": {"uv": [7, 2, 8, 3], "texture": "#5"}, - "west": {"uv": [4, 2, 12, 3], "texture": "#5"}, + "north": {"uv": [4, 2, 5, 3], "texture": "#5"}, + "east": {"uv": [3, 2, 11, 3], "texture": "#5"}, + "south": {"uv": [5, 2, 6, 3], "texture": "#5"}, + "west": {"uv": [2, 1, 10, 2], "texture": "#5"}, "up": {"uv": [2, 4, 3, 12], "texture": "#5"} } }, @@ -107,11 +107,11 @@ "from": [5, 16, 4], "to": [11, 17, 5], "faces": { - "north": {"uv": [6, 2, 12, 3], "texture": "#5"}, - "east": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "south": {"uv": [5, 2, 11, 3], "texture": "#5"}, - "west": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "up": {"uv": [5, 2, 11, 3], "texture": "#5"} + "north": {"uv": [5, 2, 11, 3], "texture": "#5"}, + "east": {"uv": [1, 2, 2, 3], "texture": "#5"}, + "south": {"uv": [2.5, 1, 8.5, 2], "texture": "#5"}, + "west": {"uv": [1, 2, 2, 3], "texture": "#5"}, + "up": {"uv": [4, 2, 10, 3], "texture": "#5"} } }, { @@ -119,10 +119,10 @@ "from": [5, 16, 11], "to": [11, 17, 12], "faces": { - "north": {"uv": [6, 2, 12, 3], "texture": "#5"}, - "east": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "south": {"uv": [5, 2, 11, 3], "texture": "#5"}, - "west": {"uv": [2, 4, 3, 5], "texture": "#5"}, + "north": {"uv": [3, 1, 9, 2], "texture": "#5"}, + "east": {"uv": [1, 2, 2, 3], "texture": "#5"}, + "south": {"uv": [2, 2, 8, 3], "texture": "#5"}, + "west": {"uv": [1, 2, 2, 3], "texture": "#5"}, "up": {"uv": [5, 2, 11, 3], "texture": "#5"} } }, @@ -131,91 +131,7 @@ "from": [5, 15.5, 5], "to": [11, 16.5, 11], "faces": { - "up": {"uv": [6, 0, 12, 6], "texture": "#3"} - } - }, - { - "name": "Gear", - "from": [-1, 6.5, 6.5], - "to": [17, 9.5, 9.5], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [6, 0, 9, 16], "rotation": 90, "texture": "#1"}, - "east": {"uv": [1, 3, 4, 6], "texture": "#1"}, - "south": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "west": {"uv": [5, 10, 8, 13], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 3], "texture": "#1"} - } - }, - { - "name": "Gear2", - "from": [-1, 6.5, 6.5], - "to": [17, 9.5, 9.5], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 3], "texture": "#1"} - } - }, - { - "name": "Gear3", - "from": [6.5, 6.5, -1], - "to": [9.5, 9.5, 17], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 3], "rotation": 90, "texture": "#1"}, - "down": {"uv": [0, 0, 16, 3], "rotation": 270, "texture": "#1"} - } - }, - { - "name": "Gear4", - "from": [6.5, 6.5, -1], - "to": [9.5, 9.5, 17], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 3, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 3, 16], "texture": "#1"} - } - }, - { - "name": "GearCaseInner", - "from": [2, 7, 2], - "to": [14, 9, 14], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "east": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "south": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "west": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "up": {"uv": [2, 2, 14, 14], "texture": "#2"}, - "down": {"uv": [2, 2, 14, 14], "texture": "#2"} - } - }, - { - "name": "GearCaseOuter", - "from": [4, 6, 4], - "to": [12, 10, 12], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "east": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "south": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "west": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "up": {"uv": [4, 4, 12, 12], "texture": "#2"}, - "down": {"uv": [4, 4, 12, 12], "texture": "#2"} + "up": {"uv": [3, 0, 9, 6], "texture": "#3"} } }, { @@ -225,18 +141,98 @@ "faces": { "up": {"uv": [0, 0, 6, 6], "texture": "#3"} } + }, + { + "name": "Gear", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear2", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear3", + "from": [-1, 6.5, 6.5], + "to": [17, 9.5, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear4", + "from": [6.5, 6.5, -1], + "to": [9.5, 9.5, 17], + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "east": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "south": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "west": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"} + } + }, + { + "name": "GearCaseInner", + "from": [2, 7, 2], + "to": [14, 9, 14], + "faces": { + "north": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "east": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "south": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "west": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "up": {"uv": [4, 0, 10, 6], "texture": "#1_2"}, + "down": {"uv": [4, 0, 10, 6], "texture": "#1_2"} + } + }, + { + "name": "GearCaseOuter", + "from": [4, 6, 4], + "to": [12, 10, 12], + "faces": { + "north": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "south": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "west": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1_2"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1_2"} + } } ], "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - { - "name": "cogwheel_shaftless", - "origin": [8, 8, 8], - "children": [11, 12, 13, 14, 15, 16] - }, { "name": "lid", "origin": [8, 8, 8], - "children": [17] + "children": [11] + }, + { + "name": "cogwheel_shaftless", + "origin": [8, 8, 8], + "children": [12, 13, 14, 15, 16, 17] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json index 49fa250bf..d53ce5844 100644 --- a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json @@ -2,28 +2,120 @@ "credit": "Made with Blockbench", "parent": "block/block", "ambientocclusion": false, + "texture_size": [32, 32], "textures": { - "1": "block/stripped_spruce_log", "2": "block/spruce_log_top", "4": "create:block/mixer_base_side", "6": "create:block/mixer_head", "11": "create:block/mechanical_press_top", - "mechanical_press_pole": "create:block/mechanical_press_pole", - "particle": "block/stripped_spruce_log" + "1_2": "create:block/cogwheel", + "mechanical_press_pole": "create:block/mechanical_press_pole" }, - "display": { - "gui": { - "rotation": [ 30, 225, 0 ], - "translation": [ 0, -2, 0], - "scale":[ 0.45, 0.45, 0.45 ] - }, - "fixed": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0, -2.75, -0.0625], - "scale":[ 0.5, 0.5, 0.5 ] - } - }, "elements": [ + { + "name": "Gear", + "from": [-1, 13.5, 6.5], + "to": [17, 16.5, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear2", + "from": [-1, 13.5, 6.5], + "to": [17, 16.5, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear3", + "from": [-1, 13.5, 6.5], + "to": [17, 16.5, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "east": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "south": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "west": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "texture": "#1_2"} + } + }, + { + "name": "Gear4", + "from": [6.5, 13.5, -1], + "to": [9.5, 16.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "east": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "south": {"uv": [5.5, 7.5, 7, 9], "texture": "#1_2"}, + "west": {"uv": [7, 7.5, 16, 9], "texture": "#1_2"}, + "up": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"}, + "down": {"uv": [7, 6, 16, 7.5], "rotation": 90, "texture": "#1_2"} + } + }, + { + "name": "GearCaseInner", + "from": [2, 14, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "east": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "south": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "west": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "up": {"uv": [4, 0, 10, 6], "texture": "#1_2"}, + "down": {"uv": [4, 0, 10, 6], "texture": "#1_2"} + } + }, + { + "name": "GearCaseOuter", + "from": [4, 13, 4], + "to": [12, 17, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "south": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "west": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1_2"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1_2"} + } + }, + { + "name": "Side3", + "from": [0, 13, 16], + "to": [16, 17, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, + "south": {"uv": [0, 6, 16, 10], "texture": "#4"} + } + }, + { + "name": "Side4", + "from": [0, 13, 0], + "to": [16, 17, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, + "south": {"uv": [0, 6, 16, 10], "texture": "#4"} + } + }, { "name": "MixerCenter", "from": [7, -4.5, 7], @@ -231,90 +323,6 @@ "up": {"uv": [10, 5, 16, 6], "rotation": 180, "texture": "#mechanical_press_pole"} } }, - { - "name": "Gear2", - "from": [-1, 13.5, 6.5], - "to": [17, 16.5, 9.5], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 3], "texture": "#1"} - } - }, - { - "name": "Gear2", - "from": [-1, 13.5, 6.5], - "to": [17, 16.5, 9.5], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 3], "texture": "#1"} - } - }, - { - "name": "Gear4", - "from": [6.5, 13.5, -1], - "to": [9.5, 16.5, 17], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 3, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 3, 16], "texture": "#1"} - } - }, - { - "name": "Gear4", - "from": [6.5, 13.5, -1], - "to": [9.5, 16.5, 17], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "east": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "south": {"uv": [0, 0, 3, 3], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 3], "texture": "#1"}, - "up": {"uv": [0, 0, 3, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 3, 16], "texture": "#1"} - } - }, - { - "name": "GearCaseInner", - "from": [2, 14, 2], - "to": [14, 16, 14], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "east": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "south": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "west": {"uv": [0, 0, 12, 2], "texture": "#1"}, - "up": {"uv": [2, 2, 14, 14], "texture": "#2"}, - "down": {"uv": [2, 2, 14, 14], "texture": "#2"} - } - }, - { - "name": "GearCaseOuter", - "from": [4, 13, 4], - "to": [12, 17, 12], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "east": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "south": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "west": {"uv": [0, 0, 8, 4], "texture": "#1"}, - "up": {"uv": [4, 4, 12, 12], "texture": "#2"}, - "down": {"uv": [4, 4, 12, 12], "texture": "#2"} - } - }, { "name": "Top", "from": [0, 17, 0], @@ -362,52 +370,66 @@ "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, "west": {"uv": [0, 6, 16, 10], "texture": "#4"} } - }, - { - "name": "Side3", - "from": [0, 13, 16], - "to": [16, 17, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "south": {"uv": [0, 6, 16, 10], "texture": "#4"} - } - }, - { - "name": "Side4", - "from": [0, 13, 0], - "to": [16, 17, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "south": {"uv": [0, 6, 16, 10], "texture": "#4"} - } } ], - "groups": [ - { - "name": "mixerhead", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8] + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] }, - { - "name": "mechanical_press_head", - "origin": [8, 8, 8], - "children": [9, 10, 11, 12, 13, 14, 15] + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, -1.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "fixed": { + "translation": [0, -3, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [0, 1, 2, 3, 4, 5, { - "name": "mixer_base", + "name": "item", "origin": [8, 8, 8], - "children": [ + "children": [6, 7, { - "name": "cogwheel", + "name": "mixerhead", "origin": [8, 8, 8], - "children": [16, 17, 18, 19] + "children": [8, 9, 10, 11, 12, 13, 14, 15, 16] }, { - "name": "mixerbase", + "name": "mechanical_press_head", "origin": [8, 8, 8], - "children": [20, 21, 22, 23, 24, 25] + "children": [17, 18, 19, 20, 21, 22, 23] + }, + { + "name": "mixer_base", + "origin": [8, 8, 8], + "children": [ + { + "name": "mixerbase", + "origin": [8, 8, 8], + "children": [24, 25, 26, 27] + } + ] } ] } diff --git a/src/main/resources/assets/create/models/block/mechanical_press/block.json b/src/main/resources/assets/create/models/block/mechanical_press/block.json index 52e0a616d..113f7348d 100644 --- a/src/main/resources/assets/create/models/block/mechanical_press/block.json +++ b/src/main/resources/assets/create/models/block/mechanical_press/block.json @@ -1,59 +1,60 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", - "textures": { - "gearbox_top": "create:block/gearbox_top", - "gearbox": "create:block/gearbox", - "mechanical_press_top": "create:block/mechanical_press_top", - "mechanical_press_bottom": "create:block/mechanical_press_bottom", - "particle": "create:block/gearbox" - }, - "elements": [ - { - "name": "Top", - "from": [ 0, 14, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "texture": "#gearbox", "uv": [ 0, 0, 16, 2 ] }, - "east": { "texture": "#gearbox", "uv": [ 0, 0, 16, 2 ] }, - "south": { "texture": "#gearbox", "uv": [ 0, 0, 16, 2 ] }, - "west": { "texture": "#gearbox", "uv": [ 0, 0, 16, 2 ] }, - "up": { "texture": "#mechanical_press_top", "uv": [ 0, 0, 16, 16 ] }, - "down": { "texture": "#gearbox", "uv": [ 0, 0, 16, 16 ] } - } - }, - { - "name": "Core", - "from": [ 2, 4, 1 ], - "to": [ 14, 14, 15 ], - "faces": { - "north": { "texture": "#gearbox", "uv": [ 2, 2, 14, 12 ] }, - "south": { "texture": "#gearbox", "uv": [ 2, 2, 14, 12 ] }, - "down": { "texture": "#mechanical_press_bottom", "uv": [ 2, 1, 14, 15 ] } - } - }, - { - "name": "Side", - "from": [ 0, 2, 0 ], - "to": [ 2, 14, 16 ], - "faces": { - "north": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] }, - "east": { "texture": "#gearbox_top", "uv": [ 0, 4, 16, 16 ] }, - "south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] }, - "west": { "texture": "#gearbox_top", "uv": [ 0, 4, 16, 16 ] }, - "down": { "texture": "#gearbox_top", "uv": [ 0, 0, 2, 16 ] } - } - }, - { - "name": "Side", - "from": [ 14, 2, 0 ], - "to": [ 16, 14, 16 ], - "faces": { - "north": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] }, - "east": { "texture": "#gearbox_top", "uv": [ 0, 4, 16, 16 ] }, - "south": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] }, - "west": { "texture": "#gearbox_top", "uv": [ 0, 4, 16, 16 ] }, - "down": { "texture": "#gearbox_top", "uv": [ 14, 0, 16, 16 ] } - } - } - ] + "credit": "Made with Blockbench", + "textures": { + "4": "create:block/mechanical_press_side", + "gearbox_top": "create:block/gearbox_top", + "particle": "create:block/mechanical_press_side", + "gearbox": "create:block/gearbox", + "mechanical_press_top": "create:block/mechanical_press_top", + "mechanical_press_bottom": "create:block/mechanical_press_bottom" + }, + "elements": [ + { + "name": "Top", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#mechanical_press_top"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#gearbox"} + } + }, + { + "name": "Core", + "from": [2, 4, 1], + "to": [14, 14, 15], + "faces": { + "north": {"uv": [2, 2, 14, 12], "texture": "#gearbox"}, + "south": {"uv": [2, 2, 14, 12], "texture": "#gearbox"}, + "down": {"uv": [2, 1, 14, 15], "texture": "#mechanical_press_bottom"} + } + }, + { + "name": "Side", + "from": [0, 2, 0], + "to": [2, 14, 16], + "faces": { + "north": {"uv": [14, 2, 16, 14], "texture": "#gearbox_top"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#4"}, + "south": {"uv": [0, 2, 2, 14], "texture": "#gearbox_top"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#4"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#gearbox_top"} + } + }, + { + "name": "Side", + "from": [14, 2, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [0, 2, 2, 14], "texture": "#gearbox_top"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#4"}, + "south": {"uv": [14, 2, 16, 14], "texture": "#gearbox_top"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#4"}, + "down": {"uv": [14, 0, 16, 16], "texture": "#gearbox_top"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_press/item.json b/src/main/resources/assets/create/models/block/mechanical_press/item.json index e0284b15f..28d22b00d 100644 --- a/src/main/resources/assets/create/models/block/mechanical_press/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_press/item.json @@ -4,13 +4,14 @@ "textures": { "0": "create:block/axis", "1": "create:block/axis_top", + "8": "create:block/mechanical_press_side", "mechanical_press_head": "create:block/mechanical_press_head", "gearbox_top": "create:block/gearbox_top", "mechanical_press_pole": "create:block/mechanical_press_pole", "gearbox": "create:block/gearbox", "mechanical_press_top": "create:block/mechanical_press_top", "mechanical_press_bottom": "create:block/mechanical_press_bottom", - "particle": "create:block/axis" + "particle": "create:block/mechanical_press_side" }, "elements": [ { @@ -19,9 +20,9 @@ "to": [16, 20, 16], "faces": { "north": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#8"}, "south": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#gearbox"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#8"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#mechanical_press_top"}, "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#gearbox"} } @@ -42,9 +43,9 @@ "to": [16, 18, 16], "faces": { "north": {"uv": [0, 2, 2, 14], "texture": "#gearbox_top"}, - "east": {"uv": [0, 4, 16, 16], "texture": "#gearbox_top"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#8"}, "south": {"uv": [14, 2, 16, 14], "texture": "#gearbox_top"}, - "west": {"uv": [0, 4, 16, 16], "texture": "#gearbox_top"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#8"}, "down": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#gearbox_top"} } }, @@ -54,9 +55,9 @@ "to": [2, 18, 16], "faces": { "north": {"uv": [14, 2, 16, 14], "texture": "#gearbox_top"}, - "east": {"uv": [0, 4, 16, 16], "texture": "#gearbox_top"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#8"}, "south": {"uv": [0, 2, 2, 14], "texture": "#gearbox_top"}, - "west": {"uv": [0, 4, 16, 16], "texture": "#gearbox_top"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#8"}, "down": {"uv": [14, 0, 16, 16], "rotation": 180, "texture": "#gearbox_top"} } }, diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/block.json b/src/main/resources/assets/create/models/block/mechanical_pump/block.json index 0d3583084..859edf294 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/block.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/block.json @@ -13,10 +13,10 @@ "to": [12, 12, 12], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]}, "faces": { - "north": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "east": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "south": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "west": {"uv": [0, 8, 4, 12], "texture": "#3"} + "north": {"uv": [0, 6, 4, 10], "texture": "#3"}, + "east": {"uv": [0, 6, 4, 10], "texture": "#3"}, + "south": {"uv": [0, 6, 4, 10], "texture": "#3"}, + "west": {"uv": [0, 6, 4, 10], "texture": "#3"} } }, { diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json index 88cb31a39..aa1befa09 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json @@ -1,33 +1,21 @@ { "credit": "Made with Blockbench", - "parent": "create:block/large_wheels", + "parent": "block/block", + "texture_size": [32, 32], "textures": { "5": "create:block/millstone", "particle": "create:block/fluid_pipe" }, "elements": [ - { - "name": "Gear5", - "from": [6.5, -1, 5], - "to": [9.5, 17, 11], - "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, - "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} - } - }, { "name": "Gear6", "from": [6.5, -1, 5], "to": [9.5, 17, 11], - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, + "north": {"uv": [6, 3, 15, 4.5], "rotation": 270, "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, + "south": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} @@ -35,26 +23,41 @@ }, { "name": "Gear7", + "from": [6.5, -1, 5], + "to": [9.5, 17, 11], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, + "faces": { + "north": {"uv": [6, 3, 15, 4.5], "rotation": 270, "texture": "#5"}, + "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, + "south": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, + "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, + "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, + "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} + } + }, + { + "name": "Gear8", "from": [-1, 6.5, 5], "to": [17, 9.5, 11], - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}, + "north": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}, + "south": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 10, 9, 13], "texture": "#5"} } }, { - "name": "Gear7", + "name": "Gear8", "from": [-1, 6.5, 5], "to": [17, 9.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}, + "north": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}, + "south": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 10, 9, 13], "texture": "#5"} @@ -64,10 +67,11 @@ "name": "GearCaseInner", "from": [2, 2, 5.5], "to": [14, 14, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]}, "faces": { - "north": {"uv": [0, 0, 6, 6], "texture": "#5"}, + "north": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#5"}, "east": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#5"}, "west": {"uv": [0, 6, 6, 8.5], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 6, 6, 8.5], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 6, 6, 8.5], "texture": "#5"} diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/item.json b/src/main/resources/assets/create/models/block/mechanical_pump/item.json index 816bff337..a91c59241 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/item.json @@ -9,179 +9,213 @@ }, "elements": [ { - "from": [7, 11.5, 1.5], - "to": [9, 13.5, 2.5], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 9.5]}, + "from": [1, 3, 1.5], + "to": [3, 5, 2.5], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]}, "faces": { - "north": {"uv": [12, 2, 14, 4], "rotation": 270, "texture": "#4"}, - "east": {"uv": [12, 2, 14, 3], "rotation": 270, "texture": "#4"}, - "south": {"uv": [14, 2, 12, 4], "rotation": 90, "texture": "#4"}, - "west": {"uv": [12, 3, 14, 4], "rotation": 90, "texture": "#4"}, - "up": {"uv": [12, 3, 14, 4], "texture": "#4"}, - "down": {"uv": [12, 2, 13, 4], "rotation": 90, "texture": "#4"} - } - }, - { - "from": [7, 11.5, 13.5], - "to": [9, 13.5, 14.5], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 6.5]}, - "faces": { - "north": {"uv": [14, 4, 12, 2], "rotation": 90, "texture": "#4"}, - "east": {"uv": [12, 3, 14, 2], "rotation": 270, "texture": "#4"}, - "south": {"uv": [12, 4, 14, 2], "rotation": 270, "texture": "#4"}, - "west": {"uv": [12, 4, 14, 3], "rotation": 90, "texture": "#4"}, - "up": {"uv": [12, 4, 14, 3], "texture": "#4"}, - "down": {"uv": [13, 2, 12, 4], "rotation": 90, "texture": "#4"} - } - }, - { - "from": [7, 13.5, 1.5], - "to": [11, 15.5, 2.5], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 9.5]}, - "faces": { - "north": {"uv": [14, 0, 16, 4], "rotation": 270, "texture": "#4"}, - "east": {"uv": [14, 0, 16, 1], "rotation": 270, "texture": "#4"}, - "south": {"uv": [16, 0, 14, 4], "rotation": 90, "texture": "#4"}, + "north": {"uv": [12, 2, 14, 4], "texture": "#4"}, + "east": {"uv": [12, 2, 13, 4], "texture": "#4"}, + "south": {"uv": [14, 2, 12, 4], "texture": "#4"}, "west": {"uv": [12, 3, 14, 4], "rotation": 270, "texture": "#4"}, - "up": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "down": {"uv": [12, 0, 13, 4], "rotation": 270, "texture": "#4"} + "up": {"uv": [12, 2, 14, 3], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 3, 14, 4], "texture": "#4"} } }, { - "from": [7, 13.5, 13.5], - "to": [11, 15.5, 14.5], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 6.5]}, + "from": [1, 3, 13.5], + "to": [3, 5, 14.5], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]}, "faces": { - "north": {"uv": [16, 4, 14, 0], "rotation": 90, "texture": "#4"}, - "east": {"uv": [14, 1, 16, 0], "rotation": 270, "texture": "#4"}, - "south": {"uv": [14, 4, 16, 0], "rotation": 270, "texture": "#4"}, + "north": {"uv": [14, 4, 12, 2], "rotation": 180, "texture": "#4"}, + "east": {"uv": [13, 2, 12, 4], "texture": "#4"}, + "south": {"uv": [12, 4, 14, 2], "rotation": 180, "texture": "#4"}, "west": {"uv": [12, 4, 14, 3], "rotation": 270, "texture": "#4"}, - "up": {"uv": [16, 0, 15, 4], "rotation": 90, "texture": "#4"}, - "down": {"uv": [13, 0, 12, 4], "rotation": 270, "texture": "#4"} + "up": {"uv": [12, 3, 14, 2], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 4, 14, 3], "texture": "#4"} + } + }, + { + "from": [-1, 3, 1.5], + "to": [1, 7, 2.5], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]}, + "faces": { + "north": {"uv": [14, 0, 16, 4], "texture": "#4"}, + "east": {"uv": [12, 0, 13, 4], "rotation": 180, "texture": "#4"}, + "south": {"uv": [16, 0, 14, 4], "texture": "#4"}, + "west": {"uv": [15, 0, 16, 4], "texture": "#4"}, + "up": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 3, 14, 4], "rotation": 180, "texture": "#4"} + } + }, + { + "from": [-1, 3, 13.5], + "to": [1, 7, 14.5], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]}, + "faces": { + "north": {"uv": [16, 4, 14, 0], "rotation": 180, "texture": "#4"}, + "east": {"uv": [13, 0, 12, 4], "rotation": 180, "texture": "#4"}, + "south": {"uv": [14, 4, 16, 0], "rotation": 180, "texture": "#4"}, + "west": {"uv": [16, 0, 15, 4], "texture": "#4"}, + "up": {"uv": [14, 1, 16, 0], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 4, 14, 3], "rotation": 180, "texture": "#4"} } }, { "name": "rod", - "from": [7.5, 13.5, 1], - "to": [8.5, 14.5, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 21.5, 10]}, + "from": [2, 8, 1], + "to": [3, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 16, 8]}, "faces": { - "north": {"uv": [0, 15, 1, 16], "texture": "#4"}, + "north": {"uv": [0, 15, 1, 16], "rotation": 90, "texture": "#4"}, "east": {"uv": [0, 15, 14, 16], "texture": "#4"}, - "south": {"uv": [0, 15, 1, 16], "texture": "#4"}, + "south": {"uv": [0, 15, 1, 16], "rotation": 270, "texture": "#4"}, "west": {"uv": [0, 15, 14, 16], "texture": "#4"}, - "up": {"uv": [0, 15, 14, 16], "rotation": 90, "texture": "#4"}, - "down": {"uv": [0, 15, 14, 16], "rotation": 90, "texture": "#4"} + "up": {"uv": [0, 15, 14, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 15, 14, 16], "rotation": 270, "texture": "#4"} } }, { "name": "Gear5", - "from": [6.5, 5, -1], - "to": [9.5, 11, 17], + "from": [5.5, 7, -1], + "to": [11.5, 10, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"} + "north": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, + "south": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, + "west": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, + "up": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, + "down": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"} } }, { "name": "Gear6", - "from": [6.5, 5, -1], - "to": [9.5, 11, 17], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [5.5, 7, -1], + "to": [11.5, 10, 17], + "rotation": {"angle": -45, "axis": "x", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"} + "north": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, + "south": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, + "west": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, + "up": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, + "down": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"} } }, { "name": "Gear7", - "from": [-1, 5, 6.5], - "to": [17, 11, 9.5], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [5.5, -0.5, 6.5], + "to": [11.5, 17.5, 9.5], + "rotation": {"angle": -45, "axis": "x", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"} + "north": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, + "west": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, + "up": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, + "down": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"} } }, { "name": "Gear7", - "from": [-1, 5, 6.5], - "to": [17, 11, 9.5], + "from": [5.5, -0.5, 6.5], + "to": [11.5, 17.5, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"} + "north": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, + "west": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, + "up": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, + "down": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"} } }, { "name": "GearCaseInner", - "from": [2, 5.5, 2], - "to": [14, 10.5, 14], + "from": [6, 2.5, 2], + "to": [11, 14.5, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, - "east": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, - "south": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, - "west": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, - "up": {"uv": [0, 0, 6, 6], "texture": "#5"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + "north": {"uv": [0, 6, 6, 8.5], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"}, + "south": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, + "down": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"} } }, { "name": "middle", - "from": [4, 4, 4], - "to": [12, 12, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]}, + "from": [4.5, 4.5, 4], + "to": [12.5, 12.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, "faces": { - "north": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "east": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "south": {"uv": [0, 8, 4, 12], "texture": "#3"}, - "west": {"uv": [0, 8, 4, 12], "texture": "#3"} + "north": {"uv": [0, 8, 4, 12], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 8, 4, 12], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 8, 4, 12], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 8, 4, 12], "rotation": 270, "texture": "#3"} } }, { "name": "back", - "from": [2, 0, 2], - "to": [14, 5, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [11, 8, 20]}, + "from": [11.5, 2.5, 2], + "to": [16.5, 14.5, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11.5, 8]}, "faces": { - "north": {"uv": [11, 0, 13.5, 6], "rotation": 270, "texture": "#3"}, - "east": {"uv": [11, 0, 13.5, 6], "rotation": 270, "texture": "#3"}, - "south": {"uv": [11, 0, 13.5, 6], "rotation": 270, "texture": "#3"}, - "west": {"uv": [11, 0, 13.5, 6], "rotation": 270, "texture": "#3"}, - "up": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#3"}, - "down": {"uv": [0, 0, 12, 12], "texture": "#4"} + "north": {"uv": [11, 0, 13.5, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 12, 12], "rotation": 270, "texture": "#4"}, + "south": {"uv": [11, 0, 13.5, 6], "rotation": 180, "texture": "#3"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "up": {"uv": [11, 0, 13.5, 6], "rotation": 180, "texture": "#3"}, + "down": {"uv": [11, 0, 13.5, 6], "rotation": 180, "texture": "#3"} } }, { "name": "front", - "from": [3, 12, 3], - "to": [13, 16, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 10]}, + "from": [0.5, 3.5, 3], + "to": [4.5, 13.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 10.5, 8]}, "faces": { - "north": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"}, - "east": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"}, - "south": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"}, - "west": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"}, - "up": {"uv": [6, 0, 11, 5], "texture": "#3"}, - "down": {"uv": [6, 0, 11, 5], "texture": "#3"} + "north": {"uv": [12, 4, 16, 14], "rotation": 180, "texture": "#4"}, + "east": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [12, 4, 16, 14], "texture": "#4"}, + "west": {"uv": [6, 0, 11, 5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [12, 4, 16, 14], "texture": "#4"}, + "down": {"uv": [12, 4, 16, 14], "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, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, "groups": [ { "name": "arrow", diff --git a/src/main/resources/assets/create/models/block/millstone/inner.json b/src/main/resources/assets/create/models/block/millstone/inner.json index 1a21a6e74..1735ba332 100644 --- a/src/main/resources/assets/create/models/block/millstone/inner.json +++ b/src/main/resources/assets/create/models/block/millstone/inner.json @@ -1,6 +1,7 @@ { "credit": "Made with Blockbench", "parent": "block/block", + "texture_size": [32, 32], "textures": { "5": "create:block/millstone", "particle": "create:block/axis", @@ -17,8 +18,8 @@ "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"} + "up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, + "down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} } }, { @@ -31,8 +32,8 @@ "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"} + "up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, + "down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} } }, { @@ -45,8 +46,8 @@ "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"} + "up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, + "down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} } }, { @@ -58,14 +59,15 @@ "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"} + "up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, + "down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} } }, { "name": "GearCaseInner", - "from": [2, 6.6, 2], - "to": [14, 11.6, 14], + "from": [2, 7, 2], + "to": [14, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "east": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, @@ -80,10 +82,10 @@ "from": [4, 6, 4], "to": [12, 13, 12], "faces": { - "north": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, - "east": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, - "south": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, - "west": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, + "north": {"uv": [6, 4.5, 10, 8], "texture": "#5"}, + "east": {"uv": [6, 4.5, 10, 8], "texture": "#5"}, + "south": {"uv": [6, 4.5, 10, 8], "texture": "#5"}, + "west": {"uv": [6, 4.5, 10, 8], "texture": "#5"}, "up": {"uv": [1, 1, 5, 5], "texture": "#5"}, "down": {"uv": [1, 1, 5, 5], "texture": "#5"} } @@ -94,10 +96,10 @@ "to": [10, 8, 10], "shade": false, "faces": { - "north": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"}, - "east": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"}, - "south": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"}, - "west": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"}, + "north": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, + "east": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, + "south": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, + "west": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, "up": {"uv": [6, 6, 10, 10], "texture": "#1_1"}, "down": {"uv": [6, 6, 10, 10], "texture": "#1_1"} } diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json deleted file mode 100644 index ccf249c2c..000000000 --- a/src/main/resources/assets/create/models/block/packager/block.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "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 deleted file mode 100644 index 7d29349c2..000000000 --- a/src/main/resources/assets/create/models/block/packager/item.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "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 deleted file mode 100644 index e0527d1d2..000000000 --- a/src/main/resources/assets/create/models/block/packager/sealer.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "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/models/block/portable_storage_interface.json b/src/main/resources/assets/create/models/block/portable_storage_interface.json index 177bbe7e6..5315fdd02 100644 --- a/src/main/resources/assets/create/models/block/portable_storage_interface.json +++ b/src/main/resources/assets/create/models/block/portable_storage_interface.json @@ -6,8 +6,8 @@ "5": "create:block/andesite_casing_short", "6": "create:block/gearbox_top", "7": "block/dark_oak_log", - "1_2": "create:block/transposer", - "particle": "create:block/extractor" + "particle": "create:block/andesite_casing_short", + "1_2": "create:block/brass_block" }, "elements": [ { @@ -75,29 +75,7 @@ "east": {"uv": [1, 4, 5, 12], "rotation": 90, "texture": "#0"}, "south": {"uv": [1, 4, 5, 12], "rotation": 90, "texture": "#0"}, "west": {"uv": [1, 4, 5, 12], "rotation": 90, "texture": "#0"}, - "up": {"uv": [7, 7, 15, 15], "rotation": 90, "texture": "#1_2"} - } - }, - { - "from": [3, 11, 11], - "to": [5, 16, 13], - "faces": { - "north": {"uv": [0, 14, 5, 16], "rotation": 90, "texture": "#0"}, - "east": {"uv": [11, 14, 16, 16], "rotation": 270, "texture": "#1_2"}, - "south": {"uv": [6, 14, 11, 16], "rotation": 90, "texture": "#1_2"}, - "west": {"uv": [6, 6, 11, 8], "rotation": 90, "texture": "#1_2"}, - "up": {"uv": [4, 6, 6, 8], "rotation": 180, "texture": "#1_2"} - } - }, - { - "from": [11, 11, 11], - "to": [13, 16, 13], - "faces": { - "north": {"uv": [0, 16, 5, 14], "rotation": 90, "texture": "#0"}, - "east": {"uv": [11, 6, 6, 8], "rotation": 270, "texture": "#1_2"}, - "south": {"uv": [6, 16, 11, 14], "rotation": 90, "texture": "#1_2"}, - "west": {"uv": [16, 14, 11, 16], "rotation": 90, "texture": "#1_2"}, - "up": {"uv": [6, 6, 4, 8], "rotation": 180, "texture": "#1_2"} + "up": {"uv": [4, 4, 12, 12], "rotation": 90, "texture": "#1_2"} } }, { @@ -105,10 +83,21 @@ "to": [5, 16, 5], "faces": { "north": {"uv": [11, 14, 6, 16], "rotation": 270, "texture": "#1_2"}, - "east": {"uv": [11, 16, 16, 14], "rotation": 270, "texture": "#1_2"}, - "south": {"uv": [5, 14, 0, 16], "rotation": 270, "texture": "#0"}, - "west": {"uv": [6, 8, 11, 6], "rotation": 90, "texture": "#1_2"}, - "up": {"uv": [4, 8, 6, 6], "rotation": 180, "texture": "#1_2"} + "east": {"uv": [8, 2, 13, 0], "rotation": 270, "texture": "#1_2"}, + "south": {"uv": [6, 0, 1, 2], "rotation": 270, "texture": "#0"}, + "west": {"uv": [6, 2, 11, 0], "rotation": 90, "texture": "#1_2"}, + "up": {"uv": [13, 3, 15, 1], "rotation": 180, "texture": "#1_2"} + } + }, + { + "from": [3, 11, 11], + "to": [5, 16, 13], + "faces": { + "north": {"uv": [6, 2, 1, 0], "rotation": 270, "texture": "#0"}, + "east": {"uv": [8, 0, 13, 2], "rotation": 270, "texture": "#1_2"}, + "south": {"uv": [11, 16, 6, 14], "rotation": 270, "texture": "#1_2"}, + "west": {"uv": [6, 0, 11, 2], "rotation": 90, "texture": "#1_2"}, + "up": {"uv": [13, 1, 15, 3], "rotation": 180, "texture": "#1_2"} } }, { @@ -116,10 +105,21 @@ "to": [13, 16, 5], "faces": { "north": {"uv": [11, 16, 6, 14], "rotation": 270, "texture": "#1_2"}, - "east": {"uv": [11, 8, 6, 6], "rotation": 270, "texture": "#1_2"}, - "south": {"uv": [5, 16, 0, 14], "rotation": 270, "texture": "#0"}, - "west": {"uv": [16, 16, 11, 14], "rotation": 90, "texture": "#1_2"}, - "up": {"uv": [6, 8, 4, 6], "rotation": 180, "texture": "#1_2"} + "east": {"uv": [6, 0, 11, 2], "rotation": 90, "texture": "#1_2"}, + "south": {"uv": [6, 2, 1, 0], "rotation": 270, "texture": "#0"}, + "west": {"uv": [8, 0, 13, 2], "rotation": 270, "texture": "#1_2"}, + "up": {"uv": [15, 3, 13, 1], "rotation": 180, "texture": "#1_2"} + } + }, + { + "from": [11, 11, 11], + "to": [13, 16, 13], + "faces": { + "north": {"uv": [6, 0, 1, 2], "rotation": 270, "texture": "#0"}, + "east": {"uv": [6, 2, 11, 0], "rotation": 90, "texture": "#1_2"}, + "south": {"uv": [11, 14, 6, 16], "rotation": 270, "texture": "#1_2"}, + "west": {"uv": [8, 2, 13, 0], "rotation": 270, "texture": "#1_2"}, + "up": {"uv": [15, 1, 13, 3], "rotation": 180, "texture": "#1_2"} } } ], diff --git a/src/main/resources/assets/create/models/block/redstone_link/receiver.json b/src/main/resources/assets/create/models/block/redstone_link/receiver.json index d4a811669..91c26e608 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/receiver.json +++ b/src/main/resources/assets/create/models/block/redstone_link/receiver.json @@ -1,66 +1,66 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", - "parent": "block/block", - "display": { - "gui": { - "rotation": [ 30, 45, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - } - }, - "textures": { - "redstone_antenna": "create:block/redstone_antenna", - "redstone_bridge": "create:block/redstone_bridge", - "particle": "create:block/redstone_bridge" - }, - "elements": [ - { - "name": "Controller", - "from": [ 2, 0, 2 ], - "to": [ 14, 3, 14 ], - "faces": { - "north": { "texture": "#redstone_bridge", "uv": [ 12, 0, 15, 12 ], "rotation": 90 }, - "east": { "texture": "#redstone_bridge", "uv": [ 0, 12, 12, 15 ] }, - "south": { "texture": "#redstone_bridge", "uv": [ 12, 0, 15, 12 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge", "uv": [ 0, 12, 12, 15 ] }, - "up": { "texture": "#redstone_bridge", "uv": [ 0, 0, 12, 12 ], "rotation": 270 } - } - }, - { - "name": "AntennaX", - "from": [ 0, 1, 4 ], - "to": [ 3, 11, 5 ], - "faces": { - "north": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "south": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "down": { "texture": "#redstone_antenna", "uv": [ 0, 9, 3, 10 ] } - } - }, - { - "name": "AntennaZ", - "from": [ 1, 1, 3 ], - "to": [ 2, 11, 6 ], - "faces": { - "east": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "west": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] } - } - }, - { - "name": "AntennaTop", - "from": [ 1, 9, 4 ], - "to": [ 2, 10, 5 ], - "faces": { - "up": { "texture": "#redstone_antenna", "uv": [ 1, 1, 2, 2 ] } - } - }, - { - "name": "Dish", - "from": [ -1, 7, 2 ], - "to": [ 4, 7, 7 ], - "faces": { - "up": { "texture": "#redstone_antenna", "uv": [ 4, 0, 9, 5 ] }, - "down": { "texture": "#redstone_antenna", "uv": [ 4, 0, 9, 5 ] } - } - } - ] + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna", + "particle": "create:block/redstone_bridge", + "redstone_bridge": "create:block/redstone_bridge" + }, + "elements": [ + { + "name": "Controller", + "from": [2, 0, 2], + "to": [14, 3, 14], + "faces": { + "north": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "south": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 7, 6, 13], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [5, 0, 11, 6], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaX", + "from": [0, 1, 4], + "to": [3, 11, 5], + "faces": { + "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [1, 1, 3], + "to": [2, 11, 6], + "faces": { + "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [1, 9, 4], + "to": [2, 10, 5], + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "Dish", + "from": [-1, 7, 2], + "to": [4, 7, 7], + "faces": { + "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, + "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/receiver_powered.json b/src/main/resources/assets/create/models/block/redstone_link/receiver_powered.json index 205c09227..8401656e8 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/receiver_powered.json +++ b/src/main/resources/assets/create/models/block/redstone_link/receiver_powered.json @@ -1,8 +1,66 @@ { - "parent": "create:block/redstone_link/receiver", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "redstone_bridge": "create:block/redstone_bridge_powered", - "particle": "create:block/redstone_bridge_powered" - } + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna_powered", + "particle": "create:block/redstone_bridge_powered", + "redstone_bridge": "create:block/redstone_bridge_powered" + }, + "elements": [ + { + "name": "Controller", + "from": [2, 0, 2], + "to": [14, 3, 14], + "faces": { + "north": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "south": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 7, 6, 13], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [5, 0, 11, 6], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaX", + "from": [0, 1, 4], + "to": [3, 11, 5], + "faces": { + "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [1, 1, 3], + "to": [2, 11, 6], + "faces": { + "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [1, 9, 4], + "to": [2, 10, 5], + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "Dish", + "from": [-1, 7, 2], + "to": [4, 7, 7], + "faces": { + "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, + "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical.json b/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical.json index 4e481b676..ff3f5c397 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical.json +++ b/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical.json @@ -1,70 +1,60 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "redstone_antenna": "create:block/redstone_antenna", - "redstone_bridge_side": "create:block/redstone_bridge_side", - "particle": "create:block/redstone_bridge_side" - }, - "elements": [ - { - "name": "Body", - "from": [ 3, 0, 1 ], - "to": [ 13, 3, 15 ], - "faces": { - "north": { "texture": "#redstone_bridge_side", "uv": [ 13, 2, 16, 12 ], "rotation": 90 }, - "east": { "texture": "#redstone_bridge_side", "uv": [ 10, 0, 13, 14 ], "rotation": 90 }, - "south": { "texture": "#redstone_bridge_side", "uv": [ 13, 2, 16, 12 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge_side", "uv": [ 10, 0, 13, 14 ], "rotation": 90 }, - "up": { "texture": "#redstone_bridge_side", "uv": [ 0, 0, 10, 14 ] } - } - }, - { - "name": "Bottom", - "from": [ 3, -1, 1 ], - "to": [ 13, 0, 15 ], - "faces": { - "north": { "texture": "#redstone_bridge_side", "uv": [ 15, 1, 16, 13 ], "rotation": 270 }, - "east": { "texture": "#redstone_bridge_side", "uv": [ 14, 0, 15, 14 ], "rotation": 270 }, - "south": { "texture": "#redstone_bridge_side", "uv": [ 15, 1, 16, 13 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge_side", "uv": [ 14, 0, 15, 14 ], "rotation": 90 } - } - }, - { - "name": "AntennaX", - "from": [ 3, 3, -5 ], - "to": [ 6, 4, 5 ], - "faces": { - "south": { "texture": "#redstone_antenna", "uv": [ 0, 9, 3, 10 ] }, - "up": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "down": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 180 } - } - }, - { - "name": "AntennaZ", - "from": [ 4, 2, -5 ], - "to": [ 5, 5, 5 ], - "faces": { - "east": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 90 }, - "west": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 270 } - } - }, - { - "name": "AntennaTop", - "from": [ 4, 3, -4 ], - "to": [ 5, 4, -3 ], - "faces": { - "north": { "texture": "#redstone_antenna", "uv": [ 1, 1, 2, 2 ] } - } - }, - { - "name": "Dish", - "from": [ 2, 1, -1 ], - "to": [ 7, 6, -1 ], - "faces": { - "north": { "texture": "#redstone_antenna", "uv": [ 4, 0, 9, 5 ] }, - "south": { "texture": "#redstone_antenna", "uv": [ 4, 0, 9, 5 ] } - } - } - ] + "textures": { + "redstone_antenna": "create:block/redstone_antenna", + "particle": "create:block/redstone_bridge", + "redstone_bridge_side": "create:block/redstone_bridge" + }, + "elements": [ + { + "name": "Body", + "from": [3, -1, 1], + "to": [13, 3, 15], + "faces": { + "north": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "east": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "south": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "west": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "up": {"uv": [7.5, 6, 12.5, 13], "texture": "#redstone_bridge_side"}, + "down": {"uv": [0, 0, 5, 7], "texture": "#redstone_bridge_side"} + } + }, + { + "name": "AntennaX", + "from": [3, 3, -5], + "to": [6, 4, 5], + "faces": { + "south": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"}, + "up": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 0, 3, 10], "rotation": 180, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [4, 2, -5], + "to": [5, 5, 5], + "faces": { + "east": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "rotation": 270, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [4, 3, -4], + "to": [5, 4, -3], + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "Dish", + "from": [2, 1, -1], + "to": [7, 6, -1], + "faces": { + "north": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, + "south": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical_powered.json b/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical_powered.json index 73a1d4106..4c2fe10cd 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical_powered.json +++ b/src/main/resources/assets/create/models/block/redstone_link/receiver_vertical_powered.json @@ -1,8 +1,60 @@ { - "parent": "create:block/redstone_link/receiver_vertical", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "redstone_bridge_side": "create:block/redstone_bridge_side_powered", - "particle": "create:block/redstone_bridge_powered" - } + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna_powered", + "particle": "create:block/redstone_bridge_powered", + "redstone_bridge_side": "create:block/redstone_bridge_powered" + }, + "elements": [ + { + "name": "Body", + "from": [3, -1, 1], + "to": [13, 3, 15], + "faces": { + "north": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "east": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "south": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "west": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "up": {"uv": [7.5, 6, 12.5, 13], "texture": "#redstone_bridge_side"}, + "down": {"uv": [0, 0, 5, 7], "texture": "#redstone_bridge_side"} + } + }, + { + "name": "AntennaX", + "from": [3, 3, -5], + "to": [6, 4, 5], + "faces": { + "south": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"}, + "up": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 0, 3, 10], "rotation": 180, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [4, 2, -5], + "to": [5, 5, 5], + "faces": { + "east": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "rotation": 270, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [4, 3, -4], + "to": [5, 4, -3], + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "Dish", + "from": [2, 1, -1], + "to": [7, 6, -1], + "faces": { + "north": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, + "south": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json index 3463ac2fe..133eae26f 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json @@ -1,57 +1,57 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", - "parent": "block/block", - "display": { - "gui": { - "rotation": [ 30, 45, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - } - }, - "textures": { - "redstone_antenna": "create:block/redstone_antenna", - "redstone_bridge": "create:block/redstone_bridge", - "particle": "create:block/redstone_bridge" - }, - "elements": [ - { - "name": "Controller", - "from": [ 2, 0, 2 ], - "to": [ 14, 3, 14 ], - "faces": { - "north": { "texture": "#redstone_bridge", "uv": [ 12, 0, 15, 12 ], "rotation": 90 }, - "east": { "texture": "#redstone_bridge", "uv": [ 0, 12, 12, 15 ] }, - "south": { "texture": "#redstone_bridge", "uv": [ 12, 0, 15, 12 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge", "uv": [ 0, 12, 12, 15 ] }, - "up": { "texture": "#redstone_bridge", "uv": [ 0, 0, 12, 12 ], "rotation": 270 } - } - }, - { - "name": "AntennaX", - "from": [ 0, 1, 4 ], - "to": [ 3, 11, 5 ], - "faces": { - "north": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "south": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "down": { "texture": "#redstone_antenna", "uv": [ 0, 9, 3, 10 ] } - } - }, - { - "name": "AntennaZ", - "from": [ 1, 1, 3 ], - "to": [ 2, 11, 6 ], - "faces": { - "east": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "west": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] } - } - }, - { - "name": "AntennaTop", - "from": [ 1, 9, 4 ], - "to": [ 2, 10, 5 ], - "faces": { - "up": { "texture": "#redstone_antenna", "uv": [ 1, 1, 2, 2 ] } - } - } - ] + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna", + "particle": "create:block/redstone_bridge", + "redstone_bridge": "create:block/redstone_bridge" + }, + "elements": [ + { + "name": "Controller", + "from": [2, 0, 2], + "to": [14, 3, 14], + "faces": { + "north": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "south": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 7, 6, 13], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [5, 0, 11, 6], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaTop", + "from": [1, 9, 4], + "to": [2, 10, 5], + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [1, 1, 3], + "to": [2, 11, 6], + "faces": { + "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaX", + "from": [0, 1, 4], + "to": [3, 11, 5], + "faces": { + "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter_powered.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter_powered.json index 4fa28d3ea..9cf06e461 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter_powered.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter_powered.json @@ -1,8 +1,57 @@ { - "parent": "create:block/redstone_link/transmitter", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "redstone_bridge": "create:block/redstone_bridge_powered", - "particle": "create:block/redstone_bridge_powered" - } + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna_powered", + "particle": "create:block/redstone_bridge_powered", + "redstone_bridge": "create:block/redstone_bridge_powered" + }, + "elements": [ + { + "name": "Controller", + "from": [2, 0, 2], + "to": [14, 3, 14], + "faces": { + "north": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "south": {"uv": [6, 7, 7.5, 13], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 13, 6, 14.5], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 7, 6, 13], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [5, 0, 11, 6], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaTop", + "from": [1, 9, 4], + "to": [2, 10, 5], + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [1, 1, 3], + "to": [2, 11, 6], + "faces": { + "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaX", + "from": [0, 1, 4], + "to": [3, 11, 5], + "faces": { + "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical.json index e57fc79bd..f1bd67560 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical.json @@ -1,61 +1,51 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", - "parent": "block/block", - "textures": { - "redstone_antenna": "create:block/redstone_antenna", - "redstone_bridge_side": "create:block/redstone_bridge_side", - "particle": "create:block/redstone_bridge_side" - }, - "elements": [ - { - "name": "Body", - "from": [ 3, 0, 1 ], - "to": [ 13, 3, 15 ], - "faces": { - "north": { "texture": "#redstone_bridge_side", "uv": [ 13, 2, 16, 12 ], "rotation": 90 }, - "east": { "texture": "#redstone_bridge_side", "uv": [ 10, 0, 13, 14 ], "rotation": 90 }, - "south": { "texture": "#redstone_bridge_side", "uv": [ 13, 2, 16, 12 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge_side", "uv": [ 10, 0, 13, 14 ], "rotation": 90 }, - "up": { "texture": "#redstone_bridge_side", "uv": [ 0, 0, 10, 14 ] } - } - }, - { - "name": "Bottom", - "from": [ 3, -1, 1 ], - "to": [ 13, 0, 15 ], - "faces": { - "north": { "texture": "#redstone_bridge_side", "uv": [ 15, 1, 16, 13 ], "rotation": 270 }, - "east": { "texture": "#redstone_bridge_side", "uv": [ 14, 0, 15, 14 ], "rotation": 270 }, - "south": { "texture": "#redstone_bridge_side", "uv": [ 15, 1, 16, 13 ], "rotation": 90 }, - "west": { "texture": "#redstone_bridge_side", "uv": [ 14, 0, 15, 14 ], "rotation": 90 } - } - }, - { - "name": "AntennaX", - "from": [ 3, 3, -5 ], - "to": [ 6, 4, 5 ], - "faces": { - "south": { "texture": "#redstone_antenna", "uv": [ 0, 9, 3, 10 ] }, - "up": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ] }, - "down": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 180 } - } - }, - { - "name": "AntennaZ", - "from": [ 4, 2, -5 ], - "to": [ 5, 5, 5 ], - "faces": { - "east": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 90 }, - "west": { "texture": "#redstone_antenna", "uv": [ 0, 0, 3, 10 ], "rotation": 270 } - } - }, - { - "name": "AntennaTop", - "from": [ 4, 3, -4 ], - "to": [ 5, 4, -3 ], - "faces": { - "north": { "texture": "#redstone_antenna", "uv": [ 1, 1, 2, 2 ] } - } - } - ] + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna", + "particle": "create:block/redstone_bridge", + "redstone_bridge_side": "create:block/redstone_bridge" + }, + "elements": [ + { + "name": "Body", + "from": [3, -1, 1], + "to": [13, 3, 15], + "faces": { + "north": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "east": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "south": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "west": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "up": {"uv": [7.5, 6, 12.5, 13], "texture": "#redstone_bridge_side"}, + "down": {"uv": [0, 0, 5, 7], "texture": "#redstone_bridge_side"} + } + }, + { + "name": "AntennaX", + "from": [3, 3, -5], + "to": [6, 4, 5], + "faces": { + "south": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"}, + "up": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 0, 3, 10], "rotation": 180, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [4, 2, -5], + "to": [5, 5, 5], + "faces": { + "east": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "rotation": 270, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [4, 3, -4], + "to": [5, 4, -3], + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical_powered.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical_powered.json index 9f4f0019c..fad07a7b7 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical_powered.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter_vertical_powered.json @@ -1,8 +1,51 @@ { - "parent": "create:block/redstone_link/transmitter_vertical", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "redstone_bridge_side": "create:block/redstone_bridge_side_powered", - "particle": "create:block/redstone_bridge_powered" - } + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna_powered", + "particle": "create:block/redstone_bridge_powered", + "redstone_bridge_side": "create:block/redstone_bridge_powered" + }, + "elements": [ + { + "name": "Body", + "from": [3, -1, 1], + "to": [13, 3, 15], + "faces": { + "north": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "east": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "south": {"uv": [7.5, 13, 12.5, 15], "texture": "#redstone_bridge_side"}, + "west": {"uv": [12.5, 6, 14.5, 13], "rotation": 90, "texture": "#redstone_bridge_side"}, + "up": {"uv": [7.5, 6, 12.5, 13], "texture": "#redstone_bridge_side"}, + "down": {"uv": [0, 0, 5, 7], "texture": "#redstone_bridge_side"} + } + }, + { + "name": "AntennaX", + "from": [3, 3, -5], + "to": [6, 4, 5], + "faces": { + "south": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"}, + "up": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 0, 3, 10], "rotation": 180, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [4, 2, -5], + "to": [5, 5, 5], + "faces": { + "east": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 10], "rotation": 270, "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaTop", + "from": [4, 3, -4], + "to": [5, 4, -3], + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/refined_radiance_block.json b/src/main/resources/assets/create/models/block/refined_radiance_block.json new file mode 100644 index 000000000..c879e90cd --- /dev/null +++ b/src/main/resources/assets/create/models/block/refined_radiance_block.json @@ -0,0 +1,69 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/refined_radiance_block", + "particle": "create:block/refined_radiance_block" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 15, 15], + "shade": false, + "rotation": {"angle": 0, "axis": "y", "origin": [9, 9, 9]}, + "faces": { + "north": {"uv": [1, 1, 15, 15], "rotation": 270, "texture": "#0"}, + "east": {"uv": [1, 1, 15, 15], "texture": "#0"}, + "south": {"uv": [1, 1, 15, 15], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1, 1, 15, 15], "texture": "#0"}, + "up": {"uv": [1, 1, 15, 15], "texture": "#0"}, + "down": {"uv": [1, 1, 15, 15], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "cube_outline", + "from": [15.99, 15.99, 15.99], + "to": [0.01, 0.01, 0.01], + "shade": false, + "rotation": {"angle": 0, "axis": "y", "origin": [9, 9, 9]}, + "faces": { + "north": {"uv": [15, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "south": {"uv": [15, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "west": {"uv": [15, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 15, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 16, 1], "rotation": 180, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json b/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json index 29495acf2..ff177ba56 100644 --- a/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json +++ b/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json @@ -5,7 +5,6 @@ "4": "create:block/brass_gearbox", "5": "create:block/brass_casing_side", "6": "create:block/brass_casing", - "7": "create:block/extractor", "8": "create:block/encased_belt_middle", "9": "create:block/brass_block", "particle": "create:block/brass_casing" @@ -73,26 +72,26 @@ "up": {"uv": [5, 8, 11, 3], "rotation": 90, "texture": "#6"} } }, - { - "from": [2, 9, 5], - "to": [6, 14, 11], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [6, 9, 12, 14], "texture": "#7"}, - "west": {"uv": [6, 9, 12, 14], "texture": "#7"}, - "up": {"uv": [6, 8, 12, 12], "rotation": 90, "texture": "#7"}, - "down": {"uv": [6, 8, 12, 12], "rotation": 270, "texture": "#7"} - } - }, { "from": [10, 9, 5], "to": [14, 14, 11], "faces": { "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [6, 10, 12, 15], "texture": "#7"}, - "west": {"uv": [6, 8, 12, 13], "texture": "#7"}, - "up": {"uv": [6, 12, 12, 8], "rotation": 90, "texture": "#7"}, - "down": {"uv": [6, 8, 12, 12], "rotation": 270, "texture": "#7"} + "east": {"uv": [12, 9, 6, 14], "texture": "#5"}, + "west": {"uv": [12, 9, 6, 14], "texture": "#5"}, + "up": {"uv": [6, 6, 12, 2], "rotation": 90, "texture": "#5"}, + "down": {"uv": [6, 6, 12, 2], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2, 9, 5], + "to": [6, 14, 11], + "faces": { + "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, + "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "up": {"uv": [6, 2, 12, 6], "rotation": 90, "texture": "#5"}, + "down": {"uv": [6, 2, 12, 6], "rotation": 90, "texture": "#5"} } }, { diff --git a/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json b/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json index 4af05d94b..63311316a 100644 --- a/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json +++ b/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json @@ -7,7 +7,6 @@ "4": "create:block/brass_gearbox", "5": "create:block/brass_casing_side", "6": "create:block/brass_casing", - "7": "create:block/extractor", "8": "create:block/encased_belt_middle", "9": "create:block/brass_block", "particle": "create:block/brass_casing" @@ -80,10 +79,10 @@ "to": [6, 14, 11], "faces": { "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [6, 9, 12, 14], "texture": "#7"}, - "west": {"uv": [6, 9, 12, 14], "texture": "#7"}, - "up": {"uv": [6, 8, 12, 12], "rotation": 90, "texture": "#7"}, - "down": {"uv": [6, 8, 12, 12], "rotation": 270, "texture": "#7"} + "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "up": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"}, + "down": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"} } }, { @@ -91,10 +90,10 @@ "to": [14, 14, 11], "faces": { "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [6, 10, 12, 15], "texture": "#7"}, - "west": {"uv": [6, 8, 12, 13], "texture": "#7"}, - "up": {"uv": [6, 12, 12, 8], "rotation": 90, "texture": "#7"}, - "down": {"uv": [6, 8, 12, 12], "rotation": 270, "texture": "#7"} + "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, + "up": {"uv": [8, 2, 14, 6], "rotation": 270, "texture": "#5"}, + "down": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"} } }, { diff --git a/src/main/resources/assets/create/models/block/spout/block.json b/src/main/resources/assets/create/models/block/spout/block.json new file mode 100644 index 000000000..6244a12c0 --- /dev/null +++ b/src/main/resources/assets/create/models/block/spout/block.json @@ -0,0 +1,196 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/spout", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "Top 1", + "from": [2, 14, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "faces": { + "north": {"uv": [1, 0, 7, 1], "texture": "#0"}, + "east": {"uv": [1, 0, 7, 1], "texture": "#0"}, + "south": {"uv": [1, 0, 7, 1], "texture": "#0"}, + "west": {"uv": [1, 0, 7, 1], "texture": "#0"}, + "up": {"uv": [1, 9, 7, 15], "texture": "#0"} + } + }, + { + "name": "Top 2", + "from": [1, 12, 1], + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, -24]}, + "faces": { + "north": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, + "east": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, + "south": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, + "west": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [2, 0, 2], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "faces": { + "north": {"uv": [1, 7, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 7, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 7, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 7, 7, 8], "texture": "#0"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#0"} + } + }, + { + "name": "Bottom 2", + "from": [1, 2, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -4, -24]}, + "faces": { + "north": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, + "east": {"uv": [1, 6, 7.5, 7], "texture": "#0"}, + "south": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, + "west": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + } + }, + { + "name": "Window", + "from": [2, 4, 6], + "to": [2, 12, 10], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + } + }, + { + "name": "Window", + "from": [6, 4, 2], + "to": [10, 12, 2], + "faces": { + "north": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "Window", + "from": [14, 4, 6], + "to": [14, 12, 10], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Window", + "from": [6, 4, 14], + "to": [10, 12, 14], + "faces": { + "north": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [9, 0, 11, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "SideLeft", + "from": [1, 4, 1], + "to": [2, 12, 6], + "faces": { + "east": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "south": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, + "west": {"uv": [0.5, 2, 3, 6], "texture": "#0"} + } + }, + { + "name": "SideLeft", + "from": [10, 4, 1], + "to": [15, 12, 2], + "faces": { + "north": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, + "south": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "west": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"} + } + }, + { + "name": "SideLeft", + "from": [14, 4, 10], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, + "east": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, + "west": {"uv": [5, 2, 7.5, 6], "texture": "#0"} + } + }, + { + "name": "SideLeft", + "from": [1, 4, 14], + "to": [6, 12, 15], + "faces": { + "north": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "east": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, + "south": {"uv": [0.5, 2, 3, 6], "texture": "#0"} + } + }, + { + "name": "SideRight", + "from": [1, 4, 10], + "to": [2, 12, 15], + "faces": { + "north": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, + "east": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, + "west": {"uv": [5, 2, 7.5, 6], "texture": "#0"} + } + }, + { + "name": "SideRight", + "from": [1, 4, 1], + "to": [6, 12, 2], + "faces": { + "north": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "east": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, + "south": {"uv": [0.5, 2, 3, 6], "texture": "#0"} + } + }, + { + "name": "SideRight", + "from": [14, 4, 1], + "to": [15, 12, 6], + "faces": { + "east": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "south": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, + "west": {"uv": [0.5, 2, 3, 6], "texture": "#0"} + } + }, + { + "name": "SideRight", + "from": [10, 4, 14], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, + "south": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, + "west": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/bottom.json b/src/main/resources/assets/create/models/block/spout/bottom.json new file mode 100644 index 000000000..b8cc7a9e1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/spout/bottom.json @@ -0,0 +1,20 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/spout" + }, + "elements": [ + { + "from": [6, -7, 6], + "to": [10, -4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, + "faces": { + "north": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "east": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "south": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "west": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "down": {"uv": [14, 0, 16, 2], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/item.json b/src/main/resources/assets/create/models/block/spout/item.json new file mode 100644 index 000000000..6c147c000 --- /dev/null +++ b/src/main/resources/assets/create/models/block/spout/item.json @@ -0,0 +1,264 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/spout", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "Top 1", + "from": [2, 14, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "faces": { + "north": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "north"}, + "east": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "east"}, + "south": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "south"}, + "west": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "west"}, + "up": {"uv": [1, 9, 7, 15], "texture": "#0"} + } + }, + { + "name": "Top 2", + "from": [1, 12, 1], + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, -24]}, + "faces": { + "north": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0", "cullface": "down"} + } + }, + { + "name": "Bottom", + "from": [2, 0, 2], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "faces": { + "north": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "north"}, + "east": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "east"}, + "south": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "south"}, + "west": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "west"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#0", "cullface": "down"} + } + }, + { + "name": "Bottom 2", + "from": [1, 2, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -4, -24]}, + "faces": { + "north": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "north"}, + "east": {"uv": [1, 6, 7.5, 7], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "west"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0", "cullface": "down"} + } + }, + { + "name": "Window", + "from": [2, 4, 6], + "to": [2, 12, 10], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + } + }, + { + "name": "Window", + "from": [6, 4, 2], + "to": [10, 12, 2], + "faces": { + "north": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "south": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "Window", + "from": [14, 4, 6], + "to": [14, 12, 10], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "east": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "west": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Window", + "from": [6, 4, 14], + "to": [10, 12, 14], + "faces": { + "north": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "south": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "SideLeft", + "from": [1, 4, 1], + "to": [2, 12, 6], + "faces": { + "east": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "south": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideLeft", + "from": [10, 4, 1], + "to": [15, 12, 2], + "faces": { + "north": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, + "south": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "west": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideLeft", + "from": [14, 4, 10], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, + "west": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideLeft", + "from": [1, 4, 14], + "to": [6, 12, 15], + "faces": { + "north": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "east": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideRight", + "from": [1, 4, 10], + "to": [2, 12, 15], + "faces": { + "north": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, + "west": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideRight", + "from": [1, 4, 1], + "to": [6, 12, 2], + "faces": { + "north": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "east": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideRight", + "from": [14, 4, 1], + "to": [15, 12, 6], + "faces": { + "east": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "south": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} + } + }, + { + "name": "SideRight", + "from": [10, 4, 14], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, + "south": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, + "west": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"} + } + }, + { + "from": [4, -2, 4], + "to": [12, 0, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 5.5, 15.5]}, + "faces": { + "north": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "east": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "south": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "west": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "down": {"uv": [12, 2, 16, 6], "texture": "#0"} + } + }, + { + "from": [5, -4, 5], + "to": [11, -2, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, + "faces": { + "north": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "east": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "south": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "west": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "down": {"uv": [12.5, 2.5, 15.5, 5.5], "texture": "#0"} + } + }, + { + "from": [6, -7, 6], + "to": [10, -4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, + "faces": { + "north": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "east": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "south": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "west": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, + "down": {"uv": [14, 0, 16, 2], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/middle.json b/src/main/resources/assets/create/models/block/spout/middle.json new file mode 100644 index 000000000..a0c3e53e7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/spout/middle.json @@ -0,0 +1,20 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/spout" + }, + "elements": [ + { + "from": [5, -4, 5], + "to": [11, -2, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, + "faces": { + "north": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "east": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "south": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "west": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, + "down": {"uv": [12.5, 2.5, 15.5, 5.5], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/top.json b/src/main/resources/assets/create/models/block/spout/top.json new file mode 100644 index 000000000..ccbd45888 --- /dev/null +++ b/src/main/resources/assets/create/models/block/spout/top.json @@ -0,0 +1,20 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/spout" + }, + "elements": [ + { + "from": [4, -2, 4], + "to": [12, 0, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 5.5, 15.5]}, + "faces": { + "north": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "east": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "south": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "west": {"uv": [12, 6, 16, 7], "texture": "#0"}, + "down": {"uv": [12, 2, 16, 6], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/block.json b/src/main/resources/assets/create/models/block/transposer/block.json deleted file mode 100644 index a2763cf3e..000000000 --- a/src/main/resources/assets/create/models/block/transposer/block.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "1": "create:block/brass_casing", - "2": "create:block/transposer", - "particle": "create:block/extractor", - "extractor": "create:block/extractor" - }, - "elements": [ - { - "name": "Bottom", - "from": [4, 4, -1], - "to": [12, 5, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, 5, 15], - "to": [12, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 6], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 5, 15], - "to": [5, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 11, 15], - "to": [12, 12.05, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "Bottom", - "from": [4, 4, 15], - "to": [12, 5, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, 12, -1], - "to": [11, 13.05, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, -1]}, - "faces": { - "north": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"}, - "east": {"uv": [0, 9, 5, 10], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 5, 0], - "to": [11, 11, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2"}, - "south": {"uv": [7, 1, 13, 7], "texture": "#extractor"}, - "west": {"uv": [0, 0, 16, 6], "texture": "#2"}, - "up": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#2"} - } - }, - { - "name": "Side", - "from": [11, 5, -1], - "to": [12, 11, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 5, -1], - "to": [5, 11, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 11, -1], - "to": [12, 12, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Extension", - "from": [4.9, 4.9, -3], - "to": [11.1, 11.1, -1], - "faces": { - "north": {"uv": [5, 5, 11, 11], "rotation": 180, "texture": "#1"}, - "east": {"uv": [3, 0, 5, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "west": {"uv": [3, 0, 5, 6], "texture": "#extractor"}, - "up": {"uv": [3, 0, 5, 6], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [0, -0.25, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -4.5], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "transposer", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/block_powered.json b/src/main/resources/assets/create/models/block/transposer/block_powered.json deleted file mode 100644 index 4747bb4d3..000000000 --- a/src/main/resources/assets/create/models/block/transposer/block_powered.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/transposer/block", - "textures": { - "extractor": "create:block/extractor_powered", - "particle": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/horizontal_linked.json b/src/main/resources/assets/create/models/block/transposer/horizontal_linked.json deleted file mode 100644 index 6edfdccc8..000000000 --- a/src/main/resources/assets/create/models/block/transposer/horizontal_linked.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:block/extractor/horizontal", - "textures": { - "1": "create:block/brass_casing", - "2": "create:block/transposer", - "particle": "create:block/extractor", - "extractor": "create:block/extractor", - "redstone_antenna": "create:block/redstone_antenna" - }, - "elements": [ - { - "name": "Bottom", - "from": [5, 4, -1], - "to": [12, 5, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 7, 13, 8], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 7, 13, 8], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 7], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 7], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, 5, 15], - "to": [12, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 6], "texture": "#extractor"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 5, 15], - "to": [5, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 11, 15], - "to": [12, 12.05, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "Bottom", - "from": [4, 4, 15], - "to": [12, 5, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, 12, -1], - "to": [11, 13.05, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, -1]}, - "faces": { - "north": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"}, - "east": {"uv": [0, 9, 5, 10], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 5, 0], - "to": [11, 11, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2"}, - "south": {"uv": [7, 1, 13, 7], "texture": "#extractor"}, - "west": {"uv": [0, 0, 16, 6], "texture": "#2"}, - "up": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#2"} - } - }, - { - "name": "Side", - "from": [11, 5, -1], - "to": [12, 11, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [5, 11, -1], - "to": [12, 12, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [6, 0, 13, 1], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 0, 13, 1], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 7], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 7], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Extension", - "from": [4.9, 4.9, -3], - "to": [11.1, 11.1, -1], - "faces": { - "north": {"uv": [5, 5, 11, 11], "rotation": 180, "texture": "#1"}, - "east": {"uv": [3, 0, 5, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "west": {"uv": [3, 0, 5, 6], "texture": "#extractor"}, - "up": {"uv": [3, 0, 5, 6], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "AntennaDish", - "from": [10, 15, 0], - "to": [15, 15, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, - "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaX", - "from": [11, 9, 2], - "to": [14, 19, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaZ", - "from": [12, 9, 1], - "to": [13, 19, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaTop", - "from": [12, 17, 2], - "to": [13, 18, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} - } - }, - { - "name": "Side", - "from": [4, 4, -1], - "to": [5, 12, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "north": {"uv": [13, 0, 14, 8], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 9], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 9], "texture": "#extractor"}, - "west": {"uv": [6, 8, 12, 16], "texture": "#extractor"}, - "up": {"uv": [6, 15, 12, 16], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [6, 15, 12, 16], "rotation": 90, "texture": "#extractor"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [0, -0.25, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -4.5], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "transposer", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/horizontal_linked_powered.json b/src/main/resources/assets/create/models/block/transposer/horizontal_linked_powered.json deleted file mode 100644 index bf379ba7f..000000000 --- a/src/main/resources/assets/create/models/block/transposer/horizontal_linked_powered.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "create:block/transposer/horizontal_linked", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "extractor": "create:block/extractor_powered", - "particle": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/vertical_linked.json b/src/main/resources/assets/create/models/block/transposer/vertical_linked.json deleted file mode 100644 index a7421a428..000000000 --- a/src/main/resources/assets/create/models/block/transposer/vertical_linked.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:block/extractor/horizontal", - "textures": { - "1": "create:block/brass_casing", - "2": "create:block/transposer", - "particle": "create:block/extractor", - "extractor": "create:block/extractor", - "redstone_antenna": "create:block/redstone_antenna" - }, - "elements": [ - { - "name": "Side", - "from": [11, 5, 15], - "to": [12, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 6], "texture": "#extractor"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 5, 15], - "to": [5, 11, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 11, 15], - "to": [12, 12.05, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 270, "texture": "#extractor"}, - "down": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "Bottom", - "from": [4, 4, 15], - "to": [12, 5, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 20]}, - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [4, 0, 6, 1], "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [4, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "up": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [4, 0, 6, 8], "rotation": 90, "texture": "#extractor"} - } - }, - { - "name": "FilterSpot", - "from": [5, 12, -1], - "to": [11, 13.05, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, -1]}, - "faces": { - "north": {"uv": [0, 9, 1, 15], "rotation": 90, "texture": "#extractor"}, - "east": {"uv": [0, 9, 5, 10], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [4, 9, 5, 15], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [0, 9, 5, 10], "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#extractor"} - } - }, - { - "name": "Center", - "from": [5, 5, 0], - "to": [11, 11, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2"}, - "south": {"uv": [7, 1, 13, 7], "texture": "#extractor"}, - "west": {"uv": [0, 0, 16, 6], "texture": "#2"}, - "up": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#2"} - } - }, - { - "name": "Extension", - "from": [4.9, 4.9, -3], - "to": [11.1, 11.1, -1], - "faces": { - "north": {"uv": [5, 5, 11, 11], "rotation": 180, "texture": "#1"}, - "east": {"uv": [3, 0, 5, 6], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#extractor"}, - "west": {"uv": [3, 0, 5, 6], "texture": "#extractor"}, - "up": {"uv": [3, 0, 5, 6], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [3, 0, 5, 6], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "AntennaDish", - "from": [10, 15, 0], - "to": [15, 15, 5], - "rotation": {"angle": 0, "axis": "x", "origin": [13, 9, 3]}, - "faces": { - "up": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"}, - "down": {"uv": [4, 0, 9, 5], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaX", - "from": [11, 9, 2], - "to": [14, 19, 3], - "rotation": {"angle": 0, "axis": "x", "origin": [13, 9, 3]}, - "faces": { - "north": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "south": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaZ", - "from": [12, 9, 1], - "to": [13, 19, 4], - "rotation": {"angle": 0, "axis": "x", "origin": [13, 9, 3]}, - "faces": { - "east": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"}, - "west": {"uv": [0, 0, 3, 10], "texture": "#redstone_antenna"} - } - }, - { - "name": "AntennaTop", - "from": [12, 17, 2], - "to": [13, 18, 3], - "rotation": {"angle": 0, "axis": "x", "origin": [13, 9, 3]}, - "faces": { - "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} - } - }, - { - "name": "Bottom", - "from": [4, 4, -1], - "to": [12, 5, 5], - "faces": { - "north": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "east": {"uv": [6, 8, 12, 9], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 7, 14, 8], "texture": "#extractor"}, - "west": {"uv": [6, 15, 12, 16], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [6, 8, 12, 16], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Top", - "from": [4, 11, -1], - "to": [12, 12, 5], - "faces": { - "north": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "east": {"uv": [0, 0, 6, 1], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 0, 14, 1], "texture": "#extractor"}, - "west": {"uv": [0, 0, 6, 1], "texture": "#extractor"}, - "up": {"uv": [0, 0, 6, 8], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [0, 0, 6, 8], "rotation": 270, "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [4, 5, -1], - "to": [5, 11, 5], - "faces": { - "north": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - }, - { - "name": "Side", - "from": [11, 5, -1], - "to": [12, 11, 5], - "faces": { - "north": {"uv": [6, 1, 7, 7], "texture": "#extractor"}, - "east": {"uv": [0, 1, 6, 7], "rotation": 180, "texture": "#extractor"}, - "south": {"uv": [13, 1, 14, 7], "texture": "#extractor"}, - "west": {"uv": [0, 1, 6, 7], "texture": "#extractor"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, -149, 0], - "translation": [0, 2.5, 0], - "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, 1, 1.25], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "translation": [2.5, -0.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 1.75, -4.5], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "transposer", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - }, - { - "name": "vertical_wireless", - "origin": [8, 8, 8], - "children": [ - { - "name": "vertical", - "origin": [8, 8, 8], - "children": [11, 12, 13, 14] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/transposer/vertical_linked_powered.json b/src/main/resources/assets/create/models/block/transposer/vertical_linked_powered.json deleted file mode 100644 index cf4443966..000000000 --- a/src/main/resources/assets/create/models/block/transposer/vertical_linked_powered.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "create:block/transposer/vertical_linked", - "textures": { - "redstone_antenna": "create:block/redstone_antenna_powered", - "extractor": "create:block/extractor_powered", - "particle": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/water_wheel.json b/src/main/resources/assets/create/models/block/water_wheel.json index 5a9652043..bf661632e 100644 --- a/src/main/resources/assets/create/models/block/water_wheel.json +++ b/src/main/resources/assets/create/models/block/water_wheel.json @@ -1,14 +1,13 @@ { "credit": "Made with Blockbench", "parent": "create:block/large_wheels", + "texture_size": [32, 32], "textures": { + "6": "create:block/wheel_extras", "axis": "create:block/axis", "axis_top": "create:block/axis_top", "wheel": "create:block/wheel", - "spruce_planks": "block/spruce_planks", - "particle": "block/stripped_spruce_log", - "stripped_spruce_log": "block/stripped_spruce_log", - "spruce_log": "block/spruce_log" + "particle": "block/stripped_spruce_log" }, "elements": [ { @@ -27,208 +26,43 @@ }, { "name": "Segment1", - "from": [13, -1, -8], - "to": [14, 17, 0], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment1", - "from": [13, -1, -8], - "to": [14, 17, 0], - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment1", - "from": [13, -1, -8], - "to": [14, 17, 0], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment1", - "from": [13, -1, -8], - "to": [14, 17, 0], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 90, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment3", - "from": [2, -1, 16], - "to": [3, 17, 24], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment3", - "from": [2, -1, 16], - "to": [3, 17, 24], - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment3", - "from": [2, -1, 16], - "to": [3, 17, 24], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment3", - "from": [2, -1, 16], - "to": [3, 17, 24], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 270, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment2", - "from": [-8, -1, 2], - "to": [0, 17, 3], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment2", - "from": [-8, -1, 2], - "to": [0, 17, 3], - "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment2", "from": [-8, -1, 2], "to": [0, 17, 3], "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"} + "north": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"} } }, { "name": "Segment2", + "from": [2, -1, 16], + "to": [3, 17, 24], + "faces": { + "north": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "texture": "#6"} + } + }, + { + "name": "Segment3", "from": [-8, -1, 2], "to": [0, 17, 3], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment4", - "from": [16, -1, 13], - "to": [24, 17, 14], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment4", - "from": [16, -1, 13], - "to": [24, 17, 14], - "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"} - } - }, - { - "name": "Segment4", - "from": [16, -1, 13], - "to": [24, 17, 14], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"} + "north": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"} } }, { @@ -237,21 +71,177 @@ "to": [24, 17, 14], "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "east": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "south": {"uv": [0, 0, 8, 16], "texture": "#stripped_spruce_log"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#stripped_spruce_log"}, - "up": {"uv": [0, 0, 8, 1], "rotation": 180, "texture": "#stripped_spruce_log"}, - "down": {"uv": [0, 0, 8, 1], "texture": "#stripped_spruce_log"} + "north": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"} } }, { - "name": "SmallRim", - "from": [-2, -0.8, -2], - "to": [18, 16.8, 18], + "name": "Segment2", + "from": [2, -1, 16], + "to": [3, 17, 24], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "up": {"uv": [2, 2, 14, 14], "texture": "#wheel"}, - "down": {"uv": [2, 2, 14, 14], "texture": "#wheel"} + "north": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "texture": "#6"} + } + }, + { + "name": "Segment3", + "from": [13, -1, -8], + "to": [14, 17, 0], + "faces": { + "north": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Segment4", + "from": [16, -1, 13], + "to": [24, 17, 14], + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "Segment5", + "from": [16, -1, 13], + "to": [24, 17, 14], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "Segment3", + "from": [2, -1, 16], + "to": [3, 17, 24], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "texture": "#6"} + } + }, + { + "name": "Segment4", + "from": [-8, -1, 2], + "to": [0, 17, 3], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"} + } + }, + { + "name": "Segment5", + "from": [13, -1, -8], + "to": [14, 17, 0], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Segment3", + "from": [2, -1, 16], + "to": [3, 17, 24], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "texture": "#6"} + } + }, + { + "name": "Segment4", + "from": [13, -1, -8], + "to": [14, 17, 0], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Segment5", + "from": [16, -1, 13], + "to": [24, 17, 14], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "Segment4", + "from": [16, -1, 13], + "to": [24, 17, 14], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "Segment5", + "from": [-8, -1, 2], + "to": [0, 17, 3], + "faces": { + "north": {"uv": [7, 0, 16, 4], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7, 3.5, 16, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7, 0, 16, 4], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 0, 16, 0.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"}, + "down": {"uv": [7, 0, 7.5, 4], "rotation": 270, "texture": "#6"} } }, { @@ -259,125 +249,129 @@ "from": [-5, -0.7, -5], "to": [21, -0.6, 21], "faces": { - "up": {"uv": [2, 2, 14, 14], "texture": "#wheel"}, - "down": {"uv": [2, 2, 14, 14], "texture": "#wheel"} + "up": {"uv": [0, 0, 13, 13], "texture": "#wheel"}, + "down": {"uv": [0, 0, 13, 13], "texture": "#wheel"} } }, { - "name": "LargeRim2", + "name": "LargeRim3", "from": [-5, 16.6, -5], "to": [21, 16.7, 21], "faces": { - "up": {"uv": [2, 2, 14, 14], "texture": "#wheel"}, - "down": {"uv": [2, 2, 14, 14], "texture": "#wheel"} + "up": {"uv": [0, 0, 13, 13], "texture": "#wheel"}, + "down": {"uv": [0, 0, 13, 13], "texture": "#wheel"} } }, { "name": "InnerSegment", - "from": [-2, -0.6, 4], - "to": [0, 16.6, 12], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [15.9, -0.5, 4], + "to": [18, 16.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "texture": "#6"} } }, { "name": "InnerSegment", - "from": [-2, -0.6, 4], - "to": [0.1, 16.6, 12], + "from": [-2, -0.5, 4], + "to": [0.1, 16.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "rotation": 180, "texture": "#6"} } }, { "name": "InnerSegment", - "from": [-2, -0.6, 4], - "to": [0, 16.6, 12], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "from": [4, -0.5, -2], + "to": [12, 16.5, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "rotation": 270, "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "rotation": 90, "texture": "#6"} } }, { "name": "InnerSegment", - "from": [15.9, -0.6, 4], - "to": [18, 16.6, 12], + "from": [4, -0.5, 15.9], + "to": [12, 16.5, 18], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "rotation": 270, "texture": "#6"} } }, { "name": "InnerSegment", - "from": [16, -0.6, 4], - "to": [18, 16.6, 12], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [15.9, -0.5, 4], + "to": [18, 16.5, 12], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "texture": "#6"} } }, { "name": "InnerSegment", - "from": [16, -0.6, 4], - "to": [18, 16.6, 12], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "from": [4, -0.5, 15.9], + "to": [12, 16.5, 18], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "texture": "#spruce_planks"} + "north": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "rotation": 270, "texture": "#6"} } }, { "name": "InnerSegment", - "from": [4, -0.6, -2], - "to": [12, 16.6, 0.1], + "from": [-2, -0.5, 4], + "to": [0.1, 16.5, 12], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#spruce_planks"} + "north": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "rotation": 180, "texture": "#6"} } }, { "name": "InnerSegment", - "from": [4, -0.6, 15.9], - "to": [12, 16.6, 18], + "from": [15.9, -0.5, 4], + "to": [18, 16.5, 12], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8.1, 8]}, "faces": { - "north": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#spruce_planks"}, - "east": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#spruce_planks"}, - "west": {"uv": [0, 0, 2, 16], "texture": "#spruce_planks"}, - "up": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#spruce_planks"}, - "down": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#spruce_planks"} + "north": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "east": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "south": {"uv": [7.5, 5.5, 16, 6.5], "rotation": 90, "texture": "#6"}, + "west": {"uv": [7.5, 4.5, 16, 8.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [7, 4, 8, 8.5], "texture": "#6"}, + "down": {"uv": [7, 4, 8, 8.5], "texture": "#6"} } }, { @@ -386,12 +380,12 @@ "to": [11, 15, 11], "shade": false, "faces": { - "north": {"uv": [5, 2, 11, 16], "texture": "#spruce_log"}, - "east": {"uv": [5, 2, 11, 16], "texture": "#spruce_log"}, - "south": {"uv": [5, 2, 11, 16], "texture": "#spruce_log"}, - "west": {"uv": [5, 2, 11, 16], "texture": "#spruce_log"}, - "up": {"uv": [5, 5, 11, 11], "rotation": 90, "texture": "#spruce_log"}, - "down": {"uv": [5, 5, 11, 11], "rotation": 90, "texture": "#spruce_log"} + "north": {"uv": [13, 0, 16, 7], "texture": "#wheel"}, + "east": {"uv": [13, 0, 16, 7], "texture": "#wheel"}, + "south": {"uv": [13, 0, 16, 7], "texture": "#wheel"}, + "west": {"uv": [13, 0, 16, 7], "texture": "#wheel"}, + "up": {"uv": [13, 7, 16, 10], "rotation": 90, "texture": "#wheel"}, + "down": {"uv": [13, 7, 16, 10], "rotation": 90, "texture": "#wheel"} } }, { @@ -401,10 +395,10 @@ "shade": false, "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "up": {"uv": [3, 0, 6, 16], "texture": "#spruce_log"}, - "down": {"uv": [6, 0, 9, 16], "texture": "#spruce_log"} + "east": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "west": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "up": {"uv": [7, 14.5, 16, 16], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 14.5, 16, 16], "rotation": 90, "texture": "#6"} } }, { @@ -414,10 +408,10 @@ "shade": false, "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "up": {"uv": [9, 0, 12, 16], "texture": "#spruce_log"}, - "down": {"uv": [2, 0, 5, 16], "texture": "#spruce_log"} + "east": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "west": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "up": {"uv": [7, 14.5, 16, 16], "rotation": 90, "texture": "#6"}, + "down": {"uv": [7, 14.5, 16, 16], "rotation": 90, "texture": "#6"} } }, { @@ -427,10 +421,10 @@ "shade": false, "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "up": {"uv": [4, 0, 7, 16], "rotation": 90, "texture": "#spruce_log"}, - "down": {"uv": [8, 0, 11, 16], "rotation": 90, "texture": "#spruce_log"} + "north": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "south": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "up": {"uv": [7, 14.5, 16, 16], "rotation": 180, "texture": "#6"}, + "down": {"uv": [7, 14.5, 16, 16], "texture": "#6"} } }, { @@ -440,10 +434,10 @@ "shade": false, "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#spruce_log"}, - "up": {"uv": [9, 0, 12, 16], "rotation": 90, "texture": "#spruce_log"}, - "down": {"uv": [2, 0, 5, 16], "rotation": 90, "texture": "#spruce_log"} + "north": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "south": {"uv": [7, 8.5, 16, 14.5], "texture": "#6"}, + "up": {"uv": [7, 14.5, 16, 16], "texture": "#6"}, + "down": {"uv": [7, 14.5, 16, 16], "texture": "#6"} } } ] diff --git a/src/main/resources/assets/create/models/entity/minecart_coupling/attachment.json b/src/main/resources/assets/create/models/entity/minecart_coupling/attachment.json new file mode 100644 index 000000000..29d9735c7 --- /dev/null +++ b/src/main/resources/assets/create/models/entity/minecart_coupling/attachment.json @@ -0,0 +1,56 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/coupling", + "particle": "create:entity/coupling" + }, + "elements": [ + { + "from": [-2.5, -2.5, -2.5], + "to": [2.5, -1.5, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [2.5, -2.5, 0]}, + "faces": { + "north": {"uv": [1, 5, 0, 10], "texture": "#0"}, + "east": {"uv": [5, 5, 0, 6], "texture": "#0"}, + "south": {"uv": [5, 5, 4, 10], "texture": "#0"}, + "west": {"uv": [5, 5, 0, 6], "texture": "#0"}, + "up": {"uv": [0, 10, 5, 5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 10, 5, 5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [-3.5, -2.5, 0.5], + "to": [2.5, -1.5, 1.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2.5, -2.5, 1.5]}, + "faces": { + "north": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "south": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "up": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "down": {"uv": [2, 5, 1, 10], "texture": "#0"} + } + }, + { + "from": [-3.5, -2.5, -1.5], + "to": [2.5, -1.5, -0.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2.5, -2.5, 1.5]}, + "faces": { + "north": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "south": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "up": {"uv": [2, 5, 1, 10], "texture": "#0"}, + "down": {"uv": [2, 5, 1, 10], "texture": "#0"} + } + }, + { + "from": [-1, -1.5, -1], + "to": [1, 2.5, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 0, -0.5]}, + "faces": { + "north": {"uv": [1, 5, 0, 9], "texture": "#0"}, + "east": {"uv": [1, 5, 0, 9], "texture": "#0"}, + "south": {"uv": [1, 5, 0, 9], "texture": "#0"}, + "west": {"uv": [1, 5, 0, 9], "texture": "#0"}, + "up": {"uv": [1, 5, 0, 6], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/entity/minecart_coupling/cart_coupling.bbmodel b/src/main/resources/assets/create/models/entity/minecart_coupling/cart_coupling.bbmodel new file mode 100644 index 000000000..e3f3ab67d --- /dev/null +++ b/src/main/resources/assets/create/models/entity/minecart_coupling/cart_coupling.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.2","model_format":"java_block","box_uv":false},"name":"","ambientocclusion":true,"front_gui_light":false,"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[-2.5,-2.5,-2.5],"to":[2.5,-1.5,2.5],"autouv":0,"color":1,"locked":false,"origin":[2.5,-2.5,0],"faces":{"north":{"uv":[1,5,0,10],"texture":0},"east":{"uv":[5,5,0,6],"texture":0},"south":{"uv":[5,5,4,10],"texture":0},"west":{"uv":[5,5,0,6],"texture":0},"up":{"uv":[0,10,5,5],"rotation":90,"texture":0},"down":{"uv":[0,10,5,5],"rotation":90,"texture":0}},"uuid":"2ab28291-d8a0-1c59-0932-fd688d885b36"},{"name":"cube","from":[-3.5,-2.5,0.5],"to":[2.5,-1.5,1.5],"autouv":0,"color":1,"locked":false,"rotation":[0,0,22.5],"origin":[2.5,-2.5,1.5],"faces":{"north":{"uv":[2,5,1,10],"texture":0},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[2,5,1,10],"texture":0},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[2,5,1,10],"texture":0},"down":{"uv":[2,5,1,10],"texture":0}},"uuid":"161c9d0c-ea0d-7643-ea35-2a2b60015c66"},{"name":"cube","from":[-1,-1.5,-1],"to":[1,2.5,1],"autouv":0,"color":0,"locked":false,"origin":[0.5,0,-0.5],"faces":{"north":{"uv":[1,5,0,9],"texture":0},"east":{"uv":[1,5,0,9],"texture":0},"south":{"uv":[1,5,0,9],"texture":0},"west":{"uv":[1,5,0,9],"texture":0},"up":{"uv":[1,5,0,6],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"df623d06-f1ee-4e7a-d324-cca888af8748"},{"name":"cube","from":[-3.5,-2.5,-1.5],"to":[2.5,-1.5,-0.5],"autouv":0,"color":1,"locked":false,"rotation":[0,0,22.5],"origin":[2.5,-2.5,1.5],"faces":{"north":{"uv":[2,5,1,10],"texture":0},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[2,5,1,10],"texture":0},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[2,5,1,10],"texture":0},"down":{"uv":[2,5,1,10],"texture":0}},"uuid":"3cc3b4bd-1a33-b861-6e08-b88cb413b6a3"},{"name":"cube","from":[-2.5,-1,-2.5],"to":[2.5,1,2.5],"autouv":0,"color":2,"locked":false,"origin":[-5.5,7,5.5],"faces":{"north":{"uv":[10,0,5,2],"texture":0},"east":{"uv":[10,0,5,2],"texture":0},"south":{"uv":[10,0,5,2],"texture":0},"west":{"uv":[10,0,5,2],"texture":0},"up":{"uv":[5,0,0,5],"texture":0},"down":{"uv":[5,0,0,5],"texture":0}},"uuid":"1d3fae57-f8fb-8ae5-6b58-a9545e59439a"}],"outliner":["2ab28291-d8a0-1c59-0932-fd688d885b36","161c9d0c-ea0d-7643-ea35-2a2b60015c66","3cc3b4bd-1a33-b861-6e08-b88cb413b6a3","df623d06-f1ee-4e7a-d324-cca888af8748","1d3fae57-f8fb-8ae5-6b58-a9545e59439a"],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Forgespace 1.15\\Create\\src\\main\\resources\\assets\\create\\textures\\entity\\coupling.png","name":"coupling.png","folder":"entity","namespace":"create","id":"0","particle":true,"mode":"bitmap","saved":true,"uuid":"b6862380-7179-b672-5fd5-f1caa05b56cf","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAm0lEQVQ4T2PMK638Ly4ixAADL9+8AzPRxSZ1tzPCFSExGFs7u/+DND15cJdBRkEZrPHsmdMM/KIScGUfX79gWLd6FW4DQBrevn3LICwszGBlbcPw8+dPhuryUqwa0F2B1QV3Hj5mmD9tEnEGwMKAnZ0dbDPIO7j8izUMgkLD/oP8C/InjMbl31EDsIUAAwNRUYVdK0R01AAqhAEAGbtwESadp4gAAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/entity/minecart_coupling/connector.json b/src/main/resources/assets/create/models/entity/minecart_coupling/connector.json new file mode 100644 index 000000000..bd660976d --- /dev/null +++ b/src/main/resources/assets/create/models/entity/minecart_coupling/connector.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/coupling", + "particle": "create:entity/coupling" + }, + "elements": [ + { + "from": [0, -0.75, -1], + "to": [16, 0.75, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 7, 7]}, + "faces": { + "north": {"uv": [5, 2, 6, 4], "texture": "#0"}, + "east": {"uv": [5, 2, 6, 4], "texture": "#0"}, + "south": {"uv": [5, 2, 6, 4], "texture": "#0"}, + "west": {"uv": [5, 2, 6, 4], "texture": "#0"}, + "up": {"uv": [5, 2, 6, 3], "texture": "#0"}, + "down": {"uv": [5, 3, 6, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/entity/minecart_coupling/ring.json b/src/main/resources/assets/create/models/entity/minecart_coupling/ring.json new file mode 100644 index 000000000..b94fbc4b3 --- /dev/null +++ b/src/main/resources/assets/create/models/entity/minecart_coupling/ring.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/coupling", + "particle": "create:entity/coupling" + }, + "elements": [ + { + "from": [-2.5, -1, -2.5], + "to": [2.5, 1, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [-5.5, 7, 5.5]}, + "faces": { + "north": {"uv": [10, 0, 5, 2], "texture": "#0"}, + "east": {"uv": [10, 0, 5, 2], "texture": "#0"}, + "south": {"uv": [10, 0, 5, 2], "texture": "#0"}, + "west": {"uv": [10, 0, 5, 2], "texture": "#0"}, + "up": {"uv": [5, 0, 0, 5], "texture": "#0"}, + "down": {"uv": [5, 0, 0, 5], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/particles/air.json b/src/main/resources/assets/create/particles/air.json new file mode 100644 index 000000000..271261099 --- /dev/null +++ b/src/main/resources/assets/create/particles/air.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/analog_lever.png b/src/main/resources/assets/create/textures/block/analog_lever.png index dea34971e..7e5a9f70e 100644 Binary files a/src/main/resources/assets/create/textures/block/analog_lever.png and b/src/main/resources/assets/create/textures/block/analog_lever.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_casing_short.png b/src/main/resources/assets/create/textures/block/andesite_casing_short.png index f692c2796..3bed29ac3 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_casing_short.png and b/src/main/resources/assets/create/textures/block/andesite_casing_short.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_casing_very_short.png b/src/main/resources/assets/create/textures/block/andesite_casing_very_short.png index 692ef9d9f..05c00d12b 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_casing_very_short.png and b/src/main/resources/assets/create/textures/block/andesite_casing_very_short.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 index 9d4f35ea9..9f795dc7b 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel.png 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 index 0cf540404..3936bfd3b 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_back.png 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 index 2d24fe731..71aacc4f3 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_powered.png b/src/main/resources/assets/create/textures/block/andesite_funnel_powered.png new file mode 100644 index 000000000..d10762084 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel_powered.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png b/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png index 4207c9e96..bf0abd43f 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_push.png b/src/main/resources/assets/create/textures/block/andesite_funnel_push.png index e9648ef74..ede3d171e 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_push.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_tall.png b/src/main/resources/assets/create/textures/block/andesite_funnel_tall.png new file mode 100644 index 000000000..f6adf3328 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel_tall.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_tall_powered.png b/src/main/resources/assets/create/textures/block/andesite_funnel_tall_powered.png new file mode 100644 index 000000000..38e04735c Binary files /dev/null and b/src/main/resources/assets/create/textures/block/andesite_funnel_tall_powered.png differ diff --git a/src/main/resources/assets/create/textures/block/basin.png b/src/main/resources/assets/create/textures/block/basin.png index c650eea86..73cf03ed4 100644 Binary files a/src/main/resources/assets/create/textures/block/basin.png and b/src/main/resources/assets/create/textures/block/basin.png differ diff --git a/src/main/resources/assets/create/textures/block/basin_side.png b/src/main/resources/assets/create/textures/block/basin_side.png index be37152b6..5cd57bd03 100644 Binary files a/src/main/resources/assets/create/textures/block/basin_side.png and b/src/main/resources/assets/create/textures/block/basin_side.png differ diff --git a/src/main/resources/assets/create/textures/block/blaze_burner_inner.png b/src/main/resources/assets/create/textures/block/blaze_burner_inner.png new file mode 100644 index 000000000..ff33417f2 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/blaze_burner_inner.png differ diff --git a/src/main/resources/assets/create/textures/block/blaze_burner_side.png b/src/main/resources/assets/create/textures/block/blaze_burner_side.png new file mode 100644 index 000000000..a0c5664bb Binary files /dev/null and b/src/main/resources/assets/create/textures/block/blaze_burner_side.png differ diff --git a/src/main/resources/assets/create/textures/block/blaze_kindled.png b/src/main/resources/assets/create/textures/block/blaze_kindled.png new file mode 100644 index 000000000..1626fc339 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/blaze_kindled.png differ diff --git a/src/main/resources/assets/create/textures/block/blaze_seething.png b/src/main/resources/assets/create/textures/block/blaze_seething.png new file mode 100644 index 000000000..33ee915fd Binary files /dev/null and b/src/main/resources/assets/create/textures/block/blaze_seething.png differ diff --git a/src/main/resources/assets/create/textures/block/blaze_smouldering.png b/src/main/resources/assets/create/textures/block/blaze_smouldering.png new file mode 100644 index 000000000..9fe08e2a4 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/blaze_smouldering.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 index ff5b11607..473c3219b 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel.png 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 index 638481460..66bccd230 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_back.png 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 index 4653ff14c..e8a3ca30e 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_plating.png and b/src/main/resources/assets/create/textures/block/brass_funnel_plating.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_powered.png index 26a0d0c52..da9e0c48d 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_powered.png 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 index ebc52fde6..f8fe8e44b 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_pull.png and b/src/main/resources/assets/create/textures/block/brass_funnel_pull.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_pull_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_pull_powered.png deleted file mode 100644 index d66a2d4aa..000000000 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_pull_powered.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_push.png b/src/main/resources/assets/create/textures/block/brass_funnel_push.png index e214fb94f..18eb09320 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_push.png and b/src/main/resources/assets/create/textures/block/brass_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png deleted file mode 100644 index b470004c1..000000000 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_push_powered.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_tall.png b/src/main/resources/assets/create/textures/block/brass_funnel_tall.png new file mode 100644 index 000000000..8e5c56b33 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_tall.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_tall_powered.png b/src/main/resources/assets/create/textures/block/brass_funnel_tall_powered.png new file mode 100644 index 000000000..97543ea4d Binary files /dev/null and b/src/main/resources/assets/create/textures/block/brass_funnel_tall_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 index f877d926f..127e492d0 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_tunnel.png 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 index 737430df3..0501e0c2b 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_tunnel_top.png 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 index f7da3317b..7897cdaac 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_tunnel_top_connected.png 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/brass_tunnel_top_window.png b/src/main/resources/assets/create/textures/block/brass_tunnel_top_window.png index df7c9d8e4..bdfc76596 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_tunnel_top_window.png and b/src/main/resources/assets/create/textures/block/brass_tunnel_top_window.png differ diff --git a/src/main/resources/assets/create/textures/block/cart_assembler_side.png b/src/main/resources/assets/create/textures/block/cart_assembler_side.png index 80dcb5f01..5e031192d 100644 Binary files a/src/main/resources/assets/create/textures/block/cart_assembler_side.png and b/src/main/resources/assets/create/textures/block/cart_assembler_side.png differ diff --git a/src/main/resources/assets/create/textures/block/chute.png b/src/main/resources/assets/create/textures/block/chute.png index a6d6bcf57..dbc6085e0 100644 Binary files a/src/main/resources/assets/create/textures/block/chute.png 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 index dd9f8ff3e..91bacdde4 100644 Binary files a/src/main/resources/assets/create/textures/block/chute_diagonal.png and b/src/main/resources/assets/create/textures/block/chute_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/cogwheel.png b/src/main/resources/assets/create/textures/block/cogwheel.png new file mode 100644 index 000000000..944bb51a6 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/cogwheel.png differ diff --git a/src/main/resources/assets/create/textures/block/crafter_side.png b/src/main/resources/assets/create/textures/block/crafter_side.png index 7d5eb19af..990a7a721 100644 Binary files a/src/main/resources/assets/create/textures/block/crafter_side.png and b/src/main/resources/assets/create/textures/block/crafter_side.png differ diff --git a/src/main/resources/assets/create/textures/block/crafter_side_connected.png b/src/main/resources/assets/create/textures/block/crafter_side_connected.png index 08c6d9c56..fe3b059fc 100644 Binary files a/src/main/resources/assets/create/textures/block/crafter_side_connected.png and b/src/main/resources/assets/create/textures/block/crafter_side_connected.png differ diff --git a/src/main/resources/assets/create/textures/block/dark_metal_block.png b/src/main/resources/assets/create/textures/block/dark_metal_block.png new file mode 100644 index 000000000..148f58004 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/dark_metal_block.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 index eea606e2a..4527fc59e 100644 Binary files a/src/main/resources/assets/create/textures/block/depot_side.png and b/src/main/resources/assets/create/textures/block/depot_side.png differ diff --git a/src/main/resources/assets/create/textures/block/encased_pipe.png b/src/main/resources/assets/create/textures/block/encased_pipe.png new file mode 100644 index 000000000..41205f1af Binary files /dev/null and b/src/main/resources/assets/create/textures/block/encased_pipe.png differ diff --git a/src/main/resources/assets/create/textures/block/extractor.png b/src/main/resources/assets/create/textures/block/extractor.png deleted file mode 100644 index 07a6b06fe..000000000 Binary files a/src/main/resources/assets/create/textures/block/extractor.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/extractor_powered.png b/src/main/resources/assets/create/textures/block/extractor_powered.png deleted file mode 100644 index a7f0cf6c3..000000000 Binary files a/src/main/resources/assets/create/textures/block/extractor_powered.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/gauge.png b/src/main/resources/assets/create/textures/block/gauge.png index 035ad1172..1fb77e247 100644 Binary files a/src/main/resources/assets/create/textures/block/gauge.png and b/src/main/resources/assets/create/textures/block/gauge.png differ diff --git a/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png b/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png new file mode 100644 index 000000000..f5b36798d Binary files /dev/null and b/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png differ diff --git a/src/main/resources/assets/create/textures/block/large_cogwheel.png b/src/main/resources/assets/create/textures/block/large_cogwheel.png new file mode 100644 index 000000000..dc2262824 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/large_cogwheel.png differ diff --git a/src/main/resources/assets/create/textures/block/linear_chassis_side.png b/src/main/resources/assets/create/textures/block/linear_chassis_side.png index d395ef06f..02f8a1a9f 100644 Binary files a/src/main/resources/assets/create/textures/block/linear_chassis_side.png and b/src/main/resources/assets/create/textures/block/linear_chassis_side.png differ diff --git a/src/main/resources/assets/create/textures/block/mechanical_arm.png b/src/main/resources/assets/create/textures/block/mechanical_arm.png index c01a1ca7f..bc8def665 100644 Binary files a/src/main/resources/assets/create/textures/block/mechanical_arm.png and b/src/main/resources/assets/create/textures/block/mechanical_arm.png differ diff --git a/src/main/resources/assets/create/textures/block/mechanical_press_head.png b/src/main/resources/assets/create/textures/block/mechanical_press_head.png index b3a85575e..79c3f488b 100644 Binary files a/src/main/resources/assets/create/textures/block/mechanical_press_head.png and b/src/main/resources/assets/create/textures/block/mechanical_press_head.png differ diff --git a/src/main/resources/assets/create/textures/block/mechanical_press_side.png b/src/main/resources/assets/create/textures/block/mechanical_press_side.png new file mode 100644 index 000000000..bdcdead8a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/mechanical_press_side.png differ diff --git a/src/main/resources/assets/create/textures/block/mechanical_press_top.png b/src/main/resources/assets/create/textures/block/mechanical_press_top.png index 06b9ed01c..0fe60a215 100644 Binary files a/src/main/resources/assets/create/textures/block/mechanical_press_top.png and b/src/main/resources/assets/create/textures/block/mechanical_press_top.png differ diff --git a/src/main/resources/assets/create/textures/block/mechanical_saw_top.png b/src/main/resources/assets/create/textures/block/mechanical_saw_top.png index 393d11f2c..263ad1357 100644 Binary files a/src/main/resources/assets/create/textures/block/mechanical_saw_top.png and b/src/main/resources/assets/create/textures/block/mechanical_saw_top.png differ diff --git a/src/main/resources/assets/create/textures/block/millstone.png b/src/main/resources/assets/create/textures/block/millstone.png index cac9a112a..43e1ab01c 100644 Binary files a/src/main/resources/assets/create/textures/block/millstone.png and b/src/main/resources/assets/create/textures/block/millstone.png differ diff --git a/src/main/resources/assets/create/textures/block/mixer_base_side.png b/src/main/resources/assets/create/textures/block/mixer_base_side.png index bc217affd..cb4948b02 100644 Binary files a/src/main/resources/assets/create/textures/block/mixer_base_side.png and b/src/main/resources/assets/create/textures/block/mixer_base_side.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png index 6aacfa9df..390c46630 100644 Binary files a/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png and b/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_7.png index cbb66a8eb..fe4377598 100644 Binary files a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_7.png and b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_7.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png index 05878b644..480bc3ad1 100644 Binary files a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png and b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_0.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_0.png new file mode 100644 index 000000000..d53825657 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_0.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_1.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_1.png new file mode 100644 index 000000000..b93bc9a63 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_1.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_2.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_2.png new file mode 100644 index 000000000..0256e98a2 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_2.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_3.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_3.png new file mode 100644 index 000000000..e5b8fc881 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_3.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_4.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_4.png new file mode 100644 index 000000000..926390a92 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_4.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_5.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_5.png new file mode 100644 index 000000000..81cdcacaf Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_5.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_6.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_6.png new file mode 100644 index 000000000..5ca5c4381 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_6.png differ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_7.png new file mode 100644 index 000000000..1118b8d1a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_7.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 deleted file mode 100644 index 8c3265bd1..000000000 Binary files a/src/main/resources/assets/create/textures/block/packager_top.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/pipe_drain.png b/src/main/resources/assets/create/textures/block/pipe_drain.png new file mode 100644 index 000000000..ce79757af Binary files /dev/null and b/src/main/resources/assets/create/textures/block/pipe_drain.png differ diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge.png b/src/main/resources/assets/create/textures/block/redstone_bridge.png index d930f4f74..ab9258ad9 100644 Binary files a/src/main/resources/assets/create/textures/block/redstone_bridge.png and b/src/main/resources/assets/create/textures/block/redstone_bridge.png differ diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png b/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png index d5acd8580..deba15cbb 100644 Binary files a/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png and b/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png differ diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_side.png b/src/main/resources/assets/create/textures/block/redstone_bridge_side.png deleted file mode 100644 index 45aa45b8b..000000000 Binary files a/src/main/resources/assets/create/textures/block/redstone_bridge_side.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_side_powered.png b/src/main/resources/assets/create/textures/block/redstone_bridge_side_powered.png deleted file mode 100644 index b60247090..000000000 Binary files a/src/main/resources/assets/create/textures/block/redstone_bridge_side_powered.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/refined_radiance_block.png b/src/main/resources/assets/create/textures/block/refined_radiance_block.png new file mode 100644 index 000000000..0f1184481 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/refined_radiance_block.png differ diff --git a/src/main/resources/assets/create/textures/block/refined_radiance_casing.png b/src/main/resources/assets/create/textures/block/refined_radiance_casing.png new file mode 100644 index 000000000..2b4ec02d5 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/refined_radiance_casing.png differ diff --git a/src/main/resources/assets/create/textures/block/refined_radiance_casing_connected.png b/src/main/resources/assets/create/textures/block/refined_radiance_casing_connected.png new file mode 100644 index 000000000..4c44ca58c Binary files /dev/null and b/src/main/resources/assets/create/textures/block/refined_radiance_casing_connected.png differ diff --git a/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side.png b/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side.png index 2eb50a89c..08c7c11da 100644 Binary files a/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side.png and b/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png index af1890182..628c9f076 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png differ diff --git a/src/main/resources/assets/create/textures/block/shadow_steel_casing.png b/src/main/resources/assets/create/textures/block/shadow_steel_casing.png new file mode 100644 index 000000000..165333d0f Binary files /dev/null and b/src/main/resources/assets/create/textures/block/shadow_steel_casing.png differ diff --git a/src/main/resources/assets/create/textures/block/shadow_steel_casing_connected.png b/src/main/resources/assets/create/textures/block/shadow_steel_casing_connected.png new file mode 100644 index 000000000..ee7b8eadd Binary files /dev/null and b/src/main/resources/assets/create/textures/block/shadow_steel_casing_connected.png differ diff --git a/src/main/resources/assets/create/textures/block/smooth_dark_log_top.png b/src/main/resources/assets/create/textures/block/smooth_dark_log_top.png new file mode 100644 index 000000000..88d809ae0 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/smooth_dark_log_top.png differ diff --git a/src/main/resources/assets/create/textures/block/spout.png b/src/main/resources/assets/create/textures/block/spout.png new file mode 100644 index 000000000..9338f64b0 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/spout.png differ diff --git a/src/main/resources/assets/create/textures/block/tamed_blaze.png b/src/main/resources/assets/create/textures/block/tamed_blaze.png deleted file mode 100644 index ba3918be1..000000000 Binary files a/src/main/resources/assets/create/textures/block/tamed_blaze.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/transposer.png b/src/main/resources/assets/create/textures/block/transposer.png deleted file mode 100644 index e2c0dd6db..000000000 Binary files a/src/main/resources/assets/create/textures/block/transposer.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/block/wheel.png b/src/main/resources/assets/create/textures/block/wheel.png index 3167ef46e..74d3e89b8 100644 Binary files a/src/main/resources/assets/create/textures/block/wheel.png and b/src/main/resources/assets/create/textures/block/wheel.png differ diff --git a/src/main/resources/assets/create/textures/block/wheel_extras.png b/src/main/resources/assets/create/textures/block/wheel_extras.png new file mode 100644 index 000000000..f6a027f20 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/wheel_extras.png differ diff --git a/src/main/resources/assets/create/textures/entity/coupling.png b/src/main/resources/assets/create/textures/entity/coupling.png new file mode 100644 index 000000000..650b16107 Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/coupling.png differ diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 06aa1ce24..865f8b22e 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ diff --git a/src/main/resources/assets/create/textures/item/andesite_alloy.png b/src/main/resources/assets/create/textures/item/andesite_alloy.png index eee0c85a4..7008a134e 100644 Binary files a/src/main/resources/assets/create/textures/item/andesite_alloy.png and b/src/main/resources/assets/create/textures/item/andesite_alloy.png differ diff --git a/src/main/resources/assets/create/textures/item/belt_connector.png b/src/main/resources/assets/create/textures/item/belt_connector.png index 483638b3a..ab22ae497 100644 Binary files a/src/main/resources/assets/create/textures/item/belt_connector.png and b/src/main/resources/assets/create/textures/item/belt_connector.png differ diff --git a/src/main/resources/assets/create/textures/item/extendo_grip.png b/src/main/resources/assets/create/textures/item/extendo_grip.png index 0ffee164f..64984feed 100644 Binary files a/src/main/resources/assets/create/textures/item/extendo_grip.png and b/src/main/resources/assets/create/textures/item/extendo_grip.png differ diff --git a/src/main/resources/assets/create/textures/item/minecart_coupling.png b/src/main/resources/assets/create/textures/item/minecart_coupling.png new file mode 100644 index 000000000..b9c5072be Binary files /dev/null and b/src/main/resources/assets/create/textures/item/minecart_coupling.png differ diff --git a/src/main/resources/assets/create/textures/item/schematic_and_quill.png b/src/main/resources/assets/create/textures/item/schematic_and_quill.png index dc2f06e0a..dfa8d360e 100644 Binary files a/src/main/resources/assets/create/textures/item/schematic_and_quill.png and b/src/main/resources/assets/create/textures/item/schematic_and_quill.png differ diff --git a/src/main/resources/assets/create/textures/special/cutout_checkerboard.png b/src/main/resources/assets/create/textures/special/cutout_checkerboard.png new file mode 100644 index 000000000..a8e187662 Binary files /dev/null and b/src/main/resources/assets/create/textures/special/cutout_checkerboard.png differ diff --git a/src/main/resources/data/create/recipes/crafting_shaped/basin.json b/src/main/resources/data/create/recipes/crafting_shaped/basin.json deleted file mode 100644 index c7ab2bc51..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/basin.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "A A", - "AAA" - ], - "key": { - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:basin", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/brass_hand.json b/src/main/resources/data/create/recipes/crafting_shaped/brass_hand.json deleted file mode 100644 index 8b3ed08c7..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/brass_hand.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - "III", - " I " - ], - "key": { - "A": { - "item": "create:andesite_alloy" - }, - "I": { - "tag": "forge:plates/brass" - } - }, - "result": { - "item": "create:brass_hand", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/cake.json b/src/main/resources/data/create/recipes/crafting_shaped/cake.json deleted file mode 100644 index 5b29e01f3..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/cake.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " M ", - "SES", - " D " - ], - "key": { - "M": { - "item": "minecraft:milk_bucket" - }, - "S": { - "item": "minecraft:sugar" - }, - "E": { - "item": "minecraft:egg" - }, - "D": { - "item": "create:dough" - } - }, - "result": { - "item": "minecraft:cake", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/adjustable_pulley.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/adjustable_pulley.json deleted file mode 100644 index 4cb953612..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/adjustable_pulley.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "A", - "B", - "C" - ], - "key": { - "A": { - "item": "create:electron_tube" - }, - "B": { - "item": "create:encased_belt" - }, - "C": { - "item": "create:large_cogwheel" - } - }, - "result": { - "item": "create:adjustable_pulley", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/analog_lever.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/analog_lever.json deleted file mode 100644 index a710226ae..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/analog_lever.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "A", - "C" - ], - "key": { - "A": { - "tag": "forge:rods/wooden" - }, - "C": { - "item": "create:andesite_casing" - } - }, - "result": { - "item": "create:analog_lever", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/belt_connector.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/belt_connector.json deleted file mode 100644 index 815c06973..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/belt_connector.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "DDD", - "DDD" - ], - "key": { - "D": { - "item": "minecraft:dried_kelp" - } - }, - "result": { - "item": "create:belt_connector", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cart_assembler.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cart_assembler.json deleted file mode 100644 index d421a33d0..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cart_assembler.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " L ", - "CRC", - "L L" - ], - "key": { - "L": { - "tag": "minecraft:logs" - }, - "R": { - "tag": "forge:dusts/redstone" - }, - "C": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:cart_assembler", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clockwork_bearing.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clockwork_bearing.json deleted file mode 100644 index 452c38601..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clockwork_bearing.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:electron_tube" - }, - "B": { - "item": "create:turntable" - }, - "C": { - "item": "create:brass_casing" - }, - "I": { - "item": "create:shaft" - } - }, - "result": { - "item": "create:clockwork_bearing", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clutch.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clutch.json deleted file mode 100644 index 933404197..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/clutch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " B " - ], - "key": { - "S": { - "item": "create:shaft" - }, - "B": { - "tag": "forge:dusts/redstone" - }, - "C": { - "item": "create:andesite_casing" - } - }, - "result": { - "item": "create:clutch", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cogwheel.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cogwheel.json deleted file mode 100644 index 863720207..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cogwheel.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "BBB", - "BSB", - "BBB" - ], - "key": { - "B": { - "tag": "minecraft:wooden_buttons" - }, - "S": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:cogwheel", - "count": 8 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cuckoo_clock.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cuckoo_clock.json deleted file mode 100644 index bca9adf20..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/cuckoo_clock.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " S ", - "SAS", - "BPB" - ], - "key": { - "B": { - "tag": "minecraft:logs" - }, - "S": { - "tag": "minecraft:planks" - }, - "A": { - "item": "minecraft:clock" - }, - "P": { - "item": "create:cogwheel" - } - }, - "result": { - "item": "create:cuckoo_clock", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/deployer.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/deployer.json deleted file mode 100644 index be500f49a..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/deployer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "crafting_shaped", - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "item": "create:electron_tube" - }, - "C": { - "item": "create:andesite_casing" - }, - "I": { - "item": "create:brass_hand" - } - }, - "result": { - "item": "create:deployer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/drill.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/drill.json deleted file mode 100644 index 69411c442..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/drill.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - "AIA", - " C " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "I": { - "tag": "forge:ingots/iron" - }, - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:mechanical_drill", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_belt.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_belt.json deleted file mode 100644 index 5ab5234ca..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_belt.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " C ", - "CBC", - " C " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "B": { - "item": "create:belt_connector" - } - }, - "result": { - "item": "create:encased_belt", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_fan.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_fan.json deleted file mode 100644 index c21000c14..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_fan.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " S ", - "RAR", - "BPB" - ], - "key": { - "B": { - "item": "minecraft:iron_bars" - }, - "S": { - "item": "create:shaft" - }, - "A": { - "item": "create:andesite_alloy" - }, - "P": { - "item": "create:propeller" - }, - "R": { - "tag": "minecraft:logs" - } - }, - "result": { - "item": "create:encased_fan", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_shaft.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_shaft.json deleted file mode 100644 index 3175e91b2..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/encased_shaft.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "CS" - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "S": { - "item": "create:shaft" - } - }, - "result": { - "item": "create:encased_shaft", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearbox.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearbox.json deleted file mode 100644 index fec3d8dcb..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearbox.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "BCB", - " B " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "B": { - "item": "create:cogwheel" - } - }, - "result": { - "item": "create:gearbox", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearshift.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearshift.json deleted file mode 100644 index 6f7b670d0..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/gearshift.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " B " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "tag": "forge:dusts/redstone" - }, - "C": { - "item": "create:andesite_casing" - } - }, - "result": { - "item": "create:gearshift", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/harvester.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/harvester.json deleted file mode 100644 index bf74fb361..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/harvester.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AIA", - "AIA", - " C " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "I": { - "tag": "forge:plates/iron" - }, - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:mechanical_harvester", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/large_cogwheel.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/large_cogwheel.json deleted file mode 100644 index c650f029f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/large_cogwheel.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "BPB", - "PSP", - "BPB" - ], - "key": { - "B": { - "tag": "minecraft:wooden_buttons" - }, - "P": { - "tag": "minecraft:planks" - }, - "S": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:large_cogwheel", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_bearing.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_bearing.json deleted file mode 100644 index 76c1919a0..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_bearing.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:andesite_alloy" - }, - "B": { - "item": "create:turntable" - }, - "C": { - "item": "create:andesite_casing" - }, - "I": { - "item": "create:shaft" - } - }, - "result": { - "item": "create:mechanical_bearing", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_crafter.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_crafter.json deleted file mode 100644 index edabb6252..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_crafter.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "crafting_shaped", - "type": "crafting_shaped", - "pattern": [ - "BRB", - "ISI", - " C " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "item": "create:electron_tube" - }, - "R": { - "item": "minecraft:crafting_table" - }, - "C": { - "item": "create:brass_casing" - }, - "I": { - "tag": "forge:plates/brass" - } - }, - "result": { - "item": "create:mechanical_crafter", - "count": 3 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_mixer.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_mixer.json deleted file mode 100644 index 79d6b3747..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_mixer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "item": "create:electron_tube" - }, - "C": { - "item": "create:andesite_casing" - }, - "I": { - "item": "create:whisk" - } - }, - "result": { - "item": "create:mechanical_mixer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_piston.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_piston.json deleted file mode 100644 index b814e8d7b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_piston.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "tag": "minecraft:wooden_slabs" - }, - "C": { - "item": "create:andesite_casing" - }, - "I": { - "item": "create:piston_extension_pole" - } - }, - "result": { - "item": "create:mechanical_piston", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_press.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_press.json deleted file mode 100644 index 9db6f0dc5..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mechanical_press.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "crafting_shaped", - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "item": "create:andesite_alloy" - }, - "C": { - "item": "create:andesite_casing" - }, - "I": { - "tag": "forge:storage_blocks/iron" - } - }, - "result": { - "item": "create:mechanical_press", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/millstone.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/millstone.json deleted file mode 100644 index 37ccdb8e6..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/millstone.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " P ", - "ACA", - " S " - ], - "key": { - "C": { - "item": "create:cogwheel" - }, - "A": { - "item": "create:andesite_alloy" - }, - "S": { - "tag": "forge:stone" - }, - "P": { - "tag": "minecraft:planks" - } - }, - "result": { - "item": "create:millstone", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mysterious_cuckoo_clock.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mysterious_cuckoo_clock.json deleted file mode 100644 index b1b337d4f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/mysterious_cuckoo_clock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " S ", - "SAS", - " S " - ], - "key": { - "S": { - "tag": "forge:gunpowder" - }, - "A": { - "item": "create:cuckoo_clock" - } - }, - "result": { - "item": "create:mysterious_cuckoo_clock", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/piston_extension_pole.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/piston_extension_pole.json deleted file mode 100644 index dbecfd229..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/piston_extension_pole.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "P", - "A", - "P" - ], - "key": { - "P": { - "tag": "minecraft:planks" - }, - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:piston_extension_pole", - "count": 8 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/plough.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/plough.json deleted file mode 100644 index 9138c455a..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/plough.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "III", - "AAA", - " C " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "I": { - "tag": "forge:plates/iron" - }, - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:mechanical_plough", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/portable_storage_interface.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/portable_storage_interface.json deleted file mode 100644 index 844377886..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/portable_storage_interface.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "LT" - ], - "key": { - "L": { - "item": "create:andesite_casing" - }, - "T": { - "item": "create:extractor" - } - }, - "result": { - "item": "create:portable_storage_interface", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rope_pulley.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rope_pulley.json deleted file mode 100644 index b411301ae..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rope_pulley.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:shaft" - }, - "B": { - "item": "create:andesite_casing" - }, - "C": { - "tag": "minecraft:wool" - }, - "I": { - "tag": "forge:plates/iron" - } - }, - "result": { - "item": "create:rope_pulley", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_chassis.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_chassis.json deleted file mode 100644 index 00a6a203b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_chassis.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " L ", - "PLP", - " L " - ], - "key": { - "L": { - "tag": "minecraft:logs" - }, - "P": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:radial_chassis", - "count": 3 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_speed_controller.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_speed_controller.json deleted file mode 100644 index 14854082b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/rotation_speed_controller.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS" - ], - "key": { - "S": { - "item": "create:shaft" - }, - "B": { - "item": "create:integrated_circuit" - }, - "C": { - "item": "create:brass_casing" - } - }, - "result": { - "item": "create:rotation_speed_controller", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/saw.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/saw.json deleted file mode 100644 index d51d80fc5..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/saw.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - "AIA", - " C " - ], - "key": { - "C": { - "item": "create:andesite_casing" - }, - "I": { - "tag": "forge:ingots/iron" - }, - "A": { - "tag": "forge:plates/iron" - } - }, - "result": { - "item": "create:mechanical_saw", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sequenced_gearshift.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sequenced_gearshift.json deleted file mode 100644 index 58683bed5..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sequenced_gearshift.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "crafting_shaped", - "type": "crafting_shaped", - "pattern": [ - " B ", - "SCS", - " I " - ], - "key": { - "S": { - "item": "create:cogwheel" - }, - "B": { - "item": "create:electron_tube" - }, - "C": { - "item": "create:brass_casing" - }, - "I": { - "item": "minecraft:clock" - } - }, - "result": { - "item": "create:sequenced_gearshift", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/shaft.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/shaft.json deleted file mode 100644 index 1f2a41442..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/shaft.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "A", - "A" - ], - "key": { - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:shaft", - "count": 8 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/speedometer.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/speedometer.json deleted file mode 100644 index f1c1e222b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/speedometer.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " C ", - "SAS" - ], - "key": { - "A": { - "item": "create:andesite_casing" - }, - "S": { - "item": "create:shaft" - }, - "C": { - "item": "minecraft:compass" - } - }, - "result": { - "item": "create:speedometer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sticky_mechanical_piston.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sticky_mechanical_piston.json deleted file mode 100644 index 0fddfe2e6..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/sticky_mechanical_piston.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "S", - "P" - ], - "key": { - "P": { - "item": "create:mechanical_piston" - }, - "S": { - "item": "minecraft:slime_ball" - } - }, - "result": { - "item": "create:sticky_mechanical_piston", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/translation_chassis.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/translation_chassis.json deleted file mode 100644 index 1f33b2710..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/translation_chassis.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " P ", - "LLL", - " P " - ], - "key": { - "L": { - "tag": "minecraft:logs" - }, - "P": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:linear_chassis", - "count": 3 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/turntable.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/turntable.json deleted file mode 100644 index ad6294cd5..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/turntable.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "S", - "H" - ], - "key": { - "H": { - "item": "create:shaft" - }, - "S": { - "tag": "minecraft:wooden_slabs" - } - }, - "result": { - "item": "create:turntable", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/water_wheel.json b/src/main/resources/data/create/recipes/crafting_shaped/contraptions/water_wheel.json deleted file mode 100644 index a9e343df2..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/contraptions/water_wheel.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SSS", - "SCS", - "SSS" - ], - "key": { - "C": { - "item": "create:large_cogwheel" - }, - "S": { - "tag": "minecraft:wooden_slabs" - } - }, - "result": { - "item": "create:water_wheel", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/deforester.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/deforester.json deleted file mode 100644 index a8d634381..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/deforester.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "EG", - "EO", - " O" - ], - "key": { - "E": { - "item": "create:refined_radiance" - }, - "O": { - "item": "minecraft:obsidian" - }, - "G": { - "item": "create:cogwheel" - } - }, - "result": { - "item": "create:deforester", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/filter.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/filter.json deleted file mode 100644 index dca598e22..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/filter.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "NWN" - ], - "key": { - "N": { - "tag": "forge:nuggets/iron" - }, - "W": { - "tag": "minecraft:wool" - } - }, - "result": { - "item": "create:filter", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/goggles.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/goggles.json deleted file mode 100644 index 0aefd8657..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/goggles.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " S ", - "GPG" - ], - "key": { - "S": { - "tag": "forge:string" - }, - "G": { - "tag": "forge:glass" - }, - "P": { - "tag": "forge:plates/gold" - } - }, - "result": { - "item": "create:goggles", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/placement_handgun.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/placement_handgun.json deleted file mode 100644 index d335b549e..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/placement_handgun.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " E", - " O ", - "OA " - ], - "key": { - "E": { - "item": "create:refined_radiance" - }, - "O": { - "item": "minecraft:obsidian" - }, - "A": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:handheld_blockzapper", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/property_filter.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/property_filter.json deleted file mode 100644 index 5d78f2cae..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/property_filter.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "NWN" - ], - "key": { - "N": { - "tag": "forge:nuggets/copper" - }, - "W": { - "tag": "minecraft:wool" - } - }, - "result": { - "item": "create:attribute_filter", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/symmetry_wand.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/symmetry_wand.json deleted file mode 100644 index 20713673a..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/symmetry_wand.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " GE", - "LEG", - "OL " - ], - "key": { - "E": { - "item": "create:refined_radiance" - }, - "L": { - "tag": "forge:ingots/brass" - }, - "O": { - "item": "minecraft:obsidian" - }, - "G": { - "tag": "forge:glass_panes/white" - } - }, - "result": { - "item": "create:wand_of_symmetry", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/wrench.json b/src/main/resources/data/create/recipes/crafting_shaped/curiosities/wrench.json deleted file mode 100644 index 318f66fbc..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/curiosities/wrench.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "PP", - "PG", - " S" - ], - "key": { - "S": { - "tag": "forge:rods/wooden" - }, - "G": { - "item": "create:cogwheel" - }, - "P": { - "tag": "forge:plates/gold" - } - }, - "result": { - "item": "create:wrench", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/dark_scoria.json b/src/main/resources/data/create/recipes/crafting_shaped/dark_scoria.json deleted file mode 100644 index 0ae9e6f51..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/dark_scoria.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "III", - "ISI", - "III" - ], - "key": { - "I": { - "item": "create:scoria" - }, - "S": { - "tag": "forge:dyes/black" - } - }, - "result": { - "item": "create:dark_scoria", - "count": 8 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/electron_tube.json b/src/main/resources/data/create/recipes/crafting_shaped/electron_tube.json deleted file mode 100644 index d0f331ab2..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/electron_tube.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "L", - "R", - "N" - ], - "key": { - "L": { - "item": "create:polished_rose_quartz" - }, - "R": { - "item": "minecraft:redstone_torch" - }, - "N": { - "tag": "forge:nuggets/iron" - } - }, - "result": { - "item": "create:electron_tube", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/hand_crank.json b/src/main/resources/data/create/recipes/crafting_shaped/hand_crank.json deleted file mode 100644 index 7f861df46..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/hand_crank.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - "PPP", - " L" - ], - "key": { - "L": { - "item": "create:andesite_alloy" - }, - "P": { - "tag": "minecraft:planks" - }, - "A": { - "tag": "forge:plates/brass" - } - }, - "result": { - "item": "create:hand_crank", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_crate.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_crate.json deleted file mode 100644 index 61a5854aa..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_crate.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "BBB", - "B B", - "BBB" - ], - "key": { - "B": { - "item": "create:brass_casing" - } - }, - "result": { - "item": "create:adjustable_crate", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_pulse_repeater.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_pulse_repeater.json deleted file mode 100644 index 3aae7c147..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_pulse_repeater.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SP" - ], - "key": { - "P": { - "item": "create:adjustable_repeater" - }, - "S": { - "item": "create:pulse_repeater" - } - }, - "result": { - "item": "create:adjustable_pulse_repeater", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_repeater.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_repeater.json deleted file mode 100644 index 7388e25a3..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/adjustable_repeater.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "RCT", - "SSS" - ], - "key": { - "S": { - "item": "minecraft:stone" - }, - "C": { - "item": "minecraft:clock" - }, - "R": { - "item": "minecraft:redstone" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "result": { - "item": "create:adjustable_repeater", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_observer.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_observer.json deleted file mode 100644 index 81cb5f8a4..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/belt_observer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "RCI", - " B " - ], - "key": { - "R": { - "tag": "forge:dusts/redstone" - }, - "I": { - "tag": "forge:ingots/iron" - }, - "C": { - "item": "minecraft:observer" - }, - "B": { - "item": "create:brass_casing" - } - }, - "result": { - "item": "create:belt_observer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_latch.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_latch.json deleted file mode 100644 index ee918aa2d..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_latch.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " T ", - "RCR", - "SSS" - ], - "key": { - "S": { - "item": "minecraft:stone" - }, - "C": { - "item": "minecraft:lever" - }, - "R": { - "item": "minecraft:redstone" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "result": { - "item": "create:powered_latch", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_toggle_latch.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_toggle_latch.json deleted file mode 100644 index a0387b9f1..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/powered_toggle_latch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " T ", - " C ", - "SSS" - ], - "key": { - "S": { - "item": "minecraft:stone" - }, - "C": { - "item": "minecraft:lever" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "result": { - "item": "create:powered_toggle_latch", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/pulse_repeater.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/pulse_repeater.json deleted file mode 100644 index 0b6d9874e..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/pulse_repeater.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "RRT", - "SSS" - ], - "key": { - "S": { - "item": "minecraft:stone" - }, - "R": { - "item": "minecraft:redstone" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "result": { - "item": "create:pulse_repeater", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_contact.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_contact.json deleted file mode 100644 index 0120ff567..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_contact.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SCS", - " B ", - "SCS" - ], - "key": { - "S": { - "tag": "forge:dusts/redstone" - }, - "B": { - "tag": "forge:ingots/iron" - }, - "C": { - "item": "create:brass_casing" - } - }, - "result": { - "item": "create:redstone_contact", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_link.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_link.json deleted file mode 100644 index 0151f604f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/redstone_link.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " T", - "GSG" - ], - "key": { - "S": { - "tag": "minecraft:planks" - }, - "G": { - "item": "create:brass_sheet" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "result": { - "item": "create:redstone_link", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/logistics/stockpile_switch.json b/src/main/resources/data/create/recipes/crafting_shaped/logistics/stockpile_switch.json deleted file mode 100644 index db67132d6..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/logistics/stockpile_switch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "RCI", - " B " - ], - "key": { - "R": { - "tag": "forge:dusts/redstone" - }, - "I": { - "tag": "forge:ingots/iron" - }, - "C": { - "item": "minecraft:comparator" - }, - "B": { - "item": "create:brass_casing" - } - }, - "result": { - "item": "create:stockpile_switch", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy.json b/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy.json deleted file mode 100644 index 551e619d1..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SW", - "WS" - ], - "key": { - "W": { - "item": "minecraft:andesite" - }, - "S": { - "tag": "forge:nuggets/iron" - } - }, - "result": { - "item": "create:andesite_alloy", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy_1.json b/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy_1.json deleted file mode 100644 index 5a01dfcbc..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_alloy_1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "SW", - "WS" - ], - "key": { - "W": { - "item": "minecraft:andesite" - }, - "S": { - "tag": "forge:nuggets/zinc" - } - }, - "result": { - "item": "create:andesite_alloy", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_casing.json b/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_casing.json deleted file mode 100644 index e3d5f8d97..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/andesite_casing.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AAA", - "CSC", - "AAA" - ], - "key": { - "A": { - "tag": "minecraft:planks" - }, - "S": { - "tag": "minecraft:logs" - }, - "C": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:andesite_casing", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/brass_casing.json b/src/main/resources/data/create/recipes/crafting_shaped/materials/brass_casing.json deleted file mode 100644 index 28788c5d1..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/brass_casing.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AAA", - "CSC", - "AAA" - ], - "key": { - "A": { - "tag": "minecraft:planks" - }, - "S": { - "tag": "minecraft:logs" - }, - "C": { - "tag": "forge:plates/brass" - } - }, - "result": { - "item": "create:brass_casing", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_casing.json b/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_casing.json deleted file mode 100644 index 70524fd2b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/materials/copper_casing.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AAA", - "CSC", - "AAA" - ], - "key": { - "A": { - "tag": "minecraft:planks" - }, - "S": { - "tag": "minecraft:logs" - }, - "C": { - "tag": "forge:plates/copper" - } - }, - "result": { - "item": "create:copper_casing", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/nozzle.json b/src/main/resources/data/create/recipes/crafting_shaped/nozzle.json deleted file mode 100644 index ca6d4d1c3..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/nozzle.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - " W ", - "AAA" - ], - "key": { - "A": { - "item": "create:andesite_alloy" - }, - "W": { - "tag": "minecraft:wool" - } - }, - "result": { - "item": "create:nozzle", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/propeller.json b/src/main/resources/data/create/recipes/crafting_shaped/propeller.json deleted file mode 100644 index a7393b082..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/propeller.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " I ", - "ISI", - " I " - ], - "key": { - "I": { - "tag": "forge:plates/iron" - }, - "S": { - "item": "create:andesite_alloy" - } - }, - "result": { - "item": "create:propeller", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematic_table.json b/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematic_table.json deleted file mode 100644 index b239d0cee..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematic_table.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "WWW", - " S ", - " S " - ], - "key": { - "W": { - "tag": "minecraft:wooden_slabs" - }, - "S": { - "item": "minecraft:smooth_stone" - } - }, - "result": { - "item": "create:schematic_table", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematicannon.json b/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematicannon.json deleted file mode 100644 index bb2a9b902..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/schematics/schematicannon.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " C ", - "LDL", - "SIS" - ], - "key": { - "I": { - "item": "minecraft:iron_block" - }, - "D": { - "item": "minecraft:dispenser" - }, - "L": { - "tag": "minecraft:logs" - }, - "S": { - "item": "minecraft:smooth_stone_slab" - }, - "C": { - "item": "minecraft:cauldron" - } - }, - "result": { - "item": "create:schematicannon", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/slot_cover.json b/src/main/resources/data/create/recipes/crafting_shaped/slot_cover.json deleted file mode 100644 index 330ba634d..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/slot_cover.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AAA" - ], - "key": { - "A": { - "tag": "forge:nuggets/brass" - } - }, - "result": { - "item": "create:crafter_slot_cover", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/super_glue.json b/src/main/resources/data/create/recipes/crafting_shaped/super_glue.json deleted file mode 100644 index 423546fe3..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/super_glue.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - "AS", - "NA" - ], - "key": { - "A": { - "tag": "forge:slimeballs" - }, - "S": { - "tag": "forge:plates/iron" - }, - "N": { - "tag": "forge:nuggets/iron" - } - }, - "result": { - "item": "create:super_glue", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shaped/whisk.json b/src/main/resources/data/create/recipes/crafting_shaped/whisk.json deleted file mode 100644 index 493e51410..000000000 --- a/src/main/resources/data/create/recipes/crafting_shaped/whisk.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "crafting_shaped", - "pattern": [ - " A ", - "IAI", - "III" - ], - "key": { - "A": { - "item": "create:andesite_alloy" - }, - "I": { - "tag": "forge:plates/iron" - } - }, - "result": { - "item": "create:whisk", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/blueprint_and_quill.json b/src/main/resources/data/create/recipes/crafting_shapeless/blueprint_and_quill.json deleted file mode 100644 index f453d23d6..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/blueprint_and_quill.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:empty_schematic" - }, - { - "item": "minecraft:feather" - } - ], - "result": { - "item": "create:schematic_and_quill", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/empty_blueprint.json b/src/main/resources/data/create/recipes/crafting_shapeless/empty_blueprint.json deleted file mode 100644 index a6df3a16a..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/empty_blueprint.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "minecraft:paper" - }, - { - "item": "minecraft:light_blue_dye" - } - ], - "result": { - "item": "create:empty_schematic", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/gearbox.json b/src/main/resources/data/create/recipes/crafting_shapeless/gearbox.json deleted file mode 100644 index f8e94f151..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/gearbox.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:vertical_gearbox" - } - ], - "result": { - "item": "create:gearbox", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/minecart.json b/src/main/resources/data/create/recipes/crafting_shapeless/minecart.json deleted file mode 100644 index 38820a23b..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/minecart.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - [ - { - "item": "create:minecart_contraption" - }, - { - "item": "create:furnace_minecart_contraption" - } - ] - ], - "result": { - "item": "minecraft:minecart", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/rose_quartz.json b/src/main/resources/data/create/recipes/crafting_shapeless/rose_quartz.json deleted file mode 100644 index ca8c4b2d7..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/rose_quartz.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "tag": "forge:gems/quartz" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - }, - { - "tag": "forge:dusts/redstone" - } - ], - "result": { - "item": "create:rose_quartz", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/slime_ball.json b/src/main/resources/data/create/recipes/crafting_shapeless/slime_ball.json deleted file mode 100644 index c1e999105..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/slime_ball.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "tag": "forge:dyes/lime" - }, - { - "item": "create:dough" - } - ], - "result": { - "item": "minecraft:slime_ball", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/speedometer.json b/src/main/resources/data/create/recipes/crafting_shapeless/speedometer.json deleted file mode 100644 index 0187e538d..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/speedometer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:stressometer" - } - ], - "result": { - "item": "create:speedometer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/stressometer.json b/src/main/resources/data/create/recipes/crafting_shapeless/stressometer.json deleted file mode 100644 index 83746416f..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/stressometer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:speedometer" - } - ], - "result": { - "item": "create:stressometer", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis.json b/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis.json deleted file mode 100644 index 466316ce2..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:secondary_linear_chassis" - } - ], - "result": { - "item": "create:linear_chassis", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis_secondary.json b/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis_secondary.json deleted file mode 100644 index 9dd34f672..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/translation_chassis_secondary.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:linear_chassis" - } - ], - "result": { - "item": "create:secondary_linear_chassis", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/tree_fertilizer.json b/src/main/resources/data/create/recipes/crafting_shapeless/tree_fertilizer.json deleted file mode 100644 index 25bae8b68..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/tree_fertilizer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - [ - { - "item": "minecraft:horn_coral" - }, - { - "item": "minecraft:tube_coral" - }, - { - "item": "minecraft:fire_coral" - }, - { - "item": "minecraft:bubble_coral" - }, - { - "item": "minecraft:brain_coral" - } - ], - { - "item": "minecraft:bone_meal" - }, - { - "tag": "minecraft:small_flowers" - }, - { - "tag": "minecraft:small_flowers" - } - ], - "result": { - "item": "create:tree_fertilizer", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting_shapeless/vertical_gearbox.json b/src/main/resources/data/create/recipes/crafting_shapeless/vertical_gearbox.json deleted file mode 100644 index 6521360af..000000000 --- a/src/main/resources/data/create/recipes/crafting_shapeless/vertical_gearbox.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "crafting_shapeless", - "ingredients": [ - { - "item": "create:gearbox" - } - ], - "result": { - "item": "create:vertical_gearbox", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/blaze_rod.json b/src/main/resources/data/create/recipes/crushing/blaze_rod.json deleted file mode 100644 index 8f282b48e..000000000 --- a/src/main/resources/data/create/recipes/crushing/blaze_rod.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:blaze_rod" - } - ], - "results": [ - { - "item": "minecraft:blaze_powder", - "count": 3 - }, - { - "item": "minecraft:blaze_powder", - "count": 3, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/brass_block.json b/src/main/resources/data/create/recipes/crushing/brass_block.json deleted file mode 100644 index 0ed80ebec..000000000 --- a/src/main/resources/data/create/recipes/crushing/brass_block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:storage_blocks/brass" - } - ], - "results": [ - { - "item": "create:crushed_brass", - "count": 5 - } - ], - "processingTime": 400 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/coal_ore.json b/src/main/resources/data/create/recipes/crushing/coal_ore.json deleted file mode 100644 index 93f8fa076..000000000 --- a/src/main/resources/data/create/recipes/crushing/coal_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:coal_ore" - } - ], - "results": [ - { - "item": "minecraft:coal", - "count": 2 - }, - { - "item": "minecraft:coal", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 300 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/copper_block.json b/src/main/resources/data/create/recipes/crushing/copper_block.json deleted file mode 100644 index e46d23b50..000000000 --- a/src/main/resources/data/create/recipes/crushing/copper_block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:storage_blocks/copper" - } - ], - "results": [ - { - "item": "create:crushed_copper_ore", - "count": 5 - } - ], - "processingTime": 400 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/copper_ore.json b/src/main/resources/data/create/recipes/crushing/copper_ore.json deleted file mode 100644 index 10c89fe5f..000000000 --- a/src/main/resources/data/create/recipes/crushing/copper_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:ores/copper" - } - ], - "results": [ - { - "item": "create:crushed_copper_ore", - "count": 1 - }, - { - "item": "create:crushed_copper_ore", - "count": 2, - "chance": 0.3 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/diamond_horse_armor.json b/src/main/resources/data/create/recipes/crushing/diamond_horse_armor.json deleted file mode 100644 index 0b1d66440..000000000 --- a/src/main/resources/data/create/recipes/crushing/diamond_horse_armor.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:diamond_horse_armor" - } - ], - "results": [ - { - "item": "minecraft:diamond", - "count": 1 - }, - { - "item": "minecraft:leather", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:diamond", - "count": 3, - "chance": 0.1 - }, - { - "item": "minecraft:string", - "count": 2, - "chance": 0.25 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/diamond_ore.json b/src/main/resources/data/create/recipes/crushing/diamond_ore.json deleted file mode 100644 index 2565016e4..000000000 --- a/src/main/resources/data/create/recipes/crushing/diamond_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:diamond_ore" - } - ], - "results": [ - { - "item": "minecraft:diamond", - "count": 2 - }, - { - "item": "minecraft:diamond", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 500 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/emerald_ore.json b/src/main/resources/data/create/recipes/crushing/emerald_ore.json deleted file mode 100644 index baae81872..000000000 --- a/src/main/resources/data/create/recipes/crushing/emerald_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:emerald_ore" - } - ], - "results": [ - { - "item": "minecraft:emerald", - "count": 2 - }, - { - "item": "minecraft:emerald", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 500 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/glowstone.json b/src/main/resources/data/create/recipes/crushing/glowstone.json deleted file mode 100644 index 3aaadcf6c..000000000 --- a/src/main/resources/data/create/recipes/crushing/glowstone.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:glowstone" - } - ], - "results": [ - { - "item": "minecraft:glowstone_dust", - "count": 3 - }, - { - "item": "minecraft:glowstone_dust", - "count": 1, - "chance": 0.5 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/gold_ore.json b/src/main/resources/data/create/recipes/crushing/gold_ore.json deleted file mode 100644 index 39fcc0744..000000000 --- a/src/main/resources/data/create/recipes/crushing/gold_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:ores/gold" - } - ], - "results": [ - { - "item": "create:crushed_gold_ore", - "count": 1 - }, - { - "item": "create:crushed_gold_ore", - "count": 2, - "chance": 0.3 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/golden_horse_armor.json b/src/main/resources/data/create/recipes/crushing/golden_horse_armor.json deleted file mode 100644 index 6ea7d4bcf..000000000 --- a/src/main/resources/data/create/recipes/crushing/golden_horse_armor.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:golden_horse_armor" - } - ], - "results": [ - { - "item": "minecraft:gold_ingot", - "count": 2 - }, - { - "item": "minecraft:leather", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:gold_ingot", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:string", - "count": 2, - "chance": 0.25 - }, - { - "item": "minecraft:gold_nugget", - "count": 8, - "chance": 0.25 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/gravel.json b/src/main/resources/data/create/recipes/crushing/gravel.json deleted file mode 100644 index 7a24b7d2b..000000000 --- a/src/main/resources/data/create/recipes/crushing/gravel.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:gravel" - } - ], - "results": [ - { - "item": "minecraft:sand", - "count": 1 - }, - { - "item": "minecraft:clay_ball", - "count": 1, - "chance": 0.1 - }, - { - "item": "minecraft:flint", - "count": 1, - "chance": 0.2 - } - ], - "processingTime": 250 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/iron_horse_armor.json b/src/main/resources/data/create/recipes/crushing/iron_horse_armor.json deleted file mode 100644 index 88ba0c780..000000000 --- a/src/main/resources/data/create/recipes/crushing/iron_horse_armor.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:iron_horse_armor" - } - ], - "results": [ - { - "item": "minecraft:iron_ingot", - "count": 2 - }, - { - "item": "minecraft:leather", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:iron_ingot", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:string", - "count": 2, - "chance": 0.25 - }, - { - "item": "minecraft:iron_nugget", - "count": 8, - "chance": 0.25 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/iron_ore.json b/src/main/resources/data/create/recipes/crushing/iron_ore.json deleted file mode 100644 index 4ade80425..000000000 --- a/src/main/resources/data/create/recipes/crushing/iron_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:ores/iron" - } - ], - "results": [ - { - "item": "create:crushed_iron_ore", - "count": 1 - }, - { - "item": "create:crushed_iron_ore", - "count": 2, - "chance": 0.3 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 400 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/lapis_ore.json b/src/main/resources/data/create/recipes/crushing/lapis_ore.json deleted file mode 100644 index 51873961e..000000000 --- a/src/main/resources/data/create/recipes/crushing/lapis_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:lapis_ore" - } - ], - "results": [ - { - "item": "minecraft:lapis_lazuli", - "count": 12 - }, - { - "item": "minecraft:lapis_lazuli", - "count": 8, - "chance": 0.25 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 300 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/leather_horse_armor.json b/src/main/resources/data/create/recipes/crushing/leather_horse_armor.json deleted file mode 100644 index eda689e4d..000000000 --- a/src/main/resources/data/create/recipes/crushing/leather_horse_armor.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:leather_horse_armor" - } - ], - "results": [ - { - "item": "minecraft:leather", - "count": 2 - }, - { - "item": "minecraft:leather", - "count": 2, - "chance": 0.5 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/nether_quartz_ore.json b/src/main/resources/data/create/recipes/crushing/nether_quartz_ore.json deleted file mode 100644 index 7767fd26c..000000000 --- a/src/main/resources/data/create/recipes/crushing/nether_quartz_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:nether_quartz_ore" - } - ], - "results": [ - { - "item": "minecraft:quartz", - "count": 2 - }, - { - "item": "minecraft:quartz", - "count": 4, - "chance": 0.5 - }, - { - "item": "minecraft:netherrack", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/nether_wart_block.json b/src/main/resources/data/create/recipes/crushing/nether_wart_block.json deleted file mode 100644 index e91740324..000000000 --- a/src/main/resources/data/create/recipes/crushing/nether_wart_block.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:nether_wart_block" - } - ], - "results": [ - { - "item": "minecraft:nether_wart", - "count": 6 - }, - { - "item": "minecraft:nether_wart", - "count": 2, - "chance": 0.5 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/obsidian.json b/src/main/resources/data/create/recipes/crushing/obsidian.json deleted file mode 100644 index 3008a63f3..000000000 --- a/src/main/resources/data/create/recipes/crushing/obsidian.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:obsidian" - } - ], - "results": [ - { - "item": "create:powdered_obsidian", - "count": 1, - "chance": 1 - }, - { - "item": "minecraft:obsidian", - "count": 1, - "chance": 0.875 - } - ], - "processingTime": 500 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/prismarine_crystals.json b/src/main/resources/data/create/recipes/crushing/prismarine_crystals.json deleted file mode 100644 index 2c9c5be20..000000000 --- a/src/main/resources/data/create/recipes/crushing/prismarine_crystals.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:prismarine_crystals" - } - ], - "results": [ - { - "item": "minecraft:prismarine_shard", - "count": 2 - }, - { - "item": "minecraft:quartz", - "count": 2, - "chance": 0.75 - }, - { - "item": "minecraft:prismarine_shard", - "count": 2, - "chance": 0.125 - }, - { - "item": "minecraft:glowstone_dust", - "count": 3, - "chance": 0.1 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/redstone_ore.json b/src/main/resources/data/create/recipes/crushing/redstone_ore.json deleted file mode 100644 index b2bdf81bb..000000000 --- a/src/main/resources/data/create/recipes/crushing/redstone_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:redstone_ore" - } - ], - "results": [ - { - "item": "minecraft:redstone", - "count": 8 - }, - { - "item": "minecraft:redstone", - "count": 6, - "chance": 0.25 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 300 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/sand.json b/src/main/resources/data/create/recipes/crushing/sand.json deleted file mode 100644 index 8d02bd559..000000000 --- a/src/main/resources/data/create/recipes/crushing/sand.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "minecraft:sand" - } - ], - "results": [ - { - "item": "create:limesand", - "count": 1 - }, - { - "item": "create:limesand", - "count": 1, - "chance": 0.5 - }, - { - "item": "minecraft:bone_meal", - "count": 1, - "chance": 0.05 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/wool.json b/src/main/resources/data/create/recipes/crushing/wool.json deleted file mode 100644 index c5c7a7e7c..000000000 --- a/src/main/resources/data/create/recipes/crushing/wool.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "minecraft:wool" - } - ], - "results": [ - { - "item": "minecraft:string", - "count": 2 - }, - { - "item": "minecraft:string", - "count": 1, - "chance": 0.5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/zinc_block.json b/src/main/resources/data/create/recipes/crushing/zinc_block.json deleted file mode 100644 index d10b5815e..000000000 --- a/src/main/resources/data/create/recipes/crushing/zinc_block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:storage_blocks/zinc" - } - ], - "results": [ - { - "item": "create:crushed_zinc_ore", - "count": 5 - } - ], - "processingTime": 400 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crushing/zinc_ore.json b/src/main/resources/data/create/recipes/crushing/zinc_ore.json deleted file mode 100644 index 4bfc78a2a..000000000 --- a/src/main/resources/data/create/recipes/crushing/zinc_ore.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "tag": "forge:ores/zinc" - } - ], - "results": [ - { - "item": "create:crushed_zinc_ore", - "count": 1 - }, - { - "item": "create:crushed_zinc_ore", - "count": 2, - "chance": 0.3 - }, - { - "item": "minecraft:cobblestone", - "count": 1, - "chance": 0.125 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/acacia_log.json b/src/main/resources/data/create/recipes/cutting/acacia_log.json deleted file mode 100644 index 9a449a5e8..000000000 --- a/src/main/resources/data/create/recipes/cutting/acacia_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:acacia_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_acacia_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/andesite_alloy.json b/src/main/resources/data/create/recipes/cutting/andesite_alloy.json deleted file mode 100644 index 300efc416..000000000 --- a/src/main/resources/data/create/recipes/cutting/andesite_alloy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "create:andesite_alloy" - } - ], - "results": [ - { - "item": "create:shaft", - "count": 6 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/birch_log.json b/src/main/resources/data/create/recipes/cutting/birch_log.json deleted file mode 100644 index ec235d23f..000000000 --- a/src/main/resources/data/create/recipes/cutting/birch_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:birch_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_birch_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/dark_oak_log.json b/src/main/resources/data/create/recipes/cutting/dark_oak_log.json deleted file mode 100644 index ba92f8d75..000000000 --- a/src/main/resources/data/create/recipes/cutting/dark_oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:dark_oak_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_dark_oak_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/jungle_log.json b/src/main/resources/data/create/recipes/cutting/jungle_log.json deleted file mode 100644 index 29baf9668..000000000 --- a/src/main/resources/data/create/recipes/cutting/jungle_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:jungle_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_jungle_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/oak_log.json b/src/main/resources/data/create/recipes/cutting/oak_log.json deleted file mode 100644 index 2d8fe8c98..000000000 --- a/src/main/resources/data/create/recipes/cutting/oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:oak_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_oak_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/spruce_log.json b/src/main/resources/data/create/recipes/cutting/spruce_log.json deleted file mode 100644 index 60d39ae39..000000000 --- a/src/main/resources/data/create/recipes/cutting/spruce_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:spruce_log" - } - ], - "results": [ - { - "item": "minecraft:stripped_spruce_log", - "count": 1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_acacia_log.json b/src/main/resources/data/create/recipes/cutting/stripped_acacia_log.json deleted file mode 100644 index 6bd4dbaf4..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_acacia_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_acacia_log" - } - ], - "results": [ - { - "item": "minecraft:acacia_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_birch_log.json b/src/main/resources/data/create/recipes/cutting/stripped_birch_log.json deleted file mode 100644 index e39f0863d..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_birch_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_birch_log" - } - ], - "results": [ - { - "item": "minecraft:birch_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_dark_oak_log.json b/src/main/resources/data/create/recipes/cutting/stripped_dark_oak_log.json deleted file mode 100644 index eba570fae..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_dark_oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_dark_oak_log" - } - ], - "results": [ - { - "item": "minecraft:dark_oak_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_jungle_log.json b/src/main/resources/data/create/recipes/cutting/stripped_jungle_log.json deleted file mode 100644 index 41fd26a47..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_jungle_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_jungle_log" - } - ], - "results": [ - { - "item": "minecraft:jungle_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_oak_log.json b/src/main/resources/data/create/recipes/cutting/stripped_oak_log.json deleted file mode 100644 index 54540d4c9..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_oak_log" - } - ], - "results": [ - { - "item": "minecraft:oak_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/cutting/stripped_spruce_log.json b/src/main/resources/data/create/recipes/cutting/stripped_spruce_log.json deleted file mode 100644 index 5bd6493c2..000000000 --- a/src/main/resources/data/create/recipes/cutting/stripped_spruce_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_spruce_log" - } - ], - "results": [ - { - "item": "minecraft:spruce_planks", - "count": 5 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json b/src/main/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json deleted file mode 100644 index 77eed4b59..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/crushing_wheel.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - " PPP ", - "PSBSP", - "PBCBP", - "PSBSP", - " PPP " - ], - "key": { - "P": { - "item": "create:andesite_alloy" - }, - "S": { - "tag": "forge:rods/wooden" - }, - "C": { - "item": "create:andesite_casing" - }, - "B": { - "tag": "forge:stone" - } - }, - "result": { - "item": "create:crushing_wheel", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/extendo_grip.json b/src/main/resources/data/create/recipes/mechanical_crafting/extendo_grip.json deleted file mode 100644 index b62194d44..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/extendo_grip.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - " L ", - " R ", - "SSS", - "SSS", - " H " - ], - "key": { - "L": { - "tag": "forge:ingots/brass" - }, - "R": { - "item": "create:cogwheel" - }, - "S": { - "tag": "forge:rods/wooden" - }, - "H": { - "item": "create:brass_hand" - } - }, - "result": { - "item": "create:extendo_grip", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/flywheel.json b/src/main/resources/data/create/recipes/mechanical_crafting/flywheel.json deleted file mode 100644 index 982c55d8d..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/flywheel.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - " PPP ", - "PSBSP", - "PBCBP", - "PSBSP", - " PPP " - ], - "key": { - "P": { - "tag": "forge:plates/brass" - }, - "S": { - "tag": "forge:rods/wooden" - }, - "C": { - "item": "create:brass_casing" - }, - "B": { - "tag": "forge:ingots/brass" - } - }, - "result": { - "item": "create:flywheel", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/furnace_engine.json b/src/main/resources/data/create/recipes/mechanical_crafting/furnace_engine.json deleted file mode 100644 index cb5e2263b..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/furnace_engine.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - "PPB", - "DCA", - "PPB" - ], - "key": { - "P": { - "tag": "forge:plates/brass" - }, - "D": { - "tag": "forge:plates/copper" - }, - "A": { - "item": "minecraft:piston" - }, - "C": { - "item": "create:brass_casing" - }, - "B": { - "tag": "forge:ingots/brass" - } - }, - "result": { - "item": "create:furnace_engine", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json b/src/main/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json deleted file mode 100644 index a96490273..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/integrated_circuit.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - " L ", - "RRR", - " C ", - "NNN" - ], - "key": { - "L": { - "item": "create:lapis_sheet" - }, - "R": { - "tag": "forge:dusts/redstone" - }, - "C": { - "tag": "forge:plates/iron" - }, - "N": { - "tag": "forge:nuggets/gold" - } - }, - "result": { - "item": "create:integrated_circuit", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mechanical_crafting/nixie_tube.json b/src/main/resources/data/create/recipes/mechanical_crafting/nixie_tube.json deleted file mode 100644 index 4aba074fc..000000000 --- a/src/main/resources/data/create/recipes/mechanical_crafting/nixie_tube.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "create:mechanical_crafting", - "pattern": [ - "EBE" - ], - "key": { - "B": { - "item": "create:brass_casing" - }, - "E": { - "item": "create:electron_tube" - } - }, - "result": { - "item": "create:nixie_tube", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/allium.json b/src/main/resources/data/create/recipes/milling/allium.json deleted file mode 100644 index 3389eeffe..000000000 --- a/src/main/resources/data/create/recipes/milling/allium.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:allium" - } - ], - "results": [ - { - "item": "minecraft:magenta_dye", - "count": 2 - }, - { - "item": "minecraft:purple_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/milling/andesite.json b/src/main/resources/data/create/recipes/milling/andesite.json deleted file mode 100644 index 7f6d34077..000000000 --- a/src/main/resources/data/create/recipes/milling/andesite.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:andesite" - } - ], - "results": [ - { - "item": "minecraft:cobblestone", - "count": 1 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/azure_bluet.json b/src/main/resources/data/create/recipes/milling/azure_bluet.json deleted file mode 100644 index d3d8d136a..000000000 --- a/src/main/resources/data/create/recipes/milling/azure_bluet.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:azure_bluet" - } - ], - "results": [ - { - "item": "minecraft:light_gray_dye", - "count": 2 - }, - { - "item": "minecraft:white_dye", - "count": 2, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/blue_orchid.json b/src/main/resources/data/create/recipes/milling/blue_orchid.json deleted file mode 100644 index a83b75431..000000000 --- a/src/main/resources/data/create/recipes/milling/blue_orchid.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:blue_orchid" - } - ], - "results": [ - { - "item": "minecraft:light_blue_dye", - "count": 2 - }, - { - "item": "minecraft:light_gray_dye", - "count": 1, - "chance": 0.05 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/bone.json b/src/main/resources/data/create/recipes/milling/bone.json deleted file mode 100644 index 974165dc3..000000000 --- a/src/main/resources/data/create/recipes/milling/bone.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:bone" - } - ], - "results": [ - { - "item": "minecraft:bone_meal", - "count": 3 - }, - { - "item": "minecraft:white_dye", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:bone_meal", - "count": 3, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/bone_meal.json b/src/main/resources/data/create/recipes/milling/bone_meal.json deleted file mode 100644 index a332f4ab8..000000000 --- a/src/main/resources/data/create/recipes/milling/bone_meal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:bone_meal" - } - ], - "results": [ - { - "item": "minecraft:white_dye", - "count": 2 - }, - { - "item": "minecraft:light_gray_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 70 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/cactus.json b/src/main/resources/data/create/recipes/milling/cactus.json deleted file mode 100644 index d2c82b4de..000000000 --- a/src/main/resources/data/create/recipes/milling/cactus.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "conditions": [ - { - "type": "forge:not", - "value": - { - "type": "forge:mod_loaded", - "modid": "quark" - } - } - ], - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:cactus" - } - ], - "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/milling/charcoal.json b/src/main/resources/data/create/recipes/milling/charcoal.json deleted file mode 100644 index 5be7dc15e..000000000 --- a/src/main/resources/data/create/recipes/milling/charcoal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:charcoal" - } - ], - "results": [ - { - "item": "minecraft:black_dye", - "count": 1 - }, - { - "item": "minecraft:gray_dye", - "count": 2, - "chance": 0.1 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/clay.json b/src/main/resources/data/create/recipes/milling/clay.json deleted file mode 100644 index cd1aa80a5..000000000 --- a/src/main/resources/data/create/recipes/milling/clay.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:clay" - } - ], - "results": [ - { - "item": "minecraft:clay_ball", - "count": 3 - }, - { - "item": "minecraft:clay_ball", - "count": 1, - "chance": 0.5 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/coal.json b/src/main/resources/data/create/recipes/milling/coal.json deleted file mode 100644 index 5216193b8..000000000 --- a/src/main/resources/data/create/recipes/milling/coal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:coal" - } - ], - "results": [ - { - "item": "minecraft:black_dye", - "count": 2 - }, - { - "item": "minecraft:gray_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/cobblestone.json b/src/main/resources/data/create/recipes/milling/cobblestone.json deleted file mode 100644 index 3a08422b6..000000000 --- a/src/main/resources/data/create/recipes/milling/cobblestone.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:cobblestone" - } - ], - "results": [ - { - "item": "minecraft:gravel", - "count": 1 - } - ], - "processingTime": 250 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/cocoa_beans.json b/src/main/resources/data/create/recipes/milling/cocoa_beans.json deleted file mode 100644 index e44faf69c..000000000 --- a/src/main/resources/data/create/recipes/milling/cocoa_beans.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:cocoa_beans" - } - ], - "results": [ - { - "item": "minecraft:brown_dye", - "count": 2 - }, - { - "item": "minecraft:brown_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/copper_ore.json b/src/main/resources/data/create/recipes/milling/copper_ore.json deleted file mode 100644 index e3f53892a..000000000 --- a/src/main/resources/data/create/recipes/milling/copper_ore.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "tag": "forge:ores/copper" - } - ], - "results": [ - { - "item": "create:crushed_copper_ore", - "count": 1 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/cornflower.json b/src/main/resources/data/create/recipes/milling/cornflower.json deleted file mode 100644 index 6a96dab2b..000000000 --- a/src/main/resources/data/create/recipes/milling/cornflower.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:cornflower" - } - ], - "results": [ - { - "item": "minecraft:blue_dye", - "count": 2 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/dandelion.json b/src/main/resources/data/create/recipes/milling/dandelion.json deleted file mode 100644 index 35e617b87..000000000 --- a/src/main/resources/data/create/recipes/milling/dandelion.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:dandelion" - } - ], - "results": [ - { - "item": "minecraft:yellow_dye", - "count": 2 - }, - { - "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/milling/diorite.json b/src/main/resources/data/create/recipes/milling/diorite.json deleted file mode 100644 index a251f3e5e..000000000 --- a/src/main/resources/data/create/recipes/milling/diorite.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:diorite" - } - ], - "results": [ - { - "item": "create:limesand", - "count": 1 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/fern.json b/src/main/resources/data/create/recipes/milling/fern.json deleted file mode 100644 index 479d50381..000000000 --- a/src/main/resources/data/create/recipes/milling/fern.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:fern" - } - ], - "results": [ - { - "item": "minecraft:green_dye", - "count": 1 - }, - { - "item": "minecraft:wheat_seeds", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/gold_ore.json b/src/main/resources/data/create/recipes/milling/gold_ore.json deleted file mode 100644 index 51570f86f..000000000 --- a/src/main/resources/data/create/recipes/milling/gold_ore.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "tag": "forge:ores/gold" - } - ], - "results": [ - { - "item": "create:crushed_gold_ore", - "count": 1 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/granite.json b/src/main/resources/data/create/recipes/milling/granite.json deleted file mode 100644 index ff6d3c70d..000000000 --- a/src/main/resources/data/create/recipes/milling/granite.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:granite" - } - ], - "results": [ - { - "item": "minecraft:red_sand", - "count": 1 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/grass.json b/src/main/resources/data/create/recipes/milling/grass.json deleted file mode 100644 index b7a5a4110..000000000 --- a/src/main/resources/data/create/recipes/milling/grass.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:grass" - } - ], - "results": [ - { - "item": "minecraft:wheat_seeds", - "count": 1, - "chance": 0.25 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/gravel.json b/src/main/resources/data/create/recipes/milling/gravel.json deleted file mode 100644 index 458acbf33..000000000 --- a/src/main/resources/data/create/recipes/milling/gravel.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:gravel" - } - ], - "results": [ - { - "item": "minecraft:flint", - "count": 1 - } - ], - "processingTime": 250 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/ink_sac.json b/src/main/resources/data/create/recipes/milling/ink_sac.json deleted file mode 100644 index ec85b114a..000000000 --- a/src/main/resources/data/create/recipes/milling/ink_sac.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:ink_sac" - } - ], - "results": [ - { - "item": "minecraft:black_dye", - "count": 2 - }, - { - "item": "minecraft:gray_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/iron_ore.json b/src/main/resources/data/create/recipes/milling/iron_ore.json deleted file mode 100644 index e8133a559..000000000 --- a/src/main/resources/data/create/recipes/milling/iron_ore.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "tag": "forge:ores/iron" - } - ], - "results": [ - { - "item": "create:crushed_iron_ore", - "count": 1 - } - ], - "processingTime": 400 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/lapis_lazuli.json b/src/main/resources/data/create/recipes/milling/lapis_lazuli.json deleted file mode 100644 index 6c6732cf6..000000000 --- a/src/main/resources/data/create/recipes/milling/lapis_lazuli.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:lapis_lazuli" - } - ], - "results": [ - { - "item": "minecraft:blue_dye", - "count": 2 - }, - { - "item": "minecraft:blue_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/large_fern.json b/src/main/resources/data/create/recipes/milling/large_fern.json deleted file mode 100644 index b58903449..000000000 --- a/src/main/resources/data/create/recipes/milling/large_fern.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:large_fern" - } - ], - "results": [ - { - "item": "minecraft:green_dye", - "count": 2 - }, - { - "item": "minecraft:green_dye", - "count": 1, - "chance": 0.5 - }, - { - "item": "minecraft:wheat_seeds", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/lilac.json b/src/main/resources/data/create/recipes/milling/lilac.json deleted file mode 100644 index bfc82d355..000000000 --- a/src/main/resources/data/create/recipes/milling/lilac.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:lilac" - } - ], - "results": [ - { - "item": "minecraft:magenta_dye", - "count": 3 - }, - { - "item": "minecraft:magenta_dye", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:purple_dye", - "count": 1, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/lily_of_the_valley.json b/src/main/resources/data/create/recipes/milling/lily_of_the_valley.json deleted file mode 100644 index 2d307e8ed..000000000 --- a/src/main/resources/data/create/recipes/milling/lily_of_the_valley.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:lily_of_the_valley" - } - ], - "results": [ - { - "item": "minecraft:white_dye", - "count": 2 - }, - { - "item": "minecraft:lime_dye", - "count": 1, - "chance": 0.1 - }, - { - "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/milling/orange_tulip.json b/src/main/resources/data/create/recipes/milling/orange_tulip.json deleted file mode 100644 index d278a5f9c..000000000 --- a/src/main/resources/data/create/recipes/milling/orange_tulip.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:orange_tulip" - } - ], - "results": [ - { - "item": "minecraft:orange_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/milling/oxeye_daisy.json b/src/main/resources/data/create/recipes/milling/oxeye_daisy.json deleted file mode 100644 index a6641508d..000000000 --- a/src/main/resources/data/create/recipes/milling/oxeye_daisy.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:oxeye_daisy" - } - ], - "results": [ - { - "item": "minecraft:light_gray_dye", - "count": 2 - }, - { - "item": "minecraft:white_dye", - "count": 1, - "chance": 0.2 - }, - { - "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/milling/peony.json b/src/main/resources/data/create/recipes/milling/peony.json deleted file mode 100644 index 4b031eaaa..000000000 --- a/src/main/resources/data/create/recipes/milling/peony.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:peony" - } - ], - "results": [ - { - "item": "minecraft:pink_dye", - "count": 3 - }, - { - "item": "minecraft:magenta_dye", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:pink_dye", - "count": 1, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/pink_tulip.json b/src/main/resources/data/create/recipes/milling/pink_tulip.json deleted file mode 100644 index 003408e10..000000000 --- a/src/main/resources/data/create/recipes/milling/pink_tulip.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:pink_tulip" - } - ], - "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/milling/poppy.json b/src/main/resources/data/create/recipes/milling/poppy.json deleted file mode 100644 index c34ddfdcc..000000000 --- a/src/main/resources/data/create/recipes/milling/poppy.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:poppy" - } - ], - "results": [ - { - "item": "minecraft:red_dye", - "count": 2 - }, - { - "item": "minecraft:green_dye", - "count": 1, - "chance": 0.05 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/red_tulip.json b/src/main/resources/data/create/recipes/milling/red_tulip.json deleted file mode 100644 index 43287b4bc..000000000 --- a/src/main/resources/data/create/recipes/milling/red_tulip.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:red_tulip" - } - ], - "results": [ - { - "item": "minecraft:red_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/milling/rose_bush.json b/src/main/resources/data/create/recipes/milling/rose_bush.json deleted file mode 100644 index 97f5a0f18..000000000 --- a/src/main/resources/data/create/recipes/milling/rose_bush.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:rose_bush" - } - ], - "results": [ - { - "item": "minecraft:red_dye", - "count": 3 - }, - { - "item": "minecraft:green_dye", - "count": 2, - "chance": 0.05 - }, - { - "item": "minecraft:red_dye", - "count": 2, - "chance": 0.25 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/saddle.json b/src/main/resources/data/create/recipes/milling/saddle.json deleted file mode 100644 index 3569880d6..000000000 --- a/src/main/resources/data/create/recipes/milling/saddle.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:saddle" - } - ], - "results": [ - { - "item": "minecraft:leather", - "count": 3 - }, - { - "item": "minecraft:leather", - "count": 2, - "chance": 0.5 - }, - { - "item": "minecraft:iron_nugget", - "count": 8, - "chance": 0.25 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/sand.json b/src/main/resources/data/create/recipes/milling/sand.json deleted file mode 100644 index acf76e900..000000000 --- a/src/main/resources/data/create/recipes/milling/sand.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:sand" - } - ], - "results": [ - { - "item": "create:limesand", - "count": 1 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/sugar_cane.json b/src/main/resources/data/create/recipes/milling/sugar_cane.json deleted file mode 100644 index f19d0a759..000000000 --- a/src/main/resources/data/create/recipes/milling/sugar_cane.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:sugar_cane" - } - ], - "results": [ - { - "item": "minecraft:sugar", - "count": 2 - }, - { - "item": "minecraft:sugar", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/sunflower.json b/src/main/resources/data/create/recipes/milling/sunflower.json deleted file mode 100644 index 8efe6a137..000000000 --- a/src/main/resources/data/create/recipes/milling/sunflower.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:sunflower" - } - ], - "results": [ - { - "item": "minecraft:yellow_dye", - "count": 3 - }, - { - "item": "minecraft:yellow_dye", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:orange_dye", - "count": 1, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/tall_grass.json b/src/main/resources/data/create/recipes/milling/tall_grass.json deleted file mode 100644 index 238806a21..000000000 --- a/src/main/resources/data/create/recipes/milling/tall_grass.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:tall_grass" - } - ], - "results": [ - { - "item": "minecraft:wheat_seeds", - "count": 2, - "chance": 0.25 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/terracotta.json b/src/main/resources/data/create/recipes/milling/terracotta.json deleted file mode 100644 index 807eeae8f..000000000 --- a/src/main/resources/data/create/recipes/milling/terracotta.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:terracotta" - } - ], - "results": [ - { - "item": "minecraft:red_sand", - "count": 1 - } - ], - "processingTime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/wheat.json b/src/main/resources/data/create/recipes/milling/wheat.json deleted file mode 100644 index 897449075..000000000 --- a/src/main/resources/data/create/recipes/milling/wheat.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:wheat" - } - ], - "results": [ - { - "item": "create:wheat_flour", - "count": 1 - }, - { - "item": "create:wheat_flour", - "count": 2, - "chance": 0.25 - }, - { - "item": "minecraft:wheat_seeds", - "count": 1, - "chance": 0.25 - } - ], - "processingTime": 150 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/white_tulip.json b/src/main/resources/data/create/recipes/milling/white_tulip.json deleted file mode 100644 index 838e2eeec..000000000 --- a/src/main/resources/data/create/recipes/milling/white_tulip.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:white_tulip" - } - ], - "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/milling/wither_rose.json b/src/main/resources/data/create/recipes/milling/wither_rose.json deleted file mode 100644 index 87f1a6cc5..000000000 --- a/src/main/resources/data/create/recipes/milling/wither_rose.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "item": "minecraft:wither_rose" - } - ], - "results": [ - { - "item": "minecraft:black_dye", - "count": 2 - }, - { - "item": "minecraft:black_dye", - "count": 1, - "chance": 0.1 - } - ], - "processingTime": 50 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/wool.json b/src/main/resources/data/create/recipes/milling/wool.json deleted file mode 100644 index 26f95f7be..000000000 --- a/src/main/resources/data/create/recipes/milling/wool.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "tag": "minecraft:wool" - } - ], - "results": [ - { - "item": "minecraft:string", - "count": 1 - } - ], - "processingTime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/milling/zinc_ore.json b/src/main/resources/data/create/recipes/milling/zinc_ore.json deleted file mode 100644 index a3e869f80..000000000 --- a/src/main/resources/data/create/recipes/milling/zinc_ore.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:milling", - "ingredients": [ - { - "tag": "forge:ores/zinc" - } - ], - "results": [ - { - "item": "create:crushed_zinc_ore", - "count": 1 - } - ], - "processingTime": 350 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/andesite_alloy.json b/src/main/resources/data/create/recipes/mixing/andesite_alloy.json deleted file mode 100644 index 3378d4cb0..000000000 --- a/src/main/resources/data/create/recipes/mixing/andesite_alloy.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "item": "minecraft:andesite" - }, - { - "tag": "forge:nuggets/iron" - } - ], - "results": [ - { - "item": "create:andesite_alloy", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/andesite_alloy_1.json b/src/main/resources/data/create/recipes/mixing/andesite_alloy_1.json deleted file mode 100644 index 80f7e589b..000000000 --- a/src/main/resources/data/create/recipes/mixing/andesite_alloy_1.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "item": "minecraft:andesite" - }, - { - "tag": "forge:nuggets/zinc" - } - ], - "results": [ - { - "item": "create:andesite_alloy", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/brass_ingot.json b/src/main/resources/data/create/recipes/mixing/brass_ingot.json deleted file mode 100644 index 3a2e2f3d1..000000000 --- a/src/main/resources/data/create/recipes/mixing/brass_ingot.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "tag": "forge:ingots/copper" - }, - { - "tag": "forge:ingots/zinc" - } - ], - "results": [ - { - "item": "create:brass_ingot", - "count": 2 - } - ], - "requiredHeat": 3 -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/brass_nugget.json b/src/main/resources/data/create/recipes/mixing/brass_nugget.json deleted file mode 100644 index 60210f795..000000000 --- a/src/main/resources/data/create/recipes/mixing/brass_nugget.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "tag": "forge:nuggets/copper" - }, - { - "tag": "forge:nuggets/zinc" - }, - { - "item": "minecraft:blaze_rod", - "return_chance": 0.97 - } - ], - "results": [ - { - "item": "create:brass_nugget", - "count": 2 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/chromatic_compound.json b/src/main/resources/data/create/recipes/mixing/chromatic_compound.json deleted file mode 100644 index 8879c142b..000000000 --- a/src/main/resources/data/create/recipes/mixing/chromatic_compound.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "tag": "forge:dusts/glowstone", - "count": 3 - }, - { - "item": "create:polished_rose_quartz" - }, - { - "item": "create:powdered_obsidian", - "count": 3 - }, - { - "item": "minecraft:dragon_breath", - "return_chance": 0.94 - } - ], - "results": [ - { - "item": "create:chromatic_compound", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/crushed_brass.json b/src/main/resources/data/create/recipes/mixing/crushed_brass.json deleted file mode 100644 index 7fb0cfa20..000000000 --- a/src/main/resources/data/create/recipes/mixing/crushed_brass.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "item": "create:crushed_copper_ore" - }, - { - "item": "create:crushed_zinc_ore" - }, - { - "item": "minecraft:blaze_rod", - "return_chance": 0.94 - } - ], - "results": [ - { - "item": "create:crushed_brass", - "count": 2 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/mixing/gunpowder.json b/src/main/resources/data/create/recipes/mixing/gunpowder.json deleted file mode 100644 index c127184c3..000000000 --- a/src/main/resources/data/create/recipes/mixing/gunpowder.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "create:mixing", - "ingredients": [ - { - "tag": "minecraft:coals" - }, - { - "item": "create:crushed_zinc_ore" - }, - { - "item": "minecraft:gunpowder" - }, - { - "item": "minecraft:blaze_powder", - "return_chance": 0.75 - } - ], - "results": [ - { - "item": "minecraft:gunpowder", - "count": 2 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/brass_ingot.json b/src/main/resources/data/create/recipes/pressing/brass_ingot.json deleted file mode 100644 index 9e50f6613..000000000 --- a/src/main/resources/data/create/recipes/pressing/brass_ingot.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "tag": "forge:ingots/brass" - } - ], - "results": [ - { - "item": "create:brass_sheet", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/copper_ingot.json b/src/main/resources/data/create/recipes/pressing/copper_ingot.json deleted file mode 100644 index b0dc3987e..000000000 --- a/src/main/resources/data/create/recipes/pressing/copper_ingot.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "tag": "forge:ingots/copper" - } - ], - "results": [ - { - "item": "create:copper_sheet", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/gold_ingot.json b/src/main/resources/data/create/recipes/pressing/gold_ingot.json deleted file mode 100644 index 5dcef9d3a..000000000 --- a/src/main/resources/data/create/recipes/pressing/gold_ingot.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "tag": "forge:ingots/gold" - } - ], - "results": [ - { - "item": "create:golden_sheet", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/iron_ingot.json b/src/main/resources/data/create/recipes/pressing/iron_ingot.json deleted file mode 100644 index d16c3c254..000000000 --- a/src/main/resources/data/create/recipes/pressing/iron_ingot.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "tag": "forge:ingots/iron" - } - ], - "results": [ - { - "item": "create:iron_sheet", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/lapis_block.json b/src/main/resources/data/create/recipes/pressing/lapis_block.json deleted file mode 100644 index af23670cd..000000000 --- a/src/main/resources/data/create/recipes/pressing/lapis_block.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "item": "minecraft:lapis_block" - } - ], - "results": [ - { - "item": "create:lapis_sheet", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/pressing/sugar_cane.json b/src/main/resources/data/create/recipes/pressing/sugar_cane.json deleted file mode 100644 index c9dc82f8a..000000000 --- a/src/main/resources/data/create/recipes/pressing/sugar_cane.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:pressing", - "ingredients": [ - { - "item": "minecraft:sugar_cane" - } - ], - "results": [ - { - "item": "minecraft:paper", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json b/src/main/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json deleted file mode 100644 index 344b731aa..000000000 --- a/src/main/resources/data/create/recipes/sandpaper_polishing/rose_quartz.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:sandpaper_polishing", - "ingredients": [ - { - "item": "create:rose_quartz" - } - ], - "results": [ - { - "item": "create:polished_rose_quartz", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/black_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/black_concrete_powder.json deleted file mode 100644 index 547a13409..000000000 --- a/src/main/resources/data/create/recipes/splashing/black_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:black_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:black_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/blue_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/blue_concrete_powder.json deleted file mode 100644 index e08f79443..000000000 --- a/src/main/resources/data/create/recipes/splashing/blue_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:blue_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:blue_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/brown_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/brown_concrete_powder.json deleted file mode 100644 index 9f2cc1240..000000000 --- a/src/main/resources/data/create/recipes/splashing/brown_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:brown_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:brown_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/bucket.json b/src/main/resources/data/create/recipes/splashing/bucket.json deleted file mode 100644 index f9a9ef937..000000000 --- a/src/main/resources/data/create/recipes/splashing/bucket.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:bucket" - } - ], - "results": [ - { - "item": "minecraft:water_bucket", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/crushed_brass.json b/src/main/resources/data/create/recipes/splashing/crushed_brass.json deleted file mode 100644 index 7fee39a22..000000000 --- a/src/main/resources/data/create/recipes/splashing/crushed_brass.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:crushed_brass" - } - ], - "results": [ - { - "item": "create:brass_nugget", - "count": 10, - "chance": 1 - }, - { - "item": "create:brass_nugget", - "count": 5, - "chance": 0.5 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/crushed_copper.json b/src/main/resources/data/create/recipes/splashing/crushed_copper.json deleted file mode 100644 index 7da8d0821..000000000 --- a/src/main/resources/data/create/recipes/splashing/crushed_copper.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:crushed_copper_ore" - } - ], - "results": [ - { - "item": "create:copper_nugget", - "count": 10, - "chance": 1 - }, - { - "item": "create:copper_nugget", - "count": 5, - "chance": 0.5 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/crushed_gold.json b/src/main/resources/data/create/recipes/splashing/crushed_gold.json deleted file mode 100644 index 96b49d7f6..000000000 --- a/src/main/resources/data/create/recipes/splashing/crushed_gold.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:crushed_gold_ore" - } - ], - "results": [ - { - "item": "minecraft:gold_nugget", - "count": 10, - "chance": 1 - }, - { - "item": "minecraft:gold_nugget", - "count": 5, - "chance": 0.5 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/crushed_iron.json b/src/main/resources/data/create/recipes/splashing/crushed_iron.json deleted file mode 100644 index 1d8a1d3d7..000000000 --- a/src/main/resources/data/create/recipes/splashing/crushed_iron.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:crushed_iron_ore" - } - ], - "results": [ - { - "item": "minecraft:iron_nugget", - "count": 10, - "chance": 1 - }, - { - "item": "minecraft:iron_nugget", - "count": 5, - "chance": 0.5 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/crushed_zinc.json b/src/main/resources/data/create/recipes/splashing/crushed_zinc.json deleted file mode 100644 index 2f00f2ae0..000000000 --- a/src/main/resources/data/create/recipes/splashing/crushed_zinc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:crushed_zinc_ore" - } - ], - "results": [ - { - "item": "create:zinc_nugget", - "count": 10, - "chance": 1 - }, - { - "item": "create:zinc_nugget", - "count": 5, - "chance": 0.5 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/cyan_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/cyan_concrete_powder.json deleted file mode 100644 index 40b028b17..000000000 --- a/src/main/resources/data/create/recipes/splashing/cyan_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:cyan_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:cyan_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/flour.json b/src/main/resources/data/create/recipes/splashing/flour.json deleted file mode 100644 index dfd6f18ea..000000000 --- a/src/main/resources/data/create/recipes/splashing/flour.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:wheat_flour" - } - ], - "results": [ - { - "item": "create:dough", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/gravel.json b/src/main/resources/data/create/recipes/splashing/gravel.json deleted file mode 100644 index e98763af1..000000000 --- a/src/main/resources/data/create/recipes/splashing/gravel.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:gravel" - } - ], - "results": [ - { - "item": "minecraft:flint", - "count": 1, - "chance": 0.25 - }, - { - "item": "minecraft:iron_nugget", - "count": 1, - "chance": 0.125 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/gray_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/gray_concrete_powder.json deleted file mode 100644 index 88fba5b2a..000000000 --- a/src/main/resources/data/create/recipes/splashing/gray_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:gray_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:gray_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/green_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/green_concrete_powder.json deleted file mode 100644 index 04e2cedb4..000000000 --- a/src/main/resources/data/create/recipes/splashing/green_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:green_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:green_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/ice.json b/src/main/resources/data/create/recipes/splashing/ice.json deleted file mode 100644 index 562e5fc77..000000000 --- a/src/main/resources/data/create/recipes/splashing/ice.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:ice" - } - ], - "results": [ - { - "item": "minecraft:packed_ice", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/light_blue_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/light_blue_concrete_powder.json deleted file mode 100644 index f87e3ec71..000000000 --- a/src/main/resources/data/create/recipes/splashing/light_blue_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:light_blue_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:light_blue_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/light_gray_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/light_gray_concrete_powder.json deleted file mode 100644 index 561c42a6f..000000000 --- a/src/main/resources/data/create/recipes/splashing/light_gray_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:light_gray_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:light_gray_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/lime_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/lime_concrete_powder.json deleted file mode 100644 index a7f3cb041..000000000 --- a/src/main/resources/data/create/recipes/splashing/lime_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:lime_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:lime_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/limestone.json b/src/main/resources/data/create/recipes/splashing/limestone.json deleted file mode 100644 index 09dcce315..000000000 --- a/src/main/resources/data/create/recipes/splashing/limestone.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "create:limestone" - } - ], - "results": [ - { - "item": "create:weathered_limestone", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/magenta_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/magenta_concrete_powder.json deleted file mode 100644 index 25ca2eb01..000000000 --- a/src/main/resources/data/create/recipes/splashing/magenta_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:magenta_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:magenta_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/magma_block.json b/src/main/resources/data/create/recipes/splashing/magma_block.json deleted file mode 100644 index a03a71865..000000000 --- a/src/main/resources/data/create/recipes/splashing/magma_block.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:magma_block" - } - ], - "results": [ - { - "item": "minecraft:obsidian", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/orange_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/orange_concrete_powder.json deleted file mode 100644 index c7645f475..000000000 --- a/src/main/resources/data/create/recipes/splashing/orange_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:orange_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:orange_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/pink_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/pink_concrete_powder.json deleted file mode 100644 index e38aedcc4..000000000 --- a/src/main/resources/data/create/recipes/splashing/pink_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:pink_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:pink_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/purple_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/purple_concrete_powder.json deleted file mode 100644 index 93b9acfcd..000000000 --- a/src/main/resources/data/create/recipes/splashing/purple_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:purple_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:purple_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/red_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/red_concrete_powder.json deleted file mode 100644 index 81db74b48..000000000 --- a/src/main/resources/data/create/recipes/splashing/red_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:red_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:red_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/red_sand.json b/src/main/resources/data/create/recipes/splashing/red_sand.json deleted file mode 100644 index b1b51d8d9..000000000 --- a/src/main/resources/data/create/recipes/splashing/red_sand.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:red_sand" - } - ], - "results": [ - { - "item": "minecraft:gold_nugget", - "count": 3, - "chance": 0.125 - }, - { - "item": "minecraft:dead_bush", - "count": 1, - "chance": 0.05 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/sand.json b/src/main/resources/data/create/recipes/splashing/sand.json deleted file mode 100644 index 6be1af521..000000000 --- a/src/main/resources/data/create/recipes/splashing/sand.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:sand" - } - ], - "results": [ - { - "item": "minecraft:clay_ball", - "count": 1, - "chance": 0.25 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/soul_sand.json b/src/main/resources/data/create/recipes/splashing/soul_sand.json deleted file mode 100644 index 020073dc2..000000000 --- a/src/main/resources/data/create/recipes/splashing/soul_sand.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:soul_sand" - } - ], - "results": [ - { - "item": "minecraft:quartz", - "count": 4, - "chance": 0.125 - }, - { - "item": "minecraft:gold_nugget", - "count": 1, - "chance": 0.02 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/stained_glass.json b/src/main/resources/data/create/recipes/splashing/stained_glass.json deleted file mode 100644 index 54151c62c..000000000 --- a/src/main/resources/data/create/recipes/splashing/stained_glass.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "tag": "forge:stained_glass" - } - ], - "results": [ - { - "item": "minecraft:glass", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/stained_glass_pane.json b/src/main/resources/data/create/recipes/splashing/stained_glass_pane.json deleted file mode 100644 index 056c4a752..000000000 --- a/src/main/resources/data/create/recipes/splashing/stained_glass_pane.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "tag": "forge:stained_glass_panes" - } - ], - "results": [ - { - "item": "minecraft:glass_pane", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/white_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/white_concrete_powder.json deleted file mode 100644 index c10a89d80..000000000 --- a/src/main/resources/data/create/recipes/splashing/white_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:white_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:white_concrete", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/wool.json b/src/main/resources/data/create/recipes/splashing/wool.json deleted file mode 100644 index 664136bfc..000000000 --- a/src/main/resources/data/create/recipes/splashing/wool.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "tag": "minecraft:wool" - } - ], - "results": [ - { - "item": "minecraft:white_wool", - "count": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/splashing/yellow_concrete_powder.json b/src/main/resources/data/create/recipes/splashing/yellow_concrete_powder.json deleted file mode 100644 index c68141de8..000000000 --- a/src/main/resources/data/create/recipes/splashing/yellow_concrete_powder.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:splashing", - "ingredients": [ - { - "item": "minecraft:yellow_concrete_powder" - } - ], - "results": [ - { - "item": "minecraft:yellow_concrete", - "count": 1 - } - ] -} \ No newline at end of file