diff --git a/gradle.properties b/gradle.properties index 84b352f70..6cab69184 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,5 +49,5 @@ almost_unified_version_range=[0.5.0,) geckolib_minecraft_version=1.20.4 geckolib_version=4.4.1 geckolib_version_range=[4.4.1,) -jade_version=13.2.2 -jade_version_range=[13.2.2,) \ No newline at end of file +jade_version=13.3.1 +jade_version_range=[13.3.1,) \ No newline at end of file diff --git a/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 b/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 index 34fc4f365..cdd91c8b3 100644 --- a/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 +++ b/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 @@ -1,7 +1,8 @@ -// 1.20.4 2024-04-14T18:38:22.7843669 Books: theurgy +// 1.20.4 2024-05-25T18:48:43.8788015 Books: theurgy 945f222b9db8c0781d05b5a13138c18620a0edc3 data/theurgy/modonomicon/books/the_hermetica/book.json f44f61550bc8611d61016c6476b88448c0fe9f00 data/theurgy/modonomicon/books/the_hermetica/categories/apparatus.json 49226efd8791cdb701bf00d7af65fff59b8c6df6 data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json +895551b2369eeed52d75cd7b057a97411eb2e5c9 data/theurgy/modonomicon/books/the_hermetica/categories/logistics.json a64ca5b23a0ad5dcc7eab9bb3182882013665ebd data/theurgy/modonomicon/books/the_hermetica/entries/apparatus/calcination_oven.json 5e015ded9416e1151342e4546cef7e645bd69c4f data/theurgy/modonomicon/books/the_hermetica/entries/apparatus/caloric_flux_emitter.json af4cf1fa34b4b568cd982c7227f59abcbbdf69c3 data/theurgy/modonomicon/books/the_hermetica/entries/apparatus/digestion_vat.json @@ -71,3 +72,11 @@ a05ddad64d7310137f8e0c9e24c9d4f32dbd71ec data/theurgy/modonomicon/books/the_herm 9ac8ff0a1648608e2aa70f26b19c7d96dd1b72dd data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t3_divination_rod.json 3f5cbd20d3bfb15a5db03b513b4813affbbe6dab data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t4_divination_rod.json 5fef9e79b194b44816e2cc923ae2fc479cf6fbdb data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/target_pedestal.json +4b705afe8108388f7e6dac1ef8ee6d14b5143508 data/theurgy/modonomicon/books/the_hermetica/entries/logistics/connection_node.json +35730f4fc3fee8c9e75ae87360ff7942d5d74e2e data/theurgy/modonomicon/books/the_hermetica/entries/logistics/intro.json +d50780fd0ed77eaa4753d3480fd552658e500858 data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_extractor.json +2d1c938c4e6d20865a49766c0f0cae4db6172aa8 data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_inserter.json +b8fadbbc07cc624b35b88989468dfde6cf2eea18 data/theurgy/modonomicon/books/the_hermetica/entries/logistics/logistics_network.json +bd201495ea88e236f1c72d59449b30c0e5072ae3 data/theurgy/modonomicon/books/the_hermetica/entries/logistics/lore.json +8c3e06c5203c3d224e01b00158b8d696d2b93cbe data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wand.json +88f320e5fd8c1e1d8850e88ab2eb26ed52da447e data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wire.json diff --git a/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc b/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc index f31e7c56d..cb778d0cc 100644 --- a/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc +++ b/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc @@ -1,16 +1,16 @@ -// 1.20.4 2024-01-17T16:43:37.1608791 Calcination Recipes -1ab868373c59c0179ba18c2b629bc3766d9857de data/theurgy/recipes/calcination/crops.json -15b0bc231284fa27e47c3bb3108c2f6218748e21 data/theurgy/recipes/calcination/mineral.json -8adcc3b4d5a73b1cf38a8e629583003d6474194d data/theurgy/recipes/calcination/mineral_from_gems.json -6fc7816baf3b28de2306dff442c9098585bbcbb2 data/theurgy/recipes/calcination/mineral_from_ingots.json -2849dc9c50f65dcb17818f14a231e73b492a3d9b data/theurgy/recipes/calcination/mineral_from_ores.json -065a0ddeeea4b53e3967302f1a99a262951f3700 data/theurgy/recipes/calcination/mineral_from_other_minerals.json -6dc5fde49b7c755176890d7c0eea01f4865726e3 data/theurgy/recipes/calcination/mineral_from_raw_materials.json -aa1410bfe3153eb4771c826d60a2bedf12321fb9 data/theurgy/recipes/calcination/strata_from_clay.json -52fa2c468144c8663fdb758092a92e9087686ce5 data/theurgy/recipes/calcination/strata_from_clay_ball.json -8ba80f78a2fe582084f130ce8979d2583ea49fbf data/theurgy/recipes/calcination/strata_from_cobblestone.json -d751dedd16dd885d13cb0105b6adef5e6e0d1c38 data/theurgy/recipes/calcination/strata_from_dirt.json -f1003cfb6b2baa186452fb7f96c40417650f4951 data/theurgy/recipes/calcination/strata_from_gravel.json -fbabb73eb03e7b0dba51f405685628a44f1b85f7 data/theurgy/recipes/calcination/strata_from_sand.json -4a1c1555c53341e1b7927bf0a34bed2f0793a7cb data/theurgy/recipes/calcination/strata_from_sandstone.json -fa3bf7b443e9d80e94fa69ab0e255cc1704ce79d data/theurgy/recipes/calcination/strata_from_stone.json +// 1.20.4 2024-05-25T13:38:47.7936853 Calcination Recipes +bf2f7ab6aa2aad16c35ef79bdc255fe4b6ff4404 data/theurgy/recipes/calcination/crops.json +39c1b59033b2f9587873bb53bcf47dd7de5c8cfc data/theurgy/recipes/calcination/mineral.json +ec3ffca30544465cb45de3dfb37424586832668a data/theurgy/recipes/calcination/mineral_from_gems.json +d34c225c052338b1501bcbd21e043231ac44f7f7 data/theurgy/recipes/calcination/mineral_from_ingots.json +b07344a18bbda6b38d70991a97148a255dbb7a18 data/theurgy/recipes/calcination/mineral_from_ores.json +5d47d2529cb79f3f62fa2159fccce5f0c28f1d4f data/theurgy/recipes/calcination/mineral_from_other_minerals.json +51f6237a8c17977cd15997e803a4e978e8d1d036 data/theurgy/recipes/calcination/mineral_from_raw_materials.json +a82594b79405cbc12e26262c3d5fe18130d61e68 data/theurgy/recipes/calcination/strata_from_clay.json +2afba9157ca93d0be647a5b26053d198d40601e5 data/theurgy/recipes/calcination/strata_from_clay_ball.json +0e62f8e438f8a1fa1fa48a6187fa8c484c00aeaa data/theurgy/recipes/calcination/strata_from_cobblestone.json +43616593ea63d7084241129deb36a3c73db08ce4 data/theurgy/recipes/calcination/strata_from_dirt.json +21d88699cbff100e85eb3d4e6cdc7c8c45c81fa4 data/theurgy/recipes/calcination/strata_from_gravel.json +e1f604548adf81e5ab8edeff92d309bfcce31a06 data/theurgy/recipes/calcination/strata_from_sand.json +f69c12741f0e9caf5a708d900f83df39d04d8802 data/theurgy/recipes/calcination/strata_from_sandstone.json +ba46b01764d94e57c7a7973da74e4cd57679fad1 data/theurgy/recipes/calcination/strata_from_stone.json diff --git a/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 b/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 index e1170f665..b33c68b13 100644 --- a/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 +++ b/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 @@ -1,4 +1,4 @@ -// 1.20.4 2024-01-29T10:24:54.8834977 Block States: theurgy +// 1.20.4 2024-05-11T09:59:44.5162451 Block States: theurgy ef875fc2604f4f19d7604536c66d3d2c26163879 assets/theurgy/blockstates/calcination_oven.json fa912507f89d2fe9ac05c8b057aed16d83f0d96c assets/theurgy/blockstates/caloric_flux_emitter.json 92ebf87f417e3426f30d3e42eeafd933e446eb23 assets/theurgy/blockstates/deepslate_sal_ammoniac_ore.json @@ -10,6 +10,9 @@ efc838dc92770522219889024bec42cc52fb93bd assets/theurgy/blockstates/distiller.js 08bfb53e16229544b84ea69caac5d11239d3c8b0 assets/theurgy/blockstates/incubator_salt_vessel.json 08bfb53e16229544b84ea69caac5d11239d3c8b0 assets/theurgy/blockstates/incubator_sulfur_vessel.json 05305f7086817341ef70a4df92bf81a24bb0b6da assets/theurgy/blockstates/liquefaction_cauldron.json +502d977970aa2a320387c75413a4b2b9254bbe26 assets/theurgy/blockstates/logistics_connector_node.json +7347dbc7dd83145c38f3e5bc374920d3c8025274 assets/theurgy/blockstates/logistics_item_extractor.json +f8a265a1be1d58e5e7533714bfe5f539919449a0 assets/theurgy/blockstates/logistics_item_inserter.json f072de10fd9407a439ba626f1208b6707d0f20c9 assets/theurgy/blockstates/mercury_catalyst.json e94d251a012694f4b0bc2925acbc4ee418cacf10 assets/theurgy/blockstates/pyromantic_brazier.json 7f204750a76eb11c6e58b05b027784947214ec60 assets/theurgy/blockstates/reformation_result_pedestal.json @@ -32,6 +35,9 @@ ca16a8ebdf82f8f110050978885ae52f50c774e8 assets/theurgy/models/block/incubator_u c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/incubator_vessel.json 1144aa12cc110991e79d9c636180b33178a26f2f assets/theurgy/models/block/liquefaction_cauldron_lower.json c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/liquefaction_cauldron_upper.json +7ad3c0d9d3c704cb7208e0956cfcdb3e49d71df0 assets/theurgy/models/block/logistics_connection_node.json +5621fe9d75475395410c06019a14ba77b6e97e14 assets/theurgy/models/block/logistics_item_extractor.json +86e79ecfb261db3b4f75a62a62de33a29252f375 assets/theurgy/models/block/logistics_item_inserter.json b409c8a9f0cf680d9b409e9d9dcef1a73e9c0948 assets/theurgy/models/block/mercury_catalyst.json 52afb4cf68605f9a482f6332b02f523a81b74168 assets/theurgy/models/block/pyromantic_brazier.json 90588f4755497f3c8df737fd06b92d33ff4d0542 assets/theurgy/models/block/pyromantic_brazier_lit.json @@ -53,6 +59,9 @@ e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_me e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_salt_vessel.json e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_sulfur_vessel.json 7452e23d15a4905caefbd048ff18482ccaab75c2 assets/theurgy/models/item/liquefaction_cauldron.json +d99e0febb52b282cab05da0d77aa66ad0ff7f2dc assets/theurgy/models/item/logistics_connector_node.json +16a006ef1b6e6bb0681e57ae1870c13b8e4978b4 assets/theurgy/models/item/logistics_item_extractor.json +74cf9047bf1f6b23a205a95f82e4ee6de943c869 assets/theurgy/models/item/logistics_item_inserter.json a3ce5b4c6144d76177427a7b1939fc3963811d05 assets/theurgy/models/item/mercury_catalyst.json 0040a92c6a948e59b36cb138ba297ede4435095c assets/theurgy/models/item/pyromantic_brazier.json 77cd62380c99d54eb54ce8573131e3a1150a9bea assets/theurgy/models/item/reformation_result_pedestal.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 324b11f5e..70af6366c 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.20.4 2024-01-16T15:38:38.1652169 Loot Tables +// 1.20.4 2024-05-11T10:50:26.5485353 Loot Tables 72c4014c4a8e846f945380a01c02fc8516e774d7 data/theurgy/loot_tables/blocks/calcination_oven.json b78ed93c8a746109ac27cbaf07f1d4979078ac50 data/theurgy/loot_tables/blocks/caloric_flux_emitter.json fd1d6c22b80bf3f1357dd9e23231ce1758e3799f data/theurgy/loot_tables/blocks/deepslate_sal_ammoniac_ore.json @@ -10,6 +10,9 @@ affc4e07fa5ea6f2710ba2f12a1ed95ff1f9a400 data/theurgy/loot_tables/blocks/incubat 5bb357c4c5616c30a5985da942447ae5108e4f8a data/theurgy/loot_tables/blocks/incubator_salt_vessel.json 83df72953dd0ffbd8bb793f6c3003f011fe7b31c data/theurgy/loot_tables/blocks/incubator_sulfur_vessel.json 76df8364f6cb252e8cae7ad4f8586d87686843f4 data/theurgy/loot_tables/blocks/liquefaction_cauldron.json +befb1f76276418639b92a317bc135b73f385ef32 data/theurgy/loot_tables/blocks/logistics_connector_node.json +eab2938a4f87b5111215802411e190728c10cd73 data/theurgy/loot_tables/blocks/logistics_item_extractor.json +1615ae8d2662ddf052afdfdb2a9fa1530d54fd8a data/theurgy/loot_tables/blocks/logistics_item_inserter.json 3a8dda04dd5948b409faf4291422b07de8491cad data/theurgy/loot_tables/blocks/mercury_catalyst.json 548d06109872a2a9d7f8fbd451414f671be41c36 data/theurgy/loot_tables/blocks/pyromantic_brazier.json 497459c788db5863c058d22ed3873f21eeca8fd6 data/theurgy/loot_tables/blocks/reformation_result_pedestal.json diff --git a/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 b/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 index e849c4e86..5c2ad2050 100644 --- a/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 +++ b/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 @@ -1,3 +1,5 @@ -// 1.20.4 2024-01-16T15:38:38.1742182 Shapeless Crafting Recipes -cc984ff1635bde6101fa84b2261798fe4af68557 data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json -bd9adbc64c1dad493a909a3f4b90ac016757432c data/theurgy/recipes/crafting/shapeless/the_hermetica.json +// 1.20.4 2024-05-25T13:38:47.7947444 Shapeless Crafting Recipes +6017c308729d12b68a43e016207b272ce0b636a4 data/theurgy/recipes/crafting/shapeless/logistics_item_extractor_from_inserter.json +4a7e21b89d8e40928e19abe740839aaadd000921 data/theurgy/recipes/crafting/shapeless/logistics_item_inserter_from_extractor.json +2eabb44670401c8fd0b1ca254b9893de14f6b125 data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json +3fb7309b9ae4030f1a88b5a888a01be4a292e6cf data/theurgy/recipes/crafting/shapeless/the_hermetica.json diff --git a/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 b/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 index 6bce35446..a2baac498 100644 --- a/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 +++ b/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 @@ -1,29 +1,34 @@ -// 1.20.4 2024-01-16T15:45:43.5179659 Shaped Crafting Recipes -10616b9ecf4903d076f75f2b754a415125413d44 data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json -10238f21b147011c777703fc0ade32f5708fd6ad data/theurgy/recipes/crafting/shaped/calcination_oven.json -e31f43d1025bbbbe3ab7dbc9892e44cba7fdc0ab data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json -8f4a534c43c54d9602ff500158424e43f9534d9e data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json -ce6aa89549dd24c24159b9134951aeb7f31c62dc data/theurgy/recipes/crafting/shaped/digestion_vat.json -072f07fe72f4d544af641d052c894b0dfcb5a1b1 data/theurgy/recipes/crafting/shaped/distiller.json -23cc9ffeb1383e5fead6a158948b62eb5b3a2f97 data/theurgy/recipes/crafting/shaped/divination_rod_t1.json -b147e20c9fc286b8571f45aebd2cc845d12b80bd data/theurgy/recipes/crafting/shaped/divination_rod_t2.json -daad93aefa89912ae4a624f64b96e6106f5b32ed data/theurgy/recipes/crafting/shaped/divination_rod_t3.json -3f469caf98fa40c1dd36a6d73485cb32db5915b4 data/theurgy/recipes/crafting/shaped/divination_rod_t4.json -88c38cdce02224a470773430ba59d370847a9b5d data/theurgy/recipes/crafting/shaped/fermentation_vat.json -8141e9f1a1eccfcb5b4c476751830b2600a2cd80 data/theurgy/recipes/crafting/shaped/incubator.json -99dffd10149edf29f4e38f3714b7182906c069f4 data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json -55f6a8722640f08990360138a09768da6da1a072 data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json -f2f5b3c943abc56b299522e13e48d9dd45cc608f data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json -07f4c6dc7399b08687ef579a23091daaaeb481f7 data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json -fcb5ee591de6878bb39c43b57dc8357c2e8eff09 data/theurgy/recipes/crafting/shaped/mercury_catalyst.json -3c4bb4a4dd344b7d4cf2117d22125b0f47492423 data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json -f96af8d81404ab21a77a0e3ce5aa9bf966e7ee5d data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json -70c0e2db5e175d83a46382786612fc13a71bc635 data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json -ed951a3a8f9d5188c399ebb428f029a73470c87b data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json -d936646ef1c9e9a146bf63b3676cc3e338c4f253 data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json -a29b1881ae565d790b09ee568780627b7854e0fe data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json -f4812283601b1a4ecb2429835e9be2d50a8a4a45 data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json -447b0ae8e48b94342498e573e74f31835a60a98f data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json -6300e5cdd6946b5b3c4e9b746ffe89201eb8e76b data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json -d3b87c7161f73e481604a2948dff55ec783e4b97 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json -c63d699e861a6a5a1f98b30783c4c62967e54e00 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json +// 1.20.4 2024-05-25T13:59:30.5808876 Shaped Crafting Recipes +65adf9745631d64def2dcad201ebfd627f7d1f54 data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json +beeb9dcc0af3fee3db11bae63a00ca0b0847e81a data/theurgy/recipes/crafting/shaped/calcination_oven.json +de70910187e1db700fcbb06e774170b0f54186a5 data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json +f10b63402d9565c5536fad68c998a2c460e7bb80 data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json +37f3353bf6ff86f8ee64ab3af30ce9bf1f21ce07 data/theurgy/recipes/crafting/shaped/copper_wire.json +655b9cf0ee6a23fb553a6894bd0554d303e4d00a data/theurgy/recipes/crafting/shaped/digestion_vat.json +415d5f0ecad980e5f54c1852974e6736dd9fa1bb data/theurgy/recipes/crafting/shaped/distiller.json +921cefdf1ac2f487f4784dab35990864a49ab98a data/theurgy/recipes/crafting/shaped/divination_rod_t1.json +6c010e0f6410098e65f5f9d2443563be9eac4364 data/theurgy/recipes/crafting/shaped/divination_rod_t2.json +c37acacfce0d45724c3551d06c3f4dfd58d67132 data/theurgy/recipes/crafting/shaped/divination_rod_t3.json +b35dcc656b28f8561a6fbd117de588377ab8a317 data/theurgy/recipes/crafting/shaped/divination_rod_t4.json +6a149cb61c6b59590ab5472946eef4b6feca1568 data/theurgy/recipes/crafting/shaped/fermentation_vat.json +e7f45eb1b7b9b57582cdfa98b50046a2d4d3861c data/theurgy/recipes/crafting/shaped/incubator.json +12bcfeb8ae4e8ad04f8c7dc5617d8851f3397c09 data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json +2a5b69ce0e29618a636e589834986eccce956a29 data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json +e99098bfd0887c4f43cb99dde1452b606d8e8d3d data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json +75819834a8823a42874b5b66d0ecf3eb9e235adc data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json +6b8bedd96a9311601374e6b8a56acdd1b38a4394 data/theurgy/recipes/crafting/shaped/logistics_connector_node.json +2455fc2a33a54b406575f477be589563688c5a77 data/theurgy/recipes/crafting/shaped/logistics_item_extractor.json +19fe7c9dda2cceeadf7b79d8b1c7e63c291731e5 data/theurgy/recipes/crafting/shaped/logistics_item_inserter.json +6fadba46429947db8e894b1f63afb0e1ef1d4693 data/theurgy/recipes/crafting/shaped/mercurial_wand.json +85b82930854b94e946bd26c03e4590ca3bb199af data/theurgy/recipes/crafting/shaped/mercury_catalyst.json +7d2334397096083e881438fcc2bca336cbba7787 data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json +dfa144c70999a57909f839b09624652ffd753460 data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json +77b224370e76cd59d99c679a7d2e127464283a6b data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json +ef3262cd7439a728f39dc1d012f8a34c4e41abd0 data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json +841fd592bc9dd4af552c2bb503cff80d1cd0f4d1 data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json +057dbdb4e2e532cfdbacad922a3bf880f12d51bf data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json +6a8f9bf88bb463844f869ba9e848eac73a2691a1 data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json +2b69863e1a4ea19a7bececf9bc205f6b01b2a877 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json +bccf3fd33fa05e1ddf8d1883651a0b427c8877ef data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json +6780b34b1f3fa7a6d95ffb7ae21f6db09b53afe6 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json +86f714ec9bd46bbbe6954126ae3ce577b89bff34 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json diff --git a/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 b/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 index 292baebe0..00be0daaf 100644 --- a/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 +++ b/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 @@ -1,45 +1,45 @@ -// 1.20.4 2024-01-17T16:43:37.1618804 Distillation Recipes -a314f01964bee0ff7b0eddefbe792328ca5294cc data/theurgy/recipes/distillation/beef.json -8ff564f291f698d881f72234150317a244402d9a data/theurgy/recipes/distillation/bread.json -1b88f0483e97df016ac75ce7eeaf03faf875de67 data/theurgy/recipes/distillation/chicken.json -2d15950bd1d2b6fc1c3c548dbc211b0b154cb813 data/theurgy/recipes/distillation/cobblestone.json -2360438157c778b798c200d17f31048becefab87 data/theurgy/recipes/distillation/cod.json -ba90fc59c9070054f14007a885142404dbf0ad8c data/theurgy/recipes/distillation/cooked_beef.json -27a6058c29cea6d59143d413e8b68627f6db5af6 data/theurgy/recipes/distillation/cooked_chicken.json -d6ae362b35ae4308293269c3a3e2e9624d039e3b data/theurgy/recipes/distillation/cooked_cod.json -1b885ce2a3fb130e75e2db4fefa4d448c6721386 data/theurgy/recipes/distillation/cooked_porkchop.json -dc83ef6068ba5d0d5280c33cb476210eb7d65a36 data/theurgy/recipes/distillation/cooked_rabbit.json -5a384a9c82b93630e60d4f6a8a9cfe7d1e01268a data/theurgy/recipes/distillation/cooked_salmon.json -88e2274d052163ad94493bf349beb87b9b8c976a data/theurgy/recipes/distillation/crops.json -19be9b696bfbe52e1388c609f2501184b7b7f4ee data/theurgy/recipes/distillation/dirt.json -f2253e23f6a0933fe804ec370da99c45af64b692 data/theurgy/recipes/distillation/dyes.json -4058a4e3b50ba08edfa642be9ac2a67b616547b1 data/theurgy/recipes/distillation/flowers.json -55daa4f7414738abc732b8bd1ed255996b5caa19 data/theurgy/recipes/distillation/gems.mercury.high.json -a55aa2a69fe8d05beab1be5ee1e8a107a745f6e4 data/theurgy/recipes/distillation/gems.mercury.low.json -0cf28124446b5021a41598349758fe94f66b0f69 data/theurgy/recipes/distillation/gems.mercury.medium.json -263edd3d4c9693246f07ee6c1456235f8f7b1308 data/theurgy/recipes/distillation/glass.json -446a6638073dd87391a437bbfd3c7039c4162b4a data/theurgy/recipes/distillation/gravel.json -efb6577fed0b9400c32985bf455b468a6db50ac0 data/theurgy/recipes/distillation/leaves.json -dc408df253133726cbf42441e7d98d930d0e6ab5 data/theurgy/recipes/distillation/logs.json -7ad208ee90455a177acceafc276b95c47fbea49e data/theurgy/recipes/distillation/metals.mercury.high.json -a3339fe3d842d1100c37dd67f44fa495a43c2201 data/theurgy/recipes/distillation/metals.mercury.low.json -4d25768693a18967f55d83dd7687c9a482dcb24c data/theurgy/recipes/distillation/metals.mercury.medium.json -df80e2dfc45aa7ccc0dfa993298ec7ab4790a610 data/theurgy/recipes/distillation/ores.mercury.high.json -a5f1de9e0d4dff7a8ec3ed38bf846cb4aea0f401 data/theurgy/recipes/distillation/ores.mercury.low.json -5c0884daaa61d29a9f6ac7084d9fb3e05e1f376b data/theurgy/recipes/distillation/ores.mercury.medium.json -2dbfeab65f1693f08c54dcc8cd94ac46ea1533c6 data/theurgy/recipes/distillation/other_minerals.mercury.high.json -c3ea5b9a645a6229ab898f00a61582ba8016b2b3 data/theurgy/recipes/distillation/other_minerals.mercury.low.json -2e1cf8ba4c27d4eaeb2d51a9ce56f3ae4b6276d0 data/theurgy/recipes/distillation/other_minerals.mercury.medium.json -3b210d808c44f022e0efb5021f137e58aada2db5 data/theurgy/recipes/distillation/planks.json -9a955039236e3b75d076e9bee47f90afa2d4efc9 data/theurgy/recipes/distillation/porkchop.json -6e94c5c8176c939e691ed97f6247d3f7f92809bb data/theurgy/recipes/distillation/rabbit.json -2daeaaaf39353cc00c08dbd18f51d9554f0a2481 data/theurgy/recipes/distillation/raw_materials.mercury.high.json -84448a6c46e835edc6098f93ca40264d8da2de5e data/theurgy/recipes/distillation/raw_materials.mercury.low.json -844710ab3d5136dc4ce16aa86c77dbb8715efda9 data/theurgy/recipes/distillation/raw_materials.mercury.medium.json -a3aa688e922b39dbbcb0340df9ff414585503b9b data/theurgy/recipes/distillation/salmon.json -ff23e3858ad26d86554f738d757c6f85ab2742f6 data/theurgy/recipes/distillation/sand.json -18a48cb7ba661b20f37cf6657842ae964e5c4725 data/theurgy/recipes/distillation/sandstone.json -8a650dfc3e8270f7b59e344de1752aac59b4e691 data/theurgy/recipes/distillation/saplings.json -68c60f4a092fef7ff544b9a85611899229da69a8 data/theurgy/recipes/distillation/stone.json -de55395189c751532453686c818bec4da7f5a59c data/theurgy/recipes/distillation/stone_bricks.json -cf7f22fea52151c18f66161164b9ce2056453858 data/theurgy/recipes/distillation/wool.json +// 1.20.4 2024-05-25T13:38:47.7952755 Distillation Recipes +7a957b0e6a81734b37571659ef5c8c208dca3f31 data/theurgy/recipes/distillation/beef.json +ee4465ea60be09f13d90a04a54d2cf631f35474c data/theurgy/recipes/distillation/bread.json +a121055bd7fbe87a2d53cb137584ab6de13a0bd5 data/theurgy/recipes/distillation/chicken.json +25c7205e2ce88f8ccc3f8b443b87b7f10cdff1ab data/theurgy/recipes/distillation/cobblestone.json +07ac8ab178aa7081e8fe19fc47e2c6391d09d777 data/theurgy/recipes/distillation/cod.json +37502658f9816a11de310260b2db1ef3e16f55af data/theurgy/recipes/distillation/cooked_beef.json +85dc3a2ed241ae3c04cff5d8f7df0c3e1378b3cf data/theurgy/recipes/distillation/cooked_chicken.json +4fc8ddfae520e1ea5f9e6b400581c414740cb89f data/theurgy/recipes/distillation/cooked_cod.json +46919950e92689eba719d34cf28fc1a04a269ede data/theurgy/recipes/distillation/cooked_porkchop.json +a40a20599f674e5478d277f67c57326c64254565 data/theurgy/recipes/distillation/cooked_rabbit.json +a2358e62cb66d9cc62287629e22d1e8cdff6a73f data/theurgy/recipes/distillation/cooked_salmon.json +37e0359189b752c1b57abff80200bcc5bae84e99 data/theurgy/recipes/distillation/crops.json +83222c6436d1258ef153bcbee7d7818b835b998a data/theurgy/recipes/distillation/dirt.json +d321ac4449b6324a2c6ce4fac246879f8ea7abf7 data/theurgy/recipes/distillation/dyes.json +fb8b57300699f5f4dbf415ad0aaa9af419ec9587 data/theurgy/recipes/distillation/flowers.json +f2b7d92e2b3e1ec191531aaffbec5e2379e4ff7b data/theurgy/recipes/distillation/gems.mercury.high.json +d7e64004e7f0bf8e60c320c29ba7191a3c590c80 data/theurgy/recipes/distillation/gems.mercury.low.json +fd20d98e65377deb549151f8e9141e238a1e1d22 data/theurgy/recipes/distillation/gems.mercury.medium.json +7e1ff9a73ef03d5f6eddf38667ea88b69edfde09 data/theurgy/recipes/distillation/glass.json +13736629c263e3616e6890af108e9de343646701 data/theurgy/recipes/distillation/gravel.json +3d02b92d9207542851a758064272c729aee566a1 data/theurgy/recipes/distillation/leaves.json +bbb33559eebed895fa408cd03a9f2cb140ae251d data/theurgy/recipes/distillation/logs.json +9108a4baf912603737b59ba2d7a3f07ecd2c8b45 data/theurgy/recipes/distillation/metals.mercury.high.json +0565ab1244fea6289fdb7794d9d08cd8e10b86a5 data/theurgy/recipes/distillation/metals.mercury.low.json +f5575989acf4e1d39c3c061ff68e9201b2fe53f6 data/theurgy/recipes/distillation/metals.mercury.medium.json +bb6bda54214c3d79143598c04e30550779ec00ba data/theurgy/recipes/distillation/ores.mercury.high.json +2f9c82dac269a0a9e534d796803451cc0cde9352 data/theurgy/recipes/distillation/ores.mercury.low.json +de492cc418677fdd60ced2a5b52929274c3da447 data/theurgy/recipes/distillation/ores.mercury.medium.json +bf6cdb7f1b2106271bd526461b7a4f7878f7849f data/theurgy/recipes/distillation/other_minerals.mercury.high.json +9cd6bf6d3edf9a5cef80021dd70abd58b68f3b85 data/theurgy/recipes/distillation/other_minerals.mercury.low.json +4d7b9c2e088fb9f69f578b4111c276d3c0aecdf7 data/theurgy/recipes/distillation/other_minerals.mercury.medium.json +7c8f88738b54186e2c4b63254f1fe17ea113e37e data/theurgy/recipes/distillation/planks.json +15dc7bb84d60c6be239943384cb1b009035f3e62 data/theurgy/recipes/distillation/porkchop.json +e85796a256b6248ef0f71d0c6ca0d3a47b9829ee data/theurgy/recipes/distillation/rabbit.json +c9ed5a25e857f0f0268498e6b0be7dc78a1fb3a4 data/theurgy/recipes/distillation/raw_materials.mercury.high.json +65a6b22d002b38a54f62bbf643d8448af0fe1cc4 data/theurgy/recipes/distillation/raw_materials.mercury.low.json +ba817a94087f826d22f2c165fca57f745e1a5776 data/theurgy/recipes/distillation/raw_materials.mercury.medium.json +a4bb3803ae77d9b75566c3eb963e923675ff325c data/theurgy/recipes/distillation/salmon.json +5c06f9750bfa6d52f40e4ebb4753b494f4dd3214 data/theurgy/recipes/distillation/sand.json +03b5648e8ab5561571f8ac871ef82f37cc0afe93 data/theurgy/recipes/distillation/sandstone.json +4bb587ece7f9c6d8d96c72bc03929c9db5961b54 data/theurgy/recipes/distillation/saplings.json +6885d0d6cfe00df4f41a8e966977ac82a1a81e95 data/theurgy/recipes/distillation/stone.json +0179d4110e4d8f4b89316e7b31ff0c4b199e117d data/theurgy/recipes/distillation/stone_bricks.json +59b39bf5f2ff25c32ad5dd56cd9391e200a21611 data/theurgy/recipes/distillation/wool.json diff --git a/src/generated/resources/.cache/9d20181137ccde1bd7d69956138c816a2bac2b6a b/src/generated/resources/.cache/9d20181137ccde1bd7d69956138c816a2bac2b6a index cca4cf1c5..8c14909ad 100644 --- a/src/generated/resources/.cache/9d20181137ccde1bd7d69956138c816a2bac2b6a +++ b/src/generated/resources/.cache/9d20181137ccde1bd7d69956138c816a2bac2b6a @@ -1,20 +1,20 @@ -// 1.20.4 2024-01-27T08:06:31.2271403 Digestion Recipes -98b34d30ceed74472a74dda3ee23ea4e144076aa data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json -071e26781ce4eb98e8c8803cee053269957518e6 data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json -71a78cb8786e9bd4fdc797de6652625d11c41d9e data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json -9ce22358ffcc2dd66d46832a1ce645c4776b78e9 data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json -51ec220ec288313446c1f44b688465d5dd64dbf7 data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json -3d45ab9db06abf6ea00a7968dcfb4e763c0639c6 data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json -092ab6b005115b045d9a8164beeea9cc5c94f880 data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json -d74c6f62c278f16b1078f14b61b28118b00b8a59 data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json -bdcf9f437e030d8369a966920b4079ca9cfbc952 data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json -024210cf0056ab8efeeabef20c48f336286cd943 data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json -317596916205b52ad1345acc5388b3761530c42f data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json -1377d90bdc20fa8017fc825037d1ce9510aadacb data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json -76fd54c87196b15335b82cea12cea3c94f31e1d2 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json -2a1793cc5525f5b0756f5cf3081392e445994a68 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json -dc5d4b39678f02b0b204dd5352c90567f2f5da03 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json -5638065b1969c6ffb006983a127c88ab3d52cf09 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json -dd4cfaa1fb43fa72fa6128ee7c52811879955d0b data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json -90a599488f36f0a56f0b1c18a567452c75783b7d data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json -e976dde05980f8f3cef51e5fc45b0f5dec3e7262 data/theurgy/recipes/digestion/purified_gold.json +// 1.20.4 2024-05-25T13:38:47.7931543 Digestion Recipes +0e0b8f2a4f89f99eae7ba3fee4565b7f8d92fd76 data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json +a669e331da141a09febd8c1dce0c671ce8c36291 data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json +9c101048aa5e2aa3824560a8673df815b7b1abfd data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json +61900f688553972a6b0832f79488833e692f1768 data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json +8c77fa2e7f35f820848f5bdce081a7d9747e0d33 data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json +1939cc5a6c08c55c65c815c1154fc5b8bbba432d data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json +77338ea0f9676fb436e9dbea72b6505da788e2e8 data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json +31e84fe9540825c03584ca0519ee27178bc30587 data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json +4c700f9e117b608a2720d93a3e5aec22aba3480c data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json +03999281d3123f856044bebb39799a26c2cfb9fa data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json +a942b39c72296470a47844e3cdf286d2db2472a2 data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json +a169bb5c3fd50c8931ed8aebcb2eccc3a9de94ca data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json +02d6acda15428c5cf5099671834dbbb20c55e51a data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json +79bb2f0b705764e16ddba60b126f358fc4aab8ab data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json +78af6070297829705a4fc8f39493010ee3392b25 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json +2cb7b782d08543fdb808f360d9ea960c2d9eb724 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json +ee1607a1bec2c7a248b449937b1941c99d74b5bd data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json +270e9acddb20929015c623d644474bd467e00cb4 data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json +c1625ff9a36ab1ca46ed65af618a271e27cfc346 data/theurgy/recipes/digestion/purified_gold.json diff --git a/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 b/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 index b71173ec9..83459c973 100644 --- a/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 +++ b/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 @@ -1,87 +1,87 @@ -// 1.20.4 2024-01-17T16:43:37.1578822 Liquefaction Recipes -f9c7b69050c575e69b8648c610186ebbfbbb1032 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json -65b185578dee93cbcf55a1e49ec97ae236b0049d data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json -bcf943c5252683931c8e62d84e81462b8f4e6104 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json -bface39b7e5d817731c9487bd037e8dd1856d72e data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json -102d975911cf7075e82c54806b850cbdf8878927 data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json -0f76efafaea6729e7eff7ba70e4e3ba97c006fbc data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json -3736b059f2ccb952632d0e07760c605c550a4830 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json -a42df5513268397aa5d9540d6d4c7417ae79272c data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json -52ccc1a9fde5f5a332c337aaaf5d5dc6e96f18f2 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json -db91623cf314f299e57a3e48415b3c8a8217350d data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json -9f7b899f9cb24bd343da7b882adade8eda9eb0a0 data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json -55584c737b094063fed6156ad786cd5a66833813 data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json -d7774161a931db7379312426c37dadab7cc72c39 data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json -2255a46aa90d3f5d525016afb98cfcda66d9675d data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json -ade712a16e5d619e5e9acd3f2c65af601e510974 data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json -b0f4adc8123dc0a89f91fad8324a1d50b0dd6ece data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json -fcb369141906c6bb01fa0aa4bb201ceb3069cfe0 data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json -91c6d726f106d2262ed5ad40522d9b2e9ba7234d data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json -37192b8ae3806bab0babcbb0cabd26b899227e64 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json -21d0c3a9442881fdd57dd7e56df819fab5af3d37 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json -58795c5210eb3c927d03d1d04a9a6639082401fd data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json -76357726611c7d75f724592af3e1d5a46746d356 data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json -65224aac4c4f56a93f90712e9972a31577ecbee7 data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json -8a521a2d120564dcb2c7de3c24f59d694b715302 data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json -c67d2a05f01e8238c121362496ff8379b572e8bb data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json -60f4900014265f191d12341fc156a79627f3360d data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json -21a1cf6f652b90a46863a25c65e411ab6fb820f3 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json -1b0513e50eedca1dbca9e5fe8987054abe7fc4da data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json -5ea932acc5eb52b00e88ec69037d2182bfe8b76d data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json -a2b2cf4c6a0ab17f304dcea86d83b4bbae69827e data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json -b3ea8b4f473b36e05368c57cb605ff759587a6df data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json -751eb983ff3890b3e74de1dceff951d195522457 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json -e36615bbe55dcd022001d267907d8ac69db59ac9 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json -b48214b9cfd8448928bc4ccdbc1dd3513174e64d data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json -a4a81876f68d29ba286b928fc76a8924aff9ebfa data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json -aaea68e0b84b820ae79c3b5051761a787cc62b09 data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json -61b9f31c3344bf9c15f89a0ca894a35976e444e5 data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json -7ce2c5c6339c2c2cb6d113bef1d1622ca41b3b2c data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json -0c8fd8f0ecc8ad702770c81f1b40cc67c6b2009e data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json -4d784302d3630bc30c5e3cea6e5586580b46fd05 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json -76c437ad5b232b70053ed2a00df2378f9191efa5 data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json -3295f701ae23fd68c074b641f872c32c5dd56107 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json -9c496cc22f674f4cfda63896c99c4330ff0b92b1 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json -712e436c58c5c637f8ac056586cd8670f21e1088 data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json -428e6dd4965cef2bdd27e5acf77788632681f37c data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json -ded13e979f69a34bb2055e1ad9816602729dc934 data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json -373520e7b8711869b559d7143236522cb1b9d0d0 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json -4d62d5b7b24e5a72e9fd8fbf81161b8e74c8a942 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json -642a39b01b87a8537c84a848b428583eff0ab928 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json -2d086572cba59abb7c5b33f27d17d849b8cba516 data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json -64bd589ff1b7ac61661fec74c1b5f386fff2e2f7 data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json -bcfb155b2d6601703ed5cba598fe75919b24ee29 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json -a2198fcb80246d23435642a3ddb4eb1646aa69f9 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json -5109e74957ca9a79df9b571a248390c12a971091 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json -867ed4bc74370702af253229d365c8bf6ba46b76 data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json -1e27201aeaca2f57bb514793fe0469bc1ec1c57a data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json -52a2cf249d41ab0516c913efb13150880246d624 data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json -eab38d1697b0aa7f66679954ea67137e5e6d5b4c data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json -c1a00f29bd2a4a42837f9da83623ca9a83365cf1 data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json -9c14e17eecb87491ce0f57d1b8936b0e88edf0c4 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json -1e4a18d174f32a62b3695a6edb72c4b8a39dcef2 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json -c6eb90623a8591f2cd9911ee3c29f6b5ade1cdfd data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json -9ba77fc1799aa2da4bdc77ccf764985a458c9f85 data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json -23d25346ba31ea7d06091d1d98c76d525ff7c81f data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json -3bd2234c22a9ac7f4db0b6e9c791aeec25d2938e data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json -5281cd830f7a4b304ebd3c8b6954beaa51d2ee33 data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json -0616e07caba37e4e65f69fc959744b6d530f110e data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json -a5a8d9db009adc149a603fbf57e41710dee13bf2 data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json -9b3723c84e72929d753857ab4784a0952732aff5 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json -92e19f2068319fb1a0b525f44d8f50c74a684a90 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json -6d88aa03b74ffb473782490b9b8d8d9d0aff8024 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json -dc43b89bcd0405c88cfbd03138dddcab093e8443 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json -d7b6fa379afd6813131f0ab8d94fd9a58173e8e5 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json -a8468f3665c3d586bcd926dee1d3e05f90ec1ecd data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json -18fa67219998736fa40537a750b4e048fb0915fb data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json -439f804a23609dbcc1580e883084783a2525113f data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json -07dca475d556fff0f06657ef657fea70fbaed736 data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json -712a8be5c06d792f6e33bb47cc492c478b5ab04e data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json -afe283944abcbcf49d65eb26f5d8218d3870661f data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json -07d84da43a3578be4bf6c5e2d2f5252be061f273 data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json -7af8d1bfb86a0a71f72858b5600234c87cd602ec data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json -4c753e8e436ca0a8308d05d6484c1d5c5ac45fcf data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json -57ef19ac1183006c5ef16d7066b7e03f7ef257f3 data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json -e1ad2e1208603e7563f82c31639cb8eff3d32156 data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json -4f0498cdd0fe5b663c33001043668921c24a1488 data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json -df79a0a0dd41cc5798606db3e740fee49c7d01c2 data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json +// 1.20.4 2024-05-25T13:38:47.7909614 Liquefaction Recipes +8de8b51fe951371859f342aada61c5bf0eb33af7 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json +62fe80a7da03aa0abf776b3f1e69728220d687a5 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json +7ec268ed0bbc57151f0825fa785716ab8ac859ff data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json +a24e4a57d907483c6553ede1d6f3c3499a7a2ec6 data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json +b74b7ba29f835bc3778c9edfaa309e964527024c data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json +c1cfbb20a429c4e92045b767594f7af370157d5f data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json +1074c60ebfb80e27ebc53d8ad1aea480dfc0e5e9 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json +2b0486a96d9981c2167be782a1e694bb1c77c613 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json +165e7e2ed15ef4318c1d5416f3c4e34422978f1e data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json +daff50d002c3b343f6a352b360414e330d1951a7 data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json +1cfde1f65da0a9ad1a4a52f388aebcdcfe2ef1d4 data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json +f0a4d449584a3a3d08b3bde261480916b93b6f1b data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json +9814e7240a1f78daa2a0a364f7f7e11a850ce67e data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json +716e9856f9712b4e60f2fd663a66bdd57906a2a0 data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json +6110d6492a275c127ea3fb1fb7bdf7492c1b5fc1 data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json +08603035cee8eb2d67757e8ef420bc5406e7acde data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json +157dc8360753a8ce72c25600028bdac900b173d2 data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json +5b22f3a2188ad570655809ec0e248c94011ee6c0 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json +0a14950e0048094dee344eb2ed17a38b39b35744 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json +5eeb025d769c1954a02be4a12a5abb7aaf9b41c4 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json +f003b0a789129dfec5db68acf2417bf4b7f919ce data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json +7c48cff1f1491a80a9a2dd191824b3e4d62bd776 data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json +747dd4bca1d1ec7b64baca4bca26fd4b8d7cd5ce data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json +aedc3221e599ae2f99342c0062ab0ce7e897c16b data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json +8555d9ebdf721a7e2443d2c7f049b206bf17fcff data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json +9df4f53fec0f38df539f413289d02f5fcd95a241 data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json +7b3ce4576d2b9915a3d4c1e36c74ef256448507e data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json +308e07bda7609a2a9eba083292748d0b24fbde00 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json +33588c5cbc5bc118dc92d67e73d5621102c9c768 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json +0080d6d1507ab6797da8e20d60903d3a98dd0cbc data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json +c9e09809ac5c9125ce3483558b2d87f3006ee1b2 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json +b730cb8aa4d55d0fe39b20acdf44c54490793747 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json +d1753a9b86be492e13ee1375f5f041f4be0a8fd0 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json +f9f672e145cc41f1e5744af7048f55ad7e4f9f81 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json +685d3361e6b1a948ae7c5e193b2bbde8e22455d4 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json +5298e6475f118d0e65ca2f8387c6647a53e03d3d data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json +58ed51b6a77a759d9f0434c896e86afdd50ee924 data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json +9b433f553a8c7b4c2df1481de916787665f012e0 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json +503f13c3703c8abc6a8a046212b0df29abc70b4b data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json +4ccbbdf7f20bd23481b50a0781e2f8d1c93fa654 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json +149663aca677ce9b77a4d871daac05b831a2c1e1 data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json +fade99b4ef70bf15e36fcb298b147c01a5049496 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json +f73ff699b9e78c3bd2a7fcfc3af55a4269e36004 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json +33e5284de11c771ca3b4ef541aa9d2718003df7e data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json +fc0400c923b31e6fafa2a80a44140e222c180275 data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json +2882461be0637ac7970f383cd534f926ba5de6b5 data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json +a58a016d2023bf25d789fd3b9b8e9b0d095bc9f9 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json +cb726ac0b386c12def34068514638b56b6786f2d data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json +f70a32b9dd59780e230f9af99d5ca4793313b512 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json +70b7cc90181ee75a3c2143f49bfd64b08880db9e data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json +d33a5d70c4c5e9e7cf72f65c73081ecc3a3d8fd8 data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json +c5d74e38eab44d8d88cc1c8ca310a1a38e839660 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json +4b3870e69cba67099a7a2f3cf8ea1a280855aa16 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json +200f360891eab6c424df1545ede6e4d803446261 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json +b9d827fc8416d873f100cc820fa2c633c417af93 data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json +fd2f0f640aadf84788ae32c8f2c692cea9764155 data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json +f61949f99c8210ea60b2c220e6fa3b286ac9082d data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json +cb8b8ffa47302d0995759f04ead57fd364bd831e data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json +0b86892817b4d0ab044435948330974aa6115e1b data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json +ad3b1247506249f2021d68d73ce91244dd3bf4f3 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json +c504d04759726db218697bd14f6ea0913e8ae561 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json +3013061b9b5e3767f4214e9323f46b18d4dae8cf data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json +10d9556e5292226b906003cfaab8c1d0018112af data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json +38acffd728fcdad451ddc9fdafb147db93a6a147 data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json +3f1012bc525980a0139e85c3cca60e0bf659a2ec data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json +b1825d99816a1ba02e3fcc0099b8cbf2400e8d8e data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json +0e2b1b9ec3b36ebde44a8506eac606b64574ff4a data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json +fe602a71e54c71924b6bd7c6fe2902f94d931b95 data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json +affb8623dad2b3acc8967b82f587d83327994319 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json +a3a9eed3d16905bd73676cbd885d118a30c55ff0 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json +c0943a8854a1e284969298c5776d51854e52efc3 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json +e554d6a5ac78ce2640e1ac346b46878c296fa714 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json +625f08bb943d1df60fa401cbc0c02703316ff1d6 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json +9b080bf21b337fb0e9f55f098656999ef1e87917 data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json +18fd2e84dbd95251647d8ae1f5e39ab33f391836 data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json +2b39b813eb46b852cd07dfb16c9f656c0c07ad35 data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json +05817ae666121fba56beae8c418ffcbe451d89aa data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json +ddbdb67640c22b8030aa5fed697da77af2cb62b9 data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json +91e6b95f70967758fa5b8e0888393f08b2bb81fa data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json +fe8012bd40889c800437fd087c6f9cb016506ae7 data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json +69732b0b064badd735243ca62a7938cbf358f09f data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json +a3e211f379a92e3242e5897cee797a9b92e093e4 data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json +c4c46d964abcb0b878a17f775695a78122b3f9e3 data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json +3cdf5eea7e22266170c2e78ce14b959b1a43e46f data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json +4fea21746fab020ac5482f65395a7b36a5c6bd8e data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json +021f75a89208eb91e5db6227e7dcad0e8b83fa5e data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json diff --git a/src/generated/resources/.cache/c50898d9dff35477a6d00c5288be279cf5198f83 b/src/generated/resources/.cache/c50898d9dff35477a6d00c5288be279cf5198f83 index 86186d077..8758630ab 100644 --- a/src/generated/resources/.cache/c50898d9dff35477a6d00c5288be279cf5198f83 +++ b/src/generated/resources/.cache/c50898d9dff35477a6d00c5288be279cf5198f83 @@ -1,25 +1,25 @@ -// 1.20.4 2024-01-17T16:43:37.1518784 Fermentation Recipes -688e42a653f8b7921ec02e6508aa3849183c6c33 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json -c5fe8367c126fc2830f69d4fa2a7eba869da5699 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json -36637786c1cebf8f25c9a7501d3ddb0d422c5b32 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json -38e715488ba418f68d12dffbe4ecba71d6ccfcac data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json -58a3d0429c35ea1337c0e362e208b0265e17a02d data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json -456e5b1eedc3c2e37726f0c4ca7df18366bc94fe data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json -1add790b0e161a7dd4977ddc4e269c067bd6630d data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json -98b83c2d3779e9408218d2055c2579b25f2e29bf data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json -c5f9f47441670662581310a5b1f1d883df66ee19 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json -c5c056a0ab3c678c59661e5efb3a100c1049ad42 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json -da2f23db7f02a5319e0eda9db6b1aea648d0f373 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json -940ce3ac3df5f107bac5b640c3fdd54b435df935 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json -47ce03fd58dd031cf4e8e7975637ef9910b69fa6 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json -7eb9879873a83fc15db00907d36d320013edbdcf data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json -78da257a1abf01ddc4030a77bf7bf4908d79b8ff data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json -5008066a396a1b42b0916218cbc7a3af2fff8af2 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json -e72af4818378102d0102cfc7c670572ed4fb2f32 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json -e581c34f712652f356d878cde1f78cfa16c5ce34 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json -69be5b25d7a1c4873017e6d357619e293c4375f6 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json -012c11efe144996dd365325b84d6a13b2ad8a055 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json -8295380ac792bcac706f411249782559e1a284be data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json -aed02e604badd9ffeebb7591ddfa03ebeb95abee data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json -6b8db27f53ecbec4d62d43f61f999933cc61baa8 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json -cda33f887c4ef9e361090c25f72db283006ce979 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json +// 1.20.4 2024-05-25T13:38:47.783499 Fermentation Recipes +05969829ee72d76c1fd61e19651accc5ac22af73 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json +392dd62a3e6e6d789564e2a96a64fe577177b37c data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json +06116e4ad921a0e5789468a343f457f1f8be3319 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json +244d19cd6b2c9a64c0bc2b7ef7df4188c41dd72b data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json +fb93e0540c6ab9d6a112549d9bbd01e2618c4830 data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json +e3c9dc8524a875c9594f4b0ceebe92547faaef4e data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json +61f7e8d8126ea998513585db9d7d12476b049baa data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json +cf72f43b8da0a4da1a72932dcd40d644f7d9d33f data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json +901b83a8ca707d344694d0c24b88a38eb47dc73f data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json +7d0f232ec60cccc6f00ea3681e0371661e78853c data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json +0f6b0d35beb48024352050cdc441fb6e31bdd8ff data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json +ca4ec24c74b20243f2f9a9c559467148e63cc8b8 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json +fa4b940ffe3a055fd34bf9397b26815596764936 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json +abe57f7ac566ee2d203dd4c07baffd7ccf5c9f1a data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json +a3d98c21758744e7bad3a1a6dc5c8d478c9dda3f data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json +7bac3b2d0e33c96e87d297c794ab45730f811de4 data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json +17fba81e76e1d6759a93ad8350b614ab629dca09 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json +1eba30f1bf5df12b096f73d34b7c3535241f49fe data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json +303821fd45157e578f57560ae9acd640d15f9f8b data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json +fdbc922159a4bd316d28bb0364f92faa93dd2846 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json +dbd1f0e454e292f0edca22ef4da5d43a2227c224 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json +8e81edcb69e32125eba931c16e68cdb0afcc4f45 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json +122aabc124d70ea19012959ad510f567c20201a0 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json +ea5f6f070461c1a912e76d48e52964ea44d7c8b3 data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index b2e9678df..78746a2eb 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.20.4 2024-04-14T18:38:22.7943596 Languages: en_us -5def81aa9d5ef08faaf65db4a3999a46b27bc003 assets/theurgy/lang/en_us.json +// 1.20.4 2024-05-25T18:48:43.8868992 Languages: en_us +cb8a24423d8828c6c1824343c3896e0bedc06230 assets/theurgy/lang/en_us.json diff --git a/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 b/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 index 2a1739ef3..980d4d9e6 100644 --- a/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 +++ b/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 @@ -1,4 +1,4 @@ -// 1.20.4 2024-01-16T15:38:38.1702175 Item Models: theurgy +// 1.20.4 2024-02-27T16:42:55.6015607 Item Models: theurgy a402a05d887ec6d271a9350944338d29e1233318 assets/theurgy/models/item/alchemical_salt.json 9fd173e362b6644716da98ba0d15809f85879e78 assets/theurgy/models/item/alchemical_salt_crops.json 9fd173e362b6644716da98ba0d15809f85879e78 assets/theurgy/models/item/alchemical_salt_mineral.json @@ -53,55 +53,56 @@ e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_s e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_wheat.json e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_zinc.json f3e1291d9c55815770b5ac20d5ab61f08fcde8dc assets/theurgy/models/item/amethyst_divination_rod.json -81eabccfd42aa89df84bc6983a7acc805f6b10dd assets/theurgy/models/item/amethyst_divination_rod/0.json -3a8901bdc3e51a215197adcd0eb9a1f419eb8982 assets/theurgy/models/item/amethyst_divination_rod/1.json -910eafa0fa0d5c2051ad1b1375baeafae570b3f8 assets/theurgy/models/item/amethyst_divination_rod/2.json -5ba98234727fd2ef3e49de1ec73d1cc43023bc92 assets/theurgy/models/item/amethyst_divination_rod/3.json -fba86b4d10abdba96978b1812ddde54605971db2 assets/theurgy/models/item/amethyst_divination_rod/4.json -9450dfe940992946522440d64ce8595317c655b4 assets/theurgy/models/item/amethyst_divination_rod/5.json -68dd998da8da3176b9d5b006faa94224fa6066eb assets/theurgy/models/item/amethyst_divination_rod/6.json -2aba39038b1fa44bc0a7c915a8b164049c97dd82 assets/theurgy/models/item/amethyst_divination_rod/7.json -423f81275242e10e1e3690abb05b6ed04086f9bb assets/theurgy/models/item/amethyst_divination_rod/searching.json +559f6c725b08a2da9351bbae7efe792d91ac2616 assets/theurgy/models/item/amethyst_divination_rod/0.json +5e620d40c554586d65225489307b29bdc62d4de5 assets/theurgy/models/item/amethyst_divination_rod/1.json +23f0c71ce127bbc8227db73b158fe472c685b9ac assets/theurgy/models/item/amethyst_divination_rod/2.json +d36e9e5b1fcf1a0be5780c4f576b95b2b66c0957 assets/theurgy/models/item/amethyst_divination_rod/3.json +448d10b25ca63edf1b7c8d6d29ed88510610473d assets/theurgy/models/item/amethyst_divination_rod/4.json +d98e72f91ff36bdbfc59acb899e084f61dd1945f assets/theurgy/models/item/amethyst_divination_rod/5.json +8358002003ef4ad8f27c267bf89ce48ab1a9423d assets/theurgy/models/item/amethyst_divination_rod/6.json +cb932aae64df4367bae90a210a4c219667b296d5 assets/theurgy/models/item/amethyst_divination_rod/7.json +506a58dad530b0611c44a40752a3e92d2ac8bed9 assets/theurgy/models/item/amethyst_divination_rod/searching.json +33873ebca7a89182e367495bbf766215c7fea8f8 assets/theurgy/models/item/copper_wire.json a544904dc7c08099dacc58898f0b16a21fca8e35 assets/theurgy/models/item/divination_rod_t1.json -56cbd2e62794dbad75babc62f07448c34813b99c assets/theurgy/models/item/divination_rod_t1/0.json -561e1235ed07f6cc1bbb5d36e2d85d8d467134cd assets/theurgy/models/item/divination_rod_t1/1.json -dbdc73496f0e2c1c562173def9afaa3fe6594cab assets/theurgy/models/item/divination_rod_t1/2.json -d7c53bd9d3ee54dc7063d1ac9c8ccd74b51b8bd0 assets/theurgy/models/item/divination_rod_t1/3.json -a481fc6d70d3b7d94b0ecbb522f56c67108db698 assets/theurgy/models/item/divination_rod_t1/4.json -e8c9cb3aa96ac7846ba5e43bceaf664a25824cc6 assets/theurgy/models/item/divination_rod_t1/5.json -239601888e1fbc066b825a7d71cb663b8c007796 assets/theurgy/models/item/divination_rod_t1/6.json -7bb03e19874ab49883313120fe439408807569d1 assets/theurgy/models/item/divination_rod_t1/7.json -81476c0120bc1bb7997b5af3f26f338552674c92 assets/theurgy/models/item/divination_rod_t1/searching.json +a3ce39925a8f95304d56e1671dd5c8bc9beb6286 assets/theurgy/models/item/divination_rod_t1/0.json +4399ee1b721ed55d26c0e65fccd250a956a41e24 assets/theurgy/models/item/divination_rod_t1/1.json +f680289ca9f57268d52525436852908e437f4b94 assets/theurgy/models/item/divination_rod_t1/2.json +b3bdcfbc61135db1289132f373b20cf3d050cf81 assets/theurgy/models/item/divination_rod_t1/3.json +d72ac6621cfcabe5d123e3a4d03c46d956b1019d assets/theurgy/models/item/divination_rod_t1/4.json +5c0bd06f476ae48fde18408dc3c56fdc5f15c5e2 assets/theurgy/models/item/divination_rod_t1/5.json +ce138d2768d06d8290d524cbc9f7c7d178ee3814 assets/theurgy/models/item/divination_rod_t1/6.json +dcf7debae21b845c0dd73f78c052a2097427570c assets/theurgy/models/item/divination_rod_t1/7.json +5199edebe09dbde67056556741eae8f935bd6646 assets/theurgy/models/item/divination_rod_t1/searching.json b22d41093cafb7912197f176fbc6151066a7cd89 assets/theurgy/models/item/divination_rod_t2.json -761a4d6a83af1e5c5bfc189111e67cc87fe36bc7 assets/theurgy/models/item/divination_rod_t2/0.json -27556ccf6c5c5077152ee0833bfe8a154a11876a assets/theurgy/models/item/divination_rod_t2/1.json -5605b7361a8a6d3e9db3c617a5de29310cf91187 assets/theurgy/models/item/divination_rod_t2/2.json -341ff72e1ba65fcc25d9c5bd1e13d3544a36b72f assets/theurgy/models/item/divination_rod_t2/3.json -0a9948a0d1c373e18935ca423f7bad3ea32b318a assets/theurgy/models/item/divination_rod_t2/4.json -d4965cb15daf2eb892364eee41aa0f2b1c6fbce1 assets/theurgy/models/item/divination_rod_t2/5.json -e157a4b14b0d0dabdaf263adf7c450ef537daf25 assets/theurgy/models/item/divination_rod_t2/6.json -5f9f66d13968cec6c177719a88342247dbde789e assets/theurgy/models/item/divination_rod_t2/7.json -4e90369da1a091b9b187a1ca2759952963efbda3 assets/theurgy/models/item/divination_rod_t2/searching.json +ad4d992b0317a0f5ec1fe06bf4e5dd5620177fa9 assets/theurgy/models/item/divination_rod_t2/0.json +33bdd2e5ea4ce16a53ba100c0f2b2027f7b5ff45 assets/theurgy/models/item/divination_rod_t2/1.json +dd3a33d668e2dd9811dde2114e915f07aae364a2 assets/theurgy/models/item/divination_rod_t2/2.json +9f7e948dfd20af0939bef0f1c28f9c191b871db8 assets/theurgy/models/item/divination_rod_t2/3.json +a560ab8b053022d62ea6e4f711a6292678162962 assets/theurgy/models/item/divination_rod_t2/4.json +043c5d4032082fafc40094420ad2ab3699a80865 assets/theurgy/models/item/divination_rod_t2/5.json +2caa50ea094522a88f4cc6d9137ff64e399e0063 assets/theurgy/models/item/divination_rod_t2/6.json +dfae67fe97f873cec3537acd09ab6abbff54363f assets/theurgy/models/item/divination_rod_t2/7.json +fd02dd04e4b7d24205410ee08af4aca11da8ff11 assets/theurgy/models/item/divination_rod_t2/searching.json e43887489024cacb8eedc9b07a24da8c28efbefa assets/theurgy/models/item/divination_rod_t3.json -c74c207dec4453af2c0be3192c155745f18e5ab3 assets/theurgy/models/item/divination_rod_t3/0.json -29ea5e52577254230bdbfe9a13abf08904ea2107 assets/theurgy/models/item/divination_rod_t3/1.json -8ae8fa89963ae4627bf44d4bd6ebb8f818163139 assets/theurgy/models/item/divination_rod_t3/2.json -4fa1c4f6dc37075d8271d437932ea06a296d3850 assets/theurgy/models/item/divination_rod_t3/3.json -319dfc39d808b3ccfaaffe237d378666d4880945 assets/theurgy/models/item/divination_rod_t3/4.json -aa58cdef692e00526bf7dead7412eeec43c0f97e assets/theurgy/models/item/divination_rod_t3/5.json -37e15311a0326611fed6f2c5b25fce14ffc022b1 assets/theurgy/models/item/divination_rod_t3/6.json -3574bf42ea614fe9c7c806770202286e29be2a96 assets/theurgy/models/item/divination_rod_t3/7.json -564f9d68d842034cd429084494fe900b849ccd57 assets/theurgy/models/item/divination_rod_t3/searching.json +f9f4273e15503003680ae4a8b5cdee0cd210fd4a assets/theurgy/models/item/divination_rod_t3/0.json +e56ee51c0d1b4a460a54dff8d7a959278b8477a5 assets/theurgy/models/item/divination_rod_t3/1.json +eabdb34d861c7acd605b43b25c45000eaba50e7b assets/theurgy/models/item/divination_rod_t3/2.json +85608331ec2329de069c4a7fae3e8930add66087 assets/theurgy/models/item/divination_rod_t3/3.json +3b011c18e2e2225b1bd495a1b2c53142e550b9a5 assets/theurgy/models/item/divination_rod_t3/4.json +564ca1c033bd8fce4789a68a8038819e49c6f358 assets/theurgy/models/item/divination_rod_t3/5.json +8f796a0ac092fa2043bdf2581325e2fd37af9585 assets/theurgy/models/item/divination_rod_t3/6.json +5186f3e4fb4bf5936671407981645b161796b158 assets/theurgy/models/item/divination_rod_t3/7.json +74738c165064984eca5e3647629fb618f8ad860d assets/theurgy/models/item/divination_rod_t3/searching.json ca54f619f26f5d4ded96d2e6c8dc9411a8f17738 assets/theurgy/models/item/divination_rod_t4.json -b95a478b24da791ae7c255e72a3370ee5f9b25c0 assets/theurgy/models/item/divination_rod_t4/0.json -96f5bad4dc75ecce2fd64ee27ca9f3ad861cad72 assets/theurgy/models/item/divination_rod_t4/1.json -ea7358fbb5bc502d969d9b56ad9a90fa67d369db assets/theurgy/models/item/divination_rod_t4/2.json -760d6647521ac9bd91ce7d333b2013cfea6d1a12 assets/theurgy/models/item/divination_rod_t4/3.json -afed8e3d6ecfd5ae2c9351ab528451080fa44382 assets/theurgy/models/item/divination_rod_t4/4.json -02160294e7bc7530e876fef3fce5db741df8b22a assets/theurgy/models/item/divination_rod_t4/5.json -46d1626a0c27280cbf141421f5134c2b02e7de7b assets/theurgy/models/item/divination_rod_t4/6.json -3237ccbf7ab79080fd9769cf3adea5e69c615619 assets/theurgy/models/item/divination_rod_t4/7.json -ea3053a9add02634af5fd7d9aef50801c48b32b2 assets/theurgy/models/item/divination_rod_t4/searching.json +afd70373470fda24cee7eec046b4cb0f418d0ae3 assets/theurgy/models/item/divination_rod_t4/0.json +20015e62c6201808ce1a70a466dbcc6b1d981067 assets/theurgy/models/item/divination_rod_t4/1.json +5db079c58854e3db6cd8ee7f656c33eb4fd2d460 assets/theurgy/models/item/divination_rod_t4/2.json +b535c2bc6d3687a698264ddd6dd5670c2480ed05 assets/theurgy/models/item/divination_rod_t4/3.json +6d0d582ad9402daaad3640e84eaf25abfadab3b1 assets/theurgy/models/item/divination_rod_t4/4.json +f2f235417935efd2ae29fb752790cf1d326dfabf assets/theurgy/models/item/divination_rod_t4/5.json +0dd262e003cd76e294e5057d4a2cea5202373c3c assets/theurgy/models/item/divination_rod_t4/6.json +d31ab16bfecf0f6a5c7cadcc0141ae0d08966a02 assets/theurgy/models/item/divination_rod_t4/7.json +c55c36b94f98fda4216160d396842ec26f016f0c assets/theurgy/models/item/divination_rod_t4/searching.json 9509d4c45c1dbf5364e6fb7f5a79859946d69e98 assets/theurgy/models/item/empty_ceramic_jar_icon.json 52d32732c4f756b579832097a281e0037cac4010 assets/theurgy/models/item/empty_ceramic_jar_labeled_icon.json e0d7667ce794b40e193ecf66945c505733faf3f8 assets/theurgy/models/item/empty_jar_icon.json @@ -116,6 +117,7 @@ e10c25d97937f9dbbae1e85e2768cdec9cbda373 assets/theurgy/models/item/gems_rare_ic dfd3d9a5b48e72aa2bb7424dba51a88c738f40d1 assets/theurgy/models/item/jar_label_frame_precious_icon.json f83a199b1494744aff01fc4c082fc35cdd78a476 assets/theurgy/models/item/jar_label_frame_rare_icon.json 94bfa4f4e6caf28d6f20cee65ac10387f5b115e2 assets/theurgy/models/item/jar_label_icon.json +c0882f6fbb3c4037338e9b3f20a01899656526a5 assets/theurgy/models/item/mercurial_wand.json dba6c70f6dc6e3efa9e5ca587d452b81421cabe2 assets/theurgy/models/item/mercury_crystal.json 022666f33be76a64adeafdb25b8955238da6ad02 assets/theurgy/models/item/mercury_shard.json c80de76c9a65f6feb89341144bd407f44a37b7ba assets/theurgy/models/item/metals_abundant_icon.json @@ -129,43 +131,43 @@ dd09e69cefe73dfb93743307ca62a17bd4bdc6b5 assets/theurgy/models/item/other_minera 9bd1f3ac4e254266765470a183589432a4a350b4 assets/theurgy/models/item/purified_gold.json 8409e0681b5a4381d0c9797935b8ff63d0af9fb9 assets/theurgy/models/item/sal_ammoniac_crystal.json 8cfa468ed4afa56fc4923a5347f7cbfe60795a3b assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant.json -66a71323a5ad5f6b6d271de59a9ad997b0835c04 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json -a3ec19c883834a41d3dbdbf96f3ffb5c4062f6fb assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json -566227e7dc4ab4b29d40474c77090dd6add12971 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json -ca08fd51a37953367c451d15337dc201262f747c assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json -9c4a225d07b8e410d231f9c6fbe4e8d5b2de4bba assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json -fc2eaee56f4386a1e192fdd960a88c58b2cd67cb assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json -c825202d4d870cb8703ce3c543c2954aeafe797a assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json -923f12688ccbbba8db7907dbfc56502fa8d1c547 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json -0ccd0a7e734a3458d335e04d2a9b681718edabb7 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json +5ab89c7d931535f140fea72b85cc36bd46700c8e assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json +1af7dc2366213f4fbbc9f53a736d40b220272cff assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json +f5806038c0cdb60d4a21a88001e0a267430970aa assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json +1175b6323a862f1e873e2250ee6470bb3cc46193 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json +614bca26921127e193fbed9a2cef8c4f6b37bc8f assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json +f7c26f9b0db8f65f6bd1bd28bd2c332d9b5d024c assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json +1d4bf14ef5cfd2ab1ea428b8b86b25f044f8b3e0 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json +85b30197c4d067cd84ca6facd69267590b7c4bcf assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json +9257d1e51ec407e3bb30b245cd3646c51f50db7d assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json 6d890201fe3e662fef7ca4fadf48fcfc7ef9228f assets/theurgy/models/item/sulfur_attuned_divination_rod_common.json -9f654079a744f07b8d71cf934808e7d2155a5fa2 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json -df6ff5c4c782adc7ee6ebbee73fc8481e4747d91 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json -0fe7f188555d36cb94f2ad25f383bbce8bc6b920 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json -02b5ff2f7b60fa7c50da933fb3aefda1cbe3da07 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json -1804b77b8f4584aecf118fcab8fdc4d246ee0cd0 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json -8fbbcc974762be02d9d91ded905e0b232bff868b assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json -39434f867c1fe868288225f277f139d83b4fb277 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json -876563d0f6340a0cb7f56efd65eccc5520f55bd0 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json -2a76e1d1e3d5be4fa6aa2ab9975c8cc7a8890dd1 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json +beceadcc756f126419c264bf62bd83816ce1fc96 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json +ffe386790f5da786e2ac4d49580781bd59b01776 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json +62aa36036b86e099c6b0f9494b59404b34b65f9d assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json +3ae100815bfcf08f4c515c62012e1c1b2dbd8a7c assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json +9c498fbdff0be2da046358470cc87c09be94b993 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json +03b69f781c99ce4726269a94eb2dc9d0061346c6 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json +ee7f6c252e23219510a275a3aa96215755c415f6 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json +3c8333f60203c4a6f3ee791f41f8035165668312 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json +93051e8aa3631b0c7f8e4d9e12f060927ff4d995 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json 39cf7cc24920f76ca50241afbd75cdba52b7bac6 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious.json -f95ce7f1aa83a2ef65f0164b38581227ee7cfc01 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json -871433e40ca569f2804dbb613f436c731d8ab1ff assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json -efb856259cbac8042eaa362d4cd9f09a2f123797 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json -f6e4b499b2be09d2a0610a338bd728f6fa8c00e2 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json -118cf53896dc03178d172304f62e26aa99b21050 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json -8c6b4bc94bcebc0260eade679078cd17dcf71fc8 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json -c3184646b9515fbe8c6c82b4be9aa68144ec5c88 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json -43091cc6131eeac944e117813dacf22539e6e4bd assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json -ba32f6646323a5c83d6ea4f84f97cd02b2767ba5 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json +372e465eac05a6fa11f14cccc07fa8920574ad0a assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json +0429a4dcc07dab17f5eb59ca4af68dbb725e4fef assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json +56422e05e6ade396b9d9497cbafff7b35680235c assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json +6b2037f686e4c5d68135ebda74d64662306074ac assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json +8c4f49276822ded7844325484202f5f933268c43 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json +e434e2dbafffa61c200e31c3cefe8a2254a753ef assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json +3dd7400fd9b0dee70e5ae5e8dff27b4f4bc4b4c9 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json +18159da0c4f9515e153e18b95d83ddcc666acbcd assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json +35b0feaf541f469218821d6bfa257b69f25bcd04 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json 7a5bd4a4aad5e00863eacbc7433a82606a66d28e assets/theurgy/models/item/sulfur_attuned_divination_rod_rare.json -ece4756b8bf0eaf04f174abfe3d09261848f0869 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json -9a64316e6234a2b71e5c81e490469ee0418f70dd assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json -b873d7e3c44a64540b595609f15b90e411acd305 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json -888c30c6ff355519d19b1c0db91afaeffe7ad12d assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json -edbb3ac79b2989e98f506c49aacdf428b1f9dd64 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json -f751c2618b3bdcbed7af47a028289b2972312906 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json -01eabbf8ec0d22dd11d30fe62259b9668984eed4 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json -e324d0138cadc8d581b207b0f08a291ca67dc25b assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json -480791ec23722cfc9be0901289627efd8bcb0785 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json +5c4de6cc3e74fa8d9e36402eccb92554e4337e6e assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json +84980eb699e9aeb8669f88dbd04ce3410c0484c6 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json +bd63f2feb54edee0ef43527de30caa2a2d613040 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json +9ab14add181b3c755f6d5871b8e3f805a6da9a6d assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json +d73e82801e5e977da3a6285ffee48d8bdac8e2e1 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json +88d9e8bd6811580b939b6379f743e5fa2f929fea assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json +8f6fa1119828af014f2a28653e7e61c974b25ff2 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json +2c3069a312b6be9c8d322cb9b6b4facdadf0f390 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json +d43e17fb9c2acfa611a7a4e355543d72cb540f0a assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json 0a1c9856bc73b607d7e6089acd1ba1a38198f8ab assets/theurgy/models/item/the_hermetica_icon.json diff --git a/src/generated/resources/.cache/cd2a2a329a0824759638154124ef2435729ebb02 b/src/generated/resources/.cache/cd2a2a329a0824759638154124ef2435729ebb02 index 892aebb48..f95f83868 100644 --- a/src/generated/resources/.cache/cd2a2a329a0824759638154124ef2435729ebb02 +++ b/src/generated/resources/.cache/cd2a2a329a0824759638154124ef2435729ebb02 @@ -1,87 +1,87 @@ -// 1.20.4 2024-01-17T16:43:37.1558786 Reformation Recipes -83356af7b4b676ef195e54d9c725121caa483cc2 data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json -652e5478b122ac99414686074ac9a2fe477f0bc5 data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json -a651a2b86241c209b28578f4403e4a8b712dced9 data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json -9c93b6aa5dd3f13a15aa01921bac03d2dde0766b data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json -019c72620e26b282ad72de1057b4618bc7ccf99f data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json -84cee33b9b72f10e66845c5dded0648ee39bd1ed data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json -8ba5f9e575f88b52f7933c646cb78a9860e90a82 data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json -b8bd8f23ca64db913b9a00e26efe9020d6aafb67 data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json -ed4d28bb31fc1400ea68f0d275edd0c17a46001b data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json -4318cf2f11d2e28448423c805d05a59287d39632 data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json -2e0dddc2df69d312bfcf6e1c6f58cc3d0d76025e data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json -113a4d89f5d3c8095298ca82ffc1e6f962ca4bfe data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json -49c445f8b7585e55f6a841355f789f7e0a826563 data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json -f51028bcce3b0e984d088c5c1bc99e50322965fd data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json -cb0cb063dbc41038149d2ffe165f3ea1e03dfc98 data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json -fb8f770e6a6f611bfad6da86a068e10a468b900f data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json -801b52d3c668bed46859327688b309e767c716b1 data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json -9ae238b1dd49b905167c454fe6996f762bc2c462 data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json -5451b7a7574f009b34466fdd2de823bab436b30e data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json -22ddf2cdfa01d544d12217b639d0189e92bafeeb data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json -e129cb0bf65f3be405420dbc07d7b17590663079 data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json -40c70f6e6359b3b01a2f539cc655349b27c75a14 data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json -a41795999d3e45e103011b9692f4021d190c8df6 data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json -140f66353035efe7c9373e171cf823dbb5ca9d29 data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json -727a9af796367a7cc8992590f786839a93136f49 data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json -53ececf21d3666ce021f2e3b24f0f7a11f648280 data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json -387184c2d717b54c2428dff2b130ad076f1ccd0a data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json -6c0fec7ddfacc373454d6ccbb51e358ce2016f3d data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json -fde1f1a2531061af79e3755be90504709447b053 data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json -70f6a5759e3ac5ad5795fa1191edd4a6c517a822 data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json -e7bb1c34898599b2d2ca5d48fdd23df06d525f46 data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json -b05e1249e888162add783fbabf4a59eb400fd2eb data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json -54d595810bdebf9bbf311ad0bae4941e809f6aeb data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json -e56f4c1d5798fada023c243ffc413de2724c2210 data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json -f57d8162c75278a4f85a8828c5bfe511113566e5 data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json -05b29b3605a7447e11e7a932e455e58c5aae769d data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json -b8339839c3a80670e09ce9af96c2aa1c5904f737 data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json -d9526a373531b8ee3af1770c92916cc97d2bf74b data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json -56eb0862fe607a39d708eba5f374ff2824b1f437 data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json -86d24bd188ec6e1b896108d9ccefd7ca16c439d4 data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json -8d60d58a4c5320a8e1ee769196b70c5bc996cdc7 data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json -3d7da56ecff95c93a23455a3fc6119733ee5ffa4 data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json -f485b718fdfbd16c666bc3293cc7f93c3dd45d63 data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json -5330c7088764f532d575534171dbee93417ca3bb data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json -cef37c15b657e586749d64f087fa12aeb4f5b9e0 data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json -3e27b87f0c43fe6aed42b3ff3226f2e850f9230e data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json -d9a9ba64207588568fac74ef2d89f92bc81e47c2 data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json -97b5afedc92f9637a1bf4ddab141d1371cf96976 data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json -e00f4e5691ad9ecb6b7a58564abd9fe542830ce1 data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json -c632223e24148d69e2c0888814d1383625b9051a data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json -d9782b409c7da3490e5243e01ab6f7547a248f3f data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json -788ff289bbc60985b979e98ad1b9ed2b6573f763 data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json -7dc1536b991b1e68f334379d9fcc4db202c46f84 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json -f7d83b742cde85702da6c82383b82bbc03b4cb50 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json -38fa4972330ba6e6829f8c85358736fdf9c9a528 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json -5766067fbb56105a13a929d6ac7b3ba2ec11fef7 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json -0aae2deaf0c13221d563bc8085fafcc708545b15 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json -4400803a8c29703609b05635b721b4939db8aebd data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json -343155e1d84b2e585af7c89ae64080491824cd87 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json -c025902f694586a52426bd5968bf9cd767254ade data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json -5bb103521e2536af032373d432ea45ddb9d49827 data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json -16d1767323a80f38b251db3a96cddcc1b992db9b data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json -fb63fd8a023c5235c27f1d2b805055898af8f1d5 data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json -d5e389a41f23ad7a24a508c26fe9fc3a785b7554 data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json -1f7236c295e672b7dbd99560a5bc2376859ce390 data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json -79d336d72887c7e4861adb00fb5dce1a7cc12fd3 data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json -f26db4bb9d4719bca0f373931095c05bb9eb198f data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json -acb69c8066e7ceaeb7e0af1a50e81bfc3db947ef data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json -9f98e252764dc90c72c40f7fba4ca37f5dc37fea data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json -0388e7a536010e368d4e9170bb7c71803f3314e3 data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json -9d07cd7db7915d1bdbedd476a8dfae2f460c2d51 data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json -2f81fca9d250e5e5df7a9ed4fc06fce490e9b867 data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json -9baa960037b938d1672e310a1cda585c2131e2de data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json -567f18ed9536aac66e85a52aa8e33e6d69016a7e data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json -d07ee9f1e719fcfe73c3686aed7a758d5c6e4d0a data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json -9305ca4f4ab5e5bc209ab97f9422772be44f371e data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json -6d787d5075b4dfb5c2992a471cd7f143857727c7 data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json -e65cd68ade057f650f23ad0083e6b3a8ea6a0159 data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json -642ea20cf783a6609bd00500b023e463490a2315 data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json -302c1b9ed23942a81e13afdeebf23c003080b2e9 data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json -b686300c64267db0115af3086740266e251fad1f data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json -c4e637b694f8bc8b0bbf805f07a978b3ae4c2125 data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json -8f8065b41310cf546d1501978e2344c6979422ec data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json -77db33349dd188d088433011c8437558c8cf37f0 data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json -90c43c41323477f6cbb5748bc014f5b8d013e489 data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json -f3328fe99a61d99c4cdaab62a99b5be9ae93e370 data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json +// 1.20.4 2024-05-25T13:38:47.7867153 Reformation Recipes +16f639b06e0109cbdd30a55f5164fe581a3bdc58 data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json +358242b4d84216cc6d217e98c68822596c75bd32 data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json +561f6de6c4bea2f959412db263a5873e62d70d7d data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json +aa93df71a43e9c84ba45d9a945b468fd1786f3bd data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json +92b4acab1010edfa8f0c82fbbcd3e1c11a8d631c data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json +4c714b5a1c06467f0bef8dfd2e8525d0d3a14308 data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json +98ae74f1210c05ace74b0185af8c8aba66017cc0 data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json +488cadba92ea300490882f0edcfae47f0537eef6 data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json +755c067233b7fe769d0fcb6d4bdca64a3bf52175 data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json +b8e94cf2d400576c11f6ea8618ea2c25b106b80b data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json +bf08e4ce84f8911831f178a9c6c6805bdbdfe4d7 data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json +36e8448f79383d568014e7bd29c41dc54073467a data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json +47c7a7a02107cc1f4664d1b2d9e06fc496adaeca data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json +2327b7a980867bc1aaddde8b18d2b929c6fa95f7 data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json +496000c8ce4bf2ba70b98054d5b4ffb272103abb data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json +4921846dfe5b2e22043b6eb803edb6a137a6b598 data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json +2f3c29189999ea4bc432f82d65b14530e157650b data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json +d799af5d24d1c197226f05c9c6700767a963a9c3 data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json +99496e0d5056695f9784b9a6aa6d7bc63c4733fd data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json +c3ac6c829c43ef9d1baa5589133306fe83b8a2f6 data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json +153114808989b60eb33110d264661248770d4c27 data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json +a8c66d8a179ebde6df6b15703025bbc673df14ec data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json +2d30e60f81d2fa8163106c2c024cd4e495c6b504 data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json +d26a2426fbc424edf2fe57db7c7ce8778982ba3b data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json +bbc2afb23a6f6034df0fce6211a1d5673bcb6e57 data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json +c32bd2b68269bf06da76690a48151a46d3e937c2 data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json +d4609ed1085d87a14ca8c6a9ef058299b9ba2039 data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json +9d9488fa2b3a73a1eac76b9b3d73b3157d2c4967 data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json +bdbc166a5020842db2cfaca0e66a0470c111797c data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json +c7b0d322c4510c233daf5d4a8d3ae9c620c678ae data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json +e197e6b9aa7cf11c43e483e5d3fc4c35cd4e6fb7 data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json +0ea47a5385486e35179e2a2da7995041230ccc2a data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json +76ca9439544a07f6cbbe7cd4b096ee2cf5a18353 data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json +87a46e5df3039f4bd184457fedb981dd55392756 data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json +dcf22d938634dc832848073b95e689dd3425244a data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json +ce817e42c3d6f2224a92ac4d35bdd573fac0272d data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json +ff8b7d884674f98ed7825a927ccd7c7e387178aa data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json +5e3950bc04822c7ff0f49467e15f4179deb208ff data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json +debcaf23cee1b670aa0da86f356935a6e6113c42 data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json +a384a5106743ede2e164d3656e52bf84bb4b531c data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json +e360e828475e501445c5d7ea3d68254ccca3ad21 data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json +d8f1773920fa0630003f10dcaef770fbf0652be1 data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json +14f716ad69219ae0b8124e556c93c1624093dc1b data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json +5266b1979639d5bfcc4ddd849308ad19ed5fbd66 data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json +431a05796b3739724174c9fc3257501608e83a01 data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json +6cfd0584278d765dd7ec429eb41dabd9dded418e data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json +f9883d4e31928e3d0df1a8a94901b8c15168c9b4 data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json +c8d9773698b9ea4de206138c34778827dba9b1f3 data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json +5ef6d33ac44952260aa6f7061894a4d9b44dec8a data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json +1798d06f8a84fe9b83a878bcfd629a8ef9a330b2 data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json +a84a541d16b5b9e4b1ce3aac6607964bafb56720 data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json +09acdb40ddc8412edbcfcede9d4a0d6f6000dc78 data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json +71dc63b5cb3c0f90cc4bb5b445943732416bcabd data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json +c5f66540cf0d24f27271c8d22d9656d97a6d7c27 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json +b88ec6c97ad831dec8931c7607cd1fa2b3822046 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json +be63abefbeeaa5d94de14460271a9191cb4810ee data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json +b554a3c46b8c4da6a72b89c527eeffbab4749ede data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json +3d2a227bd4e19106ee1de0c28eb435c6a7b6fe01 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json +dd139fc2b85acf49ade557061c3e595c9945d1e0 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json +28baf61ce8e165daf2078a0a5790444647a6e5b2 data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json +5df2ca83292b3875a8f593f7d1ca0f72b947997c data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json +2575ed95649c12951229deaa34b90b1e0f94ab5c data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json +7db2a29a5c343148d6909ee20bc8c2e7cc1eee24 data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json +ff6bac08030962dd70aae8108f4506670db903a3 data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json +948d2480f2635262967b43ba39d3d45b1586b3b4 data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json +c52161b1a0819ba910223896f2e9333943d8518a data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json +7587fa4c1bcb7d00e098205b70ad5fc7834852de data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json +260be8f178ee1284cb8240d39917723dc453f71b data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json +fc7b2b2dc435b2f584d96e9b9db3b223ec1bd74c data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json +da995ba1dd3361d65c46a8b4989ba56bdc3882c5 data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json +8fd7b65b6e97cd439f93cd145c09b84263b9e402 data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json +818f4dc6776e226201f81afb668d36f43ab94cb2 data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json +780802093996e656b08d5342cae8b84958bac4dc data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json +8aa337ac343fa9bbf1214cb252c8ec6d76ae4973 data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json +4a4967d0ca35a296db6ae5b13d48473f5ceb90ed data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json +a89851ba84a9490c4f05173fc42eb02c0c0d7ee0 data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json +23b6007ee5a4f2e9ed31467412b7fdbda0d33f72 data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json +312580ad4c6a80209d6ffe57c62c2f8cee260a51 data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json +7d47d959fd77ac0f546d958e2748f38792730f39 data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json +e92f58298b34ddf1c2d8f3e6bb31665f68fc5d90 data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json +04c5c4305d15b875e6519ea1cddfa47f636ec04c data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json +6561423dcb3789839a0135bead9f847791c849a5 data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json +786fb76194874224263f9df6b959c15bd0ce2637 data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json +a848c51842510cc13896c6d30a3c982b9936334c data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json +4ef47ebd6e9aad5259b1fa4d3cde9c5d1785ceb6 data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json +f047ac5e8706536e0955fc47c22f1bcd2420b4e3 data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json diff --git a/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a b/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a index 10bdd35c3..f8698371b 100644 --- a/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a +++ b/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a @@ -1,3 +1,3 @@ -// 1.20.4 2024-01-16T15:45:43.5229702 Accumulation Recipes -ad8b93df2cc3d2e02cb81f098860aff3d1ed2ce5 data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json -8f5a08296f1c454c9caef2e51a6a48cff3d2d141 data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json +// 1.20.4 2024-05-25T13:38:47.7947444 Accumulation Recipes +32c4d2f605e54e98777793abf9d9eab9eced17d1 data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json +57f320267f55fa411f6d8c52b59824bf05a1a40e data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json diff --git a/src/generated/resources/.cache/e4cad9ee817d87f2c90e20579fbeaa0a00944c22 b/src/generated/resources/.cache/e4cad9ee817d87f2c90e20579fbeaa0a00944c22 index 5da21e0e2..e0e73f17f 100644 --- a/src/generated/resources/.cache/e4cad9ee817d87f2c90e20579fbeaa0a00944c22 +++ b/src/generated/resources/.cache/e4cad9ee817d87f2c90e20579fbeaa0a00944c22 @@ -1,2 +1,2 @@ -// 1.20.4 2024-01-16T15:38:38.1662199 Catalysation Recipes -b05e6d2a0d17bd730ca973d8289732a0eac308a1 data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json +// 1.20.4 2024-05-25T13:38:47.7909614 Catalysation Recipes +fd33a7736394b9451fc18cc8c85711f94de16c20 data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json diff --git a/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad b/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad index b9f37e420..6e56f463b 100644 --- a/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad +++ b/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad @@ -1,36 +1,36 @@ -// 1.20.4 2024-01-17T16:43:37.1608791 Incubation Recipes -afa88a9e295f9bad7b3ecf3ddace328d0f254418 data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json -8c827a20a72a85fd2998ae86b4c8b0e16e46ff9c data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json -1e53057307298d6cf0684363c19d5785f8bc4026 data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json -21a2890ea08708d726a2786e1a5d26d0df22681c data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json -1c64cb4e0088dbefeaee34ce98f2c5fa5acece0c data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json -430a8a6d8981d8338e7133b74d4b74c54fec54c2 data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json -f2def662d0a42905e7c15c5a2d993182d5e24814 data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json -0002bed1b04da044f2faea037a72974b8a690c4e data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json -54e7db78404a589118dd7e442f29eedadce38af6 data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json -2c73ec6f999b800ff3c7f6d9acbb6a25c87f6edd data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json -d56bbe9efa05c6466e58527cb8d9eee122d85801 data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json -69510cb157d9510b3a17ddd709fc51cb61ece453 data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json -733f85cdfee3edd8940dff7337c7525ae877ff27 data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json -d2216562cfb6fb98eb70a42609d5cb325ef68837 data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json -082354a279c7d578aad50abc90cf892601c2ceac data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json -91c68d9d41e041927f2609bf4f5261dd052c58ed data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json -f5738f2d3698bccbfabd8d476a22e6807943934f data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json -1057923658236d0e3440e9b3f7294bbd52d9a177 data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json -add44145a4a1345fd8af9a7e73f4a11ab66384bf data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json -4b667fd5c10adadff19c804f40f66275a90f9d1b data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json -3a76b68acf99e6b684a32a25bf341792fa1d6735 data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json -cccabca9b978834945973a2fbfe2bef17248723b data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json -bf0bd68033c8885b60e87e4b9b5eb18115a189c8 data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json -440627e991c29e60c18783509343c7f1a25caf36 data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json -9925b7efb3ef61cfefa1ee51008dfd14aa5183e0 data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json -a7b95c7786ae96c3261009a42e467c598575771d data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json -39d392f0acdf720d43b9ca85c86522669d22017a data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json -164c3511f03c4e5094db188eedd69fd73d01fcb8 data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json -b2e51f00471103a8078323707595eadcc079d2bc data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json -9713cffc19b860227d2d1e7283fa7629bd6fb71a data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json -33fa01d7646e219cb5004e3ffe45f9ae4002a43c data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json -32b61cd4041e9cc12b34fa8e8889ed7299119901 data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json -2d808c7fcc30de75ac0ef8a54a68e58a9819fab5 data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json -30f6dff3a2a4c2ed042c44c2ee71fb8e989224bb data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json -1ae1386e31695bbcd36c17232c4b96738b7848e0 data/theurgy/recipes/incubation/wheat.json +// 1.20.4 2024-05-25T13:38:47.7931543 Incubation Recipes +3cde65371f94968f42829e11b0253c7cb4c705ab data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json +c1d8b4e18f5373a23f1ff5aa252b6a4e25df076a data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json +7fb9094308bec53aa5799232c45ec8f2b87e672c data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json +66e5da0e2bf6fa012d34474829ee6f025d14d755 data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json +32d627c8090067ccbabc0c8a24d36319cbedc344 data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json +77655b2aab0d3cdff244cf0dfb764d26dd1c7215 data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json +5ff751ac60620c2693d0380288df92ca899826b0 data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json +146f02b8a6273010788f951c121358c8198f4436 data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json +029d9552a7fa1ce3751a5eeb7639a7f1b5197402 data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json +a7568efcb86c4a0a3d344c83936bac2a2ac48ac3 data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json +74819be3b8e1eaab2d8edb01687f5901628020b6 data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json +f337f0f420117f817b2a7488338b5b4c1ca57580 data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json +a2e7e469f09408d1ae2b2b992d6653c93af5833f data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json +8fbae396475cef0ce0e947dbaf9cdab3a91ea032 data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json +8d1585e7d017b71f4824f1ff2b72416c98492186 data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json +229380547f754a01853c021ff78296b7288a60df data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json +68b34603a73d88be10bfcadc81987c7affa74332 data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json +012c69126a18b9255d1d85849705961b4448a508 data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json +32b8ab94e398d9c72d03f0a4aebbed7f62f1ac37 data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json +1748f7e8b4dfdc081984b29ec3b2185aec1c9d67 data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json +266cce26d3c2dbcac72aaa914f32d67250a2dc9f data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json +3ca478e5aa0acf4664d2ad1e77ccd8a24c0488de data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json +afe151fbcc2ae633f6c2ecb850ebc3dd541c5c80 data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json +7add07f7fc948ee3ed41bb1344ad6fb18deff8f1 data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json +d2bbae71d17d32bfd114aa2c6cb3d0f3d12a8c06 data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json +3570933ecd87325d82c9a073c4ef44bc8a0675a8 data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json +743f66a967a25b2278f8e8539aed5787266cc14e data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json +8c057313ac3864534279bd761aa4972d68587d13 data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json +0240e9fca94a980d3c077f35ba43cf34ab0e2313 data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json +cdd39b13ce7ff2b2ce490602b52dcf12ae6ce173 data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json +a3d02863fc6793c714b5c149fb4c68c180be1cf5 data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json +2497c664021b2332c24a47f772713871a0550adb data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json +1e12c5311d4abcf182b03bd860d7e09bad25f232 data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json +b0de8c9629d9eae70e338ca0350779c18e614d0f data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json +9a630798bbb79e2f13876b3adf6dd99f50c75e2c data/theurgy/recipes/incubation/wheat.json diff --git a/src/generated/resources/assets/theurgy/blockstates/logistics_connector_node.json b/src/generated/resources/assets/theurgy/blockstates/logistics_connector_node.json new file mode 100644 index 000000000..9fa746e0e --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/logistics_connector_node.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "theurgy:block/logistics_connection_node", + "x": 180 + }, + "facing=east": { + "model": "theurgy:block/logistics_connection_node", + "x": 90, + "y": 90 + }, + "facing=north": { + "model": "theurgy:block/logistics_connection_node", + "x": 90 + }, + "facing=south": { + "model": "theurgy:block/logistics_connection_node", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "theurgy:block/logistics_connection_node" + }, + "facing=west": { + "model": "theurgy:block/logistics_connection_node", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/logistics_item_extractor.json b/src/generated/resources/assets/theurgy/blockstates/logistics_item_extractor.json new file mode 100644 index 000000000..33b12ae5f --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/logistics_item_extractor.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "theurgy:block/logistics_item_extractor", + "x": 180 + }, + "facing=east": { + "model": "theurgy:block/logistics_item_extractor", + "x": 90, + "y": 90 + }, + "facing=north": { + "model": "theurgy:block/logistics_item_extractor", + "x": 90 + }, + "facing=south": { + "model": "theurgy:block/logistics_item_extractor", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "theurgy:block/logistics_item_extractor" + }, + "facing=west": { + "model": "theurgy:block/logistics_item_extractor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/logistics_item_inserter.json b/src/generated/resources/assets/theurgy/blockstates/logistics_item_inserter.json new file mode 100644 index 000000000..bd7fc7a41 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/logistics_item_inserter.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "theurgy:block/logistics_item_inserter", + "x": 180 + }, + "facing=east": { + "model": "theurgy:block/logistics_item_inserter", + "x": 90, + "y": 90 + }, + "facing=north": { + "model": "theurgy:block/logistics_item_inserter", + "x": 90 + }, + "facing=south": { + "model": "theurgy:block/logistics_item_inserter", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "theurgy:block/logistics_item_inserter" + }, + "facing=west": { + "model": "theurgy:block/logistics_item_inserter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/lang/en_us.json b/src/generated/resources/assets/theurgy/lang/en_us.json index 5529124ac..215a424f1 100644 --- a/src/generated/resources/assets/theurgy/lang/en_us.json +++ b/src/generated/resources/assets/theurgy/lang/en_us.json @@ -37,6 +37,18 @@ "block.theurgy.liquefaction_cauldron.tooltip": "A device to extract Alchemical Sulfur from Items using a Solvent.", "block.theurgy.liquefaction_cauldron.tooltip.extended": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", "block.theurgy.liquefaction_cauldron.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\n§aRight-Click§r§7 with ingredients to add them to the cauldron for processing.\n", + "block.theurgy.logistics_connector_node": "Mercurial Connection Node", + "block.theurgy.logistics_connector_node.tooltip": "Allows to connect multiple wires in a Mercurial Logistics Network", + "block.theurgy.logistics_connector_node.tooltip.extended": "Can be used to insert or extract items from a block.", + "block.theurgy.logistics_connector_node.tooltip.usage": "Place the connection node, then use wires to connect it with other connection nodes, or other mercurial logistics blocks.\n", + "block.theurgy.logistics_item_extractor": "Mercurial Item Extractor", + "block.theurgy.logistics_item_extractor.tooltip": "Allows to extract items from a block into a Mercurial Logistics Network", + "block.theurgy.logistics_item_extractor.tooltip.extended": "Can be used to insert or extract items from a block.", + "block.theurgy.logistics_item_extractor.tooltip.usage": "§aRight-Click§r§7 the target block with the extractor to place it.\nThen §aRight-Click§r§7 the extractor with a cable to connect it to the network.\n", + "block.theurgy.logistics_item_inserter": "Mercurial Item Inserter", + "block.theurgy.logistics_item_inserter.tooltip": "Allows to insert items into a block from a Mercurial Logistics Network", + "block.theurgy.logistics_item_inserter.tooltip.extended": "Can be used to insert or extract items from a block.", + "block.theurgy.logistics_item_inserter.tooltip.usage": "§aRight-Click§r§7 the target block with the inserter to place it.\nThen §aRight-Click§r§7 the inserter with a cable to connect it to the network.\n", "block.theurgy.mercury_catalyst": "Mercury Catalyst", "block.theurgy.mercury_catalyst.tooltip": "Converts mercury from it's crystal form into it's flux form.", "block.theurgy.mercury_catalyst.tooltip.extended": "Mercury in flux form is pure energy and may be used as an energy source for certain processes.", @@ -642,10 +654,95 @@ "book.theurgy.the_hermetica.getting_started.target_pedestal.name": "Target Sulfur", "book.theurgy.the_hermetica.getting_started.target_pedestal.target.text": "Place (= [#](008080)right-click[#]()) at least one [Alchemical Sulfur: Quartz](item://theurgy:alchemical_sulfur_quartz) into the target pedestal.\\\nA glowing orb should appear above it.\n\\\n\\\nThe target sulfur will *not* be consumed - you can take it out after the process is finished!\n", "book.theurgy.the_hermetica.getting_started.target_pedestal.target.title": "The Target", + "book.theurgy.the_hermetica.logistics.connection_node.description": "Extend the Range of Logistics Networks", + "book.theurgy.the_hermetica.logistics.connection_node.image.title": "Demonstration", + "book.theurgy.the_hermetica.logistics.connection_node.large_networks.text": "In networks with multiple inserters and extractors the default behaviour is round-robin. That means each extractor will attempt to split the items evenly between all connected inserters.\n\\\n\\\nIn the future more advanced configurations will be possible.\n", + "book.theurgy.the_hermetica.logistics.connection_node.large_networks.title": "Complex Networks", + "book.theurgy.the_hermetica.logistics.connection_node.name": "Mercurial Connection Node", + "book.theurgy.the_hermetica.logistics.connection_node.node.text": "The node allows connecting wires over long distances without placing an inserter or extractor.\n", + "book.theurgy.the_hermetica.logistics.connection_node.usage.text": "1. Right-click any block to attach the node to it.\n2. Then connect the node to other blocks using wires.\n3. Any block connected directly or indirectly will be part of the same network.\n", + "book.theurgy.the_hermetica.logistics.connection_node.usage.title": "Usage", + "book.theurgy.the_hermetica.logistics.intro.description": "Matter Transport & Automation", + "book.theurgy.the_hermetica.logistics.intro.intro.text": "Spagyrics show that matter and energy are closely related, interchangeable even.\n\\\n\\\nMercury is the energetic aspect of matter, which can be moved both in crystal form and as energy, over metal wires.\n", + "book.theurgy.the_hermetica.logistics.intro.intro.title": "Mercurial Logistics", + "book.theurgy.the_hermetica.logistics.intro.intro2.text": "If the conversion between matter and energy in both directions can be controlled, then a much more efficient transportation system can be created, utilizing metal wires instead of hoppers or pipes: Mercurial Logistics.\n", + "book.theurgy.the_hermetica.logistics.intro.intro2.title": "Mercurial Logistics", + "book.theurgy.the_hermetica.logistics.intro.name": "Mercurial Logistics", + "book.theurgy.the_hermetica.logistics.item_extractor.description": "Extracting items from Blocks into the Mercurial Logistics System.", + "book.theurgy.the_hermetica.logistics.item_extractor.direction.text": "Extractors can also extract from faces they are not attached to. Use the [Mercurial Wand](entry://logistics/mercurial_wand) in the \"Select Direction\" mode to cycle through the extract directions.\\\nE.g. an extractor attached to the top of a furnace can be configured to extract the output of the furnace from the bottom (instead of the input from the top).\n", + "book.theurgy.the_hermetica.logistics.item_extractor.direction.title": "Changing Direction", + "book.theurgy.the_hermetica.logistics.item_extractor.extractor.text": "When attached to a block, the extractor will extract items from the block into the Mercurial Logistics System. The items will be inserted into blocks that have inserters attached to them, if the inserters are part of the same network.\n", + "book.theurgy.the_hermetica.logistics.item_extractor.identification.text": "The extractor features a red band on the side attached to the target block.\n", + "book.theurgy.the_hermetica.logistics.item_extractor.identification.title": "Identification", + "book.theurgy.the_hermetica.logistics.item_extractor.name": "Mercurial Item Extractor", + "book.theurgy.the_hermetica.logistics.item_extractor.usage.text": "Right-click a block that has an inventory to attach the extractor to it.\n\\\n\\\nThe extractor will by default extract from the face it is attached to. E.g. if it is attached to the bottom of a furnace, it will extract the output from the furnace.\n", + "book.theurgy.the_hermetica.logistics.item_extractor.usage.title": "Usage", + "book.theurgy.the_hermetica.logistics.item_inserter.description": "Inserting items into Blocks from the Mercurial Logistics System.", + "book.theurgy.the_hermetica.logistics.item_inserter.direction.text": "Inserters can also insert into faces they are not attached to. Use the [Mercurial Wand](entry://logistics/mercurial_wand) in the \"Select Direction\" mode to cycle through the insert directions.\\\nE.g. an inserter attached to the top of a furnace can be configured to insert fuel into furnace from the side (instead of into the input slot from the top).\n", + "book.theurgy.the_hermetica.logistics.item_inserter.direction.title": "Changing Direction", + "book.theurgy.the_hermetica.logistics.item_inserter.identification.text": "The inserter features a green band on the side attached to the target block.\n", + "book.theurgy.the_hermetica.logistics.item_inserter.identification.title": "Identification", + "book.theurgy.the_hermetica.logistics.item_inserter.inserter.text": "When attached to a block, the inserter will insert items from the Mercurial Logistics System into the block. The items will be extracted from blocks that have extractors attached to them, if the extractors are part of the same network.\n", + "book.theurgy.the_hermetica.logistics.item_inserter.name": "Mercurial Item Inserter", + "book.theurgy.the_hermetica.logistics.item_inserter.usage.text": "Right-click a block that has an inventory to attach the inserter to it.\n\\\n\\\nThe inserter will by default insert into the face it is attached to. E.g. if it is attached to the side of a furnace, it will insert into the fuel slot.\n", + "book.theurgy.the_hermetica.logistics.item_inserter.usage.title": "Usage", + "book.theurgy.the_hermetica.logistics.logistics_network.advanced.text": "More complex networks that allow filtering which items are inserted/extracted will be available in the future.\n", + "book.theurgy.the_hermetica.logistics.logistics_network.advanced.title": "Advanced Networks", + "book.theurgy.the_hermetica.logistics.logistics_network.description": "Putting it all together.", + "book.theurgy.the_hermetica.logistics.logistics_network.extending.text": "To improve the setup you can now place an extractor at the bottom of the furnace (or any other face and use the {0} to change the extract direction to bottom) and an inserter at any face of a second chest. Connect the two with a wire, and your furnace will now automatically deposit smelted items into the second chest.\n", + "book.theurgy.the_hermetica.logistics.logistics_network.extending.title": "Extending the Setup", + "book.theurgy.the_hermetica.logistics.logistics_network.extending2.text": "You could add a third chest with fuel and connect it to an inserter placed on the side of the furnace to automatically refuel it.\n", + "book.theurgy.the_hermetica.logistics.logistics_network.extending2.title": "Extending the Setup", + "book.theurgy.the_hermetica.logistics.logistics_network.image.title": "Demonstration", + "book.theurgy.the_hermetica.logistics.logistics_network.name": "Network Formation", + "book.theurgy.the_hermetica.logistics.logistics_network.network.text": "The most basic mercurial logistics network consists of one inserter and one extractor, connected by a wire.\n\\\n\\\nYou can test this with a setup that inserts the contents of a chest into a furnace to be smelted.\n", + "book.theurgy.the_hermetica.logistics.logistics_network.network.title": "Network Formation", + "book.theurgy.the_hermetica.logistics.logistics_network.setup.text": "1. Place a chest and a furnace near each other.\n2. Place an extractor on any face of the chest.\n3. Place an inserter on the top of the furnace (where the input items go).\n4. Connect inserter and extractor with a wire.\n", + "book.theurgy.the_hermetica.logistics.logistics_network.setup.title": "Place the Blocks", + "book.theurgy.the_hermetica.logistics.lore.conversion.text": "When matter comes into contact with Alchemical Mercury an odd reaction occurs. The matter seems to flicker, as if it is not quite there. Apparently the matter, for the briefest moment, shifts entirely into mercurial form, before returning to its original state.\n", + "book.theurgy.the_hermetica.logistics.lore.conversion.title": "Temporary Mercuriality", + "book.theurgy.the_hermetica.logistics.lore.description": "The energetic aspect of matter", + "book.theurgy.the_hermetica.logistics.lore.name": "Temporary Mercuriality", + "book.theurgy.the_hermetica.logistics.lore.reversal.text": "If there is sufficient space for the matter to return to its original state, it will do so. To this end another piece of Alchemical Mercury can be placed at the end of the wire, allowing the matter to return to its original state.\n", + "book.theurgy.the_hermetica.logistics.lore.reversal.title": "Reversal of Conversion", + "book.theurgy.the_hermetica.logistics.lore.wires.text": "Interestingly, this conversion can be persisted. If the Alchemical Mercury is in contact with an appropriate metal wire, the matter will remain in its mercurial form and flow along the wire, as if it were energy.\n", + "book.theurgy.the_hermetica.logistics.lore.wires.title": "Mercury Wires", + "book.theurgy.the_hermetica.logistics.mercurial_wand.conversion.text": "Mercurial Logistics apparatus can be controlled and configured using the Mercurial Wand.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wand.description": "Controlling Mercurial Logistics", + "book.theurgy.the_hermetica.logistics.mercurial_wand.enable.text": "With this mode, right-clicking on a block will enable or disable it.\n\\\n\\\nA disabled block will no longer insert or extract from the block it is attached to.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wand.enable.title": "Enable/Disable", + "book.theurgy.the_hermetica.logistics.mercurial_wand.name": "Mercurial Wand", + "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate.text": "With this mode, right-clicking on a block will cycle the selected direction of the target block.\n\\\n\\\nThe \"selected direction\" is the direction the block will insert/extract to/from.\n\\\n\\\nThe default selected direction is the face the block is attached to.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate.title": "Rotate Selected Direction", + "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate_visuals.text": "When looking at a logistics block with this mode selected, the block will highlight the selected direction on its target block.\n\\\n\\\nYellow is the current direction, green is the direction that will be set if you right-click.\\\nMake sure that the side you want to insert/extract from is yellow!\n", + "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate_visuals.title": "Rotate Selected Direction", + "book.theurgy.the_hermetica.logistics.mercurial_wand.usage.text": "Crouch and Scroll to change the mode of the wand.\n\\\n\\\nRight-click to interact with the target apparatus/block.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wand.usage.title": "Usage", + "book.theurgy.the_hermetica.logistics.mercurial_wire.description": "Item-Over-Wire Transport", + "book.theurgy.the_hermetica.logistics.mercurial_wire.name": "Mercurial Wire", + "book.theurgy.the_hermetica.logistics.mercurial_wire.removal.text": "To remove a wire, break one of the blocks the wire is connected to.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wire.removal.title": "Removing Wires", + "book.theurgy.the_hermetica.logistics.mercurial_wire.usage.text": "Right-click one block, then right-click another block to connect them with the wire.\n\\\n\\\nOnly mercurial logistics blocks, such as inserters, extractors or connection nodes, can be connected with wires.\n", + "book.theurgy.the_hermetica.logistics.mercurial_wire.usage.title": "Usage", + "book.theurgy.the_hermetica.logistics.mercurial_wire.wire.text": "Mercurial Wires can connect different parts of your Mercurial Logistics system. Substances will move freely between any blocks connected by wires.\n", + "book.theurgy.the_hermetica.logistics.name": "Mercurial Logistics", "book.theurgy.the_hermetica.name": "The Hermetica", "book.theurgy.the_hermetica.tooltip": "A treatise on the Ancient Art of Alchemy.\n§o(In-Game Guide for Theurgy)§r", "config.jade.plugin_theurgy.mercury_flux": "Theurgy Mercury Flux", "fluid_type.theurgy.sal_ammoniac": "Sal Ammoniac", + "item.mode.theurgy.mercurial_wand.disabled": "Disabled", + "item.mode.theurgy.mercurial_wand.enabled": "Enabled", + "item.mode.theurgy.mercurial_wand.rotate_selected_direction": "Rotate selected direction", + "item.mode.theurgy.mercurial_wand.rotate_selected_direction.success": "Rotated direction to %s", + "item.mode.theurgy.mercurial_wand.rotate_selected_direction.with_target": "Set direction from %s to %s", + "item.mode.theurgy.mercurial_wand.select_direction": "Select direction (Currently: %s)", + "item.mode.theurgy.mercurial_wand.select_direction.success": "Direction: %s", + "item.mode.theurgy.mercurial_wand.set_selected_direction": "Set direction to %s", + "item.mode.theurgy.mercurial_wand.set_selected_direction.success": "Set direction to %s", + "item.mode.theurgy.mercurial_wand.set_selected_direction.with_target": "Set direction from %s to %s", + "item.mode.theurgy.mercurial_wand.switch_logistics_enabled": "Enable/Disable", + "item.mode.theurgy.mercurial_wand.switch_logistics_enabled.hud": " (Currently: %s)", + "item.mode.theurgy.mercurial_wand.switch_logistics_enabled.success": "Logistics Connector is now %s", "item.theurgy.alchemical_salt_crops": "Alchemical Salt %s", "item.theurgy.alchemical_salt_crops.source": "Crops", "item.theurgy.alchemical_salt_crops.tooltip": "Alchemical Salt calcinated from %s.", @@ -907,6 +1004,10 @@ "item.theurgy.amethyst_divination_rod.tooltip": "A divination rod attuned to find amethyst.", "item.theurgy.amethyst_divination_rod.tooltip.extended": "This type of divination rod is crafted pre-attuned to find amethysts.", "item.theurgy.amethyst_divination_rod.tooltip.usage": "§aCraft§r§7 the rod, it is automatically attuned to Amethyst.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", + "item.theurgy.copper_wire": "Mercurial Copper Wire", + "item.theurgy.copper_wire.tooltip": "A piece of copper wire capable of transferring matter in its mercurial form.", + "item.theurgy.copper_wire.tooltip.extended": "Can be used to connect different parts of Mercurial Logistics Networks.", + "item.theurgy.copper_wire.tooltip.usage": "Right-click one connector, then right-click another connector to connect them with the wire.\n", "item.theurgy.divination_rod.unknown_linked_block": "Unknown Block (something went wrong)", "item.theurgy.divination_rod_t1": "Glass Divination Rod", "item.theurgy.divination_rod_t1.linked": "Glass Divination Rod %s", @@ -952,6 +1053,10 @@ "item.theurgy.jar_label_frame_rare_icon.tooltip": "Dummy item for rendering.", "item.theurgy.jar_label_icon": "Jar Label Icon", "item.theurgy.jar_label_icon.tooltip": "Dummy item for rendering.", + "item.theurgy.mercurial_wand": "Mercurial Wand", + "item.theurgy.mercurial_wand.tooltip": "Definitely not just a wrench.", + "item.theurgy.mercurial_wand.tooltip.extended": "Allows configuring alchemical apparatuses and mercurial logistics networks.", + "item.theurgy.mercurial_wand.tooltip.usage": "§aRight-Click§r§7 to use current mode.\nHold §aCrouch§r§7 and §aScroll§r§7 to cycle through modes.\n", "item.theurgy.mercury_crystal": "Mercury Crystal", "item.theurgy.mercury_crystal.tooltip.extended": "Mercury crystals are large pieces of Mercury in crystalline form. Their main uses are as ingredient in Digestion processes and as an energy source.", "item.theurgy.mercury_shard": "Mercury Shard", @@ -1037,6 +1142,8 @@ "theurgy.jei.misc.mercury_flux": "Mercury Flux: %s", "theurgy.jei.misc.source_pedestal_count": "%sx", "theurgy.jei.misc.source_sulfur.tooltip": "The Target Sulfur will not be consumed!\nYou can retrieve it after crafting is complete.", + "theurgy.key.change_item_mode": "Change Item Mode", + "theurgy.key.theurgy.category": "Theurgy", "theurgy.misc.unit.millibuckets": "%smB", "theurgy.subtitle.tuning_fork": "Using Divination Rod", "theurgytheurgy.sulfur_tier.abundant": "Abundant", diff --git a/src/generated/resources/assets/theurgy/models/block/logistics_connection_node.json b/src/generated/resources/assets/theurgy/models/block/logistics_connection_node.json new file mode 100644 index 000000000..9516c45c0 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/logistics_connection_node.json @@ -0,0 +1,9 @@ +{ + "parent": "theurgy:block/logistics_node_template", + "ambientocclusion": false, + "textures": { + "base": "theurgy:block/logistics_node_base", + "connector": "theurgy:block/logistics_node_connector", + "particle": "minecraft:block/terracotta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/logistics_item_extractor.json b/src/generated/resources/assets/theurgy/models/block/logistics_item_extractor.json new file mode 100644 index 000000000..48807846f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/logistics_item_extractor.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/logistics_connector_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/logistics_extractor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/logistics_item_inserter.json b/src/generated/resources/assets/theurgy/models/block/logistics_item_inserter.json new file mode 100644 index 000000000..0314e34fa --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/logistics_item_inserter.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/logistics_connector_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/logistics_inserter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json index 9eee1497e..0940d4e96 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json index 3be130a6a..bbc46bfac 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json index 147b185a3..2a2df405b 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json index bfa5064d2..16604f9c2 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json index c7fb8f83f..b37632ecc 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json index 87ad66ee2..bdc0f9e1a 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json index 25c9ec098..c773aea85 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json index cd0384556..1932439ce 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json index eb1cb1716..b3d1aa364 100644 --- a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/copper_wire.json b/src/generated/resources/assets/theurgy/models/item/copper_wire.json new file mode 100644 index 000000000..36d0a3c12 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/copper_wire.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/copper_wire" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json index 0ceb9fdb0..843eee335 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json index 58bd4bff0..22a9cd539 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json index 173412693..4f8a57d80 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json index d8ab12a1b..6e878f36a 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json index cdd881204..3f0bad91f 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json index 1d9bf78b0..74aac5a7f 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json index ca0a1d8d7..4e756e632 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json index 1bd098db9..39783e259 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json index b66b08bf3..532fe5e45 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t1/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json index 75ecf1535..c6877ba5c 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json index 99d6be09d..507249d91 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json index 2df0390e7..15f5e8527 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json index 6d8d8e6c7..4f79932dc 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json index a1d1f7240..aff82f9de 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json index eaf3592df..3c94b4770 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json index b01d015db..de110d72b 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json index 817a8ebfa..59991f5b8 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json index f5ea18e2e..ff4fa2ba6 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t2/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json index 226dae9e2..3a88b419a 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json index cd8ed3b6f..89c605e0c 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json index 399e15f1b..1fc5d6218 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json index 94511d971..9a04ccad1 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json index 7f2e20b8e..4a5e31a62 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json index eed3fedf4..f73485f6e 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json index b0ee7cb01..92984fcf8 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json index ccf57d40d..52677f2b6 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json index d07de8531..dd475bf71 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t3/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json index 34ed31864..345e55fb5 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json index 87d2aac2b..11fc6f88a 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json index d1061d16f..3067ff82a 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json index 3c9789b3f..1c9ca0a47 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json index 6880f0b1a..a2dc1aed4 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json index 5e73b3ae2..14cb23df0 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json index 5d6d54d20..1b45b02d5 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json index a0781414d..85b798677 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json index 07d64ef34..ea0c3fa46 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/divination_rod_t4/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/logistics_connector_node.json b/src/generated/resources/assets/theurgy/models/item/logistics_connector_node.json new file mode 100644 index 000000000..958bc8d4f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/logistics_connector_node.json @@ -0,0 +1,94 @@ +{ + "parent": "theurgy:block/logistics_connection_node", + "display": { + "firstperson_lefthand": { + "rotation": [ + 0, + 225, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "firstperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "fixed": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 3, + 0 + ] + }, + "ground": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 5, + 0 + ] + }, + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "translation": [ + 0, + 4, + 0 + ] + }, + "thirdperson_lefthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "thirdperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/logistics_item_extractor.json b/src/generated/resources/assets/theurgy/models/item/logistics_item_extractor.json new file mode 100644 index 000000000..6b15e2c02 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/logistics_item_extractor.json @@ -0,0 +1,94 @@ +{ + "parent": "theurgy:block/logistics_item_extractor", + "display": { + "firstperson_lefthand": { + "rotation": [ + 0, + 225, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "firstperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "fixed": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 3, + 0 + ] + }, + "ground": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 5, + 0 + ] + }, + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "translation": [ + 0, + 4, + 0 + ] + }, + "thirdperson_lefthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "thirdperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/logistics_item_inserter.json b/src/generated/resources/assets/theurgy/models/item/logistics_item_inserter.json new file mode 100644 index 000000000..803da2f36 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/logistics_item_inserter.json @@ -0,0 +1,94 @@ +{ + "parent": "theurgy:block/logistics_item_inserter", + "display": { + "firstperson_lefthand": { + "rotation": [ + 0, + 225, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "firstperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "fixed": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 3, + 0 + ] + }, + "ground": { + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + 5, + 0 + ] + }, + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "translation": [ + 0, + 4, + 0 + ] + }, + "thirdperson_lefthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + }, + "thirdperson_righthand": { + "scale": [ + 0.7, + 0.7, + 0.7 + ], + "translation": [ + 0, + 6, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/mercurial_wand.json b/src/generated/resources/assets/theurgy/models/item/mercurial_wand.json new file mode 100644 index 000000000..3775efa9c --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/mercurial_wand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "theurgy:item/mercurial_wand" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json index 75984f906..e62e58943 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json index 390bb33f4..6038534ce 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json index 2ff512202..99949eec6 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json index 4b02bf32e..8202419ba 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json index 439d69597..69297b0df 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json index 565df0499..e4f83388b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json index ca346b3a8..1a154a08b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json index 06d6d987a..f782e777b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json index b2f354fff..5565fcad8 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json index d2b08297f..40084e59b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json index f9c151c09..113527def 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json index 1a627f498..abef3eae4 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json index feaa491e6..a549caff3 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json index 2b723c8ac..55f346638 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json index 1f2e08123..e55681302 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json index 3fb425909..0aaabf08f 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json index 4a2bd5d0c..887c27c3b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json index ab3e23094..5207f5204 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json index 1cc2c9380..e21cab0f4 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json index f8a0d1d9e..862b82235 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json index fd308e6da..4b979dc21 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json index 314afc418..0f7d3b75f 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json index 36b59dbb0..1b90a9d4b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json index bb33905fb..91d472fa5 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json index 3202ff597..25dd25e62 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json index 7d2d87b3e..d543b58a2 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json index 3c4128884..1ae7ec84c 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_searching" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json index 58f7ab774..bc21e5c5b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_0" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json index 90083c58a..4fad47cc5 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_1" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json index 00ff95e19..51051b09d 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_2" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json index ae53f1e7e..244cca53f 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_3" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json index 1112c8a49..76fa7fcc8 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_4" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json index 54917049f..adb91a40e 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_5" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json index d7d74e229..31d226e22 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_6" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json index 374432450..4117eb715 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_7" } diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json index 551012c9a..b178ea74b 100644 --- a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_searching" } diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_connector_node.json b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_connector_node.json new file mode 100644 index 000000000..7e6ffa161 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_connector_node.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:logistics_connector_node" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/logistics_connector_node" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_extractor.json b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_extractor.json new file mode 100644 index 000000000..11d9e74a0 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_extractor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:logistics_item_extractor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/logistics_item_extractor" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_inserter.json b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_inserter.json new file mode 100644 index 000000000..de07bb6cc --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/logistics_item_inserter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:logistics_item_inserter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/logistics_item_inserter" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/logistics.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/logistics.json new file mode 100644 index 000000000..b71457630 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/logistics.json @@ -0,0 +1,14 @@ +{ + "background": "theurgy:textures/gui/book/bg_nightsky2.png", + "background_height": 512, + "background_parallax_layers": [], + "background_texture_zoom_multiplier": 1.0, + "background_width": 512, + "entry_textures": "modonomicon:textures/gui/entry_textures.png", + "icon": { + "item": "theurgy:mercurial_wand" + }, + "name": "book.theurgy.the_hermetica.logistics.name", + "show_category_button": true, + "sort_number": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/connection_node.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/connection_node.json new file mode 100644 index 000000000..507a43e12 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/connection_node.json @@ -0,0 +1,82 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.connection_node.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:logistics_connector_node" + }, + "name": "book.theurgy.the_hermetica.logistics.connection_node.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "item": { + "item": "theurgy:logistics_connector_node" + }, + "text": "book.theurgy.the_hermetica.logistics.connection_node.node.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "theurgy:crafting/shaped/logistics_connector_node", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.connection_node.usage.text", + "title": "book.theurgy.the_hermetica.logistics.connection_node.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "condition": { + "type": "modonomicon:none" + }, + "images": [ + "theurgy:textures/gui/book/connection_node_example.png" + ], + "text": "", + "title": "book.theurgy.the_hermetica.logistics.connection_node.image.title" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.connection_node.large_networks.text", + "title": "book.theurgy.the_hermetica.logistics.connection_node.large_networks.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/logistics_network", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": 9, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/intro.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/intro.json new file mode 100644 index 000000000..1960072ee --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/intro.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 1, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.intro.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:mercurial_wand" + }, + "name": "book.theurgy.the_hermetica.logistics.intro.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.intro.intro.text", + "title": "book.theurgy.the_hermetica.logistics.intro.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.intro.intro2.text", + "title": "book.theurgy.the_hermetica.logistics.intro.intro2.title", + "use_markdown_in_title": false + } + ], + "show_when_any_parent_unlocked": false, + "x": -1, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_extractor.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_extractor.json new file mode 100644 index 000000000..c9cf7781a --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_extractor.json @@ -0,0 +1,80 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.item_extractor.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:logistics_item_extractor" + }, + "name": "book.theurgy.the_hermetica.logistics.item_extractor.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "item": { + "item": "theurgy:logistics_item_extractor" + }, + "text": "book.theurgy.the_hermetica.logistics.item_extractor.extractor.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "theurgy:crafting/shaped/logistics_item_extractor", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_extractor.usage.text", + "title": "book.theurgy.the_hermetica.logistics.item_extractor.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_extractor.identification.text", + "title": "book.theurgy.the_hermetica.logistics.item_extractor.identification.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_extractor.direction.text", + "title": "book.theurgy.the_hermetica.logistics.item_extractor.direction.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": 3, + "y": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_inserter.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_inserter.json new file mode 100644 index 000000000..cca03a9ac --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/item_inserter.json @@ -0,0 +1,80 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.item_inserter.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:logistics_item_inserter" + }, + "name": "book.theurgy.the_hermetica.logistics.item_inserter.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "item": { + "item": "theurgy:logistics_item_inserter" + }, + "text": "book.theurgy.the_hermetica.logistics.item_inserter.inserter.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "theurgy:crafting/shaped/logistics_item_inserter", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_inserter.usage.text", + "title": "book.theurgy.the_hermetica.logistics.item_inserter.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_inserter.identification.text", + "title": "book.theurgy.the_hermetica.logistics.item_inserter.identification.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.item_inserter.direction.text", + "title": "book.theurgy.the_hermetica.logistics.item_inserter.direction.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": 3, + "y": -2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/logistics_network.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/logistics_network.json new file mode 100644 index 000000000..886e707b1 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/logistics_network.json @@ -0,0 +1,106 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.logistics_network.description", + "hide_while_locked": false, + "icon": { + "height": 16, + "texture": "theurgy:textures/gui/book/logistics_network.png", + "width": 16 + }, + "name": "book.theurgy.the_hermetica.logistics.logistics_network.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.logistics_network.network.text", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.network.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.logistics_network.setup.text", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.setup.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "condition": { + "type": "modonomicon:none" + }, + "images": [ + "theurgy:textures/gui/book/furnace_automation.png" + ], + "text": "", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.image.title" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.logistics_network.extending.text", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.extending.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.logistics_network.extending2.text", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.extending2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.logistics_network.advanced.text", + "title": "book.theurgy.the_hermetica.logistics.logistics_network.advanced.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/mercurial_wire", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:logistics/item_extractor", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:logistics/item_inserter", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": 7, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/lore.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/lore.json new file mode 100644 index 000000000..a75158621 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/lore.json @@ -0,0 +1,57 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.lore.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:mercury_shard" + }, + "name": "book.theurgy.the_hermetica.logistics.lore.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.lore.conversion.text", + "title": "book.theurgy.the_hermetica.logistics.lore.conversion.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.lore.wires.text", + "title": "book.theurgy.the_hermetica.logistics.lore.wires.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.lore.reversal.text", + "title": "book.theurgy.the_hermetica.logistics.lore.reversal.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": -1, + "y": -2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wand.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wand.json new file mode 100644 index 000000000..4afb14e85 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wand.json @@ -0,0 +1,91 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.mercurial_wand.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:mercurial_wand" + }, + "name": "book.theurgy.the_hermetica.logistics.mercurial_wand.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "item": { + "item": "theurgy:mercurial_wand" + }, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wand.conversion.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "theurgy:crafting/shaped/mercurial_wand", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wand.usage.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wand.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate_visuals.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wand.rotate_visuals.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wand.enable.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wand.enable.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": -1, + "y": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wire.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wire.json new file mode 100644 index 000000000..55dd15a3f --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/logistics/mercurial_wire.json @@ -0,0 +1,69 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:logistics", + "description": "book.theurgy.the_hermetica.logistics.mercurial_wire.description", + "hide_while_locked": false, + "icon": { + "item": "theurgy:copper_wire" + }, + "name": "book.theurgy.the_hermetica.logistics.mercurial_wire.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "item": { + "item": "theurgy:copper_wire" + }, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wire.wire.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "theurgy:crafting/shaped/copper_wire", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wire.usage.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wire.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.logistics.mercurial_wire.removal.text", + "title": "book.theurgy.the_hermetica.logistics.mercurial_wire.removal.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:logistics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "show_when_any_parent_unlocked": false, + "x": 5, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json index 9ca1a02a0..42598515f 100644 --- a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json +++ b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json @@ -1,5 +1,6 @@ { "type": "theurgy:accumulation", + "category": "misc", "evaporant": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json index b04786367..6fd260f72 100644 --- a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json +++ b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json @@ -1,5 +1,6 @@ { "type": "theurgy:accumulation", + "category": "misc", "evaporant": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/crops.json b/src/generated/resources/data/theurgy/recipes/calcination/crops.json index 520f6dac7..6195cfb2e 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/crops.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/crops.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:crops" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral.json index ad1fba6d4..8f302dbf0 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral.json @@ -1,5 +1,6 @@ { "type": "theurgy:calcination", + "category": "misc", "ingredient": { "item": "theurgy:alchemical_salt_strata" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json index 3411c026f..fe97df811 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:gems" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json index 15b07238b..fe579e0d8 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:ingots" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json index 0b10cfaa9..3dabbe7a1 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:ores" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json index 584dfebce..e955535fb 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "theurgy:other_minerals" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json index 6a28bfd75..ebf57821d 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:raw_materials" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json index 0cff1b5d7..850498ed9 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json @@ -1,5 +1,6 @@ { "type": "theurgy:calcination", + "category": "misc", "ingredient": { "item": "minecraft:clay" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json index d636c58cc..fcba65991 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json @@ -1,5 +1,6 @@ { "type": "theurgy:calcination", + "category": "misc", "ingredient": { "item": "minecraft:clay_ball" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json index 7a605924b..b32d9be3b 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:cobblestone" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json index 5cad593c4..ae4960acd 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "minecraft:dirt" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json index 925a549f7..70e10979d 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json @@ -1,5 +1,6 @@ { "type": "theurgy:calcination", + "category": "misc", "ingredient": { "item": "minecraft:gravel" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json index f819068db..9712534f5 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "minecraft:sand" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json index a8d25b500..9002fc96b 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:sandstone" }, diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json index a9ce9697d..8c18e78b6 100644 --- a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:calcination", + "category": "misc", "ingredient": { "tag": "forge:stone" }, diff --git a/src/generated/resources/data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json b/src/generated/resources/data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json index 9e58247bb..96be7347c 100644 --- a/src/generated/resources/data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json +++ b/src/generated/resources/data/theurgy/recipes/catalysation/mercury_flux_from_mercury_shard.json @@ -1,5 +1,6 @@ { "type": "theurgy:catalysation", + "category": "misc", "ingredient": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json index 37257a73e..b2050d4a3 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "G": { "tag": "forge:glass" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json index e34af3e1d..22fc7c1e9 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:storage_blocks/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json index f30ee8f0a..47ebbbe62 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_campfire.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "g": { "tag": "forge:ingots/gold" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json index 04b91a2b1..294b94a05 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/caloric_flux_emitter_from_lava_bucket.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "g": { "tag": "forge:ingots/gold" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/copper_wire.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/copper_wire.json new file mode 100644 index 000000000..efccbf7c9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/copper_wire.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "c": { + "tag": "forge:ingots/copper" + }, + "m": { + "item": "theurgy:mercury_shard" + } + }, + "pattern": [ + "cmc" + ], + "result": { + "count": 10, + "item": "theurgy:copper_wire" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/digestion_vat.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/digestion_vat.json index d0f8b0a74..32cfa2a67 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/digestion_vat.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/digestion_vat.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "forge:sandstone" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json index 2462becd4..f4fe1414c 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:storage_blocks/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json index 13c482cd9..5a990a587 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "G": { "tag": "forge:glass" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json index c79593ce2..644186af1 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "A": { "tag": "forge:gems/amethyst" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json index c125b5838..3e40a589a 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "A": { "tag": "forge:gems/amethyst" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json index 2c46aa7d1..6afdd8962 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "A": { "tag": "forge:gems/amethyst" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/fermentation_vat.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/fermentation_vat.json index e33a73b43..3697930d8 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/fermentation_vat.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/fermentation_vat.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:storage_blocks/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json index a736e6ffe..49873d5a9 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:ingots/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json index b519b9fe2..51d8b47aa 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "M": { "tag": "theurgy:alchemical_mercuries" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json index b80cc4244..acd855597 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "forge:stone" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json index 2b5786648..298292580 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "forge:stone" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json index 91b3ab654..d4a3cc56a 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "B": { "item": "minecraft:cauldron" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_connector_node.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_connector_node.json new file mode 100644 index 000000000..455e92863 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_connector_node.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "b": { + "tag": "forge:ingots/brick" + }, + "i": { + "tag": "forge:ingots/iron" + }, + "m": { + "item": "theurgy:mercury_shard" + } + }, + "pattern": [ + " m ", + " i ", + "bbb" + ], + "result": { + "count": 3, + "item": "theurgy:logistics_connector_node" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_extractor.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_extractor.json new file mode 100644 index 000000000..d3e557c84 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_extractor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "c": { + "tag": "forge:ingots/copper" + }, + "m": { + "item": "theurgy:mercury_shard" + } + }, + "pattern": [ + "c", + "m" + ], + "result": { + "count": 1, + "item": "theurgy:logistics_item_extractor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_inserter.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_inserter.json new file mode 100644 index 000000000..ffe83ef79 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/logistics_item_inserter.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "c": { + "tag": "forge:ingots/copper" + }, + "m": { + "item": "theurgy:mercury_shard" + } + }, + "pattern": [ + "m", + "c" + ], + "result": { + "count": 1, + "item": "theurgy:logistics_item_inserter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercurial_wand.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercurial_wand.json new file mode 100644 index 000000000..a756aa2b4 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercurial_wand.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "c": { + "tag": "forge:ingots/copper" + }, + "m": { + "item": "theurgy:mercury_shard" + }, + "s": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + " sm", + " cs", + "s " + ], + "result": { + "count": 1, + "item": "theurgy:mercurial_wand" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercury_catalyst.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercury_catalyst.json index d22844f64..f857425fa 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercury_catalyst.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/mercury_catalyst.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "Q": { "tag": "forge:storage_blocks/quartz" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json index abdd8960f..2f544fc9b 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:ingots/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json index 58b5e3e73..ee9342f74 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_result_pedestal.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "theurgy:alchemical_sulfurs" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json index 327325570..441b4edf8 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_source_pedestal.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "theurgy:alchemical_sulfurs" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json index 015e321af..a6384c0c2 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/reformation_target_pedestal.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "theurgy:alchemical_sulfurs" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json index b74cb02bf..2e617d50a 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "I": { "tag": "forge:ingots/iron" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json index 4c037c67b..c24e8e8d9 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "C": { "tag": "forge:ingots/copper" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json index 0f0eee7c2..38c20588d 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:divination_rod", + "category": "misc", "key": { "G": { "tag": "forge:glass" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json index 5c3980cf6..455fcd48d 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:divination_rod", + "category": "misc", "key": { "G": { "tag": "forge:glass" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json index 03c180340..800246183 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:divination_rod", + "category": "misc", "key": { "A": { "tag": "forge:gems/amethyst" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json index ab87d8cc2..8f3d55028 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:divination_rod", + "category": "misc", "key": { "A": { "tag": "forge:gems/amethyst" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json index 4197a3e1e..cb6850bd8 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfuric_flux_emitter.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "key": { "S": { "tag": "theurgy:alchemical_sulfurs" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_extractor_from_inserter.json b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_extractor_from_inserter.json new file mode 100644 index 000000000..009683eaa --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_extractor_from_inserter.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "theurgy:logistics_item_inserter" + } + ], + "result": { + "count": 1, + "item": "theurgy:logistics_item_extractor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_inserter_from_extractor.json b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_inserter_from_extractor.json new file mode 100644 index 000000000..668f8c9a8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/logistics_item_inserter_from_extractor.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "theurgy:logistics_item_extractor" + } + ], + "result": { + "count": 1, + "item": "theurgy:logistics_item_inserter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json index 21221e252..44c803f1e 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/sal_ammoniac_crystal_from_sal_ammoniac_bucket.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "theurgy:sal_ammoniac_bucket" diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json index 8ccd7d386..d872d1de7 100644 --- a/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "minecraft:book" diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json index 08c823ba4..59b0353b1 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_abundant_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json index c9069dff1..aecf0ee9b 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json index 0cb6b0bc3..f2e1b66a2 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_common_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json index e1a1c0389..6fa0d0fea 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_precious_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json index 88b00ad73..437cb95e4 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json index 20fad3327..dd52a88a2 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_gems_rare_from_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json index eb2889c1e..7401d9346 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_abundant_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json index 257a38287..7745fb01a 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json index a8b9d1b87..3a929ada6 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_common_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json index f73d4c28d..15dbed5f5 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_precious_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json index de1402385..a219d8208 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json index c78026d96..f43826403 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_metals_rare_from_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json index cb68eafed..80e76f8da 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_abundant_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json index c0e573f8a..5c4204b89 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json index 53653c40a..bbbf9da0c 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_common_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json index e473764e7..fdacd3a03 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_precious_from_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json index 78dba5ad8..9e2059f02 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json index 3c22686fb..e6f6f0c8c 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/alchemical_sulfur_other_minerals_rare_from_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "theurgy:sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/digestion/purified_gold.json b/src/generated/resources/data/theurgy/recipes/digestion/purified_gold.json index 2b90d3ce8..03baf966b 100644 --- a/src/generated/resources/data/theurgy/recipes/digestion/purified_gold.json +++ b/src/generated/resources/data/theurgy/recipes/digestion/purified_gold.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:digestion", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/beef.json b/src/generated/resources/data/theurgy/recipes/distillation/beef.json index 5339d10ff..9dea49f55 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/beef.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/beef.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:beef" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/bread.json b/src/generated/resources/data/theurgy/recipes/distillation/bread.json index e3eb10f10..1f3e85a61 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/bread.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/bread.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:bread" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/chicken.json b/src/generated/resources/data/theurgy/recipes/distillation/chicken.json index a58ed9a04..7116eb386 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/chicken.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/chicken.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:chicken" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json b/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json index 5b2088507..6f29496bb 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:cobblestone" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cod.json b/src/generated/resources/data/theurgy/recipes/distillation/cod.json index fc8ba8b11..14d9bc960 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cod.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cod.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cod" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json index a1e886584..4d99ed1b1 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_beef" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json index 30b593f9e..898acafd5 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_chicken" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json index 969d50010..74f5186fc 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_cod" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json index 31fb4f356..59e10ccf4 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_porkchop" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json index 4d9817f12..be622e9e7 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_rabbit" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json index 388429491..4667692d8 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:cooked_salmon" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/crops.json b/src/generated/resources/data/theurgy/recipes/distillation/crops.json index 777ffb9b1..2e8b431f9 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/crops.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/crops.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:crops" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/dirt.json b/src/generated/resources/data/theurgy/recipes/distillation/dirt.json index 7efb65a39..775f1efc4 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/dirt.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/dirt.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:dirt" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/dyes.json b/src/generated/resources/data/theurgy/recipes/distillation/dyes.json index 449453c01..151e23acc 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/dyes.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/dyes.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:dyes" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/flowers.json b/src/generated/resources/data/theurgy/recipes/distillation/flowers.json index 349d23ff5..0af3cd42f 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/flowers.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/flowers.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:flowers" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json index 893c2088e..cc7f3da70 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:gems/mercury/high" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json index 08e329625..72008477a 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:gems/mercury/low" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json index bcf54b474..42e1792ef 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:gems/mercury/medium" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/glass.json b/src/generated/resources/data/theurgy/recipes/distillation/glass.json index 3e65c07c0..a3988fd21 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/glass.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/glass.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:glass" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gravel.json b/src/generated/resources/data/theurgy/recipes/distillation/gravel.json index 9ad76d190..f9cb250d5 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/gravel.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/gravel.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:gravel" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/leaves.json b/src/generated/resources/data/theurgy/recipes/distillation/leaves.json index 1d7949293..b8bcd5e8e 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/leaves.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/leaves.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:leaves" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/logs.json b/src/generated/resources/data/theurgy/recipes/distillation/logs.json index c2743f60b..3adb036f4 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/logs.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/logs.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:logs" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json index 824766a74..c9952ec0a 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:metals/mercury/high" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json index 9b22ce614..b4c5b826e 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:metals/mercury/low" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json index 44d36b250..280bef9ad 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:metals/mercury/medium" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json index fc75167c4..350790d11 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:ores/mercury/high" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json index 9d3556d4a..99ea9de08 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:ores/mercury/low" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json index e58609e08..abced835a 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:ores/mercury/medium" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json index fcec80d60..e8ba80b6f 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:other_minerals/mercury/high" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json index c6e8e78fb..f18b54ebc 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:other_minerals/mercury/low" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json index 14112493c..23257e5ed 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:other_minerals/mercury/medium" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/planks.json b/src/generated/resources/data/theurgy/recipes/distillation/planks.json index 02d796ccf..1b5da1421 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/planks.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/planks.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:planks" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json b/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json index a41dd14de..252c11ebe 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:porkchop" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json b/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json index 8a3c34475..148912c87 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:rabbit" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json index 8c2c0c92a..19cac5a55 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:raw_materials/mercury/high" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json index ff13bc326..5dc4287e5 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:raw_materials/mercury/low" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json index 7bfc80c48..04a9c2465 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "theurgy:raw_materials/mercury/medium" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/salmon.json b/src/generated/resources/data/theurgy/recipes/distillation/salmon.json index 53d52defe..a40f909d3 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/salmon.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/salmon.json @@ -1,5 +1,6 @@ { "type": "theurgy:distillation", + "category": "misc", "ingredient": { "item": "minecraft:salmon" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/sand.json b/src/generated/resources/data/theurgy/recipes/distillation/sand.json index e33c5cd35..e4a414ce5 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/sand.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/sand.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:sand" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json b/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json index a226fe25a..3dd74bf29 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:sandstone" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/saplings.json b/src/generated/resources/data/theurgy/recipes/distillation/saplings.json index cb40d85dc..8d92417f4 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/saplings.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/saplings.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:saplings" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/stone.json b/src/generated/resources/data/theurgy/recipes/distillation/stone.json index 5ea824a46..e138e1781 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/stone.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/stone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "forge:stone" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json b/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json index bcd213cda..6348a604d 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:stone_bricks" }, diff --git a/src/generated/resources/data/theurgy/recipes/distillation/wool.json b/src/generated/resources/data/theurgy/recipes/distillation/wool.json index bc03e3782..0a5505c5e 100644 --- a/src/generated/resources/data/theurgy/recipes/distillation/wool.json +++ b/src/generated/resources/data/theurgy/recipes/distillation/wool.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:distillation", + "category": "misc", "ingredient": { "tag": "minecraft:wool" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json index 781b02bee..7715c9ed6 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json index 339ecc450..592cbb393 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_abundant_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json index 29261b929..84142de74 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json index 607d3f62b..e06314c8b 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_common_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json index 741bf2165..d18a68ed5 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json index d62e93e84..5ebba9843 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_precious_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json index f99b26346..d863b6819 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json index 8ede13bca..e909fdc06 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_gems_rare_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json index 51c3b25bb..9049f3c06 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json index 23bd1e3e8..9cd204082 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_abundant_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json index f72d3eef9..b6f63a41a 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json index 4f3a58604..863b5bd5b 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_common_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json index 8fff351f7..96068525c 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json index f9f2629eb..1814f76ac 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_precious_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json index 951a340aa..a56aaff42 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json index ea001e947..dbcce6cb4 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_metals_rare_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json index 4fa2c796f..8689a9243 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json index cedf17f94..ad7302b37 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_abundant_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json index baa317408..9cc8ddc1a 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json index d210e3901..f7f170491 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_common_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json index 46a0caffa..3b994dacb 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json index 3d3525b35..746fcce7a 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_precious_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json index 299a3033d..f60107de1 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_crops.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json index cdf9a43bf..a9d5880ae 100644 --- a/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json +++ b/src/generated/resources/data/theurgy/recipes/fermentation/alchemical_sulfur_other_minerals_rare_using_sugar.json @@ -16,6 +16,7 @@ } ], "type": "theurgy:fermentation", + "category": "misc", "fluid": { "tag": "minecraft:water" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json b/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json index f2275f254..193e98dc5 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json b/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json index 3eed99e35..635920c57 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json index 8bd0cec6a..beb6469ae 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json index e48361f2e..5b6a157db 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json index 7217ee96f..3ab9bcee1 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json index d427f5e43..e0b2a09c7 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json index 5ff689471..2aec83ae0 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json index f5969d543..42c3a9bdc 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json index 1ccef9184..38187a334 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json index 0e02b1cdd..939d73579 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json index 7f66dd119..d0dccda3a 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json index bee1374ed..32bf90141 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json index 105b8bf1c..ff52c7262 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json index f97db9719..3dc078b33 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json index 9e29201f1..1a470b838 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json index 4683c0d08..1e7c78eff 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json index 8734dea23..7d5c3658e 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json index 66a410aa8..a052fbd8c 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json index 7166bb6af..436efd343 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json index a26de73f6..9407c148d 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json index 73210de2b..99d4c64ac 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json index 6967e4787..a4a686db1 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json index d6b250cce..92b0a4266 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json index 6c61c1248..94e8a7f7f 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json index 43ecbaec1..5d096c311 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json index 245b15005..def0a7d31 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json index ba1e34103..e69108514 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json index bed0b1742..3044335d1 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json index 63470d4b4..966b46ae4 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json index 06c00d68e..ed4c91188 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json index 65f5112ef..79f3eba1a 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json index dcad760d9..88b8c078e 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json index 007807519..1dbbee735 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json index 0fd2d1835..af4301bd8 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/incubation/wheat.json b/src/generated/resources/data/theurgy/recipes/incubation/wheat.json index 23dc476c1..cbf819162 100644 --- a/src/generated/resources/data/theurgy/recipes/incubation/wheat.json +++ b/src/generated/resources/data/theurgy/recipes/incubation/wheat.json @@ -1,5 +1,6 @@ { "type": "theurgy:incubation", + "category": "misc", "mercury": { "item": "theurgy:mercury_shard" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json index 44f7dce15..20cbb142d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/allthemodium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json index c749efb5c..967bb5a22 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/allthemodium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json index 402487b1a..5311ecc48 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/allthemodium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json index 2c3b34a1f..0643c37af 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/amethyst" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json index 36b42ccd4..eca65c220 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/apatite" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json index 17275834e..d7286a7c6 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/apatite" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json index 4a492ea6b..8ccaab0d4 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/azure_silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json index 5c2874853..87aad173d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/azure_silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json index 37dcdcfbd..f89713445 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/azure_silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json index e2ef3739b..6dd4ae68a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/cinnabar" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json index 8a163873c..1c3add44d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/cinnabar" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json index 3f7f9d46d..18ef01454 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/cinnabar" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json index 8504c52a1..d71d49096 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "minecraft:coals" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json index 689c12e12..2cc8bfa31 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/coal" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json index ce7ec3bc4..a9be119ae 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/copper" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json index ef68e9026..af56df744 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/copper" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json index 65008d70c..1a150a1d2 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/copper" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json index c22417699..3baa37045 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/crimson_iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json index 17dc7b3c8..11c02ddc3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/crimson_iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json index d4b0994e4..117ac8b9d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/crimson_iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json index d161dcafd..533881b21 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/diamond" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json index 062ecac43..25ac2c46f 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/diamond" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json index 2cef89d46..1320bc376 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/emerald" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json index f3f3eccda..ab9b5f9f3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/emerald" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json index 63c2ee8ba..6640a7428 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/fluorite" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json index 315e9e895..be42756e3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/fluorite" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json index f910f468b..25b14d7dc 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/gold" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json index 9d110a00c..871b610f1 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/gold" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json index b2589fe23..d6e2cfd98 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/gold" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json index 7ea6d5408..9fe9d47d0 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/iridium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json index ab89ad2bb..609114551 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/iridium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json index 9473b52ce..03c370166 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/iridium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json index 49cf70fee..ebc17ae49 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json index d44619e8e..3c1fb8eda 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json index 94ba47369..eace06d97 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/iron" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json index 5725f5107..9bd988a7d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/lapis" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json index 8042421a0..1236f326a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/lapis" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json index 03fc85ff5..047bfcb60 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/lead" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json index 98bf241a1..ef52c3953 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/lead" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json index 1fe21fd5d..1cdc56586 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/lead" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json index 11e14acef..9e0acfde3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "minecraft:logs" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json index d8f733d57..6bf635af6 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/netherite" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json index b284b4085..bcff93f5a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/netherite_scrap" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json index b687b8033..86e75b456 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/nickel" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json index d518a2770..5022a3901 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/nickel" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json index 62d8cf7c4..68388a330 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/nickel" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json index d9a62c676..0c4fc02af 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/osmium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json index 4a5b28c0f..405ff255a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/osmium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json index f253dcde9..a0a55c9d5 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/osmium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json index b52c22538..f2b1e0f50 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/peridot" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json index 9d0c0cfde..c3705c495 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/peridot" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json index b8e8c5cd9..cf51a814a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/platinum" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json index 4dd24627a..94f02fd09 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/platinum" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json index 8d046b4b5..4839b1761 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/platinum" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json index 19e028212..d1c5665da 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/prismarine" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json index 92012b6dd..a18caa8dc 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/quartz" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json index e7b589606..37eb0cca0 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/quartz" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json index 8beb75499..21129cbe3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:dusts/redstone" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json index 5de1bca56..4243a951a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/redstone" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json index ab529c873..82dc09752 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/ruby" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json index 4137bb260..1095355cb 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/ruby" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json index 813c158e9..e3b45cd79 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json index db6e28fdb..3e5e137eb 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/sal_ammoniac" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json index cff50e08a..ab0363798 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/sapphire" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json index 3b76219d9..24da9ab13 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/sapphire" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json index b3b67a137..6a8010a0f 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json index 9ca388d40..3efd57778 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json index 13a8b2d0d..d07b286e3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/silver" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json index 42d08c076..db125767a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:gems/sulfur" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json index 371a7c50e..0f3bbfd45 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/sulfur" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json index f7b8af424..9e0ce6977 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/tin" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json index b1d45feed..c49d1260a 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/tin" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json index 97bd635f2..382ab4c5d 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/tin" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json index 14d1ea397..bb641d029 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/unobtainium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json index 4bdac1984..9d995279b 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/unobtainium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json index 15d59a75d..6d4e5d81e 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/unobtainium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json index 6f06a5ce2..4076f8e0e 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/uranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json index 3c0fa27aa..f0a58437f 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/uranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json index 71f0343f7..fcc7e85b3 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/uranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json index d4cfc21c2..8db607eae 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/vibranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json index aed7de87b..fdb355ccd 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/vibranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json index 30d222336..7e70fb1fc 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/vibranium" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json index 8ee4c9303..bda8c6cca 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json @@ -1,5 +1,6 @@ { "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "item": "minecraft:wheat" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json index faffe8ee9..fa5a2e50b 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ingots/zinc" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json index a24839a7e..41e1b6a6b 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:ores/zinc" }, diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json index 9e78a1562..695e25b17 100644 --- a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:liquefaction", + "category": "misc", "ingredient": { "tag": "forge:raw_materials/zinc" }, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json index 0d7fbd226..b62474f94 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json index a08a055d1..0cb40d44f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_amethyst_from_alchemical_sulfurs_gems_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json index 3a4e4e17c..c515730c2 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfur_gems_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json index a16c1d3db..1ea7f2587 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_apatite_from_alchemical_sulfurs_gems_abundant.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json index 1bc11c1c0..4ca50e555 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json index 23190fc99..d791470e2 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_azure_silver_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json index 7af52a08d..9e38f8fd1 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json index 269ca29d4..9bf9a8f81 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_cinnabar_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json index 72771c82e..01bd55398 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfur_other_minerals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json index 2c171e636..d8c074656 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_coal_from_alchemical_sulfurs_other_minerals_abundant.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json index a377c9d55..94d9177bf 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfur_metals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json index b84b27a37..8e6cb898f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_copper_from_alchemical_sulfurs_metals_abundant.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json index f2f035942..755236467 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json index bbb476685..e79c99381 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_crimson_iron_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json index 0b4ff4e54..9d3816a39 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfur_gems_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json index 4fc6169e2..bcc66301f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_diamond_from_alchemical_sulfurs_gems_precious.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json index ee43c0696..4e998b92e 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfur_gems_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json index 57e7ac622..cf4051ba9 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_emerald_from_alchemical_sulfurs_gems_precious.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json index fec7988a2..615406a18 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfur_gems_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json index ed1ff4410..cad8a9690 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_fluorite_from_alchemical_sulfurs_gems_abundant.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json index 9d1f17680..336fdc1dc 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_metals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json index 5905f83a3..ed4340436 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_abundant_from_alchemical_sulfur_other_minerals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json index dbc008792..768dee0ec 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json index 2d41ce4f9..bddbe4b20 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_common_from_alchemical_sulfur_other_minerals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json index 1bce210cb..60605365c 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_metals_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json index bbb09ee31..3fb6ddd2d 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_precious_from_alchemical_sulfur_other_minerals_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json index c66154a4b..4b9e6d412 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json index bf4c7bb24..9a5cbe154 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gems_rare_from_alchemical_sulfur_other_minerals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json index 94ad98294..c729b80f2 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json index f30218d2f..16e6c57e2 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_gold_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json index 9b79c55a5..19ac6354d 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json index aafdbfd5a..9efbc7d15 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iridium_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json index e28cf8229..0db8867f4 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json index 524c167e9..afd5fdf75 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_iron_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json index 6eda7e0e2..db1f580d7 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfur_gems_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json index 35e4f33e5..47ebc42f6 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lapis_from_alchemical_sulfurs_gems_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json index 91868b2a1..3dd640456 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json index c9399cfcd..df784e89f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_lead_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json index c9a1ee9cd..6033e9d9b 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_gems_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json index 7a2a49538..fb55ae4a1 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_abundant_from_alchemical_sulfur_other_minerals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json index 634af52c4..e6dc66b6a 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_gems_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json index 616ba8447..61fdffdae 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_common_from_alchemical_sulfur_other_minerals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json index 10b3b634d..d56c04e98 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_gems_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json index 960f26288..e6c31c298 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_precious_from_alchemical_sulfur_other_minerals_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json index f27ff656e..700594de0 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json index fdeb1525f..64ea665c3 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_metals_rare_from_alchemical_sulfur_other_minerals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json index 588d3060f..5fcb1bdd4 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfur_metals_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json index f1be3f174..826c5286f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_netherite_from_alchemical_sulfurs_metals_precious.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json index c7ea350b9..e153ccc56 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json index 5c63519bd..91d48aa98 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_nickel_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json index 509462547..90c1b4815 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json index 661eabfb8..6f0d86f72 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_osmium_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json index 1b08673a5..65e0e5d85 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_gems_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 4, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json index c64e19c46..d5a7f327f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_abundant_from_alchemical_sulfur_metals_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json index c28f3f102..603e68efe 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_gems_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 4, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json index 3e840a917..efbb9d20e 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_common_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json index 118647173..a95b7896f 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_gems_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 4, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json index 562ee0e71..5f2c42bef 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_precious_from_alchemical_sulfur_metals_precious.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 200, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json index dcaf2554d..aabb9da55 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 4, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json index 651b699f4..0f6f4f63b 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_other_minerals_rare_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 2, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json index 0fd02ab69..b8c7c983d 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json index 0d2442a36..4e03fb98e 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_peridot_from_alchemical_sulfurs_gems_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json index 53d5cac9e..3917d1182 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json index 60a6328ea..8ba1d9148 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_platinum_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json index 56971292b..843589187 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json index 11e961037..854caedb0 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_prismarine_from_alchemical_sulfurs_gems_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json index 76771ace3..aa724e570 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfur_gems_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json index 8c885a455..d1a24c9da 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_quartz_from_alchemical_sulfurs_gems_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json index 069ea621b..332da801b 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfur_other_minerals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json index 9e74c9d7b..1903fcc01 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_redstone_from_alchemical_sulfurs_other_minerals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json index 645070aba..5814b6ea1 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json index 16d1dce4e..27331e8e5 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_ruby_from_alchemical_sulfurs_gems_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json index 7741adb5d..6c422c371 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfur_gems_abundant.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json index 89f670434..9abd450fc 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sal_ammoniac_from_alchemical_sulfurs_gems_abundant.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 50, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json index dd177a0c8..d10147e59 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfur_gems_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json index 1f7247c9a..7c52d1ffe 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sapphire_from_alchemical_sulfurs_gems_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json index 9390956a2..a95522145 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json index c3545b840..4ec0fd3b1 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_silver_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json index d5cad7cd6..b3a0d338a 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfur_other_minerals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json index 8d95c0671..a0bc97dc5 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_sulfur_from_alchemical_sulfurs_other_minerals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json index a077d8a95..8569b5477 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json index 34ed20017..98eb59d9d 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_tin_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json index 3dcf0dea9..83db75ffd 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfur_metals_rare.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json index 6b7909f39..9660fa060 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_uranium_from_alchemical_sulfurs_metals_rare.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 150, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json index 8a3d479b0..062797593 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfur_metals_common.json @@ -1,5 +1,6 @@ { "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json index 28a99620c..19f5b5513 100644 --- a/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json +++ b/src/generated/resources/data/theurgy/recipes/reformation/alchemical_sulfur_zinc_from_alchemical_sulfurs_metals_common.json @@ -9,6 +9,7 @@ } ], "type": "theurgy:reformation", + "category": "misc", "mercury_flux": 100, "result": { "count": 1, diff --git a/src/main/java/com/klikli_dev/theurgy/Theurgy.java b/src/main/java/com/klikli_dev/theurgy/Theurgy.java index f89fdb36c..1cde85420 100644 --- a/src/main/java/com/klikli_dev/theurgy/Theurgy.java +++ b/src/main/java/com/klikli_dev/theurgy/Theurgy.java @@ -18,19 +18,24 @@ import com.klikli_dev.theurgy.content.apparatus.mercurycatalyst.MercuryCatalystBlock; import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.render.SalAmmoniacAccumulatorRenderer; import com.klikli_dev.theurgy.content.apparatus.salammoniactank.render.SalAmmoniacTankRenderer; -import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; -import com.klikli_dev.theurgy.content.render.BlankEntityRenderer; -import com.klikli_dev.theurgy.content.render.ClientTicks; -import com.klikli_dev.theurgy.content.render.TheurgyModelLayers; +import com.klikli_dev.theurgy.content.item.salt.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.mode.ModeItem; +import com.klikli_dev.theurgy.content.render.*; +import com.klikli_dev.theurgy.content.render.itemhud.ItemHUD; import com.klikli_dev.theurgy.content.render.outliner.Outliner; import com.klikli_dev.theurgy.datagen.TheurgyDataGenerators; import com.klikli_dev.theurgy.integration.modonomicon.PageLoaders; import com.klikli_dev.theurgy.integration.modonomicon.PageRenderers; +import com.klikli_dev.theurgy.logistics.Logistics; +import com.klikli_dev.theurgy.logistics.WireRenderer; +import com.klikli_dev.theurgy.logistics.WireSync; +import com.klikli_dev.theurgy.logistics.Wires; import com.klikli_dev.theurgy.network.Networking; import com.klikli_dev.theurgy.registry.*; import com.klikli_dev.theurgy.tooltips.TooltipHandler; +import com.klikli_dev.theurgy.util.ScrollHelper; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.logging.LogUtils; @@ -49,10 +54,8 @@ import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent; import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import net.neoforged.neoforge.client.event.RecipesUpdatedEvent; -import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; -import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; import net.neoforged.neoforge.client.model.DynamicFluidContainerModel; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.TickEvent; @@ -103,6 +106,10 @@ public Theurgy(IEventBus modEventBus) { modEventBus.addListener(CapabilityRegistry::onRegisterCapabilities); NeoForge.EVENT_BUS.addListener(TooltipHandler::onItemTooltipEvent); + NeoForge.EVENT_BUS.addListener(Logistics::onLevelUnload); + NeoForge.EVENT_BUS.addListener(Wires::onLevelUnload); + NeoForge.EVENT_BUS.addListener(WireSync.get()::onChunkWatch); + NeoForge.EVENT_BUS.addListener(WireSync.get()::onChunkUnWatch); if (FMLEnvironment.dist == Dist.CLIENT) { modEventBus.addListener(ParticleRegistry::registerFactories); @@ -111,11 +118,18 @@ public Theurgy(IEventBus modEventBus) { modEventBus.addListener(Client::onRegisterEntityRenderers); modEventBus.addListener(Client::onRegisterItemColors); modEventBus.addListener(Client::onRegisterBlockColors); + modEventBus.addListener(Client::onRegisterGuiOverlays); + modEventBus.addListener(BlockOverlays::onTextureAtlasStitched); + modEventBus.addListener(KeyMappingsRegistry::onRegisterKeyMappings); NeoForge.EVENT_BUS.addListener(Client::onRenderLevelStage); NeoForge.EVENT_BUS.addListener(Client::onClientTick); NeoForge.EVENT_BUS.addListener(Client::onRecipesUpdated); + NeoForge.EVENT_BUS.addListener(Client::onMouseScrolling); NeoForge.EVENT_BUS.addListener(Client::onRightClick); NeoForge.EVENT_BUS.addListener(Client::onLeftClick); + NeoForge.EVENT_BUS.addListener(BlockHighlightRenderer::onRenderBlockHighlight); + NeoForge.EVENT_BUS.addListener(KeyMappingsRegistry::onKeyInput); + NeoForge.EVENT_BUS.addListener(KeyMappingsRegistry::onMouseInput); } GeckoLib.initialize(modEventBus); @@ -189,6 +203,8 @@ public static void onRenderLevelStage(RenderLevelStageEvent event) { buffer.endBatch(); RenderSystem.enableCull(); ms.popPose(); + + WireRenderer.get().onRenderLevelStage(event); } public static void onRecipesUpdated(RecipesUpdatedEvent event) { @@ -258,6 +274,26 @@ public static void onRegisterBlockColors(RegisterColorHandlersEvent.Block event) event.register(MercuryCatalystBlock::getBlockColor, BlockRegistry.MERCURY_CATALYST.get()); } + public static void onRegisterGuiOverlays(RegisterGuiOverlaysEvent event) { + event.registerAbove(VanillaGuiOverlay.HOTBAR.id(), Theurgy.loc("item_hud"), ItemHUD.get()); + } + + public static void onMouseScrolling(InputEvent.MouseScrollingEvent event) { + var minecraft = Minecraft.getInstance(); + if (minecraft.player != null && minecraft.player.isShiftKeyDown()) { + double delta = event.getScrollDeltaY(); + var stack = minecraft.player.getMainHandItem(); + + if (delta != 0 && stack.getItem() instanceof ModeItem modeItem) { + int shift = ScrollHelper.scroll(delta); + if (shift != 0) { + modeItem.onScroll(minecraft.player, stack, shift); + } + event.setCanceled(true); + } + } + } + public static void onRightClick(PlayerInteractEvent.RightClickBlock event) { if (BlockRegistry.CALORIC_FLUX_EMITTER.get().selectionBehaviour().onRightClickBlock(event.getLevel(), event.getEntity(), event.getHand(), event.getPos(), event.getFace())) { event.setCanceled(true); diff --git a/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java b/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java index b5715ba24..13d9f4831 100644 --- a/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java +++ b/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java @@ -63,6 +63,23 @@ public static class Item { private static final String PREFIX = "item." + Theurgy.MODID + "."; public static final String ALCHEMICAL_SULFUR_UNKNOWN_SOURCE = PREFIX + "alchemical_sulfur.unknown_source"; public static final String DIVINATION_ROD_UNKNOWN_LINKED_BLOCK = PREFIX + "divination_rod.unknown_linked_block"; + + public static class Mode { + public static final String PREFIX = "item.mode." + Theurgy.MODID + "."; + public static final String MERCURIAL_WAND_SELECT_DIRECTION = PREFIX + "mercurial_wand.select_direction"; + public static final String MERCURIAL_WAND_SELECT_DIRECTION_SUCCESS = PREFIX + "mercurial_wand.select_direction.success"; + public static final String MERCURIAL_WAND_SET_SELECTED_DIRECTION = PREFIX + "mercurial_wand.set_selected_direction"; + public static final String MERCURIAL_WAND_SET_SELECTED_DIRECTION_WITH_TARGET = PREFIX + "mercurial_wand.set_selected_direction.with_target"; + public static final String MERCURIAL_WAND_SET_SELECTED_DIRECTION_SUCCESS = PREFIX + "mercurial_wand.set_selected_direction.success"; + public static final String MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION = PREFIX + "mercurial_wand.rotate_selected_direction"; + public static final String MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_WITH_TARGET = PREFIX + "mercurial_wand.rotate_selected_direction.with_target"; + public static final String MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_SUCCESS = PREFIX + "mercurial_wand.rotate_selected_direction.success"; + public static final String MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED = PREFIX + "mercurial_wand.switch_logistics_enabled"; + public static final String MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_HUD = PREFIX + "mercurial_wand.switch_logistics_enabled.hud"; + public static final String MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_SUCCESS = PREFIX + "mercurial_wand.switch_logistics_enabled.success"; + public static final String ENABLED = PREFIX + "mercurial_wand.enabled"; + public static final String DISABLED = PREFIX + "mercurial_wand.disabled"; + } } public static class Tooltip { @@ -119,6 +136,12 @@ public static class Misc { public static final String UNIT_MILLIBUCKETS = PREFIX + "unit.millibuckets"; } + public static class Key { + public static final String PREFIX = Theurgy.MODID + ".key."; + public static final String CATEGORY = PREFIX + "theurgy.category"; + public static final String CHANGE_ITEM_MODE = PREFIX + "change_item_mode"; + } + public static class Behaviour { public static final String PREFIX = Theurgy.MODID + ".behaviour."; public static final String SELECTION_MODE = PREFIX + "selection.mode"; @@ -134,6 +157,8 @@ public static class Behaviour { public static final String SELECTION_SUMMARY_SULFURIC_FLUX_EMITTER_NO_SOURCES = PREFIX + "selection.summary.sulfuric_flux_emitter.no_sources"; public static final String SELECTION_SUMMARY_SULFURIC_FLUX_EMITTER_NO_RESULT = PREFIX + "selection.summary.sulfuric_flux_emitter.no_result"; + public static final String SELECTION_MODE_LOGISTICS_NODE = PREFIX + "selection.mode.logistics_node"; + public static final String INTERACTION_FERMENTATION_VAT_NO_RECIPE = PREFIX + "interaction.fermentation_vat.no_recipe"; public static final String INTERACTION_FERMENTATION_VAT_CLOSED = PREFIX + "interaction.fermentation_vat.closed"; diff --git a/src/main/java/com/klikli_dev/theurgy/config/ClientConfig.java b/src/main/java/com/klikli_dev/theurgy/config/ClientConfig.java index 181cc529f..cb5eaeaa5 100644 --- a/src/main/java/com/klikli_dev/theurgy/config/ClientConfig.java +++ b/src/main/java/com/klikli_dev/theurgy/config/ClientConfig.java @@ -28,6 +28,8 @@ public static ClientConfig get() { public static class Rendering { public final BooleanValue renderSulfurSourceItem; + public final BooleanValue enableItemHUD; + public final ModConfigSpec.DoubleValue itemHUDScale; public Rendering(ModConfigSpec.Builder builder) { builder.comment("Rendering Settings").push("rendering"); @@ -37,6 +39,14 @@ public Rendering(ModConfigSpec.Builder builder) { "Disabling this setting may improve performance in inventories with lots of sulfur item stacks.") .define("renderSulfurSourceItem", true); + this.enableItemHUD = builder + .comment("True to enable the item HUD, false to disable it.") + .define("enableItemHUD", true); + + this.itemHUDScale = builder + .comment("The scale of the Item HUD text (e.g. for the mercurial wand).") + .defineInRange("hudScale", 0.7, 0.25, 3); + builder.pop(); } } diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/DirectionalBlockShape.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/DirectionalBlockShape.java new file mode 100644 index 000000000..066a6ade3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/DirectionalBlockShape.java @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus; + +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class DirectionalBlockShape { + + protected final float length; + protected final float width; + protected final float height; + protected final float center; + protected final VoxelShape up; + protected final VoxelShape down; + protected final VoxelShape west; + protected final VoxelShape east; + protected final VoxelShape north; + protected final VoxelShape south; + + + public DirectionalBlockShape(float length, float width, float height) { + this(length, width, height, 8.0F); + } + + public DirectionalBlockShape(float length, float width, float height, float center) { + this.length = length; + this.width = width; + this.height = height; + this.center = center; + + this.up = Block.box(center - width / 2, 0.0F, center - length / 2, center + width / 2, height, center + length / 2); + this.down = Block.box(center - width / 2, 16.0F - height, center - length / 2, center + width / 2, 16.0F, center + length / 2); + this.west = Block.box(16.0F - height, center - width / 2, center - length / 2, 16.0F, center + width / 2, center + length / 2); + this.east = Block.box(0.0F, center - width / 2, center - length / 2, height, center + width / 2, center + length / 2); + this.north = Block.box(center - width / 2, center - length / 2, 16.0F - height, center + width / 2, center + length / 2, 16.0F); + this.south = Block.box(center - width / 2, center - length / 2, 0.0F, center + width / 2, center + length / 2, height); + } + + public VoxelShape getShape(Direction direction) { + return switch (direction) { + case UP -> this.up; + case DOWN -> this.down; + case WEST -> this.west; + case EAST -> this.east; + case NORTH -> this.north; + case SOUTH -> this.south; + }; + } + + public VoxelShape up() { + return this.up; + } + + public VoxelShape down() { + return this.down; + } + + public VoxelShape west() { + return this.west; + } + + public VoxelShape east() { + return this.east; + } + + public VoxelShape north() { + return this.north; + } + + public VoxelShape south() { + return this.south; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationAnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationAnimationBehaviour.java index f6ba55754..2081d2dd5 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationAnimationBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationAnimationBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.calcinationoven; -import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.animation.AnimationBehaviour; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animation.AnimationController; import software.bernie.geckolib.core.animation.AnimationState; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java index 93cc6ee78..ed749ba6f 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.calcinationoven; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java index 9d57b10ef..18088bad3 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java @@ -4,8 +4,8 @@ package com.klikli_dev.theurgy.content.apparatus.calcinationoven; -import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; -import com.klikli_dev.theurgy.content.behaviour.HeatConsumerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.animation.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.heat.HeatConsumerBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultHeatReceiver; import com.klikli_dev.theurgy.registry.BlockEntityRegistry; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationStorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationStorageBehaviour.java index 463668416..28fdf6d05 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationStorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationStorageBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.calcinationoven; -import com.klikli_dev.theurgy.content.behaviour.StorageBehaviour; +import com.klikli_dev.theurgy.content.behaviour.storage.StorageBehaviour; import com.klikli_dev.theurgy.content.storage.MonitoredItemStackHandler; import com.klikli_dev.theurgy.content.storage.PreventInsertWrapper; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionCraftingBehaviour.java index 67110ba47..816528a30 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.digestionvat; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.DigestionRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionStorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionStorageBehaviour.java index 76f135dfe..c3e0bb99f 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionStorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionStorageBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.digestionvat; -import com.klikli_dev.theurgy.content.behaviour.StorageBehaviour; +import com.klikli_dev.theurgy.content.behaviour.storage.StorageBehaviour; import com.klikli_dev.theurgy.content.storage.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlock.java index 5e9d941bb..42098ceb7 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlock.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlock.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.digestionvat; -import com.klikli_dev.theurgy.content.behaviour.HasCraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.HasCraftingBehaviour; import com.klikli_dev.theurgy.content.behaviour.fluidhandler.FluidHandlerBehaviour; import com.klikli_dev.theurgy.content.behaviour.fluidhandler.OneTankFluidHandlerBehaviour; import com.klikli_dev.theurgy.content.behaviour.interaction.InteractionBehaviour; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlockEntity.java index 5284d55d2..9cb898f33 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/digestionvat/DigestionVatBlockEntity.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.digestionvat; -import com.klikli_dev.theurgy.content.behaviour.HasCraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.HasCraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.DigestionRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.BlockEntityRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationCraftingBehaviour.java index 9237bcc80..2e272a012 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.distiller; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationStorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationStorageBehaviour.java index 22f3ab7f1..70134ad3d 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationStorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillationStorageBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.distiller; -import com.klikli_dev.theurgy.content.behaviour.StorageBehaviour; +import com.klikli_dev.theurgy.content.behaviour.storage.StorageBehaviour; import com.klikli_dev.theurgy.content.storage.MonitoredItemStackHandler; import com.klikli_dev.theurgy.content.storage.PreventInsertWrapper; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java index 7b1518f9b..8f0dfe873 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.distiller; -import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.animation.AnimationBehaviour; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animation.AnimationController; import software.bernie.geckolib.core.animation.AnimationState; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java index ccc4c54a0..d7ed2fee8 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java @@ -4,8 +4,8 @@ package com.klikli_dev.theurgy.content.apparatus.distiller; -import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; -import com.klikli_dev.theurgy.content.behaviour.HeatConsumerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.animation.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.heat.HeatConsumerBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultHeatReceiver; import com.klikli_dev.theurgy.registry.BlockEntityRegistry; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationCraftingBehaviour.java index 8d4600429..e7dad27d4 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.fermentationvat; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.FermentationRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationStorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationStorageBehaviour.java index 3db21e778..7230f5b7b 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationStorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationStorageBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.fermentationvat; -import com.klikli_dev.theurgy.content.behaviour.StorageBehaviour; +import com.klikli_dev.theurgy.content.behaviour.storage.StorageBehaviour; import com.klikli_dev.theurgy.content.storage.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlock.java index 8d5d78b97..aa84e70e0 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlock.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlock.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.fermentationvat; -import com.klikli_dev.theurgy.content.behaviour.HasCraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.HasCraftingBehaviour; import com.klikli_dev.theurgy.content.behaviour.fluidhandler.FluidHandlerBehaviour; import com.klikli_dev.theurgy.content.behaviour.fluidhandler.OneTankFluidHandlerBehaviour; import com.klikli_dev.theurgy.content.behaviour.interaction.InteractionBehaviour; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlockEntity.java index 07485c3dd..f6786ea8e 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/fermentationvat/FermentationVatBlockEntity.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.fermentationvat; -import com.klikli_dev.theurgy.content.behaviour.HasCraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.HasCraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.FermentationRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.BlockEntityRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java index 5ed1940e4..1d664802e 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java @@ -4,8 +4,8 @@ package com.klikli_dev.theurgy.content.apparatus.incubator; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; -import com.klikli_dev.theurgy.content.behaviour.HeatConsumerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.heat.HeatConsumerBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultHeatReceiver; import com.klikli_dev.theurgy.content.recipe.wrapper.IncubatorRecipeWrapper; import com.klikli_dev.theurgy.content.storage.MonitoredItemStackHandler; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java index 31c096c73..0fed04aac 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.incubator; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.IncubatorRecipeWrapper; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java index 71b52b873..234dacb05 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; -import com.klikli_dev.theurgy.content.behaviour.HeatConsumerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.heat.HeatConsumerBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultHeatReceiver; import com.klikli_dev.theurgy.content.particle.ParticleColor; import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleProvider; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCraftingBehaviour.java index 97a03a706..fd950c01e 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionStorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionStorageBehaviour.java index c1615d979..2322f6184 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionStorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionStorageBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; -import com.klikli_dev.theurgy.content.behaviour.StorageBehaviour; +import com.klikli_dev.theurgy.content.behaviour.storage.StorageBehaviour; import com.klikli_dev.theurgy.content.storage.MonitoredItemStackHandler; import com.klikli_dev.theurgy.content.storage.PreventInsertWrapper; import com.klikli_dev.theurgy.registry.FluidTagRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsconnectornode/LogisticsConnectionNodeBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsconnectornode/LogisticsConnectionNodeBlock.java new file mode 100644 index 000000000..ba771cd9e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsconnectornode/LogisticsConnectionNodeBlock.java @@ -0,0 +1,134 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsconnectornode; + +import com.klikli_dev.theurgy.content.apparatus.DirectionalBlockShape; +import com.klikli_dev.theurgy.content.behaviour.logistics.HasWireEndPoint; +import com.klikli_dev.theurgy.logistics.Logistics; +import com.klikli_dev.theurgy.logistics.Wires; +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageShowLogisticsNodeStatus; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class LogisticsConnectionNodeBlock extends DirectionalBlock implements HasWireEndPoint { + public static final MapCodec CODEC = simpleCodec(LogisticsConnectionNodeBlock::new); + + public static final DirectionalBlockShape SHAPE = new DirectionalBlockShape(6, 6, 8); + + + public LogisticsConnectionNodeBlock(Properties properties) { + super(properties); + + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.UP)); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + + @SuppressWarnings("deprecation") + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return SHAPE.getShape(pState.getValue(FACING)); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (!pPlayer.getItemInHand(pHand).isEmpty()) + return InteractionResult.PASS; + + if (pLevel.isClientSide) + return InteractionResult.SUCCESS; + + List> result = new ArrayList<>(); + var connected = Logistics.get().getNetwork(GlobalPos.of(pLevel.dimension(), pPos)); + for (var block : connected.nodes()) { + if (block.dimension().equals(pLevel.dimension())) { + result.add(Pair.of(block.pos(), 0xFFFFF00)); + } + } + Networking.sendTo((ServerPlayer) pPlayer, new MessageShowLogisticsNodeStatus(result)); + + return InteractionResult.SUCCESS; + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + super.onRemove(pState, pLevel, pPos, pNewState, pMovedByPiston); + + //Note: Adding is not necessary, because when using the wire it adds the two connection points. + var removedWires = Wires.get(pLevel).removeWiresFor(pPos); + + if (pLevel.isClientSide) + return; + + Block.popResource(pLevel, pPos, new ItemStack(ItemRegistry.COPPER_WIRE.get(), removedWires)); + Logistics.get().remove(GlobalPos.of(pLevel.dimension(), pPos)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + Direction direction = pContext.getClickedFace(); + BlockState blockstate = pContext.getLevel().getBlockState(pContext.getClickedPos().relative(direction.getOpposite())); + return blockstate.is(this) && blockstate.getValue(FACING) == direction + ? this.defaultBlockState().setValue(FACING, direction.getOpposite()) + : this.defaultBlockState().setValue(FACING, direction); + } + + @SuppressWarnings("deprecation") + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { +// //the connection node can only be placed on a solid face +// Direction direction = pState.getValue(FACING); +// BlockPos blockpos = pPos.relative(direction.getOpposite()); +// BlockState blockstate = pLevel.getBlockState(blockpos); +// return blockstate.isFaceSturdy(pLevel, blockpos, direction); + + //The connection node can be connected to any block that is not air. + Direction direction = pState.getValue(FACING); + BlockPos blockpos = pPos.relative(direction.getOpposite()); + return !pLevel.getBlockState(blockpos).isAir(); + } + + @SuppressWarnings("deprecation") + @Override + public @NotNull BlockState updateShape(BlockState pState, Direction pFacing, @NotNull BlockState pFacingState, @NotNull LevelAccessor pLevel, @NotNull BlockPos pCurrentPos, @NotNull BlockPos pFacingPos) { + return pFacing.getOpposite() == pState.getValue(FACING) && !pState.canSurvive(pLevel, pCurrentPos) ? Blocks.AIR.defaultBlockState() : pState; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlock.java new file mode 100644 index 000000000..325d16f75 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlock.java @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector; + +import com.klikli_dev.theurgy.content.apparatus.DirectionalBlockShape; +import com.klikli_dev.theurgy.content.behaviour.logistics.HasWireEndPoint; +import com.klikli_dev.theurgy.logistics.Wires; +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageShowLogisticsNodeStatus; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; + +public abstract class LogisticsItemConnectorBlock extends DirectionalBlock implements EntityBlock, HasWireEndPoint { + + public static final DirectionalBlockShape SHAPE = new DirectionalBlockShape(2, 2, 8); + + public LogisticsItemConnectorBlock(Properties properties) { + super(properties); + + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.UP)); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + + if (!pPlayer.getItemInHand(pHand).isEmpty()) + return InteractionResult.PASS; + + if (pLevel.isClientSide) + return InteractionResult.SUCCESS; + + if (pLevel.getBlockEntity(pPos) instanceof LogisticsItemConnectorBlockEntity blockEntity) { + Networking.sendTo((ServerPlayer) pPlayer, new MessageShowLogisticsNodeStatus(blockEntity.getStatusHighlights())); + } + + return InteractionResult.SUCCESS; + } + + @SuppressWarnings("deprecation") + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return SHAPE.getShape(pState.getValue(FACING)); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + super.onRemove(pState, pLevel, pPos, pNewState, pMovedByPiston); + + var removedWires = Wires.get(pLevel).removeWiresFor(pPos); + if (pLevel.isClientSide) + return; + + Block.popResource(pLevel, pPos, new ItemStack(ItemRegistry.COPPER_WIRE.get(), removedWires)); + + if (pLevel.getBlockEntity(pPos) instanceof LogisticsItemConnectorBlockEntity blockEntity) { + blockEntity.leafNode().onDestroyed(); + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + Direction direction = pContext.getClickedFace(); + BlockState blockstate = pContext.getLevel().getBlockState(pContext.getClickedPos().relative(direction.getOpposite())); + return blockstate.is(this) && blockstate.getValue(FACING) == direction + ? this.defaultBlockState().setValue(FACING, direction.getOpposite()) + : this.defaultBlockState().setValue(FACING, direction); + } + + @SuppressWarnings("deprecation") + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + //The item connector can be connected to any block that is not air. + //that is because many machines do not offer solid faces. + Direction direction = pState.getValue(FACING); + BlockPos blockpos = pPos.relative(direction.getOpposite()); + return !pLevel.getBlockState(blockpos).isAir(); + } + + @SuppressWarnings("deprecation") + @Override + public @NotNull BlockState updateShape(BlockState pState, Direction pFacing, @NotNull BlockState pFacingState, @NotNull LevelAccessor pLevel, @NotNull BlockPos pCurrentPos, @NotNull BlockPos pFacingPos) { + return pFacing.getOpposite() == pState.getValue(FACING) && !pState.canSurvive(pLevel, pCurrentPos) ? Blocks.AIR.defaultBlockState() : pState; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockEntity.java new file mode 100644 index 000000000..6310c4733 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockEntity.java @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector; + +import com.klikli_dev.theurgy.content.behaviour.logistics.HasLeafNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.LeafNodeBehaviour; +import com.klikli_dev.theurgy.content.item.mode.EnabledSetter; +import com.klikli_dev.theurgy.content.item.mode.TargetDirectionSetter; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public abstract class LogisticsItemConnectorBlockEntity extends BlockEntity implements HasLeafNodeBehaviour, TargetDirectionSetter, EnabledSetter { + + protected LeafNodeBehaviour leafNodeBehaviour; + + protected LogisticsItemConnectorBlockEntity(BlockEntityType pType, BlockPos pPos, BlockState pBlockState) { + super(pType, pPos, pBlockState); + } + + @Override + public List> getStatusHighlights() { + if (this.level.isClientSide()) + return List.of(); + + List> result = new ArrayList<>(); + + var targets = this.leafNode().targets(); + for (var target : targets) { + result.add(Pair.of(target, 0x00FFFF)); + } + + //also show network? +// var connected = Logistics.get().getNetwork(GlobalPos.of(this.level.dimension(), this.getBlockPos())); +// if (connected != null) { +// var shape = Shapes.block(); +// for (var block : connected.nodes()) { +// if (block.dimension().equals(this.level.dimension())) { +// Outliner.get().showAABB(block, shape.bounds() +// .move(block.pos()), 20 * 5) +// .colored(0x00FF00) +// .lineWidth(1 / 16f); +// } +// } +// } + + return result; + } + + @Override + public void onLoad() { + super.onLoad(); + + if (!this.level.isClientSide) { + this.leafNode().onLoad(); + } + } + + @Override + public void onChunkUnloaded() { + super.onChunkUnloaded(); + + if (!this.level.isClientSide) { + this.leafNode().onChunkUnload(); + } + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + this.leafNode().load(pTag); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + this.leafNode().saveAdditional(pTag); + } + + @Override + public LeafNodeBehaviour leafNode() { + return this.leafNodeBehaviour; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockItem.java new file mode 100644 index 000000000..94fe0494c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/LogisticsItemConnectorBlockItem.java @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemConnectorBlockItem extends BlockItem { + public LogisticsItemConnectorBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + protected boolean updateCustomBlockEntityTag(BlockPos pPos, Level pLevel, @Nullable Player pPlayer, ItemStack pStack, BlockState pState) { + var direction = pState.getValue(BlockStateProperties.FACING).getOpposite(); + + var blockEntityTag = pStack.getOrCreateTagElement("BlockEntityTag"); + + var list = new ListTag(); + var target = pPos.relative(direction); + list.add(LongTag.valueOf(target.asLong())); + blockEntityTag.put("targets", list); + + return super.updateCustomBlockEntityTag(pPos, pLevel, pPlayer, pStack, pState); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBehaviour.java new file mode 100644 index 000000000..2dde307ab --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBehaviour.java @@ -0,0 +1,179 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.extractor; + +import com.klikli_dev.theurgy.content.behaviour.logistics.ExtractorNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.LeafNodeBehaviour; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemExtractorBehaviour extends ExtractorNodeBehaviour { + + public static final int EXTRACTION_EVERY_N_TICKS = 20; // 1 second + public static final int MAX_EXTRACTION_AMOUNT = 10; //how many items to extract per extraction tick + private final int slowTickRandomOffset = (int) (Math.random() * 20); + private int extractionAmount = MAX_EXTRACTION_AMOUNT; + private Direction directionOverride = null; + private boolean enabled = true; + + public LogisticsItemExtractorBehaviour(BlockEntity blockEntity) { + super(blockEntity, Capabilities.ItemHandler.BLOCK); + } + + protected static int getFirstMatchingSlot(IItemHandler handler) { + return getFirstMatchingSlotAfter(handler, -1); + } + + protected static int getFirstMatchingSlotAfter(IItemHandler handler, int slot) { + for (int i = slot + 1; i < handler.getSlots(); i++) { + if (!handler.getStackInSlot(i).isEmpty()) { + return i; + } + } + return -1; + } + + @Override + protected boolean isValidInsertTarget(LeafNodeBehaviour leafNode, BlockCapabilityCache capability) { + //any target we get is guaranteed to exist and have an item capability, so we just return true here. + return true; + } + + @Override + public @Nullable Direction getTargetContext(BlockPos targetPos) { + return this.directionOverride != null ? this.directionOverride : + this.blockEntity.getBlockState().getValue(BlockStateProperties.FACING); + } + + public boolean enabled() { + return this.enabled; + } + + public void enabled(boolean enabled) { + this.enabled = enabled; + } + + public void directionOverride(Direction directionOverride) { + this.directionOverride = directionOverride; + this.rebuildExtractTargets(); + } + + public Direction directionOverride() { + return this.directionOverride; + } + + @Override + public void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.putInt("extractionAmount", this.extractionAmount); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("extractionAmount")) { + this.extractionAmount = pTag.getInt("extractionAmount"); + } + + } + + @Override + public void writeNetwork(CompoundTag pTag) { + super.writeNetwork(pTag); + + pTag.putBoolean("enabled", this.enabled); + if (this.directionOverride != null) + pTag.putInt("directionOverride", this.directionOverride.get3DDataValue()); + } + + @Override + public void readNetwork(CompoundTag pTag) { + super.readNetwork(pTag); + + if (pTag.contains("directionOverride")) { + this.directionOverride = Direction.from3DDataValue(pTag.getInt("directionOverride")); + } + if (pTag.contains("enabled")) { + this.enabled = pTag.getBoolean("enabled"); + } + } + + @Override + public void tickServer() { + //TODO: extraction should happen on a low tick, and in bulk. + + if (!this.enabled) + return; + + super.tickServer(); + + if ((this.slowTickRandomOffset + this.blockEntity.getLevel().getGameTime()) % EXTRACTION_EVERY_N_TICKS != 0) //slow tick + return; + + this.distributor.tick(); //moved from super.tickServer() here because otherwise the distributor keeps moving targets despite not moving items + + + var insertTarget = this.distributor.target(); + if (insertTarget == null) + return; + + var extractTarget = this.extractTargets.get(0); //we only support one target + if (extractTarget == null) + return; + + var insertCap = insertTarget.getCapability(); + if (insertCap == null) + return; + + var extractCap = extractTarget.getCapability(); + if (extractCap == null) + return; + + //TODO: item filter! + this.performExtraction(extractCap, insertCap); + } + + protected void performExtraction(IItemHandler extractCap, IItemHandler insertCap) { + int extractSlot = getFirstMatchingSlot(extractCap); + if (extractSlot == -1) + return; //nothing found to extract + + + //first simulate extraction, this tells us how much we can extract + var extractStack = extractCap.extractItem(extractSlot, this.extractionAmount, true); + if (extractStack.isEmpty()) + return; + + + //TODO: better round robin distribution that works with extraction amounts > 1? + // Simulate extract to get available + // Simulate insert on each to get available space + // Split evenly and take care of remainder + // Then insert/extract + // BUUUT: we should move that logic into the distributor + // and: figure out if we do round robin only within a single tick, or if we do it across ticks + // we probably need both depending on the transferred amount + + //and insertion + ItemStack inserted = ItemHandlerHelper.insertItemStacked(insertCap, extractStack, true); + + //then if anything was inserted during the simulation, perform the real extraction and insertion + if (inserted.getCount() != extractStack.getCount()) { + ItemStack remaining = ItemHandlerHelper.insertItemStacked(insertCap, extractStack, false); + extractCap.extractItem(extractSlot, extractStack.getCount() - remaining.getCount(), false); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlock.java new file mode 100644 index 000000000..a8d617c1d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlock.java @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.extractor; + +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.LogisticsItemConnectorBlock; +import com.klikli_dev.theurgy.content.render.outliner.Outliner; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.Shapes; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemExtractorBlock extends LogisticsItemConnectorBlock { + + public static final MapCodec CODEC = simpleCodec(LogisticsItemExtractorBlock::new); + + public LogisticsItemExtractorBlock(Properties properties) { + super(properties); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.LOGISTICS_ITEM_EXTRACTOR.get().create(pPos, pState); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pLevel.isClientSide()) { + return null; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof LogisticsItemExtractorBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlockEntity.java new file mode 100644 index 000000000..62a2fcecf --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/extractor/LogisticsItemExtractorBlockEntity.java @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.extractor; + +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.LogisticsItemConnectorBlockEntity; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class LogisticsItemExtractorBlockEntity extends LogisticsItemConnectorBlockEntity { + + public LogisticsItemExtractorBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.LOGISTICS_ITEM_EXTRACTOR.get(), pPos, pBlockState); + this.leafNodeBehaviour = new LogisticsItemExtractorBehaviour(this); + } + + @Override + public LogisticsItemExtractorBehaviour leafNode() { + return (LogisticsItemExtractorBehaviour) this.leafNodeBehaviour; + } + + @Override + public List> getStatusHighlights() { + if (this.level.isClientSide()) + return List.of(); + + var result = super.getStatusHighlights(); + + var targets = this.leafNode().insertTargets(); + for (var target : targets) { + result.add(Pair.of(target.pos(), 0xFFFFF00)); + } + + return result; + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + this.leafNode().readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + this.leafNode().writeNetwork(tag); + } + + protected void sendBlockUpdated() { + if (this.getLevel() != null && !this.getLevel().isClientSide) + this.getLevel().sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), Block.UPDATE_CLIENTS); + } + + public void tickServer() { + this.leafNode().tickServer(); + } + + @Override + public void enabled(boolean enabled) { + this.leafNode().enabled(enabled); + this.setChanged(); + this.sendBlockUpdated(); + } + + @Override + public boolean enabled() { + return this.leafNode().enabled(); + } + + @Override + public void targetDirection(Direction direction) { + this.leafNode().directionOverride(direction); + this.setChanged(); + this.sendBlockUpdated(); + } + + @Override + public Direction targetDirection() { + return this.leafNode().getTargetContext(this.targetPos()); + } + + @Override + public BlockPos targetPos() { + return this.leafNode().targets().isEmpty() ? this.getBlockPos() : this.leafNode().targets().get(0); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBehaviour.java new file mode 100644 index 000000000..9917b0b11 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBehaviour.java @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.inserter; + +import com.klikli_dev.theurgy.content.behaviour.logistics.InserterNodeBehaviour; +import com.klikli_dev.theurgy.logistics.Logistics; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemInserterBehaviour extends InserterNodeBehaviour { + + private Direction directionOverride = null; + private boolean enabled = true; + + public LogisticsItemInserterBehaviour(BlockEntity blockEntity) { + super(blockEntity, Capabilities.ItemHandler.BLOCK); + } + + public boolean enabled() { + return this.enabled; + } + + public void enabled(boolean enabled) { + this.enabled = enabled; + this.onEnabledChanged(); + } + + public void directionOverride(Direction directionOverride) { + this.directionOverride = directionOverride; + + //first notify the network to remove the old target capabilities + this.targetCapabilities.forEach(c -> this.onCapabilityInvalidated(c.pos(), this, true)); + + //then build the new capabilities + this.targetCapabilities = this.buildTargetCapabilities(this.targets()); + + //then notify the network to add the new target capabilities + this.targetCapabilities.forEach(this::notifyTargetCapabilityCacheCreated); + } + + public Direction directionOverride() { + return this.directionOverride; + } + + protected void onEnabledChanged() { + //a disabled logistics node is equivalent to one not existing + if (this.enabled) { + Logistics.get().add(this); + } else { + Logistics.get().remove(this, false); + } + } + + @Override + public @Nullable Direction getTargetContext(BlockPos targetPos) { + return this.directionOverride != null ? this.directionOverride : + this.blockEntity.getBlockState().getValue(BlockStateProperties.FACING); + } + + @Override + public void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + } + + @Override + public void writeNetwork(CompoundTag pTag) { + super.writeNetwork(pTag); + + pTag.putBoolean("enabled", this.enabled); + if (this.directionOverride != null) + pTag.putInt("directionOverride", this.directionOverride.get3DDataValue()); + } + + @Override + public void readNetwork(CompoundTag pTag) { + super.readNetwork(pTag); + + if (pTag.contains("directionOverride")) { + this.directionOverride = Direction.from3DDataValue(pTag.getInt("directionOverride")); + } + if (pTag.contains("enabled")) { + this.enabled = pTag.getBoolean("enabled"); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlock.java new file mode 100644 index 000000000..4f2fb9d31 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlock.java @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.inserter; + +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.LogisticsItemConnectorBlock; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemInserterBlock extends LogisticsItemConnectorBlock { + + public static final MapCodec CODEC = simpleCodec(LogisticsItemInserterBlock::new); + + public LogisticsItemInserterBlock(Properties properties) { + super(properties); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.LOGISTICS_ITEM_INSERTER.get().create(pPos, pState); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlockEntity.java new file mode 100644 index 000000000..36710a952 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/logisticsitemconnector/inserter/LogisticsItemInserterBlockEntity.java @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.inserter; + +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.LogisticsItemConnectorBlockEntity; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import org.jetbrains.annotations.Nullable; + +public class LogisticsItemInserterBlockEntity extends LogisticsItemConnectorBlockEntity { + + public LogisticsItemInserterBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.LOGISTICS_ITEM_INSERTER.get(), pPos, pBlockState); + this.leafNodeBehaviour = new LogisticsItemInserterBehaviour(this); + } + + @Override + public LogisticsItemInserterBehaviour leafNode() { + return (LogisticsItemInserterBehaviour) this.leafNodeBehaviour; + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + this.leafNode().readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + this.leafNode().writeNetwork(tag); + } + + protected void sendBlockUpdated() { + if (this.getLevel() != null && !this.getLevel().isClientSide) + this.getLevel().sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), Block.UPDATE_CLIENTS); + } + + @Override + public void enabled(boolean enabled) { + this.leafNode().enabled(enabled); + this.setChanged(); + this.sendBlockUpdated(); + } + + @Override + public boolean enabled() { + return this.leafNode().enabled(); + } + + @Override + public void targetDirection(Direction direction) { + this.leafNode().directionOverride(direction); + this.setChanged(); + this.sendBlockUpdated(); + } + + @Override + public Direction targetDirection() { + return this.leafNode().getTargetContext(this.targetPos()); + } + + @Override + public BlockPos targetPos() { + return this.leafNode().targets().isEmpty() ? this.getBlockPos() : this.leafNode().targets().get(0); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystBlockEntity.java index aa78415e6..b5fe38196 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystBlockEntity.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.mercurycatalyst; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultMercuryFluxStorage; import com.klikli_dev.theurgy.content.storage.MonitoredItemStackHandler; import com.klikli_dev.theurgy.registry.BlockEntityRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystCraftingBehaviour.java index 63e7195cd..829a2f157 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/mercurycatalyst/MercuryCatalystCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.mercurycatalyst; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.capability.MercuryFluxStorage; import com.klikli_dev.theurgy.content.recipe.CatalysationRecipe; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/ReformationArrayCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/ReformationArrayCraftingBehaviour.java index 8a6835d94..3b45dd34a 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/ReformationArrayCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/ReformationArrayCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.reformationarray; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.capability.MercuryFluxStorage; import com.klikli_dev.theurgy.content.recipe.ReformationRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.ReformationArrayRecipeWrapper; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/SulfuricFluxEmitterBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/SulfuricFluxEmitterBlockEntity.java index 597c618de..19ab97442 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/SulfuricFluxEmitterBlockEntity.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/reformationarray/SulfuricFluxEmitterBlockEntity.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.reformationarray; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.behaviour.selection.SelectionBehaviour; import com.klikli_dev.theurgy.content.capability.DefaultMercuryFluxStorage; import com.klikli_dev.theurgy.content.entity.FollowProjectile; diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java index 23fbb436b..ba6d887cf 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator; -import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.CraftingBehaviour; import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/animation/AnimationBehaviour.java similarity index 94% rename from src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java rename to src/main/java/com/klikli_dev/theurgy/content/behaviour/animation/AnimationBehaviour.java index 1ed2290e1..c2261f093 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/animation/AnimationBehaviour.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.behaviour; +package com.klikli_dev.theurgy.content.behaviour.animation; import net.minecraft.world.level.block.entity.BlockEntity; import software.bernie.geckolib.animatable.GeoBlockEntity; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/CraftingBehaviour.java similarity index 99% rename from src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java rename to src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/CraftingBehaviour.java index f6c32ff3d..85e9d295c 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/CraftingBehaviour.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.behaviour; +package com.klikli_dev.theurgy.content.behaviour.crafting; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/HasCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/HasCraftingBehaviour.java similarity index 87% rename from src/main/java/com/klikli_dev/theurgy/content/behaviour/HasCraftingBehaviour.java rename to src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/HasCraftingBehaviour.java index d11ac7e7d..1176ebd8b 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/HasCraftingBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/crafting/HasCraftingBehaviour.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.behaviour; +package com.klikli_dev.theurgy.content.behaviour.crafting; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatConsumerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/heat/HeatConsumerBehaviour.java similarity index 97% rename from src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatConsumerBehaviour.java rename to src/main/java/com/klikli_dev/theurgy/content/behaviour/heat/HeatConsumerBehaviour.java index 4857ddf69..5410f159a 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatConsumerBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/heat/HeatConsumerBehaviour.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.behaviour; +package com.klikli_dev.theurgy.content.behaviour.heat; import com.klikli_dev.theurgy.registry.CapabilityRegistry; import net.minecraft.core.Direction; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/interaction/GenericVatInteractionBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/interaction/GenericVatInteractionBehaviour.java index a2359fb4c..183f02285 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/interaction/GenericVatInteractionBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/interaction/GenericVatInteractionBehaviour.java @@ -4,7 +4,7 @@ package com.klikli_dev.theurgy.content.behaviour.interaction; -import com.klikli_dev.theurgy.content.behaviour.HasCraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.crafting.HasCraftingBehaviour; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/ExtractorNodeBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/ExtractorNodeBehaviour.java new file mode 100644 index 000000000..56ccd0418 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/ExtractorNodeBehaviour.java @@ -0,0 +1,192 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +import com.klikli_dev.theurgy.content.behaviour.logistics.distribution.DistributionMode; +import com.klikli_dev.theurgy.content.behaviour.logistics.distribution.Distributor; +import com.klikli_dev.theurgy.content.behaviour.logistics.distribution.RoundRobinDistributor; +import com.klikli_dev.theurgy.logistics.Logistics; +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.ArrayList; +import java.util.List; + +/** + * A special leaf node that is used to extract from its targets and inserts into valid insert targets in the graph. + */ +public abstract class ExtractorNodeBehaviour extends LeafNodeBehaviour { + + protected List> insertTargets; + protected List> extractTargets; + protected Distributor distributor; + + public ExtractorNodeBehaviour(BlockEntity blockEntity, BlockCapability capabilityType) { + super(blockEntity, capabilityType); + this.insertTargets = new ArrayList<>(); + this.extractTargets = new ArrayList<>(); + this.distributor = DistributionMode.createDistributor(DistributionMode.ROUND_ROBIN, this.insertTargets); + } + + //TODO: if we end up with nodes that can support multiple capability types we need to rework this + // for now we are working with the assumption that each leaf node represents exactly one capability type. + // if we get multi-type nodes we can probably just handle the functionality in the subclasses + + @Override + public LeafNodeMode mode() { + return LeafNodeMode.EXTRACT; + } + + /** + * Gets the list of cached block entities connected to insert nodes that this extractor will insert into + */ + public List> insertTargets() { + return this.insertTargets; + } + + public void resetInsertTargets() { + this.insertTargets.clear(); + } + + public List> extractTargets() { + return this.extractTargets; + } + + /** + * Called if a leaf node is added to the graph. + * Should be used to update the cached insertTargets. + * + * @param pos the position of the leaf node + * @param leafNode the leaf node added + */ + public void onLeafNodeAddedToGraph(GlobalPos pos, LeafNodeBehaviour leafNode) { + if (leafNode.mode() != LeafNodeMode.INSERT) + return; //as we are only caching insert mode all other nodes are not relevant + + var targets = leafNode.asInserter().targetCapabilities(); + + for (var target : targets) { + if (target != null && this.isValidInsertTarget(leafNode, target)) { + this.addInsertTarget(target); + } + } + } + + /** + * Called if a leaf node is removed from the graph. + * Should be used to update the cached insertTargets. + */ + public void onLeafNodeRemovedFromGraph(GlobalPos pos, LeafNodeBehaviour leafNode) { + if (leafNode.mode() != LeafNodeMode.INSERT) + return; //as we are only caching insert mode all other nodes are not relevant + + for (var target : leafNode.targets()) { + this.removeInsertTarget(leafNode.level().dimension(), target); + } + } + + /** + * Called if a single target is added to the graph. + * This is NOT called if a leaf node (with one or more targets) is added to the graph. + * For that see onLeafNodeAddedToGraph. + */ + public void onTargetAddedToGraph(GlobalPos pos, BlockCapabilityCache capability, LeafNodeBehaviour leafNode) { + if (leafNode.mode() != LeafNodeMode.INSERT) + return; //as we are only caching insert mode all other nodes are not relevant + + if (this.isValidInsertTarget(leafNode, capability)) { + this.addInsertTarget(capability); + } + } + + /** + * Called if a single target is removed from the graph. + * This is NOT called if a leaf node (with one or more targets) is removed from the graph. + * For that see onLeafNodeRemovedFromGraph. + */ + public void onTargetRemovedFromGraph(GlobalPos pos, LeafNodeBehaviour leafNode) { + if (leafNode.mode() != LeafNodeMode.INSERT) + return; //as we are only caching insert mode all other nodes are not relevant + + this.removeInsertTarget(pos); + } + + protected void addInsertTarget(BlockCapabilityCache capability) { + if (!this.insertTargets().contains(capability)){ + this.insertTargets().add(capability); + this.distributor.onTargetsChanged(); + } + } + + protected void removeInsertTarget(GlobalPos pos) { + this.removeInsertTarget(pos.dimension(), pos.pos()); + } + + protected void removeInsertTarget(ResourceKey dimension, BlockPos pos) { + if(this.insertTargets().removeIf(cached -> cached.level().dimension().equals(dimension) && cached.pos().equals(pos))){ + this.distributor.onTargetsChanged(); + } + } + + + @Override + public void onLoad() { + //targets are filled via load(tag) on the parent, the NBT in turn is provided by the BlockItem. + this.rebuildExtractTargets(); + + super.onLoad(); + } + + public void rebuildExtractTargets() { + this.extractTargets.clear(); + this.extractTargets.addAll(this.buildTargetCapabilities(this.targets())); + } + + /** + * Target capabilities are built irrespective of if the target is blockloaded or not. + * The invalidator will be called if the loaded state changes (or if the target is destroyed). + * The target capabilities will be updated accordingly. + */ + public List> buildTargetCapabilities(List targets) { + var serverLevel = (ServerLevel) this.level(); + return targets.stream() + .map(target -> BlockCapabilityCache.create(this.capabilityType(), serverLevel, target, this.getTargetContext(target))).toList(); + } + + public void tickServer() { + } + + @Override + public void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + pTag.putByte("distributor", (byte) this.distributor.mode().ordinal()); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + DistributionMode mode = DistributionMode.ROUND_ROBIN; + if (pTag.contains("distributor")) { + mode = DistributionMode.values()[pTag.getByte("distributor")]; + } + this.distributor = DistributionMode.createDistributor(mode, this.insertTargets); + } + + /** + * Checks if the target is a valid insert target for this extractor node. + */ + protected abstract boolean isValidInsertTarget(LeafNodeBehaviour leafNode, BlockCapabilityCache capability); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasLeafNodeBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasLeafNodeBehaviour.java new file mode 100644 index 000000000..1b90ada82 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasLeafNodeBehaviour.java @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +/** + * Marker interface for blockentities that represent have a leaf node behaviour. + * Such BEs are always logistics nodes. + */ +public interface HasLeafNodeBehaviour extends LogisticsNode { + LeafNodeBehaviour leafNode(); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasWireEndPoint.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasWireEndPoint.java new file mode 100644 index 000000000..f19609106 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/HasWireEndPoint.java @@ -0,0 +1,8 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +public interface HasWireEndPoint { +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/InserterNodeBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/InserterNodeBehaviour.java new file mode 100644 index 000000000..56dd059b1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/InserterNodeBehaviour.java @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +import com.klikli_dev.theurgy.logistics.Logistics; +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.ArrayList; +import java.util.List; + +/** + * A special leaf node whose targets can be inserted into. + */ +public abstract class InserterNodeBehaviour extends LeafNodeBehaviour { + protected List> targetCapabilities; + + public InserterNodeBehaviour(BlockEntity blockEntity, BlockCapability capabilityType) { + super(blockEntity, capabilityType); + + this.targetCapabilities = new ArrayList<>(); + } + + @Override + public LeafNodeMode mode() { + return LeafNodeMode.INSERT; + } + + @Override + public void onLoad() { + //targets are filled via load(tag) on the parent, the NBT in turn is provided by the BlockItem. + this.targetCapabilities = this.buildTargetCapabilities(this.targets()); + + super.onLoad(); + } + + /** + * Target capabilities are built irrespective of if the target is blockloaded or not. + * The invalidator will be called if the loaded state changes (or if the target is destroyed). + * The target capabilities will be updated accordingly. + */ + public List> buildTargetCapabilities(List targets) { + var serverLevel = (ServerLevel) this.level(); + return targets.stream() + .map(target -> BlockCapabilityCache.create(this.capabilityType(), serverLevel, target, this.getTargetContext(target), + //only listen to the invalidator if the node is still valid + () -> !this.blockEntity.isRemoved() && Logistics.get().getNetwork(this.globalPos()) != null, + () -> { + //handles chunk loads/unloads and destruction of the target BE + this.onCapabilityInvalidated(target, this, false); + })).toList(); + } + + public void onCapabilityInvalidated(BlockPos targetPos, InserterNodeBehaviour leafNode, boolean forceSetRemoved) { + var serverLevel = (ServerLevel) this.level(); + //Note: we never modify this.targetCapabilities because it listens for chunk *loads* too! + + //a valid target means the capability changed but is still there. + //an invalid target means removed/unloaded. + var targetValid = serverLevel.isLoaded(targetPos) && serverLevel.getBlockEntity(targetPos) != null; + + var targetGlobalPos = GlobalPos.of(serverLevel.dimension(), targetPos); + + var network = Logistics.get().getNetwork(this.globalPos()); + if (network != null) { + //always call remove to ensure the target is removed from the graph if it was changed + //this avoids duplicates because we don't know if any extractor nodes already had it in their list + network.onInserterNodeTargetRemoved(targetGlobalPos, leafNode); + + //then if we have a still valid one, re-add it / or if it is valid for the first time add it + if (targetValid && !forceSetRemoved) { + var capabilityCache = this.targetCapabilities.stream().filter(cache -> cache.pos().equals(targetPos)).findFirst().orElse(null); + if (capabilityCache != null) { + network.onInserterNodeTargetAdded(targetGlobalPos, capabilityCache, leafNode); + } + } + } + } + + /** + * Notify the network that a new capability cache was created -> calls onInserterNodeTargetAdded. + * The main use is to notify the network when a target capability cache was re-created after its context (direction) changed. + */ + protected void notifyTargetCapabilityCacheCreated(BlockCapabilityCache capability) { + var serverLevel = (ServerLevel) this.level(); + + //only notify if we actually have a valid one - otherwise onCapabilityInvalidated will handle it on load of target + var targetValid = serverLevel.isLoaded(capability.pos()) && serverLevel.getBlockEntity(capability.pos()) != null; + + var targetGlobalPos = GlobalPos.of(serverLevel.dimension(), capability.pos()); + + var network = Logistics.get().getNetwork(this.globalPos()); + if (network != null && targetValid) { + network.onInserterNodeTargetAdded(targetGlobalPos, capability, this); + } + } + + /** + * gets the target capabilities that are currently loaded & available. + * + * @return + */ + public List> targetCapabilities() { + return this.targetCapabilities.stream().filter(cache -> this.level().isLoaded(cache.pos()) && this.level().getBlockEntity(cache.pos()) != null).toList(); + } + + /** + * Gets all target capabilities. + */ + public List> targetAllCapabilities() { + return this.targetCapabilities; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeBehaviour.java new file mode 100644 index 000000000..b04f67b18 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeBehaviour.java @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +import com.klikli_dev.theurgy.logistics.Logistics; +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.common.util.Lazy; + +import java.util.ArrayList; +import java.util.List; + +/** + * A leaf node in the logistics graph is a node that interfaces with one or more target block entities - or rather, their capabilities. + */ +public abstract class LeafNodeBehaviour { + + //TODO: target removal: probably not a problem for Logistics.get(), but rather just locally to the leaf node. + // the leaf node reports the target unload, and never reports a target load -> because removed + // for the logistics system that does not matter, and the node itself can e.g. show an error message if status checked + // the general path will then likely be to just remove the node, link it and re-add it. + // t1 nodes like the connector will likely just get destroyed when the target is removed anyway. + + protected BlockEntity blockEntity; + protected Lazy globalPos; + protected BlockCapability capabilityType; + /* + * Targets are set via BlockItem by placing them in the NBT, at least for the LogisticsItemConnectorBlocks + */ + protected List targets; + protected int frequency; + + public LeafNodeBehaviour(BlockEntity blockEntity, BlockCapability capabilityType){ + this.blockEntity = blockEntity; + this.globalPos = Lazy.of(() -> GlobalPos.of(this.level().dimension(), this.blockEntity.getBlockPos())); //will be initialized lazily + this.capabilityType = capabilityType; + this.targets = new ArrayList<>(); + this.frequency = 0; + } + + public Level level(){ + return this.blockEntity.getLevel(); + } + + public GlobalPos globalPos(){ + return this.globalPos.get(); + } + + /** + * Gets the capability type of this node. + */ + public BlockCapability capabilityType(){ + return this.capabilityType; + } + + /** + * The targets of this leaf node, i.e. the block positions of the block entities this leaf node interfaces with. + */ + public List targets(){ + return this.targets; + } + + public int frequency(){ + return this.frequency; + } + + public ExtractorNodeBehaviour asExtractor() { + return (ExtractorNodeBehaviour) this; + } + + public InserterNodeBehaviour asInserter() { + return (InserterNodeBehaviour) this; + } + + /** + * Call from BlockEntity.onLoad() + * This is called before the first tick of the BE after a chunk was loaded. + */ + public void onLoad(){ + Logistics.get().add(this); + } + + /** + * Call from BlockEntity.onChunkUnload() + * This is called when the chunk is unloaded. + */ + public void onChunkUnload(){ + Logistics.get().remove(this, false); + } + + /** + * Call from Block.onRemove(), it is only called if a block is destroyed. + * Do not call from BlockEntity.setRemoved() + * -> that is also called on chunk unload and would permanently disconnect the node from its network. + */ + public void onDestroyed(){ + Logistics.get().remove(this, true); + } + + public void saveAdditional(CompoundTag pTag) { + this.writeNetwork(pTag); + } + + public void load(CompoundTag pTag) { + this.readNetwork(pTag); + } + + public void writeNetwork(CompoundTag pTag) { + pTag.putInt("frequency", this.frequency); + var list = new ListTag(); + for(var target : this.targets){ + list.add(LongTag.valueOf(target.asLong())); + } + pTag.put("targets", list); + } + + public void readNetwork(CompoundTag pTag) { + this.frequency = pTag.getInt("frequency"); + this.targets = new ArrayList<>(); + var list = pTag.getList("targets", Tag.TAG_LONG); + for(int i = 0; i < list.size(); i++){ + this.targets.add(BlockPos.of(((LongTag)list.get(i)).getAsLong())); + } + } + + /** + * The mode of this leaf node, i.e. if it is an insert or extract node. + */ + public abstract LeafNodeMode mode(); + + public abstract C getTargetContext(BlockPos targetPos); + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeMode.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeMode.java new file mode 100644 index 000000000..db78e7d3f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LeafNodeMode.java @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +public enum LeafNodeMode { + INSERT, + EXTRACT + //TODO: we may need a mode "mirror" that just mirrors the capability to another node. + // in this node if we have multiple source/target nodes we'd need a function to e.g. round-robin between them, + // or allow the player to select a fixed target. +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LogisticsNode.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LogisticsNode.java new file mode 100644 index 000000000..94ab8776f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/LogisticsNode.java @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; + +import java.util.List; + +/** + * Marker interface for blockentities that represent a logistics node + */ +public interface LogisticsNode { + + /** + * Visualises the status of the logistics node. + * Should be called server-side only as the information may not be available client side. + */ + List> getStatusHighlights(); + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/DistributionMode.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/DistributionMode.java new file mode 100644 index 000000000..9aac17f6c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/DistributionMode.java @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics.distribution; + +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.List; + +public enum DistributionMode { + SINGLE_TARGET, + ROUND_ROBIN; + + public static Distributor createDistributor(DistributionMode mode, List> targets) { + return switch (mode) { + case SINGLE_TARGET -> throw new IllegalArgumentException("Not yet implemented: " + mode); + case ROUND_ROBIN -> new RoundRobinDistributor<>(targets); + default -> throw new IllegalArgumentException("Unknown distribution mode: " + mode); + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/Distributor.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/Distributor.java new file mode 100644 index 000000000..1da0edd5a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/Distributor.java @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics.distribution; + +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.List; + +public abstract class Distributor { + protected List> targets; + + public Distributor(List> targets) { + this.targets = targets; + } + + public abstract DistributionMode mode(); + + public abstract BlockCapabilityCache target(); + + public abstract void tick(); + + /** + * Should be called if the list of targets on the leaf node using this distributor changes. + */ + public abstract void onTargetsChanged(); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/RoundRobinDistributor.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/RoundRobinDistributor.java new file mode 100644 index 000000000..d51d1b7ab --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/logistics/distribution/RoundRobinDistributor.java @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.behaviour.logistics.distribution; + +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.List; + +public class RoundRobinDistributor extends Distributor{ + protected int currentTargetIndex; + protected BlockCapabilityCache cachedTarget; + + public RoundRobinDistributor(List> targets) { + super(targets); + } + + @Override + public DistributionMode mode() { + return DistributionMode.ROUND_ROBIN; + } + + @Override + public BlockCapabilityCache target() { + return this.cachedTarget; + } + + @Override + public void tick() { + var oldIndex = this.currentTargetIndex; + + if(this.targets.isEmpty()) { + this.currentTargetIndex = -1; + } else { + this.currentTargetIndex = (this.currentTargetIndex + 1) % this.targets.size(); + } + + if(oldIndex != this.currentTargetIndex || this.cachedTarget == null){ + if(this.currentTargetIndex >= 0 && this.currentTargetIndex < this.targets.size()) { + this.cachedTarget = this.targets.get(this.currentTargetIndex); + } else { + this.cachedTarget = null; + } + } + + } + + @Override + public void onTargetsChanged() { + this.cachedTarget = null; + if(this.targets.isEmpty()) { + this.currentTargetIndex = -1; + } else if(this.currentTargetIndex >= this.targets.size()) { + this.currentTargetIndex = 0; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/StorageBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/storage/StorageBehaviour.java similarity index 98% rename from src/main/java/com/klikli_dev/theurgy/content/behaviour/StorageBehaviour.java rename to src/main/java/com/klikli_dev/theurgy/content/behaviour/storage/StorageBehaviour.java index d66c9916a..f1987224b 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/behaviour/StorageBehaviour.java +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/storage/StorageBehaviour.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.behaviour; +package com.klikli_dev.theurgy.content.behaviour.storage; import com.klikli_dev.theurgy.util.TetraConsumer; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/divinationrod/DivinationRodItem.java similarity index 99% rename from src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java rename to src/main/java/com/klikli_dev/theurgy/content/item/divinationrod/DivinationRodItem.java index cb4bf7699..986ce168f 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/divinationrod/DivinationRodItem.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item; +package com.klikli_dev.theurgy.content.item.divinationrod; import com.klikli_dev.theurgy.TheurgyConstants; import com.klikli_dev.theurgy.content.entity.FollowProjectile; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/MercurialWandItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/MercurialWandItem.java new file mode 100644 index 000000000..1c008a714 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/MercurialWandItem.java @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand; + +import com.klikli_dev.theurgy.content.item.mercurialwand.mode.MercurialWandItemMode; +import com.klikli_dev.theurgy.content.item.mode.ModeItem; +import com.klikli_dev.theurgy.content.render.itemhud.ItemHUDProvider; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class MercurialWandItem extends Item implements ItemHUDProvider, ModeItem { + public MercurialWandItem(Properties pProperties) { + super(pProperties); + } + + @Override + public void changeMode(Player player, ItemStack stack, int shift) { + var nextMode = MercurialWandItemMode.getMode(stack).type().next().mode(); + MercurialWandItemMode.setMode(stack, nextMode); + + player.displayClientMessage(nextMode.description(stack, player.level()), true); + } + + @Override + public void onScroll(Player player, ItemStack stack, int shift) { + if (MercurialWandItemMode.getMode(stack).supportsScrollWithRightDown() && DistHelper.isRightPressed()) { + //if right mouse button is pressed AND we are in a mode that supports this we perform a sub-scroll. + MercurialWandItemMode.getMode(stack).onScrollWithRightDown(player, stack, shift); + } else { + //otherwise we change the mode + ModeItem.super.onScroll(player, stack, shift); + } + } + + @Override + public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + var stack = pPlayer.getItemInHand(pUsedHand); + var mode = MercurialWandItemMode.getMode(stack); + + var result = mode.use(pLevel, pPlayer, pUsedHand); + if (result.getResult() != InteractionResult.PASS) { + return result; + } + + return super.use(pLevel, pPlayer, pUsedHand); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + //onItemUseFirst is called BEFORE the block so we can interrupt e.g. opening the block inv + var mode = MercurialWandItemMode.getMode(stack); + + var result = mode.onItemUseFirst(stack, context); + if (result != InteractionResult.PASS) { + return result; + } + + return super.onItemUseFirst(stack, context); + } + + @Override + public void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents) { + MercurialWandItemMode.getMode(pStack).appendHUDText(pPlayer, pHitResult, pStack, pLevel, pTooltipComponents); + } + + public static class DistHelper { + + public static boolean isRightPressed() { + return Minecraft.getInstance().mouseHandler.isRightPressed(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/MercurialWandItemMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/MercurialWandItemMode.java new file mode 100644 index 000000000..4ed5cf741 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/MercurialWandItemMode.java @@ -0,0 +1,97 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.content.item.mode.ItemMode; +import net.minecraft.world.item.ItemStack; + +public abstract class MercurialWandItemMode extends ItemMode { + protected Type type; + + protected MercurialWandItemMode() { + super(); + } + + public static MercurialWandItemMode getMode(ItemStack stack) { + var tag = stack.getOrCreateTag(); + var modeOrdinal = tag.getInt("theurgy:mode"); + return Type.values()[modeOrdinal].mode(); + } + + public static void setMode(ItemStack stack, MercurialWandItemMode mode) { + var tag = stack.getOrCreateTag(); + tag.putInt("theurgy:mode", mode.type.ordinal()); + } + + public Type type() { + return this.type; + } + + @Override + protected String typeName() { + return this.type.name().toLowerCase(); + } + + + public enum Type { + ROTATE_DIRECTION(new RotateSelectedDirectionMode()), + SWITCH_LOGISTICS_ENABLED(new SwitchLogisticsEnabledMode()), + SELECT_DIRECTION(new SelectDirectionMode(), false), + SET_SELECTED_DIRECTION(new SetSelectedDirectionMode(), false); + + final MercurialWandItemMode mode; + final boolean enabled; + + Type(MercurialWandItemMode mode) { + this(mode, true); + } + + Type(MercurialWandItemMode mode, boolean enabled) { + this.mode = mode; + this.enabled = enabled; + mode.type = this; + } + + public MercurialWandItemMode mode() { + return this.mode; + } + + public Type next() { + int next = this.ordinal() + 1; + if (next >= Type.values().length) { + next = 0; + } + var nextValue = Type.values()[next]; + if (!nextValue.enabled) { + return nextValue.next(); + } + return Type.values()[next]; + } + + public Type previous() { + int previous = this.ordinal() - 1; + if (previous < 0) { + previous = Type.values().length - 1; + } + + var previousValue = Type.values()[previous]; + if (!previousValue.enabled) { + return previousValue.previous(); + } + + return Type.values()[previous]; + } + + public Type shift(int shift) { + if (shift > 0) { + return this.next(); + } else if (shift < 0) { + return this.previous(); + } + return this; + } + + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionMode.java new file mode 100644 index 000000000..83ef555d5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionMode.java @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.mode.TargetDirectionSetter; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class RotateSelectedDirectionMode extends MercurialWandItemMode { + + private final RotateSelectedDirectionModeRenderHandler renderHandler; + + protected RotateSelectedDirectionMode() { + super(); + this.renderHandler = new RotateSelectedDirectionModeRenderHandler(this); + } + + @Override + public String descriptionId() { + return TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION; + } + + @Override + public void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents) { + var description = this.description(pStack, pLevel); + if (pHitResult instanceof BlockHitResult blockHitResult) { + var blockEntity = pLevel.getBlockEntity(blockHitResult.getBlockPos()); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + var currentDirection = directionSettable.targetDirection(); + var newDirection = this.nextDirection(currentDirection); + + var component = Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_WITH_TARGET, + Component.translatable(currentDirection.getName()).withStyle(currentDirection != newDirection ? ChatFormatting.YELLOW : ChatFormatting.GREEN), + Component.translatable(newDirection.getName()).withStyle(ChatFormatting.GREEN) + ); + + description = component; + } + } + pTooltipComponents.add(description); + } + + @Override + public RotateSelectedDirectionModeRenderHandler renderHandler() { + return this.renderHandler; + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + //get the target block and move its direction to the next one + + var blockPos = context.getClickedPos(); + var level = context.getLevel(); + + var blockEntity = level.getBlockEntity(blockPos); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + if (!level.isClientSide) { + var currentDirection = directionSettable.targetDirection(); + var newDirection = this.nextDirection(currentDirection); + directionSettable.targetDirection(newDirection); + + context.getPlayer().displayClientMessage(Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_SUCCESS, + Component.translatable(newDirection.getName()).withStyle(ChatFormatting.GREEN) + ), true); + } + return InteractionResult.SUCCESS; + } + + return super.onItemUseFirst(stack, context); + } + + protected Direction nextDirection(Direction direction) { + return switch (direction) { + case UP -> Direction.NORTH; + case NORTH -> Direction.WEST; + case SOUTH -> Direction.EAST; + case WEST -> Direction.SOUTH; + case EAST -> Direction.DOWN; + case DOWN -> Direction.UP; + }; + } + + protected Direction previousDirection(Direction direction) { + return switch (direction) { + case UP -> Direction.DOWN; + case NORTH -> Direction.UP; + case SOUTH -> Direction.DOWN; + case WEST -> Direction.NORTH; + case EAST -> Direction.SOUTH; + case DOWN -> Direction.NORTH; + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionModeRenderHandler.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionModeRenderHandler.java new file mode 100644 index 000000000..56731ddba --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/RotateSelectedDirectionModeRenderHandler.java @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import com.klikli_dev.theurgy.content.item.mode.TargetDirectionSetter; +import com.klikli_dev.theurgy.content.render.BlockOverlays; +import com.klikli_dev.theurgy.content.render.Color; +import com.klikli_dev.theurgy.content.render.RenderTypes; +import com.klikli_dev.theurgy.content.render.cube.CubeModel; +import com.klikli_dev.theurgy.content.render.cube.CubeModelRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.RenderHighlightEvent; + +public class RotateSelectedDirectionModeRenderHandler extends ItemModeRenderHandler { + + public RotateSelectedDirectionModeRenderHandler(RotateSelectedDirectionMode mode) { + super(mode); + } + + @Override + public void renderBlockHighlight(RenderHighlightEvent.Block event) { + Player player = Minecraft.getInstance().player; + if (player == null) + return; + + BlockHitResult rayTraceResult = event.getTarget(); + if (rayTraceResult.getType() != BlockHitResult.Type.BLOCK) + return; + + var blockEntity = player.level().getBlockEntity(rayTraceResult.getBlockPos()); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + var currentDirection = directionSettable.targetDirection(); + var newDirection = this.mode.nextDirection(currentDirection); + + var targetPos = directionSettable.targetPos(); + + var ps = event.getPoseStack(); + var camera = event.getCamera(); + var bufferSource = event.getMultiBufferSource(); + + //Note: for now we simply do not use transparency here because it does not work nicely with translucent blocks + // specifically, it stops them from rendering, os the transparent highlight renders the world behind the bock. + // If we want to play with it again, use public final static Color GREEN = new Color(0, 255, 0, 155).setImmutable(); + + Vec3 viewPosition = camera.getPosition(); + ps.pushPose(); + ps.translate(targetPos.getX() - viewPosition.x, targetPos.getY() - viewPosition.y, targetPos.getZ() - viewPosition.z); + CubeModelRenderer.renderCube( + CubeModel.getOverlayModel(newDirection, BlockOverlays.WHITE), ps, bufferSource.getBuffer(RenderTypes.translucentCullNoDepthBlockSheet()), + Color.GREEN.getRGB(), LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, CubeModelRenderer.FaceDisplay.FRONT, + camera); + if (currentDirection != newDirection) { + CubeModelRenderer.renderCube( + CubeModel.getOverlayModel(currentDirection, BlockOverlays.WHITE), ps, bufferSource.getBuffer(RenderTypes.translucentCullNoDepthBlockSheet()), + Color.YELLOW.getRGB(), LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, CubeModelRenderer.FaceDisplay.FRONT, + camera); + } + ps.popPose(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionMode.java new file mode 100644 index 000000000..5685398f3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionMode.java @@ -0,0 +1,117 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.mode.ItemMode; +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageItemModeSelectDirection; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public class SelectDirectionMode extends MercurialWandItemMode { + + private final SelectDirectionModeRenderHandler renderHandler; + + protected SelectDirectionMode() { + super(); + this.renderHandler = new SelectDirectionModeRenderHandler(this); + } + + @Override + public String descriptionId() { + return TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SELECT_DIRECTION; + } + + @Override + public MutableComponent description(ItemStack pStack, @Nullable Level pLevel) { + return Component.translatable( + this.descriptionId(), + Component.translatable(this.getDirection(pStack).getName()).withStyle(ChatFormatting.GREEN)); + } + + @Override + public SelectDirectionModeRenderHandler renderHandler() { + return this.renderHandler; + } + + @Override + public boolean supportsScrollWithRightDown() { + return true; + } + + @Override + public void onScrollWithRightDown(Player player, ItemStack stack, int shift) { + super.onScrollWithRightDown(player, stack, shift); + + var modeTag = this.getModeTag(stack); + var direction = !modeTag.contains("direction") ? Direction.fromYRot(player.getYRot()) : this.shiftDirection(this.getDirection(modeTag), shift); + + modeTag.putInt("direction", direction.ordinal()); + + Networking.sendToServer(new MessageItemModeSelectDirection(direction)); + + player.displayClientMessage(Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SELECT_DIRECTION_SUCCESS, + Component.translatable(direction.getName()).withStyle(ChatFormatting.GREEN) + ), true); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + //the select direction mode does not have a "use" function, it just listens to the scroll + return InteractionResult.CONSUME; //we need to consume because SUCCESS causes a swing animation + } + + public Direction getDirection(CompoundTag modeTag) { + return Direction.values()[modeTag.getInt("direction")]; + } + + public void setDirection(CompoundTag modeTag, Direction direction) { + modeTag.putInt("direction", direction.ordinal()); + } + + public Direction getDirection(ItemStack stack) { + return this.getDirection(this.getModeTag(stack)); + } + + public void setDirection(ItemStack stack, Direction direction) { + this.setDirection(this.getModeTag(stack), direction); + } + + protected Direction nextDirection(Direction direction) { + int next = direction.ordinal() + 1; + if (next >= Direction.values().length) { + next = 0; + } + return Direction.values()[next]; + } + + protected Direction previousDirection(Direction direction) { + int previous = direction.ordinal() - 1; + if (previous < 0) { + previous = Direction.values().length - 1; + } + return Direction.values()[previous]; + } + + public Direction shiftDirection(Direction direction, int shift) { + if (shift > 0) { + return this.nextDirection(direction); + } else if (shift < 0) { + return this.previousDirection(direction); + } + return direction; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionModeRenderHandler.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionModeRenderHandler.java new file mode 100644 index 000000000..80cbdf9dc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SelectDirectionModeRenderHandler.java @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import com.klikli_dev.theurgy.content.render.BlockOverlays; +import com.klikli_dev.theurgy.content.render.Color; +import com.klikli_dev.theurgy.content.render.RenderTypes; +import com.klikli_dev.theurgy.content.render.cube.CubeModel; +import com.klikli_dev.theurgy.content.render.cube.CubeModelRenderer; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.RenderHighlightEvent; + +public class SelectDirectionModeRenderHandler extends ItemModeRenderHandler { + + public SelectDirectionModeRenderHandler(SelectDirectionMode mode) { + super(mode); + } + + @Override + public void renderBlockHighlight(RenderHighlightEvent.Block event) { + Player player = Minecraft.getInstance().player; + if (player == null) + return; + + BlockHitResult rayTraceResult = event.getTarget(); + if (rayTraceResult.getType() == BlockHitResult.Type.MISS) + return; + + var pos = rayTraceResult.getBlockPos(); + var ps = event.getPoseStack(); + var camera = event.getCamera(); + var bufferSource = event.getMultiBufferSource(); + + var stack = player.getMainHandItem(); + + Direction face = this.mode.getDirection(stack); + + //Note: for now we simply do not use transparency here because it does not work nicely with translucent blocks + // specifically, it stops them from rendering, os the transparent highlight renders the world behind the bock. + // If we want to play with it again, use public final static Color GREEN = new Color(0, 255, 0, 155).setImmutable(); + + Vec3 viewPosition = camera.getPosition(); + ps.pushPose(); + ps.translate(pos.getX() - viewPosition.x, pos.getY() - viewPosition.y, pos.getZ() - viewPosition.z); + CubeModelRenderer.renderCube( + CubeModel.getOverlayModel(face, BlockOverlays.WHITE), ps, bufferSource.getBuffer(RenderTypes.translucentCullNoDepthBlockSheet()), + Color.GREEN.getRGB(), LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, CubeModelRenderer.FaceDisplay.FRONT, + camera); + ps.popPose(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionMode.java new file mode 100644 index 000000000..0fea0596d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionMode.java @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.mode.EnabledSetter; +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import com.klikli_dev.theurgy.content.item.mode.TargetDirectionSetter; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class SetSelectedDirectionMode extends MercurialWandItemMode { + + private SetSelectedDirectionModeRenderHandler renderHandler; + + protected SetSelectedDirectionMode() { + super(); + this.renderHandler = new SetSelectedDirectionModeRenderHandler(this); + } + + @Override + public String descriptionId() { + return TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION; + } + + @Override + public MutableComponent description(ItemStack pStack, @Nullable Level pLevel) { + return Component.translatable( + this.descriptionId(), + Component.translatable(this.getDirection(pStack).getName()).withStyle(ChatFormatting.GREEN)); + } + + @Override + public void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents) { + var description = this.description(pStack, pLevel); + if (pHitResult instanceof BlockHitResult blockHitResult) { + var blockEntity = pLevel.getBlockEntity(blockHitResult.getBlockPos()); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + var currentDirection = directionSettable.targetDirection(); + var newDirection = this.getDirection(pStack); + + var component = Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION_WITH_TARGET, + Component.translatable(currentDirection.getName()).withStyle(currentDirection != newDirection ? ChatFormatting.YELLOW : ChatFormatting.GREEN), + Component.translatable(newDirection.getName()).withStyle(ChatFormatting.GREEN) + ); + + description = component; + } + } + pTooltipComponents.add(description ); + } + + @Override + public SetSelectedDirectionModeRenderHandler renderHandler() { + return this.renderHandler; + } + + public Direction getDirection(ItemStack stack) { + var mode = (SelectDirectionMode) Type.SELECT_DIRECTION.mode(); + return mode.getDirection(stack); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + //get the target block and set its direction if it is a fitting block + + var blockPos = context.getClickedPos(); + var level = context.getLevel(); + + var blockEntity = level.getBlockEntity(blockPos); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + if(!level.isClientSide){ + var direction = this.getDirection(stack); + directionSettable.targetDirection(direction); + + context.getPlayer().displayClientMessage(Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION_SUCCESS, + Component.translatable(direction.getName()).withStyle(ChatFormatting.GREEN) + ), true); + } + return InteractionResult.SUCCESS; + } + + return super.onItemUseFirst(stack, context); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionModeRenderHandler.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionModeRenderHandler.java new file mode 100644 index 000000000..9e596c7a8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SetSelectedDirectionModeRenderHandler.java @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import com.klikli_dev.theurgy.content.item.mode.TargetDirectionSetter; +import com.klikli_dev.theurgy.content.render.BlockOverlays; +import com.klikli_dev.theurgy.content.render.Color; +import com.klikli_dev.theurgy.content.render.RenderTypes; +import com.klikli_dev.theurgy.content.render.cube.CubeModel; +import com.klikli_dev.theurgy.content.render.cube.CubeModelRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.RenderHighlightEvent; + +public class SetSelectedDirectionModeRenderHandler extends ItemModeRenderHandler { + + public SetSelectedDirectionModeRenderHandler(SetSelectedDirectionMode mode) { + super(mode); + } + + @Override + public void renderBlockHighlight(RenderHighlightEvent.Block event) { + Player player = Minecraft.getInstance().player; + if (player == null) + return; + + BlockHitResult rayTraceResult = event.getTarget(); + if (rayTraceResult.getType() != BlockHitResult.Type.BLOCK) + return; + + var blockEntity = player.level().getBlockEntity(rayTraceResult.getBlockPos()); + if (blockEntity instanceof TargetDirectionSetter directionSettable) { + var currentDirection = directionSettable.targetDirection(); + + var stack = player.getMainHandItem(); + var newDirection = this.mode.getDirection(stack); + var targetPos = directionSettable.targetPos(); + + var ps = event.getPoseStack(); + var camera = event.getCamera(); + var bufferSource = event.getMultiBufferSource(); + + //Note: for now we simply do not use transparency here because it does not work nicely with translucent blocks + // specifically, it stops them from rendering, os the transparent highlight renders the world behind the bock. + // If we want to play with it again, use public final static Color GREEN = new Color(0, 255, 0, 155).setImmutable(); + + Vec3 viewPosition = camera.getPosition(); + ps.pushPose(); + ps.translate(targetPos.getX() - viewPosition.x, targetPos.getY() - viewPosition.y, targetPos.getZ() - viewPosition.z); + CubeModelRenderer.renderCube( + CubeModel.getOverlayModel(newDirection, BlockOverlays.WHITE), ps, bufferSource.getBuffer(RenderTypes.translucentCullNoDepthBlockSheet()), + Color.GREEN.getRGB(), LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, CubeModelRenderer.FaceDisplay.FRONT, + camera); + if (currentDirection != newDirection) { + CubeModelRenderer.renderCube( + CubeModel.getOverlayModel(currentDirection, BlockOverlays.WHITE), ps, bufferSource.getBuffer(RenderTypes.translucentCullNoDepthBlockSheet()), + Color.YELLOW.getRGB(), LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, CubeModelRenderer.FaceDisplay.FRONT, + camera); + } + ps.popPose(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SwitchLogisticsEnabledMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SwitchLogisticsEnabledMode.java new file mode 100644 index 000000000..420766200 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mercurialwand/mode/SwitchLogisticsEnabledMode.java @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mercurialwand.mode; + +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.mode.EnabledSetter; +import com.klikli_dev.theurgy.content.item.mode.ItemModeRenderHandler; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class SwitchLogisticsEnabledMode extends MercurialWandItemMode { + + private final ItemModeRenderHandler renderHandler; + + protected SwitchLogisticsEnabledMode() { + super(); + this.renderHandler = new ItemModeRenderHandler<>(this); + } + + @Override + public String descriptionId() { + return TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED; + } + + @Override + public void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents) { + var description = this.description(pStack, pLevel); + if (pHitResult instanceof BlockHitResult blockHitResult) { + var blockEntity = pLevel.getBlockEntity(blockHitResult.getBlockPos()); + if (blockEntity instanceof EnabledSetter enabledSetter) { + var enabled = enabledSetter.enabled(); + + var component = Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_HUD, + Component.translatable( + enabled ? TheurgyConstants.I18n.Item.Mode.ENABLED : + TheurgyConstants.I18n.Item.Mode.DISABLED + ).withStyle( + enabled ? ChatFormatting.GREEN : + ChatFormatting.RED + ) + + ); + + description.append(component); + } + } + pTooltipComponents.add(description); + } + + @Override + public ItemModeRenderHandler renderHandler() { + return this.renderHandler; + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + //get the target block and set its direction if it is a fitting block + + var blockPos = context.getClickedPos(); + var level = context.getLevel(); + + var blockEntity = level.getBlockEntity(blockPos); + if (blockEntity instanceof EnabledSetter enabledSetter) { + + if (!level.isClientSide) { + enabledSetter.enabled(!enabledSetter.enabled()); + var enabled = enabledSetter.enabled(); + + context.getPlayer().displayClientMessage(Component.translatable(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_SUCCESS, + Component.translatable( + enabled ? TheurgyConstants.I18n.Item.Mode.ENABLED : + TheurgyConstants.I18n.Item.Mode.DISABLED + ).withStyle( + enabled ? ChatFormatting.GREEN : + ChatFormatting.RED + ) + ), true); + } + + return InteractionResult.SUCCESS; + } + + + return super.onItemUseFirst(stack, context); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mode/EnabledSetter.java b/src/main/java/com/klikli_dev/theurgy/content/item/mode/EnabledSetter.java new file mode 100644 index 000000000..450894576 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mode/EnabledSetter.java @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mode; + +public interface EnabledSetter { + void enabled(boolean enabled); + + boolean enabled(); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemMode.java b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemMode.java new file mode 100644 index 000000000..488c755d1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemMode.java @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mode; + +import com.klikli_dev.theurgy.content.render.itemhud.ItemHUDProvider; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class ItemMode implements ItemHUDProvider { + + public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + return InteractionResultHolder.pass(pPlayer.getItemInHand(pUsedHand)); + } + + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + return InteractionResult.PASS; + } + + public void onScrollWithRightDown(Player player, ItemStack stack, int shift) { + + } + + public boolean supportsScrollWithRightDown() { + return false; + } + + protected abstract String typeName(); + + public abstract String descriptionId(); + + public MutableComponent description(ItemStack pStack, @Nullable Level pLevel) { + return Component.translatable(this.descriptionId()); + } + + @Override + public void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents) { + pTooltipComponents.add(this.description(pStack, pLevel)); + } + + public abstract ItemModeRenderHandler renderHandler(); + + protected CompoundTag getModeTag(ItemStack stack) { + //an item will end up with one tag per mode type. + return stack.getOrCreateTagElement("theurgy:mode." + this.typeName()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemModeRenderHandler.java b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemModeRenderHandler.java new file mode 100644 index 000000000..c0b9fabc2 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ItemModeRenderHandler.java @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mode; + +import net.neoforged.neoforge.client.event.RenderHighlightEvent; + +public class ItemModeRenderHandler { + + protected final T mode; + public ItemModeRenderHandler(T mode){ + this.mode = mode; + } + + + public void renderBlockHighlight(RenderHighlightEvent.Block event) { + + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mode/ModeItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ModeItem.java new file mode 100644 index 000000000..ca2ad1ca5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mode/ModeItem.java @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mode; + +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageSetMode; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public interface ModeItem { + void changeMode(Player player, ItemStack stack, int shift); + + default void onScroll(Player player, ItemStack stack, int shift) { + Networking.sendToServer(new MessageSetMode(shift)); + } + + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/mode/TargetDirectionSetter.java b/src/main/java/com/klikli_dev/theurgy/content/item/mode/TargetDirectionSetter.java new file mode 100644 index 000000000..139d0010e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/mode/TargetDirectionSetter.java @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.mode; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +public interface TargetDirectionSetter { + void targetDirection(Direction direction); + + Direction targetDirection(); + + /** + * This is used for the visualization of the current target direction in the {@link com.klikli_dev.theurgy.content.item.mercurialwand.mode.SelectDirectionMode} + */ + BlockPos targetPos(); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/salt/AlchemicalSaltItem.java similarity index 96% rename from src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java rename to src/main/java/com/klikli_dev/theurgy/content/item/salt/AlchemicalSaltItem.java index 5f5057efd..eca072ffd 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/salt/AlchemicalSaltItem.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item; +package com.klikli_dev.theurgy.content.item.salt; import com.google.common.collect.ImmutableList; import com.klikli_dev.theurgy.TheurgyConstants; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurItem.java similarity index 99% rename from src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java rename to src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurItem.java index c2c364d2e..17f974d6a 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurItem.java @@ -2,12 +2,12 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item; +package com.klikli_dev.theurgy.content.item.sulfur; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.render.AlchemicalSulfurBEWLR; +import com.klikli_dev.theurgy.content.item.sulfur.render.AlchemicalSulfurBEWLR; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; import com.klikli_dev.theurgy.registry.SulfurRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurTier.java b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurTier.java similarity index 92% rename from src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurTier.java rename to src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurTier.java index 53b34e3f0..18033e040 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurTier.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurTier.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item; +package com.klikli_dev.theurgy.content.item.sulfur; import com.klikli_dev.theurgy.Theurgy; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurType.java b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurType.java similarity index 90% rename from src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurType.java rename to src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurType.java index 7aa1e2ea8..39bee0457 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurType.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/AlchemicalSulfurType.java @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item; +package com.klikli_dev.theurgy.content.item.sulfur; import com.klikli_dev.theurgy.Theurgy; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/render/AlchemicalSulfurBEWLR.java similarity index 97% rename from src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java rename to src/main/java/com/klikli_dev/theurgy/content/item/sulfur/render/AlchemicalSulfurBEWLR.java index df0fb8beb..b681abd3a 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/sulfur/render/AlchemicalSulfurBEWLR.java @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: MIT -package com.klikli_dev.theurgy.content.item.render; +package com.klikli_dev.theurgy.content.item.sulfur.render; import com.klikli_dev.theurgy.config.ClientConfig; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurTier; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurTier; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/wire/WireItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/wire/WireItem.java new file mode 100644 index 000000000..80b5913af --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/wire/WireItem.java @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.item.wire; + +import com.klikli_dev.theurgy.content.behaviour.logistics.HasLeafNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.HasWireEndPoint; +import com.klikli_dev.theurgy.logistics.Logistics; +import com.klikli_dev.theurgy.logistics.Wire; +import com.klikli_dev.theurgy.logistics.WireEndPoint; +import com.klikli_dev.theurgy.logistics.Wires; +import net.minecraft.core.GlobalPos; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.context.UseOnContext; + +public class WireItem extends Item { + + private final int maxRange; + public WireItem(Properties pProperties, int maxRange) { + super(pProperties); + this.maxRange = maxRange; + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + var stack = pContext.getItemInHand(); + + if (!this.isWireEndPoint(pContext)) { + return InteractionResult.FAIL; + } + + var wirePoint = WireEndPoint.load(stack); + if (wirePoint != null) { + return this.connectWire(pContext, wirePoint); + } else { + return this.storeWireEndPoint(pContext); + } + } + + protected boolean isWireEndPoint(UseOnContext pContext) { + var level = pContext.getLevel(); + var pos = pContext.getClickedPos(); + + return level.getBlockState(pos).getBlock() instanceof HasWireEndPoint; + } + + protected InteractionResult connectWire(UseOnContext pContext, WireEndPoint wireEndPoint) { + if (wireEndPoint.level() != pContext.getLevel().dimension()) + return InteractionResult.FAIL; //can't do cables across dimensions + + var pos = pContext.getClickedPos(); + if (wireEndPoint.pos().equals(pos)) + return InteractionResult.FAIL; //can't connect to self + + if (wireEndPoint.pos().distManhattan(pos) > this.maxRange) + return InteractionResult.FAIL; //can't connect to points too far away + + var stack = pContext.getItemInHand(); + WireEndPoint.removeFrom(stack); + + if (!pContext.getPlayer().getAbilities().instabuild) { + stack.shrink(1); + } + + var level = pContext.getLevel(); + + Wires.get(level).addWire(new Wire(wireEndPoint.pos(), pos)); + + if (!level.isClientSide) { + var posA = GlobalPos.of(level.dimension(), pos); + var posB = GlobalPos.of(wireEndPoint.level(), wireEndPoint.pos()); + Logistics.get().add(posA, posB); + + if (level.getBlockEntity(posA.pos()) instanceof HasLeafNodeBehaviour blockEntity) { + Logistics.get().add(blockEntity.leafNode()); + } + + if (level.getBlockEntity(posB.pos()) instanceof HasLeafNodeBehaviour blockEntity) { + Logistics.get().add(blockEntity.leafNode()); + } + } + + return InteractionResult.SUCCESS; + } + + protected InteractionResult storeWireEndPoint(UseOnContext pContext) { + var stack = pContext.getItemInHand(); + + var wirePoint = new WireEndPoint(pContext.getClickedPos(), pContext.getLevel().dimension()); + wirePoint.save(stack); + + return InteractionResult.sidedSuccess(pContext.getLevel().isClientSide); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/BlockHighlightRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/render/BlockHighlightRenderer.java new file mode 100644 index 000000000..dacdf83a7 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/BlockHighlightRenderer.java @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2023 Aidan C. Brady + * SPDX-FileCopyrightText: 2024 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.render; + +import com.klikli_dev.theurgy.content.item.mercurialwand.mode.MercurialWandItemMode; +import com.klikli_dev.theurgy.content.item.mercurialwand.mode.SelectDirectionMode; +import com.klikli_dev.theurgy.content.render.cube.CubeModel; +import com.klikli_dev.theurgy.content.render.cube.CubeModelRenderer; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.RenderHighlightEvent; + +/** + * Based on Mekanism RenderTickhandler#onBlockHover https://github.com/mekanism/Mekanism/blob/d22f6e2028009ed043f8b40c4ea1f7912be3002c/src/main/java/mekanism/client/render/RenderTickHandler.java#L347-L347 + */ +public class BlockHighlightRenderer { + + public static void onRenderBlockHighlight(RenderHighlightEvent.Block event) { + Player player = Minecraft.getInstance().player; + if (player == null) + return; + + BlockHitResult rayTraceResult = event.getTarget(); + if (rayTraceResult.getType() == BlockHitResult.Type.MISS) + return; + + var stack = player.getMainHandItem(); + if(!stack.is(ItemRegistry.MERCURIAL_WAND.get())) + return; + + var mode = MercurialWandItemMode.getMode(stack); + + mode.renderHandler().renderBlockHighlight(event); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/BlockOverlays.java b/src/main/java/com/klikli_dev/theurgy/content/render/BlockOverlays.java new file mode 100644 index 000000000..7a1953873 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/BlockOverlays.java @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.neoforged.neoforge.client.event.TextureAtlasStitchedEvent; + +public class BlockOverlays { + public static TextureAtlasSprite WHITE; + + public static void onTextureAtlasStitched(TextureAtlasStitchedEvent event){ + TextureAtlas map = event.getAtlas(); + if (!map.location().equals(TextureAtlas.LOCATION_BLOCKS)) { + return; + } + + WHITE = map.getSprite(Theurgy.loc("block/overlay/white")); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/Color.java b/src/main/java/com/klikli_dev/theurgy/content/render/Color.java index 681fb4bff..4bf6ff859 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/render/Color.java +++ b/src/main/java/com/klikli_dev/theurgy/content/render/Color.java @@ -20,6 +20,7 @@ public class Color { public final static Color WHITE = new Color(255, 255, 255).setImmutable(); public final static Color RED = new Color(255, 0, 0).setImmutable(); public final static Color GREEN = new Color(0, 255, 0).setImmutable(); + public final static Color YELLOW = new Color(255, 255, 0).setImmutable(); public final static Color SPRING_GREEN = new Color(0, 255, 187).setImmutable(); protected boolean mutable = true; diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java index 592ff8f23..287e4367e 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java +++ b/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java @@ -12,9 +12,11 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.material.Fluid; @@ -22,12 +24,24 @@ import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.FluidType; +import org.jetbrains.annotations.NotNull; /** * See com.simibubi.create.foundation.fluid.FluidRenderer */ public class FluidRenderer { + public static TextureAtlasSprite getFluidTexture(@NotNull FluidStack fluidStack, @NotNull FluidTextureType type) { + IClientFluidTypeExtensions properties = IClientFluidTypeExtensions.of(fluidStack.getFluid()); + ResourceLocation spriteLocation; + if (type == FluidTextureType.STILL) { + spriteLocation = properties.getStillTexture(fluidStack); + } else { + spriteLocation = properties.getFlowingTexture(fluidStack); + } + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(spriteLocation); + } + public static VertexConsumer getFluidBuilder(MultiBufferSource buffer) { return buffer.getBuffer(RenderTypes.fluid()); } @@ -174,4 +188,9 @@ private static void putVertex(VertexConsumer builder, PoseStack ms, float x, flo .normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ()) .endVertex(); } + + public enum FluidTextureType { + STILL, + FLOWING + } } diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java b/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java index 0c021b5ae..8192c430d 100644 --- a/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java +++ b/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java @@ -12,11 +12,37 @@ import net.minecraft.Util; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.resources.ResourceLocation; import java.util.function.Function; public class RenderTypes extends RenderStateShard { + + protected static final Function ENTITY_TRANSLUCENT_CULL_NO_DEPTH = Util.memoize( + p_286165_ -> { + RenderType.CompositeState rendertype$compositestate = RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) + .setDepthTestState(DepthTestStateShard.NO_DEPTH_TEST) + .setTextureState(new RenderStateShard.TextureStateShard(p_286165_, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true); + return RenderType.create("entity_translucent_cull_no_depth", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 1536, true, true, rendertype$compositestate); + } + ); + + public static RenderType entityTranslucentCullNoDepth(ResourceLocation pLocation) { + return ENTITY_TRANSLUCENT_CULL_NO_DEPTH.apply(pLocation); + } + + protected static final RenderType TRANSLUCENT_CULL_NO_DEPTH_BLOCK_SHEET = entityTranslucentCullNoDepth(TextureAtlas.LOCATION_BLOCKS); + + public static RenderType translucentCullNoDepthBlockSheet() { + return TRANSLUCENT_CULL_NO_DEPTH_BLOCK_SHEET; + } + protected static final TransparencyStateShard SRC_MINUS_ONE_TRANSPARENCY = new TransparencyStateShard(Theurgy.loc("src_minus_one").toString(), () -> { RenderSystem.enableDepthTest(); diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModel.java b/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModel.java new file mode 100644 index 000000000..d0b69ddd7 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModel.java @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: 2023 Aidan C. Brady +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.render.cube; + +import com.klikli_dev.theurgy.content.render.FluidRenderer; +import com.klikli_dev.theurgy.util.EnumUtil; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.neoforged.neoforge.fluids.FluidStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.Map; +import java.util.function.Predicate; + +/** + * From Mekanism Model3D, see https://github.com/mekanism/Mekanism/blob/d22f6e2028009ed043f8b40c4ea1f7912be3002c/src/main/java/mekanism/client/render/MekanismRenderer.java#L349-L349 + */ +public class CubeModel { + + private static final Map cachedOverlays = new EnumMap<>(Direction.class); + private final TextureAtlasSprite[] textures = new TextureAtlasSprite[6]; + private final boolean[] renderSides = {true, true, true, true, true, true}; + public float minX, minY, minZ; + public float maxX, maxY, maxZ; + + public static CubeModel getOverlayModel(Direction side, TextureAtlasSprite sprite) { + return cachedOverlays.computeIfAbsent(side, s -> new CubeModel() + .setTexture(sprite) + .prepSingleFaceModelSize(side) + ); + } + + public CubeModel setSideRender(Predicate shouldRender) { + for (Direction direction : EnumUtil.DIRECTIONS) { + this.setSideRender(direction, shouldRender.test(direction)); + } + return this; + } + + public CubeModel setSideRender(Direction side, boolean value) { + this.renderSides[side.ordinal()] = value; + return this; + } + + public CubeModel copy() { + CubeModel copy = new CubeModel(); + System.arraycopy(this.textures, 0, copy.textures, 0, this.textures.length); + System.arraycopy(this.renderSides, 0, copy.renderSides, 0, this.renderSides.length); + return copy.bounds(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + } + + @Nullable + public TextureAtlasSprite getSpriteToRender(Direction side) { + int ordinal = side.ordinal(); + return this.renderSides[ordinal] ? this.textures[ordinal] : null; + } + + public CubeModel shrink(float amount) { + return this.grow(-amount); + } + + public CubeModel grow(float amount) { + return this.bounds(this.minX - amount, this.minY - amount, this.minZ - amount, this.maxX + amount, this.maxY + amount, this.maxZ + amount); + } + + public CubeModel xBounds(float min, float max) { + this.minX = min; + this.maxX = max; + return this; + } + + public CubeModel yBounds(float min, float max) { + this.minY = min; + this.maxY = max; + return this; + } + + public CubeModel zBounds(float min, float max) { + this.minZ = min; + this.maxZ = max; + return this; + } + + public CubeModel bounds(float min, float max) { + return this.bounds(min, min, min, max, max, max); + } + + public CubeModel bounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) { + return this.xBounds(minX, maxX) + .yBounds(minY, maxY) + .zBounds(minZ, maxZ); + } + + public CubeModel prepSingleFaceModelSize(Direction face) { + this.bounds(0, 1); + return switch (face) { + case DOWN -> this.yBounds(-0.01F, -0.001F); + case UP -> this.yBounds(1.001F, 1.01F); + case NORTH -> this.zBounds(-0.01F, -0.001F); + case SOUTH -> this.zBounds(1.001F, 1.01F); + case WEST -> this.xBounds(-0.01F, -0.001F); + case EAST -> this.xBounds(1.001F, 1.01F); + }; + } + + public CubeModel prepFlowing(@NotNull FluidStack fluid) { + TextureAtlasSprite still = FluidRenderer.getFluidTexture(fluid, FluidRenderer.FluidTextureType.STILL); + TextureAtlasSprite flowing = FluidRenderer.getFluidTexture(fluid, FluidRenderer.FluidTextureType.FLOWING); + return this.setTextures(still, still, flowing, flowing, flowing, flowing); + } + + public CubeModel setTexture(Direction side, @Nullable TextureAtlasSprite sprite) { + this.textures[side.ordinal()] = sprite; + return this; + } + + public CubeModel setTexture(TextureAtlasSprite tex) { + Arrays.fill(this.textures, tex); + return this; + } + + public CubeModel setTextures(TextureAtlasSprite down, TextureAtlasSprite up, TextureAtlasSprite north, TextureAtlasSprite south, TextureAtlasSprite west, + TextureAtlasSprite east) { + this.textures[0] = down; + this.textures[1] = up; + this.textures[2] = north; + this.textures[3] = south; + this.textures[4] = west; + this.textures[5] = east; + return this; + } + + public interface ModelBoundsSetter { + + CubeModel set(float min, float max); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModelRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModelRenderer.java new file mode 100644 index 000000000..1dcf3db66 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/cube/CubeModelRenderer.java @@ -0,0 +1,350 @@ +// SPDX-FileCopyrightText: 2023 Aidan C. Brady +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.render.cube; + +import com.klikli_dev.theurgy.util.EnumUtil; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.util.FastColor; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Vector3f; + +import java.util.Arrays; + +/** + * From Mekanism RenderResizableCuboid, see https://github.com/mekanism/Mekanism/blob/d22f6e2028009ed043f8b40c4ea1f7912be3002c/src/main/java/mekanism/client/render/RenderResizableCuboid.java + * Adapted from Mantle's FluidRenderer and Tinker's SmelteryTankRenderer + */ +public class CubeModelRenderer { + + /** + * Used to not need to create multiple arrays when we just want to fill it differently at times, and given rendering TERs is not multithreaded it is perfectly safe to + * just use one backing "temporary" array. + */ + private static final int[] combinedARGB = new int[EnumUtil.DIRECTIONS.length]; + private static final Vector3f NORMAL = new Vector3f(1, 1, 1).normalize(); + private static final int X_AXIS_MASK = 1 << Axis.X.ordinal(); + private static final int Y_AXIS_MASK = 1 << Axis.Y.ordinal(); + private static final int Z_AXIS_MASK = 1 << Axis.Z.ordinal(); + + private CubeModelRenderer() { + } + + public static void renderCube(CubeModel object, PoseStack matrix, VertexConsumer buffer, int argb, int light, int overlay, + FaceDisplay faceDisplay, Camera camera) { + renderCube(object, matrix, buffer, argb, light, overlay, faceDisplay, camera, null); + } + + public static void renderCube(CubeModel object, PoseStack matrix, VertexConsumer buffer, int[] colors, int light, int overlay, + FaceDisplay faceDisplay, Camera camera) { + renderCube(object, matrix, buffer, colors, light, overlay, faceDisplay, camera, null); + } + + public static void renderCube(CubeModel cube, PoseStack matrix, VertexConsumer buffer, int argb, int light, int overlay, FaceDisplay faceDisplay, Camera camera, + @Nullable Vec3 renderPos) { + Arrays.fill(combinedARGB, argb); + renderCube(cube, matrix, buffer, combinedARGB, light, overlay, faceDisplay, camera, renderPos); + } + + /** + * @implNote Based off of Tinker's + */ + public static void renderCube(CubeModel cube, PoseStack matrix, VertexConsumer buffer, int[] colors, int light, int overlay, FaceDisplay faceDisplay, Camera camera, @Nullable Vec3 renderPos) { + TextureAtlasSprite[] sprites = new TextureAtlasSprite[6]; + int axisToRender = 0; + //TODO: Eventually try not rendering faces that are covered by things? At the very least for things like multiblocks + // when one face is entirely casing and not glass + if (renderPos != null && faceDisplay != FaceDisplay.BOTH) { + //If we know the position this model is based around in the world, and we aren't displaying both faces + // then calculate to see if we can skip rendering any faces due to the camera not facing them + Vec3 camPos = camera.getPosition(); + Vec3 minPos = renderPos.add(cube.minX, cube.minY, cube.minZ); + Vec3 maxPos = renderPos.add(cube.maxX, cube.maxY, cube.maxZ); + for (Direction direction : EnumUtil.DIRECTIONS) { + TextureAtlasSprite sprite = cube.getSpriteToRender(direction); + if (sprite != null) { + Axis axis = direction.getAxis(); + AxisDirection axisDirection = direction.getAxisDirection(); + double planeLocation = switch (axisDirection) { + case POSITIVE -> axis.choose(maxPos.x, maxPos.y, maxPos.z); + case NEGATIVE -> axis.choose(minPos.x, minPos.y, minPos.z); + }; + double cameraPosition = axis.choose(camPos.x, camPos.y, camPos.z); + //Check whether the camera's position is past the side that it can render on for the face + // that we want to be rendering + if (faceDisplay.front == (axisDirection == AxisDirection.POSITIVE)) { + if (cameraPosition >= planeLocation) { + sprites[direction.ordinal()] = sprite; + axisToRender |= 1 << axis.ordinal(); + } + } else if (cameraPosition <= planeLocation) { + sprites[direction.ordinal()] = sprite; + axisToRender |= 1 << axis.ordinal(); + } + } + } + } else { + for (Direction direction : EnumUtil.DIRECTIONS) { + TextureAtlasSprite sprite = cube.getSpriteToRender(direction); + if (sprite != null) { + sprites[direction.ordinal()] = sprite; + axisToRender |= 1 << direction.getAxis().ordinal(); + } + } + } + if (axisToRender == 0) { + //Skip rendering if no sides are meant to be rendered + return; + } + //TODO: Further attempt to fix z-fighting at larger distances if we make it not render the sides when it is in a solid block + // that may improve performance some, but definitely would reduce/remove the majority of remaining z-fighting that is going on + //Shift it so that the min values are all greater than or equal to zero as the various drawing code + // has some issues when it comes to handling negative numbers + int xShift = Mth.floor(cube.minX); + int yShift = Mth.floor(cube.minY); + int zShift = Mth.floor(cube.minZ); + float minX = cube.minX - xShift; + float minY = cube.minY - yShift; + float minZ = cube.minZ - zShift; + float maxX = cube.maxX - xShift; + float maxY = cube.maxY - yShift; + float maxZ = cube.maxZ - zShift; + int xDelta = calculateDelta(minX, maxX); + int yDelta = calculateDelta(minY, maxY); + int zDelta = calculateDelta(minZ, maxZ); + float[] xBounds = getBlockBounds(xDelta, minX, maxX); + float[] yBounds = getBlockBounds(yDelta, minY, maxY); + float[] zBounds = getBlockBounds(zDelta, minZ, maxZ); + + matrix.pushPose(); + matrix.translate(xShift, yShift, zShift); + PoseStack.Pose lastMatrix = matrix.last(); + Matrix4f matrix4f = lastMatrix.pose(); + NormalData normal = new NormalData(lastMatrix.normal(), NORMAL, faceDisplay); + Vector3f from = new Vector3f(); + Vector3f to = new Vector3f(); + + //Calculate if we can speed up any of the for loops by skipping ones that will never draw anything + int xIncrement = 1; + int yIncrement = 1; + int zIncrement = 1; + if (axisToRender == X_AXIS_MASK) { + //Only sides are on the x-axis, we can skip from min to max x + xIncrement = Math.max(xDelta, 1); + } else if (axisToRender == Y_AXIS_MASK) { + //Only sides are on the y-axis, we can skip from min to max y + yIncrement = Math.max(yDelta, 1); + } else if (axisToRender == Z_AXIS_MASK) { + //Only sides are on the z-axis, we can skip from min to max z + zIncrement = Math.max(zDelta, 1); + } + + // render each side + for (int y = 0; y <= yDelta; y += yIncrement) { + TextureAtlasSprite upSprite = y == yDelta ? sprites[Direction.UP.ordinal()] : null; + TextureAtlasSprite downSprite = y == 0 ? sprites[Direction.DOWN.ordinal()] : null; + from.y = yBounds[y]; + to.y = yBounds[y + 1]; + for (int z = 0; z <= zDelta; z += zIncrement) { + TextureAtlasSprite northSprite = z == 0 ? sprites[Direction.NORTH.ordinal()] : null; + TextureAtlasSprite southSprite = z == zDelta ? sprites[Direction.SOUTH.ordinal()] : null; + from.z = zBounds[z]; + to.z = zBounds[z + 1]; + for (int x = 0; x <= xDelta; x += xIncrement) { + TextureAtlasSprite westSprite = x == 0 ? sprites[Direction.WEST.ordinal()] : null; + TextureAtlasSprite eastSprite = x == xDelta ? sprites[Direction.EAST.ordinal()] : null; + //Set bounds + from.x = xBounds[x]; + to.x = xBounds[x + 1]; + putTexturedQuad(buffer, matrix4f, westSprite, from, to, Direction.WEST, colors, light, overlay, faceDisplay, normal); + putTexturedQuad(buffer, matrix4f, eastSprite, from, to, Direction.EAST, colors, light, overlay, faceDisplay, normal); + putTexturedQuad(buffer, matrix4f, northSprite, from, to, Direction.NORTH, colors, light, overlay, faceDisplay, normal); + putTexturedQuad(buffer, matrix4f, southSprite, from, to, Direction.SOUTH, colors, light, overlay, faceDisplay, normal); + putTexturedQuad(buffer, matrix4f, upSprite, from, to, Direction.UP, colors, light, overlay, faceDisplay, normal); + putTexturedQuad(buffer, matrix4f, downSprite, from, to, Direction.DOWN, colors, light, overlay, faceDisplay, normal); + } + } + } + matrix.popPose(); + } + + /** + * @implNote From Tinker's + */ + private static float[] getBlockBounds(int delta, float start, float end) { + float[] bounds = new float[2 + delta]; + bounds[0] = start; + int offset = (int) start; + for (int i = 1; i <= delta; i++) { + bounds[i] = i + offset; + } + bounds[delta + 1] = end; + return bounds; + } + + /** + * @implNote From Tinker's + */ + private static int calculateDelta(float min, float max) { + //The texture can stretch over more blocks than the subtracted height is if min's decimal is bigger than max's decimal (causing UV over 1) + // ignoring the decimals prevents this, as yd then equals exactly how many ints are between the two + // for example, if max = 5.1 and min = 2.3, 2.8 (which rounds to 2), with the face array becoming 2.3, 3, 4, 5.1 + int delta = (int) (max - (int) min); + // except in the rare case of max perfectly aligned with the block, causing the top face to render multiple times + // for example, if max = 3 and min = 1, the values of the face array become 1, 2, 3, 3 as we then have middle ints + if (max % 1d == 0) { + delta--; + } + return delta; + } + + /** + * @implNote From Mantle with some adjustments + */ + private static void putTexturedQuad(VertexConsumer buffer, Matrix4f matrix, @Nullable TextureAtlasSprite spriteInfo, Vector3f from, Vector3f to, Direction face, int[] colors, + int light, int overlay, FaceDisplay faceDisplay, NormalData normal) { + if (spriteInfo == null) { + return; + } + // start with texture coordinates + float x1 = from.x(), y1 = from.y(), z1 = from.z(); + float x2 = to.x(), y2 = to.y(), z2 = to.z(); + // choose UV based on opposite two axis + Bounds uBounds, vBounds; + switch (face.getAxis()) { + case Z -> { + uBounds = Bounds.calculate(x2, x1); + vBounds = Bounds.calculate(y1, y2); + } + case X -> { + uBounds = Bounds.calculate(z2, z1); + vBounds = Bounds.calculate(y1, y2); + } + default -> { + uBounds = Bounds.calculate(x1, x2); + vBounds = Bounds.calculate(z2, z1); + } + } + + float minU = spriteInfo.getU(uBounds.min()); + float maxU = spriteInfo.getU(uBounds.max()); + //Flip V + float minV = spriteInfo.getV(1 - vBounds.max()); + float maxV = spriteInfo.getV(1 - vBounds.min()); + int argb = colors[face.ordinal()]; + // add quads + switch (face) { + case DOWN -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x1, y1, z2, + x1, y1, z1, + x2, y1, z1, + x2, y1, z2); + case UP -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x1, y2, z1, + x1, y2, z2, + x2, y2, z2, + x2, y2, z1); + case NORTH -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x1, y1, z1, + x1, y2, z1, + x2, y2, z1, + x2, y1, z1); + case SOUTH -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x2, y1, z2, + x2, y2, z2, + x1, y2, z2, + x1, y1, z2); + case WEST -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x1, y1, z2, + x1, y2, z2, + x1, y2, z1, + x1, y1, z1); + case EAST -> drawFace(buffer, matrix, argb, minU, maxU, minV, maxV, light, overlay, faceDisplay, normal, + x2, y1, z1, + x2, y2, z1, + x2, y2, z2, + x2, y1, z2); + } + } + + private static void drawFace(VertexConsumer buffer, Matrix4f matrix, int argb, float minU, float maxU, float minV, float maxV, int light, int overlay, + FaceDisplay faceDisplay, NormalData normal, + float x1, float y1, float z1, + float x2, float y2, float z2, + float x3, float y3, float z3, + float x4, float y4, float z4) { + int red = FastColor.ARGB32.red(argb); + int green = FastColor.ARGB32.green(argb); + int blue = FastColor.ARGB32.blue(argb); + int alpha = FastColor.ARGB32.alpha(argb); + if (faceDisplay.front) { + buffer.vertex(matrix, x1, y1, z1).color(red, green, blue, alpha).uv(minU, maxV).overlayCoords(overlay).uv2(light).normal(normal.front.x(), normal.front.y(), normal.front.z()).endVertex(); + buffer.vertex(matrix, x2, y2, z2).color(red, green, blue, alpha).uv(minU, minV).overlayCoords(overlay).uv2(light).normal(normal.front.x(), normal.front.y(), normal.front.z()).endVertex(); + buffer.vertex(matrix, x3, y3, z3).color(red, green, blue, alpha).uv(maxU, minV).overlayCoords(overlay).uv2(light).normal(normal.front.x(), normal.front.y(), normal.front.z()).endVertex(); + buffer.vertex(matrix, x4, y4, z4).color(red, green, blue, alpha).uv(maxU, maxV).overlayCoords(overlay).uv2(light).normal(normal.front.x(), normal.front.y(), normal.front.z()).endVertex(); + } + if (faceDisplay.back) { + buffer.vertex(matrix, x4, y4, z4).color(red, green, blue, alpha).uv(maxU, maxV).overlayCoords(overlay).uv2(light).normal(normal.back.x(), normal.back.y(), normal.back.z()).endVertex(); + buffer.vertex(matrix, x3, y3, z3).color(red, green, blue, alpha).uv(maxU, minV).overlayCoords(overlay).uv2(light).normal(normal.back.x(), normal.back.y(), normal.back.z()).endVertex(); + buffer.vertex(matrix, x2, y2, z2).color(red, green, blue, alpha).uv(minU, minV).overlayCoords(overlay).uv2(light).normal(normal.back.x(), normal.back.y(), normal.back.z()).endVertex(); + buffer.vertex(matrix, x1, y1, z1).color(red, green, blue, alpha).uv(minU, maxV).overlayCoords(overlay).uv2(light).normal(normal.back.x(), normal.back.y(), normal.back.z()).endVertex(); + } + } + + public enum FaceDisplay { + FRONT(true, false), + BACK(false, true), + BOTH(true, true); + + private final boolean front; + private final boolean back; + + FaceDisplay(boolean front, boolean back) { + this.front = front; + this.back = back; + } + } + + private record Bounds(float min, float max) { + + public static Bounds calculate(float min, float max) { + // wrap UV to be between 0 and 1, assumes none of the positions lie outside the 0, 0, 0 to 1, 1, 1 range + // however, one of them might be exactly on the 1.0 bound, that one should be set to 1 instead of left at 0 + boolean bigger = min > max; + min = min % 1; + max = max % 1; + if (bigger) { + return new Bounds(min == 0 ? 1 : min, max); + } + return new Bounds(min, max == 0 ? 1 : max); + } + } + + /** + * Used to only have to calculate normals once rather than transforming based on the matrix for every vertex call. If a face shouldn't be displayed the normal vector + * will be zero. + */ + private record NormalData(Vector3f front, Vector3f back) { + + private NormalData(Matrix3f normalMatrix, Vector3f normal, FaceDisplay faceDisplay) { + this(faceDisplay.front ? calculate(normalMatrix, normal.x(), normal.y(), normal.z()) : new Vector3f(), + faceDisplay.back ? calculate(normalMatrix, -normal.x(), -normal.y(), -normal.z()) : new Vector3f()); + } + + private static Vector3f calculate(Matrix3f normalMatrix, float x, float y, float z) { + Vector3f matrixAdjustedNormal = new Vector3f(x, y, z); + return matrixAdjustedNormal.mul(normalMatrix); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUD.java b/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUD.java new file mode 100644 index 000000000..054bbc7a5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUD.java @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2023 Aidan C. Brady + * SPDX-FileCopyrightText: 2024 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.render.itemhud; + +import com.klikli_dev.theurgy.config.ClientConfig; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; +import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; + +import java.util.ArrayList; + +/** + * Based on https://github.com/mekanism/Mekanism/blob/d22f6e2028009ed043f8b40c4ea1f7912be3002c/src/main/java/mekanism/client/render/HUDRenderer.java + */ +public class ItemHUD implements IGuiOverlay { + + private static final ItemHUD instance = new ItemHUD(); + + public static ItemHUD get() { + return instance; + } + + @Override + public void render(ExtendedGui gui, GuiGraphics guiGraphics, float partialTick, int screenWidth, int screenHeight) { + var minecraft = gui.getMinecraft(); + if (minecraft.options.hideGui || minecraft.player == null || minecraft.player.isSpectator() || !ClientConfig.get().rendering.enableItemHUD.get()) + return; + + var stack = minecraft.player.getMainHandItem(); + if (!(stack.getItem() instanceof ItemHUDProvider itemHUDProvider)) + return; + + var hudTexts = new ArrayList(); + itemHUDProvider.appendHUDText(minecraft.player, minecraft.hitResult, stack, minecraft.level, hudTexts); + + if (hudTexts.isEmpty()) + return; + + Font font = gui.getFont(); + + float hudScale = ClientConfig.get().rendering.itemHUDScale.get().floatValue(); + + int yScale = (int) (screenHeight / hudScale); + int start = 2 + hudTexts.size() * 9; //where we start rendering at the bottom of the screen + int y = yScale - start; + + PoseStack pose = guiGraphics.pose(); + pose.pushPose(); + pose.scale(hudScale, hudScale, hudScale); + + for (Component text : hudTexts) { + int x = 2; + guiGraphics.drawString(font, text, x, y, 0xFFC8C8C8); + y += 9; + } + + pose.popPose(); + + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUDProvider.java b/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUDProvider.java new file mode 100644 index 000000000..77a364829 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/itemhud/ItemHUDProvider.java @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.content.render.itemhud; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface ItemHUDProvider { + + void appendHUDText(Player pPlayer, HitResult pHitResult, ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents); +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/SulfurMappings.java b/src/main/java/com/klikli_dev/theurgy/datagen/SulfurMappings.java index 6ec82c665..181cc59c7 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/SulfurMappings.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/SulfurMappings.java @@ -4,9 +4,9 @@ package com.klikli_dev.theurgy.datagen; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurTier; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurType; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurTier; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurType; import com.klikli_dev.theurgy.registry.SulfurRegistry; import java.util.List; diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/LogisticsCategory.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/LogisticsCategory.java new file mode 100644 index 000000000..2c52984d4 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/LogisticsCategory.java @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2022 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book; + +import com.klikli_dev.modonomicon.api.datagen.BookProvider; +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookCategoryModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.book.logistics.*; +import com.klikli_dev.theurgy.registry.ItemRegistry; + + +public class LogisticsCategory extends CategoryProvider { + + public static final String CATEGORY_ID = "logistics"; + + public LogisticsCategory(BookProvider parent) { + super(parent, CATEGORY_ID); + } + + @Override + protected String[] generateEntryMap() { + return new String[]{ + "__________________________________", + "__________________________________", + "__________________________________", + "__________________________________", + "________________l___í_____________", + "__________________________________", + "________________i_____ŵ_n_ň_______", + "__________________________________", + "________________w___e_____________", + "__________________________________", + "__________________________________", + "__________________________________" + + }; + } + + @Override + protected void generateEntries() { + var introEntry = new IntroEntry(this).generate('i'); + var loreEntry = new LoreEntry(this).generate('l'); + loreEntry.withParent(introEntry); + + var wandEntry = new MercurialWandEntry(this).generate('w'); + wandEntry.withParent(introEntry); + //TODO: add a brief tutorial entry for reconfiguring e.g. an oven setup with the wand to not use the default direction? + // maybe after the network entry + + var wireEntry = new MercurialWireEntry(this).generate('ŵ'); + wireEntry.withParent(introEntry); + + var extractorEntry = new ItemExtractorEntry(this).generate('e'); + extractorEntry.withParent(introEntry); + + var inserterEntry = new ItemInserterEntry(this).generate('í'); + inserterEntry.withParent(introEntry); + + var networkEntry = new LogisticsNetworkEntry(this).generate('n'); + networkEntry.withParent(wireEntry); + networkEntry.withParent(extractorEntry); + networkEntry.withParent(inserterEntry); + + var nodeEntry = new ConnectionNodeEntry(this).generate('ň'); + nodeEntry.withParent(networkEntry); + } + + @Override + protected BookCategoryModel generateCategory() { + this.add(this.context().categoryName(), "Mercurial Logistics"); + + return BookCategoryModel.create( + Theurgy.loc(this.context().categoryId()), + this.context().categoryName() + ) + .withBackground(Theurgy.loc("textures/gui/book/bg_nightsky2.png")) + .withIcon(ItemRegistry.MERCURIAL_WAND.get()); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java index b3b9d1a15..cba3f16de 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java @@ -33,6 +33,8 @@ protected BookModel generateBook() { var apparatusCategory = new ApparatusCategory(this).generate().withSortNumber(categorySortNum++); + var logisticsCategory = new LogisticsCategory(this).generate().withSortNumber(categorySortNum++); + //TODO: entry read condition var book = BookModel.create( @@ -42,7 +44,8 @@ protected BookModel generateBook() { .withTooltip(this.context().bookTooltip()) .withCategories( gettingStartedCategory, - apparatusCategory + apparatusCategory, + logisticsCategory ) .withGenerateBookItem(true) .withModel(this.modLoc("the_hermetica_icon")) diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ConnectionNodeEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ConnectionNodeEntry.java new file mode 100644 index 000000000..e8b1e1b96 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ConnectionNodeEntry.java @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookImagePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.book.LogisticsCategory; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.crafting.Ingredient; + +public class ConnectionNodeEntry extends EntryProvider { + public ConnectionNodeEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("node", () -> BookSpotlightPageModel.create() + .withItem(Ingredient.of(ItemRegistry.LOGISTICS_CONNECTION_NODE.get())) + .withText(this.context().pageText())); + this.pageText(""" + The node allows connecting wires over long distances without placing an inserter or extractor. + """ + ); + + this.page("recipe", () -> BookCraftingRecipePageModel.create() + .withRecipeId1(Theurgy.loc("crafting/shaped/logistics_connector_node"))); + + this.page("usage", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Usage"); + this.pageText(""" + 1. Right-click any block to attach the node to it. + 2. Then connect the node to other blocks using wires. + 3. Any block connected directly or indirectly will be part of the same network. + """ + ); + + this.page("image", () -> BookImagePageModel.create() + .withTitle(this.context().pageTitle()) + .withImages(Theurgy.loc("textures/gui/book/connection_node_example.png"))); + this.pageTitle("Demonstration"); + + this.page("large_networks", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Complex Networks"); + this.pageText(""" + In networks with multiple inserters and extractors the default behaviour is round-robin. That means each extractor will attempt to split the items evenly between all connected inserters. + \\ + \\ + In the future more advanced configurations will be possible. + """ + ); + } + + @Override + protected String entryName() { + return "Mercurial Connection Node"; + } + + @Override + protected String entryDescription() { + return "Extend the Range of Logistics Networks"; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.LOGISTICS_CONNECTION_NODE.get()); + } + + @Override + protected String entryId() { + return "connection_node"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/IntroEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/IntroEntry.java new file mode 100644 index 000000000..f91c97d34 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/IntroEntry.java @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.datagen.book.GettingStartedCategoryProvider; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; + +public class IntroEntry extends EntryProvider { + public IntroEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("intro", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Mercurial Logistics"); + this.pageText(""" + Spagyrics show that matter and energy are closely related, interchangeable even. + \\ + \\ + Mercury is the energetic aspect of matter, which can be moved both in crystal form and as energy, over metal wires. + """ + ); + + this.page("intro2", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Mercurial Logistics"); + this.pageText(""" + If the conversion between matter and energy in both directions can be controlled, then a much more efficient transportation system can be created, utilizing metal wires instead of hoppers or pipes: Mercurial Logistics. + """ + ); + } + + @Override + protected String entryName() { + return "Mercurial Logistics"; + } + + @Override + protected String entryDescription() { + return "Matter Transport & Automation"; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.CATEGORY_START; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.MERCURIAL_WAND.get()); + } + + @Override + protected String entryId() { + return "intro"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemExtractorEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemExtractorEntry.java new file mode 100644 index 000000000..0f1c7ff2d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemExtractorEntry.java @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.book.LogisticsCategory; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.crafting.Ingredient; + +public class ItemExtractorEntry extends EntryProvider { + public ItemExtractorEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("extractor", () -> BookSpotlightPageModel.create() + .withItem(Ingredient.of(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get())) + .withText(this.context().pageText())); + this.pageText(""" + When attached to a block, the extractor will extract items from the block into the Mercurial Logistics System. The items will be inserted into blocks that have inserters attached to them, if the inserters are part of the same network. + """ + ); + + this.page("recipe", () -> BookCraftingRecipePageModel.create() + .withRecipeId1(Theurgy.loc("crafting/shaped/logistics_item_extractor"))); + + this.page("usage", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Usage"); + this.pageText(""" + Right-click a block that has an inventory to attach the extractor to it. + \\ + \\ + The extractor will by default extract from the face it is attached to. E.g. if it is attached to the bottom of a furnace, it will extract the output from the furnace. + """ + ); + + this.page("identification", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Identification"); + this.pageText(""" + The extractor features a red band on the side attached to the target block. + """ + ); + + this.page("direction", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Changing Direction"); + this.pageText(""" + Extractors can also extract from faces they are not attached to. Use the {0} in the "Select Direction" mode to cycle through the extract directions.\\ + E.g. an extractor attached to the top of a furnace can be configured to extract the output of the furnace from the bottom (instead of the input from the top). + """, + this.entryLink("Mercurial Wand", LogisticsCategory.CATEGORY_ID, MercurialWandEntry.ENTRY_ID) + ); + } + + @Override + protected String entryName() { + return "Mercurial Item Extractor"; + } + + @Override + protected String entryDescription() { + return "Extracting items from Blocks into the Mercurial Logistics System."; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get()); + } + + @Override + protected String entryId() { + return "item_extractor"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemInserterEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemInserterEntry.java new file mode 100644 index 000000000..f7504c893 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/ItemInserterEntry.java @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.book.LogisticsCategory; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.crafting.Ingredient; + +public class ItemInserterEntry extends EntryProvider { + public ItemInserterEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("inserter", () -> BookSpotlightPageModel.create() + .withItem(Ingredient.of(ItemRegistry.LOGISTICS_ITEM_INSERTER.get())) + .withText(this.context().pageText())); + this.pageText(""" + When attached to a block, the inserter will insert items from the Mercurial Logistics System into the block. The items will be extracted from blocks that have extractors attached to them, if the extractors are part of the same network. + """ + ); + + this.page("recipe", () -> BookCraftingRecipePageModel.create() + .withRecipeId1(Theurgy.loc("crafting/shaped/logistics_item_inserter"))); + + this.page("usage", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Usage"); + this.pageText(""" + Right-click a block that has an inventory to attach the inserter to it. + \\ + \\ + The inserter will by default insert into the face it is attached to. E.g. if it is attached to the side of a furnace, it will insert into the fuel slot. + """ + ); + + this.page("identification", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Identification"); + this.pageText(""" + The inserter features a green band on the side attached to the target block. + """ + ); + + this.page("direction", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Changing Direction"); + this.pageText(""" + Inserters can also insert into faces they are not attached to. Use the {0} in the "Select Direction" mode to cycle through the insert directions.\\ + E.g. an inserter attached to the top of a furnace can be configured to insert fuel into furnace from the side (instead of into the input slot from the top). + """, + this.entryLink("Mercurial Wand", LogisticsCategory.CATEGORY_ID, MercurialWandEntry.ENTRY_ID) + ); + } + + @Override + protected String entryName() { + return "Mercurial Item Inserter"; + } + + @Override + protected String entryDescription() { + return "Inserting items into Blocks from the Mercurial Logistics System."; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.LOGISTICS_ITEM_INSERTER.get()); + } + + @Override + protected String entryId() { + return "item_inserter"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LogisticsNetworkEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LogisticsNetworkEntry.java new file mode 100644 index 000000000..0c8730ab5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LogisticsNetworkEntry.java @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookImagePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.book.LogisticsCategory; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class LogisticsNetworkEntry extends EntryProvider { + public LogisticsNetworkEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("network", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Network Formation"); + this.pageText(""" + The most basic mercurial logistics network consists of one inserter and one extractor, connected by a wire. + \\ + \\ + You can test this with a setup that inserts the contents of a chest into a furnace to be smelted. + """ + ); + + this.page("setup", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Place the Blocks"); + this.pageText(""" + 1. Place a chest and a furnace near each other. + 2. Place an extractor on any face of the chest. + 3. Place an inserter on the top of the furnace (where the input items go). + 4. Connect inserter and extractor with a wire. + """ + ); + + this.page("image", () -> BookImagePageModel.create() + .withTitle(this.context().pageTitle()) + .withImages(Theurgy.loc("textures/gui/book/furnace_automation.png"))); + this.pageTitle("Demonstration"); + + this.page("extending", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Extending the Setup"); + this.pageText(""" + To improve the setup you can now place an extractor at the bottom of the furnace (or any other face and use the {0} to change the extract direction to bottom) and an inserter at any face of a second chest. Connect the two with a wire, and your furnace will now automatically deposit smelted items into the second chest. + """ + ); + + this.page("extending2", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Extending the Setup"); + this.pageText(""" + You could add a third chest with fuel and connect it to an inserter placed on the side of the furnace to automatically refuel it. + """ + ); + + this.page("advanced", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Advanced Networks"); + this.pageText(""" + More complex networks that allow filtering which items are inserted/extracted will be available in the future. + """ + ); + } + + @Override + protected String entryName() { + return "Network Formation"; + } + + @Override + protected String entryDescription() { + return "Putting it all together."; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create( + Theurgy.loc("textures/gui/book/logistics_network.png") + ); + } + + @Override + protected String entryId() { + return "logistics_network"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LoreEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LoreEntry.java new file mode 100644 index 000000000..55ef98ab4 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/LoreEntry.java @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; + +public class LoreEntry extends EntryProvider { + public LoreEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("conversion", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Temporary Mercuriality"); + this.pageText(""" + When matter comes into contact with Alchemical Mercury an odd reaction occurs. The matter seems to flicker, as if it is not quite there. Apparently the matter, for the briefest moment, shifts entirely into mercurial form, before returning to its original state. + """ + ); + + this.page("wires", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Mercury Wires"); + this.pageText(""" + Interestingly, this conversion can be persisted. If the Alchemical Mercury is in contact with an appropriate metal wire, the matter will remain in its mercurial form and flow along the wire, as if it were energy. + """ + ); + + this.page("reversal", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Reversal of Conversion"); + this.pageText(""" + If there is sufficient space for the matter to return to its original state, it will do so. To this end another piece of Alchemical Mercury can be placed at the end of the wire, allowing the matter to return to its original state. + """ + ); + } + + @Override + protected String entryName() { + return "Temporary Mercuriality"; + } + + @Override + protected String entryDescription() { + return "The energetic aspect of matter"; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.MERCURY_SHARD.get()); + } + + @Override + protected String entryId() { + return "lore"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWandEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWandEntry.java new file mode 100644 index 000000000..9fad03ea9 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWandEntry.java @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.crafting.Ingredient; + +public class MercurialWandEntry extends EntryProvider { + + public static final String ENTRY_ID = "mercurial_wand"; + public MercurialWandEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("conversion", () -> BookSpotlightPageModel.create() + .withItem(Ingredient.of(ItemRegistry.MERCURIAL_WAND.get())) + .withText(this.context().pageText())); + this.pageText(""" + Mercurial Logistics apparatus can be controlled and configured using the Mercurial Wand. + """ + ); + + this.page("recipe", () -> BookCraftingRecipePageModel.create() + .withRecipeId1(Theurgy.loc("crafting/shaped/mercurial_wand"))); + + this.page("usage", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Usage"); + this.pageText(""" + Crouch and Scroll to change the mode of the wand. + \\ + \\ + Right-click to interact with the target apparatus/block. + """ + ); + + this.page("rotate", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Rotate Selected Direction"); + this.pageText(""" + With this mode, right-clicking on a block will cycle the selected direction of the target block. + \\ + \\ + The "selected direction" is the direction the block will insert/extract to/from. + \\ + \\ + The default selected direction is the face the block is attached to. + """ + ); + + this.page("rotate_visuals", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Rotate Selected Direction"); + this.pageText(""" + When looking at a logistics block with this mode selected, the block will highlight the selected direction on its target block. + \\ + \\ + Yellow is the current direction, green is the direction that will be set if you right-click.\\ + Make sure that the side you want to insert/extract from is yellow! + """ + ); + + this.page("enable", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Enable/Disable"); + this.pageText(""" + With this mode, right-clicking on a block will enable or disable it. + \\ + \\ + A disabled block will no longer insert or extract from the block it is attached to. + """ + ); + } + + @Override + protected String entryName() { + return "Mercurial Wand"; + } + + @Override + protected String entryDescription() { + return "Controlling Mercurial Logistics"; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.MERCURIAL_WAND.get()); + } + + @Override + protected String entryId() { + return ENTRY_ID; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWireEntry.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWireEntry.java new file mode 100644 index 000000000..95a9948b2 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/logistics/MercurialWireEntry.java @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.datagen.book.logistics; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.EntryBackground; +import com.klikli_dev.modonomicon.api.datagen.EntryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.crafting.Ingredient; + +public class MercurialWireEntry extends EntryProvider { + public MercurialWireEntry(CategoryProvider parent) { + super(parent); + } + + @Override + protected void generatePages() { + this.page("wire", () -> BookSpotlightPageModel.create() + .withItem(Ingredient.of(ItemRegistry.COPPER_WIRE.get())) + .withText(this.context().pageText())); + this.pageText(""" + Mercurial Wires can connect different parts of your Mercurial Logistics system. Substances will move freely between any blocks connected by wires. + """ + ); + + this.page("recipe", () -> BookCraftingRecipePageModel.create() + .withRecipeId1(Theurgy.loc("crafting/shaped/copper_wire"))); + + this.page("usage", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Usage"); + this.pageText(""" + Right-click one block, then right-click another block to connect them with the wire. + \\ + \\ + Only mercurial logistics blocks, such as inserters, extractors or connection nodes, can be connected with wires. + """ + ); + + this.page("removal", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText())); + this.pageTitle("Removing Wires"); + this.pageText(""" + To remove a wire, break one of the blocks the wire is connected to. + """ + ); + } + + @Override + protected String entryName() { + return "Mercurial Wire"; + } + + @Override + protected String entryDescription() { + return "Item-Over-Wire Transport"; + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(ItemRegistry.COPPER_WIRE.get()); + } + + @Override + protected String entryId() { + return "mercurial_wire"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java index a6b889246..98446697d 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java @@ -7,10 +7,10 @@ import com.klikli_dev.modonomicon.api.datagen.AbstractModonomiconLanguageProvider; import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurTier; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurType; +import com.klikli_dev.theurgy.content.item.salt.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurTier; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurType; import com.klikli_dev.theurgy.registry.BlockRegistry; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.klikli_dev.theurgy.registry.SaltRegistry; @@ -22,6 +22,7 @@ import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Item; import net.neoforged.neoforge.registries.DeferredHolder; +import org.checkerframework.common.returnsreceiver.qual.This; import java.text.MessageFormat; import java.util.function.Supplier; @@ -43,6 +44,11 @@ protected String darkRed(String text) { return ChatFormatting.DARK_RED + text + ChatFormatting.RESET + ChatFormatting.GRAY; } + private void addKeys() { + this.add(TheurgyConstants.I18n.Key.CATEGORY, "Theurgy"); + this.add(TheurgyConstants.I18n.Key.CHANGE_ITEM_MODE, "Change Item Mode"); + } + private void addMisc() { this.add(TheurgyConstants.I18n.Tooltip.SHOW_EXTENDED, ChatFormatting.GOLD + "[" + ChatFormatting.LIGHT_PURPLE + "shift " + @@ -297,6 +303,44 @@ private void addBlocks() { this.addBlock(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE, "Deepslate Sal Ammoniac Ore"); this.addExtendedTooltip(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get()::asItem, "Ore that yields Sal Ammoniac Crystals for use in a Sal Ammoniac Accumulator."); + + this.addBlock(BlockRegistry.LOGISTICS_ITEM_INSERTER, "Mercurial Item Inserter"); + this.addTooltip(BlockRegistry.LOGISTICS_ITEM_INSERTER.get()::asItem, + "Allows to insert items into a block from a Mercurial Logistics Network", + "Can be used to insert or extract items from a block.", + this.f( + """ + {0} the target block with the inserter to place it. + Then {0} the inserter with a cable to connect it to the network. + """, + this.green("Right-Click") + ) + ); + + this.addBlock(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR, "Mercurial Item Extractor"); + this.addTooltip(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get()::asItem, + "Allows to extract items from a block into a Mercurial Logistics Network", + "Can be used to insert or extract items from a block.", + this.f( + """ + {0} the target block with the extractor to place it. + Then {0} the extractor with a cable to connect it to the network. + """, + this.green("Right-Click") + ) + ); + + this.addBlock(BlockRegistry.LOGISTICS_CONNECTION_NODE, "Mercurial Connection Node"); + this.addTooltip(BlockRegistry.LOGISTICS_CONNECTION_NODE.get()::asItem, + "Allows to connect multiple wires in a Mercurial Logistics Network", + "Can be used to insert or extract items from a block.", + this.f( + """ + Place the connection node, then use wires to connect it with other connection nodes, or other mercurial logistics blocks. + """, + this.green("Right-Click") + ) + ); } private void addGenericSulfur(AlchemicalSulfurItem sulfur) { @@ -555,7 +599,6 @@ private void addItems() { this.addSalts(); this.addSulfurs(); this.addDivinationRods(); - this.addItem(ItemRegistry.EMPTY_JAR_ICON, "Empty Jar Icon"); this.addTooltip(ItemRegistry.EMPTY_JAR_ICON, "Dummy item for rendering."); this.addItem(ItemRegistry.EMPTY_JAR_IRON_BAND_ICON, "Empty Jar with Iron Band Icon"); @@ -615,6 +658,50 @@ private void addItems() { this.addTooltip(ItemRegistry.OTHER_MINERALS_PRECIOUS_ICON, "Dummy item for rendering."); this.addItem(ItemRegistry.SAL_AMMONIAC_BUCKET, "Sal Ammoniac Bucket"); + this.addItem(ItemRegistry.COPPER_WIRE, "Mercurial Copper Wire"); + this.addTooltip(ItemRegistry.COPPER_WIRE, + "A piece of copper wire capable of transferring matter in its mercurial form.", + "Can be used to connect different parts of Mercurial Logistics Networks.", + """ + Right-click one connector, then right-click another connector to connect them with the wire. + """ + ); + + this.addItem(ItemRegistry.MERCURIAL_WAND, "Mercurial Wand"); + + var wandUsage = this.f(""" + {0} to use current mode. + Hold {1} and {3} to cycle through modes. + """, +//these two are only relevant if we use the "Select Direction Mode" again, which we currently don't +// Hold {1} and {2} and {3} to use "Select Direction Mode". +// {0} without any keys held down in case a mode gets stuck. +// """, + this.green("Right-Click"), + this.green("Crouch"), + this.green("Right Mouse Button"), + this.green("Scroll") + ); + this.addTooltip(ItemRegistry.MERCURIAL_WAND, + "Definitely not just a wrench.", + "Allows configuring alchemical apparatuses and mercurial logistics networks.", + wandUsage + ); + + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SELECT_DIRECTION, "Select direction (Currently: %s)"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SELECT_DIRECTION_SUCCESS, "Direction: %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION, "Set direction to %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION_WITH_TARGET, "Set direction from %s to %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SET_SELECTED_DIRECTION_SUCCESS, "Set direction to %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION, "Rotate selected direction"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_WITH_TARGET, "Set direction from %s to %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_ROTATE_SELECTED_DIRECTION_SUCCESS, "Rotated direction to %s"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED, "Enable/Disable"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_HUD, " (Currently: %s)"); + this.add(TheurgyConstants.I18n.Item.Mode.MERCURIAL_WAND_SWITCH_LOGISTICS_ENABLED_SUCCESS, "Logistics Connector is now %s"); + this.add(TheurgyConstants.I18n.Item.Mode.ENABLED, "Enabled"); + this.add(TheurgyConstants.I18n.Item.Mode.DISABLED, "Disabled"); + this.addItem(ItemRegistry.MERCURY_SHARD, "Mercury Shard"); this.addExtendedTooltip(ItemRegistry.MERCURY_SHARD, @@ -648,6 +735,7 @@ private void addItems() { @Override protected void addTranslations() { this.addMisc(); + this.addKeys(); this.addSubtitles(); this.addMessages(); this.addItems(); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java index 4c75f61b2..3ea732126 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java @@ -67,6 +67,10 @@ protected void generate() { this.dropSelf(BlockRegistry.FERMENTATION_VAT.get()); this.dropSelf(BlockRegistry.DIGESTION_VAT.get()); + this.dropSelf(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get()); + this.dropSelf(BlockRegistry.LOGISTICS_ITEM_INSERTER.get()); + this.dropSelf(BlockRegistry.LOGISTICS_CONNECTION_NODE.get()); + this.add(BlockRegistry.SAL_AMMONIAC_ORE.get(), (block) -> { return this.createOreDrop(block, ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); }); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java index 65077d03c..e91fbe24d 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java @@ -10,9 +10,11 @@ import com.klikli_dev.theurgy.registry.BlockRegistry; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; @@ -28,6 +30,10 @@ public TheurgyBlockStateProvider(PackOutput packOutput, ExistingFileHelper exFil super(packOutput, Theurgy.MODID, exFileHelper); } + protected ResourceLocation key(Block block) { + return BuiltInRegistries.BLOCK.getKey(block); + } + @Override protected void registerStatesAndModels() { this.registerCalcinationOven(); @@ -48,11 +54,162 @@ protected void registerStatesAndModels() { this.registerFermentationVat(); this.registerDigestionVat(); + this.registerLogisticsItemInserter(); + this.registerLogisticsItemExtractor(); + this.registerLogisticsNode(); this.simpleBlockWithItem(BlockRegistry.SAL_AMMONIAC_ORE.get(), this.cubeAll(BlockRegistry.SAL_AMMONIAC_ORE.get())); this.simpleBlockWithItem(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get(), this.cubeAll(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get())); } + protected void registerLogisticsItemInserter() { + var model = this.models().withExistingParent("logistics_item_inserter", this.modLoc("block/logistics_connector_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/logistics_inserter")) + .texture("particle", this.mcLoc("block/copper_block")); + + //build blockstate + this.directionalBlock(BlockRegistry.LOGISTICS_ITEM_INSERTER.get(), model); + this.itemModels().getBuilder(this.key(BlockRegistry.LOGISTICS_ITEM_INSERTER.get()).getPath()) + .parent(model) + .transforms() + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) + .translation(0, 4, 0) + .scale(1) + .end() + .transform(ItemDisplayContext.GROUND) + .rotation(0, 0, 0) + .translation(0, 5, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.FIXED) + .rotation(0, 0, 0) + .translation(0, 3, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_LEFT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_LEFT_HAND) + .rotation(0, 225, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end(); + } + + protected void registerLogisticsItemExtractor() { + var model = this.models().withExistingParent("logistics_item_extractor", this.modLoc("block/logistics_connector_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/logistics_extractor")) + .texture("particle", this.mcLoc("block/copper_block")); + + //build blockstate + this.directionalBlock(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get(), model); + this.itemModels().getBuilder(this.key(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get()).getPath()) + .parent(model) + .transforms() + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) + .translation(0, 4, 0) + .scale(1) + .end() + .transform(ItemDisplayContext.GROUND) + .rotation(0, 0, 0) + .translation(0, 5, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.FIXED) + .rotation(0, 0, 0) + .translation(0, 3, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_LEFT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_LEFT_HAND) + .rotation(0, 225, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end(); + } + + protected void registerLogisticsNode() { + var model = this.models().withExistingParent("logistics_connection_node", this.modLoc("block/logistics_node_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("connector", this.modLoc("block/logistics_node_connector")) + .texture("base", this.modLoc("block/logistics_node_base")) + .texture("particle", this.mcLoc("block/terracotta")); + + //build blockstate + this.directionalBlock(BlockRegistry.LOGISTICS_CONNECTION_NODE.get(), model); + this.itemModels().getBuilder(this.key(BlockRegistry.LOGISTICS_CONNECTION_NODE.get()).getPath()) + .parent(model) + .transforms() + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) + .translation(0, 4, 0) + .scale(1) + .end() + .transform(ItemDisplayContext.GROUND) + .rotation(0, 0, 0) + .translation(0, 5, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.FIXED) + .rotation(0, 0, 0) + .translation(0, 3, 0) + .scale(0.5f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.THIRD_PERSON_LEFT_HAND) + .rotation(0, 0, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end() + .transform(ItemDisplayContext.FIRST_PERSON_LEFT_HAND) + .rotation(0, 225, 0) + .translation(0, 6, 0) + .scale(0.7f) + .end(); + } + protected void registerFermentationVat() { //for now we use a barrel, later we add the appropriate improved textures var model = this.models().withExistingParent("fermentation_vat", this.mcLoc("block/cube_bottom_top")) diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java index 6ea152508..08131fb5c 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java @@ -6,7 +6,7 @@ import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.klikli_dev.theurgy.registry.SaltRegistry; import com.klikli_dev.theurgy.registry.SulfurRegistry; @@ -43,12 +43,17 @@ private ItemModelBuilder registerItemGenerated(String name, String texture) { .texture("layer0", this.modLoc("item/" + texture)); } - private void registerItemHandheld(String name) { - this.getBuilder(name) + private ItemModelBuilder registerItemHandheld(String name) { + return this.registerItemHandheld(name, name); + } + + private ItemModelBuilder registerItemHandheld(String name, String texture) { + return this.getBuilder(name) .parent(new ModelFile.UncheckedModelFile("item/handheld")) - .texture("layer0", this.modLoc("item/" + name)); + .texture("layer0", this.modLoc("item/" + texture)); } + private void registerItemBuiltinEntity(String name) { this.getBuilder(name) .parent(new ModelFile.UncheckedModelFile("builtin/entity")); @@ -57,15 +62,15 @@ private void registerItemBuiltinEntity(String name) { private void registerDivinationRod(Item divinationRodItem) { //somehow we have to prefix "item/" if we append "/0" instead of "_=". Probably something in the item builder or resource location logic it a "/" is present. Anyhow, this moves the variants into a subfolder - var variant0 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/0", this.name(divinationRodItem) + "/divination_rod_0"); - var variant1 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/1", this.name(divinationRodItem) + "/divination_rod_1"); - var variant2 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/2", this.name(divinationRodItem) + "/divination_rod_2"); - var variant3 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/3", this.name(divinationRodItem) + "/divination_rod_3"); - var variant4 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/4", this.name(divinationRodItem) + "/divination_rod_4"); - var variant5 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/5", this.name(divinationRodItem) + "/divination_rod_5"); - var variant6 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/6", this.name(divinationRodItem) + "/divination_rod_6"); - var variant7 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/7", this.name(divinationRodItem) + "/divination_rod_7"); - var searchingVariant = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/searching", this.name(divinationRodItem) + "/divination_rod_searching"); + var variant0 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/0", this.name(divinationRodItem) + "/divination_rod_0"); + var variant1 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/1", this.name(divinationRodItem) + "/divination_rod_1"); + var variant2 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/2", this.name(divinationRodItem) + "/divination_rod_2"); + var variant3 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/3", this.name(divinationRodItem) + "/divination_rod_3"); + var variant4 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/4", this.name(divinationRodItem) + "/divination_rod_4"); + var variant5 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/5", this.name(divinationRodItem) + "/divination_rod_5"); + var variant6 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/6", this.name(divinationRodItem) + "/divination_rod_6"); + var variant7 = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/7", this.name(divinationRodItem) + "/divination_rod_7"); + var searchingVariant = this.registerItemHandheld("item/" + this.name(divinationRodItem) + "/searching", this.name(divinationRodItem) + "/divination_rod_searching"); var name = this.name(divinationRodItem); this.getBuilder(name) @@ -182,5 +187,8 @@ protected void registerModels() { this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get()); this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get()); this.registerDivinationRod(ItemRegistry.AMETHYST_DIVINATION_ROD.get()); + + this.registerItemGenerated(this.name(ItemRegistry.COPPER_WIRE.get())); + this.registerItemHandheld(this.name(ItemRegistry.MERCURIAL_WAND.get())); } } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java index f5409a213..ac8f8c203 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java @@ -30,7 +30,7 @@ public AccumulationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { var salAmmoniac = FluidRegistry.SAL_AMMONIAC.get(); this.makeRecipe("sal_ammoniac_from_water", salAmmoniac, 100, (Item) null, FluidTags.WATER, 1000, TIME); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java index 35fd78b82..aa62d6aa5 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java @@ -30,7 +30,7 @@ public CalcinationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { this.makeRecipe(SaltRegistry.STRATA.get(), "from_stone", Tags.Items.STONE); this.makeRecipe(SaltRegistry.STRATA.get(), "from_sandstone", Tags.Items.SANDSTONE); this.makeRecipe(SaltRegistry.STRATA.get(), "from_cobblestone", Tags.Items.COBBLESTONE); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CatalysationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CatalysationRecipeProvider.java index 755401cea..5459cac24 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CatalysationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CatalysationRecipeProvider.java @@ -24,7 +24,7 @@ public CatalysationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { //one coal = one mercury shard //one coal burns 200t in a furnace/generator and usually yields 40 FE / t = 8000FE //that means we should make one shard give mercury flux equivalent to 8000 FE diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DigestionRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DigestionRecipeProvider.java index ef3846260..1ebd2d7f9 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DigestionRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DigestionRecipeProvider.java @@ -7,7 +7,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; import com.klikli_dev.theurgy.content.recipe.FermentationRecipe; import com.klikli_dev.theurgy.registry.*; import com.mojang.datafixers.util.Pair; @@ -43,7 +43,7 @@ public void makeTierConversion(AlchemicalSulfurItem lower, AlchemicalSulfurItem } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { this.makeRecipeWithTags(Fluids.WATER, 1000, List.of( Tags.Items.INGOTS_GOLD, ItemTagRegistry.ALCHEMICAL_SALTS diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java index be3e9feb9..10ba860bc 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java @@ -31,7 +31,7 @@ public DistillationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { this.makeMercuryShardRecipe(1, Tags.Items.STONE, 10); this.makeMercuryShardRecipe(1, Tags.Items.SANDSTONE, 10); this.makeMercuryShardRecipe(1, ItemTags.STONE_BRICKS, 10); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/FermentationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/FermentationRecipeProvider.java index 8ef24a471..235b04e60 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/FermentationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/FermentationRecipeProvider.java @@ -31,7 +31,7 @@ public FermentationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { this.makeRecipesForCropTag(ItemTagRegistry.SUGAR); this.makeRecipesForCropTag(Tags.Items.CROPS); } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java index 647f30c20..b9b86c182 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java @@ -7,8 +7,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.salt.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; @@ -33,7 +33,7 @@ public IncubationRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { this.makeRecipe(Items.WHEAT, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.CROPS.get(), SulfurRegistry.WHEAT.get()); //metal ingots from sulfurs diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java index 87cde893c..18cbc4efc 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java @@ -17,6 +17,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.material.Fluid; import net.neoforged.neoforge.fluids.FluidStack; @@ -196,6 +197,9 @@ public CompletableFuture run(CachedOutput pOutput) { Set set = Sets.newHashSet(); List> futures = new ArrayList<>(); this.recipeConsumer = (id, recipe) -> { + if(!recipe.has("category")) + recipe.addProperty("category", CraftingBookCategory.MISC.getSerializedName()); + if (!set.add(id)) { throw new IllegalStateException("Duplicate recipe " + id); } else { @@ -206,5 +210,5 @@ public CompletableFuture run(CachedOutput pOutput) { return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); } - abstract void buildRecipes(BiConsumer recipeConsumer); + public abstract void buildRecipes(BiConsumer recipeConsumer); } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java index bd4363a03..35dc1ff0a 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java @@ -32,7 +32,7 @@ public LiquefactionRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { var salAmmoniac = FluidRegistry.SAL_AMMONIAC.get(); diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ReformationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ReformationRecipeProvider.java index 7e9a5c64f..9af45538a 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ReformationRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ReformationRecipeProvider.java @@ -7,8 +7,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurTier; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurTier; import com.klikli_dev.theurgy.content.recipe.ReformationRecipe; import com.klikli_dev.theurgy.datagen.SulfurMappings; import com.klikli_dev.theurgy.registry.ItemTagRegistry; @@ -173,7 +173,7 @@ private void otherMinerals() { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { //Set up materials that should not get the automatic conversion rates this.noAutomaticRecipesFor = Set.of( diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java index 23534574c..a7c9b1fb8 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java @@ -8,7 +8,7 @@ import com.google.gson.JsonObject; import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.klikli_dev.theurgy.registry.ItemTagRegistry; import net.minecraft.core.registries.BuiltInRegistries; @@ -19,6 +19,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; @@ -35,7 +36,7 @@ public ShapedRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { //Divination Rods this.makeRecipe("divination_rod_t1", new RecipeBuilder( ItemRegistry.DIVINATION_ROD_T1.get(), 1, this.makeDivinationRodSettings(ItemRegistry.DIVINATION_ROD_T1.get())) @@ -328,6 +329,50 @@ void buildRecipes(BiConsumer recipeConsumer) { .define('g', Tags.Items.INGOTS_GOLD) .define('S', Tags.Items.SANDSTONE) ); + + + this.makeRecipe(this.name(ItemRegistry.COPPER_WIRE.get()), new RecipeBuilder( + ItemRegistry.COPPER_WIRE.get(), 10) + .pattern("cmc") + .define('m', ItemRegistry.MERCURY_SHARD) + .define('c', Tags.Items.INGOTS_COPPER) + ); + + this.makeRecipe(this.name(ItemRegistry.MERCURIAL_WAND.get()), new RecipeBuilder( + ItemRegistry.MERCURIAL_WAND.get(), 1) + .pattern(" sm") + .pattern(" cs") + .pattern("s ") + .define('m', ItemRegistry.MERCURY_SHARD) + .define('s', Tags.Items.RODS_WOODEN) + .define('c', Tags.Items.INGOTS_COPPER) + ); + + this.makeRecipe(this.name(ItemRegistry.LOGISTICS_ITEM_INSERTER.get()), new RecipeBuilder( + ItemRegistry.LOGISTICS_ITEM_INSERTER.get(), 1) + .pattern("m") + .pattern("c") + .define('m', ItemRegistry.MERCURY_SHARD) + .define('c', Tags.Items.INGOTS_COPPER) + ); + + this.makeRecipe(this.name(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get()), new RecipeBuilder( + ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get(), 1) + .pattern("c") + .pattern("m") + .define('m', ItemRegistry.MERCURY_SHARD) + .define('c', Tags.Items.INGOTS_COPPER) + ); + + this.makeRecipe(this.name(ItemRegistry.LOGISTICS_CONNECTION_NODE.get()), new RecipeBuilder( + ItemRegistry.LOGISTICS_CONNECTION_NODE.get(), 3) + .pattern(" m ") + .pattern(" i ") + .pattern("bbb") + .define('m', ItemRegistry.MERCURY_SHARD) + .define('i', Tags.Items.INGOTS_IRON) + .define('b', Tags.Items.INGOTS_BRICK) + ); } public JsonObject makeDivinationRodSettings(DivinationRodItem rodItem) { @@ -412,6 +457,8 @@ public RecipeBuilder pattern(String pattern) { } public JsonObject build() { + if(!this.recipe.has("category")) + this.recipe.addProperty("category", CraftingBookCategory.MISC.getSerializedName()); return this.recipe; } } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java index 3d706d23c..230c12a29 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java @@ -14,6 +14,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.common.Tags; @@ -28,7 +29,7 @@ public ShapelessRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { var hermeticaNbt = new JsonObject(); hermeticaNbt.addProperty("modonomicon:book_id", "theurgy:the_hermetica"); @@ -42,6 +43,16 @@ void buildRecipes(BiConsumer recipeConsumer) { new RecipeBuilder(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get(), 1) .requires(ItemRegistry.SAL_AMMONIAC_BUCKET.get()) ); + + this.makeRecipe("logistics_item_extractor_from_inserter", + new RecipeBuilder(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get(), 1) + .requires(ItemRegistry.LOGISTICS_ITEM_INSERTER.get()) + ); + + this.makeRecipe("logistics_item_inserter_from_extractor", + new RecipeBuilder(ItemRegistry.LOGISTICS_ITEM_INSERTER.get(), 1) + .requires(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get()) + ); } public void makeRecipe(String name, RecipeBuilder recipe) { @@ -107,6 +118,9 @@ public RecipeBuilder requires(JsonObject ingredient) { } public JsonObject build() { + if(!this.recipe.has("category")) + this.recipe.addProperty("category", CraftingBookCategory.MISC.getSerializedName()); + return this.recipe; } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/SmeltingRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/SmeltingRecipeProvider.java index 37b3e9967..c9dfa3782 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/SmeltingRecipeProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/SmeltingRecipeProvider.java @@ -11,6 +11,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.Nullable; @@ -24,7 +25,7 @@ public SmeltingRecipeProvider(PackOutput packOutput) { } @Override - void buildRecipes(BiConsumer recipeConsumer) { + public void buildRecipes(BiConsumer recipeConsumer) { // this.makeRecipe("sal_ammoniac_crystal_from_sal_ammoniac_bucket", // new RecipeBuilder(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get(), 1) // .requires(ItemRegistry.SAL_AMMONIAC_BUCKET.get()) @@ -89,6 +90,9 @@ public RecipeBuilder requires(JsonObject ingredient) { } public JsonObject build() { + if(!this.recipe.has("category")) + this.recipe.addProperty("category", CraftingBookCategory.MISC.getSerializedName()); + return this.recipe; } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java index dff60be4e..8a77a2cad 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java @@ -5,8 +5,8 @@ package com.klikli_dev.theurgy.datagen.tag; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurType; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurType; import com.klikli_dev.theurgy.datagen.SulfurMappings; import com.klikli_dev.theurgy.registry.*; import net.minecraft.core.HolderLookup; diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java index 3c1a18cb0..2ae4e7438 100644 --- a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java @@ -5,8 +5,8 @@ package com.klikli_dev.theurgy.integration.jei; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; import com.klikli_dev.theurgy.integration.jei.recipes.*; import com.klikli_dev.theurgy.registry.BlockRegistry; import com.klikli_dev.theurgy.registry.ItemRegistry; diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/Logistics.java b/src/main/java/com/klikli_dev/theurgy/logistics/Logistics.java new file mode 100644 index 000000000..2fe0b3fd9 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/Logistics.java @@ -0,0 +1,499 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + +import com.google.common.graph.GraphBuilder; +import com.google.common.graph.MutableGraph; +import com.google.common.graph.Traverser; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.behaviour.logistics.*; +import com.klikli_dev.theurgy.util.TheurgyExtraCodecs; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.datafix.DataFixTypes; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.SavedData; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.event.level.LevelEvent; +import net.neoforged.neoforge.server.ServerLifecycleHooks; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; + +@SuppressWarnings("UnstableApiUsage") +public class Logistics extends SavedData { + public static final Supplier> GRAPH_SUPPLIER = () -> GraphBuilder.undirected().allowsSelfLoops(false).build(); + public static final String ID = "theurgy.logistics"; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + TheurgyExtraCodecs.graph(GlobalPos.CODEC, GRAPH_SUPPLIER).fieldOf("graph").forGetter(Logistics::graph) + ).apply(instance, Logistics::new)); + private static final String NBT_TAG = "theurgy:logistics"; + private static Logistics cachedLogistics; + + private final MutableGraph graph; + private final Set graphNodes = new ObjectOpenHashSet<>(); + private final Map blockPosToNetwork = new Object2ObjectOpenHashMap<>(); + private final Map>> cachedLeafNodes = new Object2ObjectOpenHashMap<>(); + /** + * If true, leaf node lookups will be cached. This is useful if you access a lot of nodes in a short period of time. + */ + private boolean useLeafNodeCache = false; + + /** + * If true, the network's leaf node caches will be rebuilt automatically after a network change. + * This should be true in most cases, but can be disabled if you want to handle it manually, e.g. for bulk operations. + */ + private boolean useAutomaticNetworkCacheRebuild = true; + + //TODO: can we somehow handle offline modifications? eg worldedit + // check if node exists on chunk load and kick out all GlobalPos that no longer represent a node block + // that does not handle if a DIFFERENT node was placed which may cause issues with our capability key system + // -> or we can just require admins that do that to do it live? :) + // the kicking of non-nodes might make sense though + + public Logistics() { + this(GRAPH_SUPPLIER.get()); + } + + public Logistics(MutableGraph graph) { + this.graph = graph; + this.rebuildGraph(); + } + + public static Logistics load(CompoundTag pCompoundTag) { + return CODEC.parse(NbtOps.INSTANCE, pCompoundTag.get(NBT_TAG)).result().orElseThrow(); + } + + private static MinecraftServer server() { + return ServerLifecycleHooks.getCurrentServer(); + } + + public static Logistics get() { + if (cachedLogistics == null) { + var server = server(); + + if (server != null) { + var logistics = server.overworld().getDataStorage().computeIfAbsent( + new SavedData.Factory<>(Logistics::new, Logistics::load, DataFixTypes.LEVEL), + Logistics.ID + ); + + cachedLogistics = logistics; + } else { + var logistics = new Logistics(); //handle client side access gracefully + Theurgy.LOGGER.warn("Logistics accessed client side, this should not happen!"); + cachedLogistics = logistics; + } + } + return cachedLogistics; + } + + /** + * If the overworld is unloaded we are leaving the world, so we have to reset the cached data. + * It will be reloaded at the first access after a new world is loaded. + */ + public static void onLevelUnload(LevelEvent.Unload event) { + if (event.getLevel() instanceof Level level && level.dimension() == Level.OVERWORLD) { + cachedLogistics = null; + } + } + + + public void enableLeafNodeCache() { + this.useLeafNodeCache = true; + } + + public void disableLeafNodeCache() { + this.useLeafNodeCache = false; + this.cachedLeafNodes.clear(); + } + + public void disableAutomaticNetworkCacheRebuild() { + this.useAutomaticNetworkCacheRebuild = false; + } + + public void enableAutomaticNetworkCacheRebuild() { + this.useAutomaticNetworkCacheRebuild = true; + } + + public LogisticsNetwork getNetwork(GlobalPos pos) { + return this.blockPosToNetwork.get(pos); + } + + /** + * Gets the leaf node at the given position if it is in the desired mode ( or null ). + * Call enableLeafNodeCache() before calling this to enable caching if you plan to access a lot of nodes in short periods of time. + */ + public LeafNodeBehaviour getLeafNode(GlobalPos pos, LeafNodeMode mode) { + return this.getLeafNode(pos, mode, (BlockCapability) null); + } + + + /** + * Gets the leaf node at the given position ( or null ). + * Call enableLeafNodeCache() before calling this to enable caching if you plan to access a lot of nodes in short periods of time. + */ + public LeafNodeBehaviour getLeafNode(GlobalPos pos) { + return this.getLeafNode(pos, (BlockCapability) null); + } + + /** + * Gets the leaf node at the given position if it is in the desired mode ( or null ). + * Call enableLeafNodeCache() before calling this to enable caching if you plan to access a lot of nodes in short periods of time. + */ + public LeafNodeBehaviour getLeafNode(GlobalPos pos, LeafNodeMode mode, BlockCapability capability) { + var node = this.getLeafNode(pos, capability); + if (node != null && node.mode() == mode) { + return node; + } + return null; + } + + + public LeafNodeBehaviour getLeafNode(GlobalPos pos, BlockCapability capability) { + //first check leaf node cache + LeafNodeBehaviour result = null; + if (this.useLeafNodeCache) { + var weakRef = this.cachedLeafNodes.get(pos); + if (weakRef != null) { + var temp = weakRef.get(); + if (temp != null && (capability == null || temp.capabilityType().equals(capability))) { + //noinspection unchecked -> we know it is the right type because we check! + result = (LeafNodeBehaviour) temp; + } + if (result == null) { //clean up cache if needed. + this.cachedLeafNodes.remove(pos); + } + } + } + + //if not in cache, query world and store. + if (result == null) { + var level = server().getLevel(pos.dimension()); + if (level == null) { + return null; + } + + var blockEntity = level.getBlockEntity(pos.pos()); + if (blockEntity instanceof HasLeafNodeBehaviour hasLeafNode && (capability == null || hasLeafNode.leafNode().capabilityType().equals(capability))) { + //noinspection unchecked -> we know it is the right type because we check! + result = (LeafNodeBehaviour) hasLeafNode.leafNode(); + } + + if (result != null && this.useLeafNodeCache) { + this.cachedLeafNodes.put(pos, new WeakReference<>(result)); + } + } + + return result; + } + + /** + * Returns true if the given position is a logistics node. + */ + public boolean isLogisticsNode(GlobalPos pos) { + var level = server().getLevel(pos.dimension()); + if (level == null) { + return false; + } + + var blockEntity = level.getBlockEntity(pos.pos()); + return blockEntity instanceof LogisticsNode; + } + + /** + * Adds a leaf node to the graph. + * Will call onLoadInsertNode or onLoadExtractNode methods on the network for you. + * Will also create a network if none exists yet, as leaf nodes need a network to be in. + * + * @param leafNode the leaf node + */ + public LogisticsNetwork add(LeafNodeBehaviour leafNode) { + var pos = leafNode.globalPos(); + this.add(pos); + var network = this.blockPosToNetwork.get(pos); + if (network != null) { + network.addLeafNode(leafNode); + } + return network; + } + + + /** + * Removes a leaf node from the graph. + * + * @param leafNode the leaf node + * @param permanently true if the block was destroyed, false if it was just unloaded. + */ + public void remove(LeafNodeBehaviour leafNode, boolean permanently) { + //if a leaf node is unloaded we remove it as a leaf node, but leave the "normal" node behind. + //this way it stays known to the network and can re-add itself when loaded + //otherwise we would have the problem that a leaf node would have to know which network it is in to register correctly + //further, a leaf node can theoretically also connect other nodes, so unload should not destroy the network! + //only if it was destroyed = permanently removed we remove the normal node too + + var network = this.blockPosToNetwork.get(leafNode.globalPos()); + if (network != null) { + network.removeLeafNode(leafNode); + } + + if (permanently) { + this.remove(leafNode.globalPos()); + } + } + + /** + * Adds a single node to the graph. + * Needs to be called both for internal nodes and leaf nodes. + * The latter will automatically call it from its respective add() method. + * Will re-create existing networks if the node was already present on a previous load. + */ + public LogisticsNetwork add(GlobalPos node) { + var isNew = this.graphNodes().add(node); + if (isNew) { + //if new we just add it, there will be no network + this.graph().addNode(node); + this.setDirty(); + return null; + } else { + //if not new it was previously added and may have been connected before, so we query the graph. + //this causes network re-creation after a world load. + var neighbors = this.graph().adjacentNodes(node); + for (GlobalPos neighbor : neighbors) { + this.add(node, neighbor); + } + } + return this.blockPosToNetwork.get(node); + } + + /** + * Remove the given node. Naturally also removes the connections to it. + * If this was the last connection between two or more parts of a network it will be split. + */ + public void remove(GlobalPos destroyedBlock) { + //This is a bit trickier than just removing an edge, because it can theoretically create multiple networks. + if(!this.graphNodes().contains(destroyedBlock)){ + return; + } + + //first query the neighbors, because after removal we can't + var neighbors = this.graph().adjacentNodes(destroyedBlock); + this.graph().removeNode(destroyedBlock); + this.graphNodes().remove(destroyedBlock); + this.setDirty(); + + var oldNetwork = this.blockPosToNetwork.get(destroyedBlock); + if (oldNetwork != null) { + oldNetwork.removeNode(destroyedBlock); + this.blockPosToNetwork.remove(destroyedBlock); + } + + //now we need to detect the splits, and avoid unecessary iterations. + List splitNetworks = new ArrayList<>(); + + for (GlobalPos neighbor : neighbors) { + boolean isNeighborInSplitNetwork = splitNetworks.stream() + .anyMatch(network -> network.nodes().contains(neighbor)); + + if (!isNeighborInSplitNetwork) { + var newNetwork = this.buildNetwork(neighbor, this.getConnected(neighbor), (node) -> { + }); + splitNetworks.add(newNetwork); + } + } + + // Logistics networks also need to re-notify all their nodes to update the cache. + // As long as all new networks reset and rebuild fully that is probably pretty easy. + // Rebuild caches on all! + if (this.useAutomaticNetworkCacheRebuild) { + splitNetworks.forEach(LogisticsNetwork::rebuildCaches); + } + } + + /** + * Adds an edge/connection to the network. + * This will add the nodes if they are not present yet. + * Will create a network if none exists yet and handles merging. + */ + public LogisticsNetwork add(GlobalPos a, GlobalPos b) { + this.graph().putEdge(a, b); + this.graphNodes().add(a); + this.graphNodes().add(b); + this.setDirty(); + + LogisticsNetwork network; + var netA = this.blockPosToNetwork.get(a); + var netB = this.blockPosToNetwork.get(b); + if (netA == null && netB == null) { + //create network + network = new LogisticsNetwork(); + } else if (netA == null) { + //add to network B + //this one and the next if elegantly avoid a merge if a single node is connected to a network + //a single node does not create a network. + network = netB; + } else if (netB == null) { + //add to network A + network = netA; + } else if (netA != netB) { + //merge networks + if (netA.nodes().size() == 1) //in case netB is also 1 that is fine. + network = this.mergeSingle(netB, netA); + else if (netB.nodes().size() == 1) + network = this.mergeSingle(netA, netB); + else + network = this.merge(netA, netB); + } else { + //already in the same network .. so we just choose A + network = netA; + } + + network.addNode(a); + network.addNode(b); + + this.blockPosToNetwork.put(a, network); + this.blockPosToNetwork.put(b, network); + + return network; + } + + /** + * Remove the connection between two nodes. + * If this was the last connection between two parts of a network it will be split into two. + * This does NOT remove the nodes. + */ + public void remove(GlobalPos a, GlobalPos b) { + this.graph().removeEdge(a, b); + this.setDirty(); + + var connectedA = new ObjectOpenHashSet(); + this.getConnected(a).forEach(connectedA::add); + if (connectedA.contains(b)) { + //no split + return; + } + + //split detected + + var networkA = this.buildNetwork(a, connectedA, (node) -> { + }); + var networkB = this.buildNetwork(b, this.getConnected(b), (node) -> { + }); //no need to build a set as we only iterate once + + //now rebuild the leaf node caches + if (this.useAutomaticNetworkCacheRebuild) { + networkA.rebuildCaches(); + networkB.rebuildCaches(); + } + } + + @Override + public CompoundTag save(CompoundTag pCompoundTag) { + pCompoundTag.put(NBT_TAG, CODEC.encodeStart(NbtOps.INSTANCE, this).result().orElseThrow()); + return pCompoundTag; + } + + private MutableGraph graph() { + return this.graph; + } + + private Set graphNodes() { + return this.graphNodes; + } + + private Iterable getConnected(GlobalPos start) { + var traverser = Traverser.forGraph(this.graph()); + if (this.graphNodes().contains(start)) + return traverser.breadthFirst(start); + + return List.of(); + } + + /** + * Rebuilds the entire graph, re-creating networks. + * It does not rebuild the leaf node caches. + */ + private void rebuildGraph() { + this.graphNodes.clear(); + this.blockPosToNetwork.clear(); + for (var node : this.graph().nodes()) { + //skip nodes we already handled + if (this.graphNodes.contains(node)) { + continue; + } + + //now get all nodes connected to this one and create a network for them + var connected = this.getConnected(node); + + this.buildNetwork(node, connected, this.graphNodes::add); + //last param: we add both the root node and the connected nodes to graphNodes to ensure we don't do unnecessary double-checks + } + } + + private LogisticsNetwork merge(LogisticsNetwork a, LogisticsNetwork b) { + //create new network that combines the old two + var result = new LogisticsNetwork(); + result.merge(a); + result.merge(b); + + //add new network to mapping + //this also replaces the old network as each node is overwritten + result.nodes().forEach(pos -> this.blockPosToNetwork.put(pos, result)); + + if (this.useAutomaticNetworkCacheRebuild) { + result.rebuildCaches(); //just rebuild cache on the new network as that will reset all nodes anyway + } + + return result; + } + + /** + * Merges a network with only one node into a larger network. + * This means it will never perform a cache rebuild. + * Instead, in the case of a leaf being the added one it being added to the network will fire the necessary event. + */ + private LogisticsNetwork mergeSingle(LogisticsNetwork network, LogisticsNetwork singleNodeNetwork) { + network.merge(singleNodeNetwork); + return network; + } + + /** + * Builds a logistics network from a root node and it's connected nodes. + * + * @param rootNode the root node. This has no special meaning, it is just the first one we query. + * @param connected the connected nodes, + * @param onNodeAdded a callback that is called for each node that is added to the network. + * This can be used to ensure nodes are not handled twice, e.g. in a full graph rebuild. + */ + private LogisticsNetwork buildNetwork(GlobalPos rootNode, Iterable connected, Consumer onNodeAdded) { + var network = new LogisticsNetwork(); + + //add the root node + network.addNode(rootNode); + this.blockPosToNetwork.put(rootNode, network); + onNodeAdded.accept(rootNode); + + //now add all other nodes + connected.forEach(c -> { + network.addNode(c); + this.blockPosToNetwork.put(c, network); + onNodeAdded.accept(c); + }); + + return network; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/LogisticsNetwork.java b/src/main/java/com/klikli_dev/theurgy/logistics/LogisticsNetwork.java new file mode 100644 index 000000000..85c6a0b9d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/LogisticsNetwork.java @@ -0,0 +1,295 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.SetMultimap; +import com.klikli_dev.theurgy.content.behaviour.logistics.ExtractorNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.InserterNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.LeafNodeBehaviour; +import com.klikli_dev.theurgy.content.behaviour.logistics.LeafNodeMode; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.core.GlobalPos; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; + +import java.util.Set; + +/** + * Represents one network within the full logistics graph + *

+ * A network is simply a collection of nodes that are connected directly or indirectly. + * The interesting feature of the network is the leaf nodes - only those are interacted with by the outside. + * The leaf nodes form sub-networks that are defined by the capability type they support, and by a frequency. + */ +public class LogisticsNetwork { + private final Set nodes = new ObjectOpenHashSet<>(); + private final Set leafNodes = new ObjectOpenHashSet<>(); + private final SetMultimap keyToLeafNodes = HashMultimap.create(); + + public Set nodes() { + return this.nodes; + } + + public Set getLeafNodes(Key key) { + return this.keyToLeafNodes.get(key); + } + + public Set getLeafNodes(BlockCapability capability, int frequency) { + return this.getLeafNodes(new Key(capability, frequency)); + } + + public void addNode(GlobalPos pos) { + this.nodes.add(pos); + } + + public void removeNode(GlobalPos pos) { + this.nodes.remove(pos); + } + + public void addLeafNode(LeafNodeBehaviour leafNode) { + var pos = leafNode.globalPos(); + this.leafNodes.add(pos); + this.keyToLeafNodes.put(new Key(leafNode.capabilityType(), leafNode.frequency()), pos); + + if (leafNode.mode() == LeafNodeMode.INSERT) { + this.onLoadInsertNode(leafNode.asInserter()); + } + if (leafNode.mode() == LeafNodeMode.EXTRACT) { + this.onLoadExtractNode(leafNode.asExtractor()); + } + } + + public void removeLeafNode(LeafNodeBehaviour leafNode) { + var pos = leafNode.globalPos(); + this.leafNodes.remove(pos); + this.keyToLeafNodes.remove(new Key(leafNode.capabilityType(), leafNode.frequency()), pos); + + if (leafNode.mode() == LeafNodeMode.INSERT) { + this.onUnloadInsertNode(leafNode.asInserter()); + } + if (leafNode.mode() == LeafNodeMode.EXTRACT) { + this.onUnloadExtractNode(leafNode.asExtractor()); + } + } + + public void onInserterNodeTargetAdded(GlobalPos targetPos, BlockCapabilityCache capability, InserterNodeBehaviour leafNode) { + var otherNodes = this.getLeafNodes(leafNode.capabilityType(), leafNode.frequency()); + for (var other : otherNodes) { + if (other.equals(leafNode.globalPos())) { //skip self + continue; + } + + var otherLeafNode = Logistics.get().getLeafNode(other, LeafNodeMode.EXTRACT, leafNode.capabilityType()); + if (otherLeafNode == null) { + continue; + } + + var extractNode = otherLeafNode.asExtractor(); + extractNode.onTargetAddedToGraph(targetPos, capability, leafNode); + } + } + + public void onInserterNodeTargetRemoved(GlobalPos targetPos, InserterNodeBehaviour leafNode) { + var otherNodes = this.getLeafNodes(leafNode.capabilityType(), leafNode.frequency()); + for (var other : otherNodes) { + if (other.equals(leafNode.globalPos())) { //skip self + continue; + } + + var otherLeafNode = Logistics.get().getLeafNode(other, LeafNodeMode.EXTRACT, leafNode.capabilityType()); + if (otherLeafNode == null) { + continue; + } + + var extractNode = otherLeafNode.asExtractor(); + extractNode.onTargetRemovedFromGraph(targetPos, leafNode); + } + } + + + public void onFrequencyChange(LeafNodeBehaviour leafNode, BlockCapability capability, int oldFrequency, int newFrequency) { + var pos = leafNode.globalPos(); + var oldKey = new Key(capability, oldFrequency); + var newKey = new Key(capability, newFrequency); + + this.keyToLeafNodes.remove(oldKey, pos); + this.keyToLeafNodes.put(newKey, pos); + + //Note: When we update the network, it only updates currently loaded leaf nodes. + // That is ok -> the unloaded ones re-query their status when they are loaded. + + if (leafNode.mode() == LeafNodeMode.INSERT) { + this.onInsertNodeFrequencyChange(leafNode.asInserter(), oldKey, newKey); + } + if (leafNode.mode() == LeafNodeMode.EXTRACT) { + this.onExtractNodeFrequencyChange(leafNode.asExtractor(), oldKey, newKey); + } + } + + protected void onExtractNodeFrequencyChange(ExtractorNodeBehaviour leafNode, Key oldKey, Key newKey) { + this.onUnloadExtractNode(leafNode, oldKey); + this.onLoadExtractNode(leafNode, newKey); + } + + protected void onInsertNodeFrequencyChange(InserterNodeBehaviour leafNode, Key oldKey, Key newKey) { + this.onUnloadInsertNode(leafNode, oldKey); + this.onLoadInsertNode(leafNode, newKey); + } + + /** + * Shorthand for loads called from the node itself. + * Does not need to provide the key separately, because it is unchanged. + * The main overload is also used for frequency changes so we need to be able to manually specify a key. + */ + public void onLoadExtractNode(ExtractorNodeBehaviour leafNode) { + this.onLoadExtractNode(leafNode, new Key(leafNode.capabilityType(), leafNode.frequency())); + } + + /** + * Called when an extract node is loaded on / added to the graph + * It rebuilds the cache of insert targets for the node. + */ + public void onLoadExtractNode(ExtractorNodeBehaviour leafNode, Key newKey) { + var otherNodes = this.getLeafNodes(newKey); + + for (var other : otherNodes) { + if (other.equals(leafNode.globalPos())) { //skip self + continue; + } + + var otherLeafNode = Logistics.get().getLeafNode(other, LeafNodeMode.INSERT, leafNode.capabilityType()); + if (otherLeafNode == null) { + continue; + } + + leafNode.onLeafNodeAddedToGraph(other, otherLeafNode); + } + } + + /** + * Shorthand for unloads called from the node itself. + * Does not need to provide the key separately, because it is unchanged. + * The main overload is also used for frequency changes so we need to be able to manually specify a key. + */ + public void onUnloadExtractNode(ExtractorNodeBehaviour leafNode) { + this.onUnloadExtractNode(leafNode, new Key(leafNode.capabilityType(), leafNode.frequency())); + } + + /** + * Resets the node's cache of insert targets. + */ + public void onUnloadExtractNode(ExtractorNodeBehaviour leafNode, Key oldKey) { + //here we just reset the cache -> that way we avoid iterating the old ones + leafNode.resetInsertTargets(); + } + + /** + * Shorthand for loads called from the node itself. + * Does not need to provide the key separately, because it is unchanged. + * The main overload is also used for frequency changes so we need to be able to manually specify a key. + */ + public void onLoadInsertNode(InserterNodeBehaviour leafNode) { + this.onLoadInsertNode(leafNode, new Key(leafNode.capabilityType(), leafNode.frequency())); + } + + /** + * Informs live nodes to add us to their cache + */ + public void onLoadInsertNode(InserterNodeBehaviour leafNode, Key newKey) { + //we need to inform all our new nodes that they have to add us + var newSet = this.keyToLeafNodes.get(newKey); + for (var other : newSet) { + if (other.equals(leafNode.globalPos())) { + continue; + } + + var otherLeafNode = Logistics.get().getLeafNode(other, LeafNodeMode.EXTRACT, leafNode.capabilityType()); + if (otherLeafNode == null) { + continue; + } + + var extractNode = otherLeafNode.asExtractor(); + extractNode.onLeafNodeAddedToGraph(leafNode.globalPos(), leafNode); + } + } + + /** + * Shorthand for unloads called from the node itself. + * Does not need to provide the key separately, because it is unchanged. + * The main overload is also used for frequency changes so we need to be able to manually specify a key. + */ + public void onUnloadInsertNode(InserterNodeBehaviour leafNode) { + this.onUnloadInsertNode(leafNode, new Key(leafNode.capabilityType(), leafNode.frequency())); + } + + /** + * Informs live nodes to remove us from their cache. + */ + public void onUnloadInsertNode(InserterNodeBehaviour leafNode, Key oldKey) { + //we need to inform all our nodes that they have to remove us + var oldSet = this.keyToLeafNodes.get(oldKey); + for (var other : oldSet) { + if (other.equals(leafNode.globalPos())) { + continue; + } + + var otherLeafNode = Logistics.get().getLeafNode(other, LeafNodeMode.EXTRACT, leafNode.capabilityType()); + if (otherLeafNode == null) { + continue; + } + + var extractNode = otherLeafNode.asExtractor(); + extractNode.onLeafNodeRemovedFromGraph(leafNode.globalPos(), leafNode); + } + } + + /** + * Merges the other network into this one. + */ + public void merge(LogisticsNetwork other) { + this.nodes.addAll(other.nodes); + this.leafNodes.addAll(other.leafNodes); + this.keyToLeafNodes.putAll(other.keyToLeafNodes); + } + + /** + * Forces all nodes to rebuild their caches. + */ + public void rebuildCaches() { + Logistics.get().enableLeafNodeCache(); + //first unload all to unlink them + for (var leafNode : this.leafNodes) { + var node = Logistics.get().getLeafNode(leafNode); + if (node != null) { + if (node.mode() == LeafNodeMode.EXTRACT) { + this.onUnloadExtractNode(node.asExtractor()); + } + if (node.mode() == LeafNodeMode.INSERT) { + //no need to call unload here as it just notifies the extractors, which we reset anyay + //this.onUnloadInsertNode(node.asInserter()); + } + } + } + //then load all to link them + for (var leafNode : this.leafNodes) { + var node = Logistics.get().getLeafNode(leafNode); + if (node != null) { + if (node.mode() == LeafNodeMode.EXTRACT) { + //now there is no need to call load here, as the load insert will notify the extractors + //this.onLoadExtractNode(node.asExtractor()); + } + if (node.mode() == LeafNodeMode.INSERT) { + this.onLoadInsertNode(node.asInserter()); + } + } + } + Logistics.get().disableLeafNodeCache(); + } + + public record Key(BlockCapability capability, int frequency) { + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/Wire.java b/src/main/java/com/klikli_dev/theurgy/logistics/Wire.java new file mode 100644 index 000000000..4e0c2fe03 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/Wire.java @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; + +public record Wire(BlockPos from, BlockPos to) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("from").forGetter(Wire::from), + BlockPos.CODEC.fieldOf("to").forGetter(Wire::to) + ).apply(instance, Wire::new)); + + + public static Wire load(CompoundTag tag) { + return new Wire(BlockPos.of(tag.getLong("from")), BlockPos.of(tag.getLong("to"))); + } + + public CompoundTag save(CompoundTag tag) { + tag.putLong("from", this.from.asLong()); + tag.putLong("to", this.to.asLong()); + return tag; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/WireEndPoint.java b/src/main/java/com/klikli_dev/theurgy/logistics/WireEndPoint.java new file mode 100644 index 000000000..50d88ba9c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/WireEndPoint.java @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public record WireEndPoint(BlockPos pos, ResourceKey level) { + + public static WireEndPoint load(CompoundTag tag) { + return new WireEndPoint(BlockPos.of(tag.getLong("pos")), ResourceKey.create(Registries.DIMENSION, new ResourceLocation(tag.getString("level")))); + } + + public static WireEndPoint load(ItemStack stack) { + if (!stack.hasTag() || !stack.getOrCreateTag().contains("wirePoint")) + return null; + return load(stack.getOrCreateTag().getCompound("wirePoint")); + } + + public static void removeFrom(ItemStack stack) { + if (!stack.hasTag() || !stack.getOrCreateTag().contains("wirePoint")) + return; + stack.getOrCreateTag().remove("wirePoint"); + } + + public void save(ItemStack stack) { + CompoundTag tag = stack.getOrCreateTag(); + tag.put("wirePoint", this.save(new CompoundTag())); + } + + public CompoundTag save(CompoundTag tag) { + tag.putLong("pos", this.pos.asLong()); + tag.putString("level", this.level.location().toString()); + return tag; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/WireRenderer.java b/src/main/java/com/klikli_dev/theurgy/logistics/WireRenderer.java new file mode 100644 index 000000000..466f40c62 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/WireRenderer.java @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2020 Commoble +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +//See upstream https://github.com/Commoble/morered/blob/HEAD/src/main/java/commoble/morered/client/WirePostRenderer.java + +package com.klikli_dev.theurgy.logistics; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import org.joml.Matrix4f; + +import java.util.Collections; +import java.util.Set; + +public class WireRenderer { + + private static final WireRenderer instance = new WireRenderer(); + + public Set wires = Collections.synchronizedSet(new ObjectOpenHashSet<>()); + + public static WireRenderer get() { + return instance; + } + + public void onRenderLevelStage(RenderLevelStageEvent event) { + var bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); + var poseStack = event.getPoseStack(); + + EntityRenderDispatcher erd = Minecraft.getInstance().getEntityRenderDispatcher(); + double renderPosX = erd.camera.getPosition().x(); + double renderPosY = erd.camera.getPosition().y(); + double renderPosZ = erd.camera.getPosition().z(); + + poseStack.pushPose(); + poseStack.translate(-renderPosX, -renderPosY, -renderPosZ); + + //we use lines() to avoid all the wires getting connected as it would happen with linestrip + var buffer = bufferSource.getBuffer(RenderType.lines()); + for (var wire : this.wires) { + poseStack.pushPose(); + poseStack.translate(wire.from().getX(), wire.from().getY(), wire.from().getZ()); + this.renderWire(buffer, poseStack, wire.from().getCenter(), wire.to().getCenter()); + poseStack.popPose(); + } + poseStack.popPose(); + + //TODO: render cache? + // look up wire in cache + // render wires to cache, if not in cache. + // clear cache if related wire is no longer rendered (probably should be done from Wires class) + } + + private void renderWire(VertexConsumer vertexBuilder, PoseStack poseStack, Vec3 startPos, Vec3 endPos) { + poseStack.pushPose(); + { + + boolean translateSwap = false; + if (startPos.y() > endPos.y()) { + Vec3 swap = startPos; + startPos = endPos; + endPos = swap; + translateSwap = true; + } + + poseStack.translate(0.5D, 0.5D, 0.5D); + + double startX = startPos.x(); + double startY = startPos.y(); + double startZ = startPos.z(); + + double endX = endPos.x(); + double endY = endPos.y(); + double endZ = endPos.z(); + float dx = (float) (endX - startX); + float dy = (float) (endY - startY); + float dz = (float) (endZ - startZ); + if (translateSwap) { + poseStack.translate(-dx, -dy, -dz); + } + Matrix4f fourMatrix = poseStack.last().pose(); + + Vec3[] points = WireSlackHelper.getInterpolatedDifferences(endPos.subtract(startPos)); + + poseStack.pushPose(); + for (int line = 0; line < points.length - 1; line++) { + Vec3 firstPoint = points[line]; + Vec3 secondPoint = points[line + 1]; + + Vec3 normal = secondPoint.subtract(firstPoint).normalize(); + Vec3 reverseNormal = firstPoint.subtract(secondPoint).normalize(); + + vertexBuilder.vertex(fourMatrix, (float) firstPoint.x(), (float) firstPoint.y(), (float) firstPoint.z()) + .color(0, 0, 0, 255) + .normal(poseStack.last().normal(), (float) normal.x(), (float) normal.y(), (float) normal.z()) + .endVertex(); + + vertexBuilder.vertex(fourMatrix, (float) secondPoint.x(), (float) secondPoint.y(), (float) secondPoint.z()) + .color(0, 0, 0, 255) + .normal(poseStack.last().normal(), (float) reverseNormal.x(), (float) reverseNormal.y(), (float) reverseNormal.z()) + .endVertex(); + } + poseStack.popPose(); + + } + poseStack.popPose(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/WireSlackHelper.java b/src/main/java/com/klikli_dev/theurgy/logistics/WireSlackHelper.java new file mode 100644 index 000000000..b4e2035c9 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/WireSlackHelper.java @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2020 Commoble +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +//See upstream https://github.com/Commoble/morered/blob/HEAD/src/main/java/commoble/morered/wire_post/SlackInterpolator.java + +package com.klikli_dev.theurgy.logistics; + +import net.minecraft.world.phys.Vec3; + +public class WireSlackHelper { + public static Vec3[] getInterpolatedDifferences(Vec3 vector) { + int points = 17; // 16 segments + Vec3[] list = new Vec3[points]; + + double dx = vector.x(); + double dy = vector.y(); + double dz = vector.z(); + + double sag = 0.3; + + for (int point = 0; point < points; point++) { + double startLerp = getFractionalLerp(point, points - 1); + double startYLerp = getYLerp(startLerp, dy); +// list[point] = new Vec3(startLerp * dx, startYLerp * dy, startLerp * dz); //Original, this leads to a straight line if start and end are the same height + double sagFactor = sag * (1 - (4 * Math.pow(startLerp - 0.5, 2))); + + // Subtract the sag factor from the y-coordinate calculation + double y = dy != 0 ? (startYLerp - sagFactor) * dy : -sagFactor; + + list[point] = new Vec3(startLerp * dx, y, startLerp * dz); + + } + + return list; + } + + public static Vec3[] getInterpolatedPoints(Vec3 a, Vec3 b) { + Vec3 diff = b.subtract(a); + Vec3[] diffs = getInterpolatedDifferences(diff); + Vec3[] points = new Vec3[diffs.length]; + for (int i = 0; i < points.length; i++) { + points[i] = a.add(diffs[i]); + } + return points; + } + + public static double getFractionalLerp(int current, int max) { + return (double) current / (double) max; + } + + public static double getYLerp(double lerp, double dY) { + return Math.pow(lerp, Math.log(Math.abs(dY) + 3)); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/WireSync.java b/src/main/java/com/klikli_dev/theurgy/logistics/WireSync.java new file mode 100644 index 000000000..56b973845 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/WireSync.java @@ -0,0 +1,132 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.SetMultimap; +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageAddWires; +import com.klikli_dev.theurgy.network.messages.MessageRemoveWires; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.ChunkPos; +import net.neoforged.neoforge.event.level.ChunkWatchEvent; + +import java.util.Set; +import java.util.UUID; + +public class WireSync { + private static final WireSync instance = new WireSync(); + + /** + * one player can watch multiple chunks, and one chunk can be watched by multiple players, so we need a multimap + * we do not need to keep track of the level, because if a player changes level he will unwatch all chunkPos in that level + */ + private final SetMultimap playerToWatchedChunk = HashMultimap.create(); + /** + * Reverse map to allow lookup of all players watching a chunk + */ + private final SetMultimap watchedChunkToPlayers = HashMultimap.create(); + + public static WireSync get() { + return instance; + } + + + /** + * Needs to be called BEFORE the wire has been removed from the serverside wire multimaps + */ + public void sendRemoveWireToWatchingPlayers(ServerLevel level, Wire wire) { + var players = this.getWatchingPlayers(level, wire); + var message = new MessageRemoveWires(Set.of(wire)); + + for (var playerUUID : players) { + var player = level.getServer().getPlayerList().getPlayer(playerUUID); //this uses a map and is faster than level.getPlayerByUUID + Networking.sendTo(player, message); + } + } + + /** + * Needs to be called AFTER the wire has been added to the serverside wire multimaps + */ + public void sendAddWireToWatchingPlayers(ServerLevel level, Wire wire) { + var players = this.getWatchingPlayers(level, wire); + var message = new MessageAddWires(Set.of(wire)); + + for (var playerUUID : players) { + var player = level.getServer().getPlayerList().getPlayer(playerUUID); //this uses a map and is faster than level.getPlayerByUUID + Networking.sendTo(player, message); + } + } + + + private Set getWatchingPlayers(ServerLevel level, Wire wire) { + Set players = new ObjectOpenHashSet<>(); + var chunks = Wires.get(level).getChunks(wire); //get all chunks the wire intersects with + for (var chunk : chunks) { + var playersInChunk = this.watchedChunkToPlayers.get(chunk); //then get the players watching each chunk + players.addAll(playersInChunk); + } + return players; + } + + private void sendAddWiresInChunk(ServerPlayer player, ChunkPos chunkPos) { + var wires = Wires.get(player.level()); + Networking.sendTo(player, new MessageAddWires(wires.getWires(chunkPos))); + } + + private void sendRemoveWiresInChunk(ServerPlayer player, ChunkPos chunkPos) { + //tricky, we now have to make sure not to remove any wires that are still in other watched chunks + //luckily we have the reverse map, so we can check if a wire is still in there + var manager = Wires.get(player.level()); + var wires = manager.getWires(chunkPos); + var wiresToRemove = new ObjectOpenHashSet(); + for (var wire : wires) { + var otherChunksForWire = manager.getChunks(wire); + + //if the wire is only in one chunk we can safely remove it from the client + if (otherChunksForWire.size() == 1) { + wiresToRemove.add(wire); + continue; + } + + //if not we need to check if it in any of the other watched chunks of the player + //if it is, we cannot remove it + boolean isStillWatched = false; + for (var otherChunk : otherChunksForWire) { + //the current chunk has already been removed from playerToWatchedChunk before this method was called + //so this will not lead to a "false positive" and we can safely just query the map. + if (this.playerToWatchedChunk.containsEntry(player.getUUID(), otherChunk)) { + isStillWatched = true; + break; + } + } + + if (!isStillWatched) { + wiresToRemove.add(wire); + } + } + + Networking.sendTo(player, new MessageRemoveWires(wiresToRemove)); + } + + public void onChunkWatch(ChunkWatchEvent.Watch event) { + //TODO: probably safe to do this async + + this.playerToWatchedChunk.put(event.getPlayer().getUUID(), event.getPos()); + this.watchedChunkToPlayers.put(event.getPos(), event.getPlayer().getUUID()); + this.sendAddWiresInChunk(event.getPlayer(), event.getPos()); + + } + + public void onChunkUnWatch(ChunkWatchEvent.UnWatch event) { + //TODO: probably safe to do this async + + this.playerToWatchedChunk.remove(event.getPlayer().getUUID(), event.getPos()); + this.watchedChunkToPlayers.remove(event.getPos(), event.getPlayer().getUUID()); + this.sendRemoveWiresInChunk(event.getPlayer(), event.getPos()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/logistics/Wires.java b/src/main/java/com/klikli_dev/theurgy/logistics/Wires.java new file mode 100644 index 000000000..a5f0ccd87 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/logistics/Wires.java @@ -0,0 +1,229 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.logistics; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.SetMultimap; +import com.klikli_dev.modonomicon.util.Codecs; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.datafix.DataFixTypes; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.SavedData; +import net.neoforged.neoforge.event.level.LevelEvent; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Stream; + +public class Wires extends SavedData { + + public static final String ID = "theurgy.wires"; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codecs.set(Wire.CODEC).fieldOf("wireConnections").forGetter(wires -> wires.wires), + Codec.BOOL.fieldOf("isClient").forGetter(wires -> wires.isClient) + ).apply(instance, Wires::new)); + private static final String NBT_TAG = "theurgy:wires"; + + private static WeakReference cachedServerLevel = new WeakReference<>(null); + private static WeakReference cachedServerWires = new WeakReference<>(null); + + private static WeakReference cachedClientLevel = new WeakReference<>(null); + private static WeakReference cachedClientWires = new WeakReference<>(null); + + /** + * Store all wire connections. + * Server only - if we modify this on the logical client we get into trouble because this is a singleton - we'd remove them permanently + */ + private final Set wires = new ObjectOpenHashSet<>(); + + /** + * Store all wires per chunk to access for e.g. players watching a chunk. + */ + private final SetMultimap chunkToWires = Multimaps.synchronizedSetMultimap(HashMultimap.create()); + /** + * Also store reverse map, mainly to make removal from chunkToWires easier. + */ + private final SetMultimap wiresToChunk = Multimaps.synchronizedSetMultimap(HashMultimap.create()); + + /** + * Maps the wire start and end point to the wire. + */ + private final SetMultimap blockPosToWire = Multimaps.synchronizedSetMultimap(HashMultimap.create()); + + private final boolean isClient; + + public Wires(boolean isClient) { + this.isClient = isClient; + } + + public Wires(Set wires, boolean isClient) { + this(isClient); + + if(!isClient){ + this.wires.addAll(wires); + + //restore chunkToWires and wiresToChunk and blockPosToWire + this.wires.forEach(wire -> { + this.calculateChunkPosForWire(wire).forEach(chunkPos -> { + this.chunkToWires.put(chunkPos, wire); + this.wiresToChunk.put(wire, chunkPos); + }); + + this.blockPosToWire.put(wire.from(), wire); + this.blockPosToWire.put(wire.to(), wire); + }); + } + + } + + /** + * Gets all wires connected to the given block pos + */ + public Set getWires(BlockPos pos){ + return this.blockPosToWire.get(pos); + } + + /** + * Gets all wires in a chunk + */ + public Set getWires(ChunkPos chunk){ + return this.chunkToWires.get(chunk); + } + + /** + * Gets all chunks a wire is in + */ + public Set getChunks(Wire wire){ + return this.wiresToChunk.get(wire); + } + + public static Wires get(Level level) { + if (level instanceof ServerLevel serverLevel) { + if (cachedServerLevel.get() == level) { + if (cachedServerWires.get() != null) + return cachedServerWires.get(); + } + + var wires = serverLevel.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(() -> new Wires(false), Wires::load, DataFixTypes.LEVEL), + Wires.ID + ); + + cachedServerLevel = new WeakReference<>(serverLevel); + cachedServerWires = new WeakReference<>(wires); + + return wires; + } else { + if (cachedClientLevel.get() == level) { + if (cachedClientWires.get() != null) + return cachedClientWires.get(); + } + + //on client data is not stored in the world, so we make an empty + //it will be filled via the chunk watch events that cause a sync from server + var wires = new Wires(true); + + cachedClientLevel = new WeakReference<>(level); + cachedClientWires = new WeakReference<>(wires); + + return wires; + } + } + + /** + * We have to reset save data on unload to handle world changes + * (mainly on the client, server usually just shuts down and restarts, if it ever changes the main level) + * -> unloaded overworld means we completely left the game towards the main menu. + */ + public static void onLevelUnload(LevelEvent.Unload event) { + if (event.getLevel() == cachedServerLevel.get()) { + cachedServerLevel = new WeakReference<>(null); + cachedServerWires = new WeakReference<>(null); + } else if (event.getLevel() == cachedClientLevel.get()) { + cachedClientLevel = new WeakReference<>(null); + cachedClientWires = new WeakReference<>(null); + WireRenderer.get().wires.clear(); + } + } + + public static Wires load(CompoundTag pCompoundTag) { + return CODEC.parse(NbtOps.INSTANCE, pCompoundTag.get(NBT_TAG)).result().orElseThrow(); + } + + Stream calculateChunkPosForWire(Wire wire) { + return Arrays.stream(WireSlackHelper.getInterpolatedPoints(wire.from().getCenter(), wire.to().getCenter())).map(pos -> new ChunkPos( + SectionPos.blockToSectionCoord(pos.x()), + SectionPos.blockToSectionCoord(pos.z()) + )); + } + + public void addWire(Wire wire) { + if (this.isClient) { + //we just add it to the renderer's set. + WireRenderer.get().wires.add(wire); + } else { + //add to our complete view of wires + this.wires.add(wire); + + //then add to our per-chunk view + this.calculateChunkPosForWire(wire).forEach(chunkPos -> { + this.chunkToWires.put(chunkPos, wire); + this.wiresToChunk.put(wire, chunkPos); + }); + + this.blockPosToWire.put(wire.from(), wire); + this.blockPosToWire.put(wire.to(), wire); + + //needs to be called last because it relies on the new state + WireSync.get().sendAddWireToWatchingPlayers(cachedServerLevel.get(), wire); + } + this.setDirty(); + } + + public int removeWiresFor(BlockPos pos){ + var wires = this.getWires(pos); + var copy = new ArrayList<>(wires); //removeWires modifies the underlying set so we can't iterate on it + copy.forEach(this::removeWire); + return copy.size(); + } + + public void removeWire(Wire wire) { + if (this.isClient) { + //we just add it to the renderer's set. + WireRenderer.get().wires.remove(wire); + } else { + //needs to be called first because it relies on the old state + WireSync.get().sendRemoveWireToWatchingPlayers(cachedServerLevel.get(), wire); + + this.wires.remove(wire); + this.blockPosToWire.remove(wire.from(), wire); + this.blockPosToWire.remove(wire.to(), wire); + + Set chunks = this.wiresToChunk.get(wire); + for (ChunkPos chunkPos : chunks) { + this.chunkToWires.remove(chunkPos, wire); + } + this.wiresToChunk.removeAll(wire); + } + this.setDirty(); + } + + @Override + public CompoundTag save(CompoundTag pCompoundTag) { + pCompoundTag.put(NBT_TAG, CODEC.encodeStart(NbtOps.INSTANCE, this).result().orElseThrow()); + return pCompoundTag; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/network/Networking.java b/src/main/java/com/klikli_dev/theurgy/network/Networking.java index e4e40e00b..b48dcc07a 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/Networking.java +++ b/src/main/java/com/klikli_dev/theurgy/network/Networking.java @@ -20,14 +20,21 @@ public class Networking { public static void register(final RegisterPayloadHandlerEvent event) { final IPayloadRegistrar registrar = event.registrar(Theurgy.MODID); + //to server registrar.play(MessageSetDivinationResult.ID, MessageSetDivinationResult::new, MessageHandler::handle); + registrar.play(MessageSetMode.ID, MessageSetMode::new, MessageHandler::handle); + registrar.play(MessageItemModeSelectDirection.ID, MessageItemModeSelectDirection::new, MessageHandler::handle); registrar.play(MessageCaloricFluxEmitterSelection.ID, MessageCaloricFluxEmitterSelection::new, MessageHandler::handle); registrar.play(MessageSulfuricFluxEmitterSelection.ID, MessageSulfuricFluxEmitterSelection::new, MessageHandler::handle); + //to client registrar.play(MessageRequestCaloricFluxEmitterSelection.ID, MessageRequestCaloricFluxEmitterSelection::new, MessageHandler::handle); registrar.play(MessageRequestSulfuricFluxEmitterSelection.ID, MessageRequestSulfuricFluxEmitterSelection::new, MessageHandler::handle); registrar.play(MessageShowCaloricFlux.ID, MessageShowCaloricFlux::new, MessageHandler::handle); registrar.play(MessageShowSulfuricFluxEmitterStatus.ID, MessageShowSulfuricFluxEmitterStatus::new, MessageHandler::handle); + registrar.play(MessageShowLogisticsNodeStatus.ID, MessageShowLogisticsNodeStatus::new, MessageHandler::handle); + registrar.play(MessageAddWires.ID, MessageAddWires::new, MessageHandler::handle); + registrar.play(MessageRemoveWires.ID, MessageRemoveWires::new, MessageHandler::handle); } diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageAddWires.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageAddWires.java new file mode 100644 index 000000000..fc44fc34c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageAddWires.java @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.network.messages; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.logistics.Wire; +import com.klikli_dev.theurgy.logistics.Wires; +import com.klikli_dev.theurgy.network.Message; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.Set; + +public class MessageAddWires implements Message { + + public static final ResourceLocation ID = Theurgy.loc("add_wires"); + + public Set wires; + + public MessageAddWires(Set wires) { + this.wires = wires; + } + + public MessageAddWires(FriendlyByteBuf buf) { + this.decode(buf); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeCollection(this.wires, (buf1, wire) -> buf1.writeNbt(wire.save(new CompoundTag()))); + } + + @Override + public void decode(FriendlyByteBuf buf) { + this.wires = buf.readCollection(ObjectOpenHashSet::new, (buf1) -> Wire.load(buf1.readNbt())); + } + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + this.wires.forEach(Wires.get(player.level())::addWire); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageItemModeSelectDirection.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageItemModeSelectDirection.java new file mode 100644 index 000000000..a4e020042 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageItemModeSelectDirection.java @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2023 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.network.messages; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.mercurialwand.mode.MercurialWandItemMode; +import com.klikli_dev.theurgy.content.item.mercurialwand.mode.SelectDirectionMode; +import com.klikli_dev.theurgy.content.item.mode.ModeItem; +import com.klikli_dev.theurgy.network.Message; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; + + +public class MessageItemModeSelectDirection implements Message { + + public static final ResourceLocation ID = Theurgy.loc("select_direction"); + + public Direction direction; + + public MessageItemModeSelectDirection(FriendlyByteBuf buf) { + this.decode(buf); + } + + public MessageItemModeSelectDirection(Direction direction) { + this.direction = direction; + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeByte(this.direction.ordinal()); + } + + @Override + public void decode(FriendlyByteBuf buf) { + this.direction = Direction.values()[buf.readByte()]; + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); + if (stack.getItem() instanceof ModeItem modeItem) { + //theoretically the current mode should be the select direction mode, + // but if we run into some sort of race condition it is better to just get it directly + var mode = (SelectDirectionMode) MercurialWandItemMode.Type.SELECT_DIRECTION.mode(); + mode.setDirection(stack, this.direction); + } + } + + @Override + public ResourceLocation id() { + return ID; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageRemoveWires.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageRemoveWires.java new file mode 100644 index 000000000..436fd1936 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageRemoveWires.java @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.network.messages; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.logistics.Wire; +import com.klikli_dev.theurgy.logistics.Wires; +import com.klikli_dev.theurgy.network.Message; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.Set; + +public class MessageRemoveWires implements Message { + + public static final ResourceLocation ID = Theurgy.loc("remove_wires"); + + public Set wires; + + public MessageRemoveWires(Set wires) { + this.wires = wires; + } + + public MessageRemoveWires(FriendlyByteBuf buf) { + this.decode(buf); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeCollection(this.wires, (buf1, wire) -> buf1.writeNbt(wire.save(new CompoundTag()))); + } + + @Override + public void decode(FriendlyByteBuf buf) { + this.wires = buf.readCollection(ObjectOpenHashSet::new, (buf1) -> Wire.load(buf1.readNbt())); + } + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + this.wires.forEach(Wires.get(player.level())::removeWire); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java index 4eafb08cc..2082381c2 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java @@ -6,7 +6,7 @@ import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; import com.klikli_dev.theurgy.network.Message; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetMode.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetMode.java new file mode 100644 index 000000000..bbcb5cc06 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetMode.java @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2023 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.network.messages; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.mode.ModeItem; +import com.klikli_dev.theurgy.network.Message; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; + + +public class MessageSetMode implements Message { + + public static final ResourceLocation ID = Theurgy.loc("set_mode"); + + public byte shift; + + public MessageSetMode(FriendlyByteBuf buf) { + this.decode(buf); + } + + public MessageSetMode(int shift) { + this.shift = (byte) shift; + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeByte(this.shift); + } + + @Override + public void decode(FriendlyByteBuf buf) { + this.shift = buf.readByte(); + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); + if (stack.getItem() instanceof ModeItem modeItem) { + modeItem.changeMode(player, stack, this.shift); + } + } + + @Override + public ResourceLocation id() { + return ID; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageShowLogisticsNodeStatus.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageShowLogisticsNodeStatus.java new file mode 100644 index 000000000..154b091c1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageShowLogisticsNodeStatus.java @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.network.messages; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.render.outliner.Outliner; +import com.klikli_dev.theurgy.network.Message; +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.shapes.Shapes; + +import java.util.List; + +public class MessageShowLogisticsNodeStatus implements Message { + + public static final ResourceLocation ID = Theurgy.loc("show_logistics_node_status"); + + private List> blockPos; + + public MessageShowLogisticsNodeStatus(List> blockPos) { + this.blockPos = blockPos; + } + + public MessageShowLogisticsNodeStatus(FriendlyByteBuf buf) { + this.decode(buf); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeCollection(this.blockPos, (buffer, pair) -> { + buffer.writeBlockPos(pair.getFirst()); + buffer.writeInt(pair.getSecond()); + }); + } + + @Override + public void decode(FriendlyByteBuf buf) { + this.blockPos = buf.readList((buffer) -> { + BlockPos pos = buffer.readBlockPos(); + int status = buffer.readInt(); + return Pair.of(pos, status); + }); + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + Level level = player.level(); + + for (var target : this.blockPos) { + Outliner.get().showAABB(target, Shapes.block().bounds().move(target.getFirst()), (int)(20 * 2.5)) + .colored(target.getSecond()) + .lineWidth(1 / 16f); + } + } + + @Override + public ResourceLocation id() { + return ID; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java index 228b89eb5..becbfc927 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java @@ -15,6 +15,8 @@ import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockEntity; import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockEntity; import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.extractor.LogisticsItemExtractorBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.inserter.LogisticsItemInserterBlockEntity; import com.klikli_dev.theurgy.content.apparatus.mercurycatalyst.MercuryCatalystBlockEntity; import com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier.PyromanticBrazierBlockEntity; import com.klikli_dev.theurgy.content.apparatus.reformationarray.ReformationResultPedestalBlockEntity; @@ -104,4 +106,12 @@ public class BlockEntityRegistry { BLOCKS.register("digestion_vat", () -> BlockEntityType.Builder.of(DigestionVatBlockEntity::new, BlockRegistry.DIGESTION_VAT.get()).build(null)); + public static final Supplier> LOGISTICS_ITEM_INSERTER = + BLOCKS.register(BlockRegistry.LOGISTICS_ITEM_INSERTER.getId().getPath(), () -> + BlockEntityType.Builder.of(LogisticsItemInserterBlockEntity::new, BlockRegistry.LOGISTICS_ITEM_INSERTER.get()).build(null)); + + public static final Supplier> LOGISTICS_ITEM_EXTRACTOR = + BLOCKS.register(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.getId().getPath(), () -> + BlockEntityType.Builder.of(LogisticsItemExtractorBlockEntity::new, BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get()).build(null)); + } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java index 7b3762e52..a359ed3bb 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java @@ -15,6 +15,9 @@ import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlock; import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlock; import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlock; +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.extractor.LogisticsItemExtractorBlock; +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.inserter.LogisticsItemInserterBlock; +import com.klikli_dev.theurgy.content.apparatus.logisticsconnectornode.LogisticsConnectionNodeBlock; import com.klikli_dev.theurgy.content.apparatus.mercurycatalyst.MercuryCatalystBlock; import com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier.PyromanticBrazierBlock; import com.klikli_dev.theurgy.content.apparatus.reformationarray.ReformationResultPedestalBlock; @@ -171,6 +174,30 @@ public class BlockRegistry { .strength(1.0f)) ); + public static final DeferredBlock LOGISTICS_CONNECTION_NODE = + BLOCKS.register("logistics_connector_node", () -> new LogisticsConnectionNodeBlock(BlockBehaviour.Properties.of() + .strength(0.1f) + .noOcclusion() + .forceSolidOff() + ) + ); + + public static final DeferredBlock LOGISTICS_ITEM_INSERTER = + BLOCKS.register("logistics_item_inserter", () -> new LogisticsItemInserterBlock(BlockBehaviour.Properties.of() + .strength(0.1f) + .noOcclusion() + .forceSolidOff() + ) + ); + + public static final DeferredBlock LOGISTICS_ITEM_EXTRACTOR = + BLOCKS.register("logistics_item_extractor", () -> new LogisticsItemExtractorBlock(BlockBehaviour.Properties.of() + .strength(0.1f) + .noOcclusion() + .forceSolidOff() + ) + ); + public static final DeferredBlock SAL_AMMONIAC_ORE = BLOCKS.register("sal_ammoniac_ore", () -> new DropExperienceBlock( UniformInt.of(2, 5), diff --git a/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java index 61d2f1d2b..f56a90fbe 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java @@ -6,7 +6,7 @@ import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; @@ -33,6 +33,8 @@ public class CreativeModeTabRegistry { DivinationRodItem.registerCreativeModeTabs(ItemRegistry.AMETHYST_DIVINATION_ROD.get(), output); output.accept(ItemRegistry.SAL_AMMONIAC_BUCKET.get()); + output.accept(ItemRegistry.COPPER_WIRE.get()); + output.accept(ItemRegistry.MERCURIAL_WAND.get()); output.accept(ItemRegistry.MERCURY_SHARD.get()); output.accept(ItemRegistry.MERCURY_CRYSTAL.get()); @@ -65,6 +67,10 @@ public class CreativeModeTabRegistry { output.accept(ItemRegistry.FERMENTATION_VAT.get()); output.accept(ItemRegistry.DIGESTION_VAT.get()); + output.accept(ItemRegistry.LOGISTICS_ITEM_INSERTER.get()); + output.accept(ItemRegistry.LOGISTICS_ITEM_EXTRACTOR.get()); + output.accept(ItemRegistry.LOGISTICS_CONNECTION_NODE.get()); + }).build()); } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java index 5d1e0709f..b7118c97d 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java @@ -12,10 +12,13 @@ import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlockItem; import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockItem; import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockItem; +import com.klikli_dev.theurgy.content.apparatus.logisticsitemconnector.LogisticsItemConnectorBlockItem; import com.klikli_dev.theurgy.content.apparatus.reformationarray.SulfuricFluxEmitterBlockItem; import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.SalAmmoniacAccumulatorBlockItem; import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlockItem; -import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.divinationrod.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.mercurialwand.MercurialWandItem; +import com.klikli_dev.theurgy.content.item.wire.WireItem; import net.minecraft.world.item.*; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; @@ -119,6 +122,13 @@ public class ItemRegistry { Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, 96, 40, 16, false)); + //Other Tools + public static final DeferredItem COPPER_WIRE = + ITEMS.register("copper_wire", () -> new WireItem(new Item.Properties(), 32)); + + public static final DeferredItem MERCURIAL_WAND = + ITEMS.register("mercurial_wand", () -> new MercurialWandItem(new Item.Properties())); + //Buckets public static final DeferredItem SAL_AMMONIAC_BUCKET = ITEMS.register("sal_ammoniac_bucket", () -> new BucketItem( @@ -181,4 +191,13 @@ public class ItemRegistry { public static final DeferredItem DIGESTION_VAT = ITEMS.register("digestion_vat", () -> new DigestionVatBlockItem(BlockRegistry.DIGESTION_VAT.get(), new Item.Properties())); + + public static final DeferredItem LOGISTICS_CONNECTION_NODE = + ITEMS.register(BlockRegistry.LOGISTICS_CONNECTION_NODE.getId().getPath(), () -> new BlockItem(BlockRegistry.LOGISTICS_CONNECTION_NODE.get(), new Item.Properties())); + + public static final DeferredItem LOGISTICS_ITEM_INSERTER = + ITEMS.register(BlockRegistry.LOGISTICS_ITEM_INSERTER.getId().getPath(), () -> new LogisticsItemConnectorBlockItem(BlockRegistry.LOGISTICS_ITEM_INSERTER.get(), new Item.Properties())); + + public static final DeferredItem LOGISTICS_ITEM_EXTRACTOR = + ITEMS.register(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.getId().getPath(), () -> new LogisticsItemConnectorBlockItem(BlockRegistry.LOGISTICS_ITEM_EXTRACTOR.get(), new Item.Properties())); } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/KeyMappingsRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/KeyMappingsRegistry.java new file mode 100644 index 000000000..f129c7062 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/KeyMappingsRegistry.java @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.mode.ModeItem; +import com.klikli_dev.theurgy.network.Networking; +import com.klikli_dev.theurgy.network.messages.MessageSetMode; +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.settings.IKeyConflictContext; +import org.lwjgl.glfw.GLFW; + +public class KeyMappingsRegistry { + public static final KeyMapping CHANGE_ITEM_MODE = + new KeyMapping(TheurgyConstants.I18n.Key.CHANGE_ITEM_MODE, new IKeyConflictContext() { + @Override + public boolean isActive() { + return Minecraft.getInstance().screen == null && Minecraft.getInstance().player.getMainHandItem().getItem() instanceof ModeItem; + } + + @Override + public boolean conflicts(IKeyConflictContext other) { + return this == other; + } + }, InputConstants.Type.KEYSYM.getOrCreate(GLFW.GLFW_KEY_UNKNOWN), "key.theurgy.category"); + + public static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) { + event.register(CHANGE_ITEM_MODE); + } + + public static void onKeyInput(InputEvent.Key event) { + onInput(event); + } + + public static void onMouseInput(InputEvent.MouseButton.Key event) { + onInput(event); + } + + private static void onInput(InputEvent event) { + + if (CHANGE_ITEM_MODE.consumeClick()) { + Networking.sendToServer(new MessageSetMode(1)); + } + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java index ead89267e..bf5bbef4d 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java @@ -5,7 +5,7 @@ package com.klikli_dev.theurgy.registry; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.salt.AlchemicalSaltItem; import com.klikli_dev.theurgy.util.LevelUtil; import net.minecraft.world.item.Item; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; diff --git a/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java index e43242733..7aaceca9d 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java @@ -6,9 +6,9 @@ import com.google.common.base.Suppliers; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurTier; -import com.klikli_dev.theurgy.content.item.AlchemicalSulfurType; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurTier; +import com.klikli_dev.theurgy.content.item.sulfur.AlchemicalSulfurType; import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; import com.klikli_dev.theurgy.util.LevelUtil; import net.minecraft.world.item.Item; diff --git a/src/main/java/com/klikli_dev/theurgy/util/EnumUtil.java b/src/main/java/com/klikli_dev/theurgy/util/EnumUtil.java new file mode 100644 index 000000000..550bfd713 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/util/EnumUtil.java @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.util; + +import net.minecraft.core.Direction; + +public class EnumUtil { + public static final Direction[] DIRECTIONS = Direction.values(); //cache direction values +} diff --git a/src/main/java/com/klikli_dev/theurgy/util/ScrollHelper.java b/src/main/java/com/klikli_dev/theurgy/util/ScrollHelper.java new file mode 100644 index 000000000..e393310f8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/util/ScrollHelper.java @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2023 Aidan C. Brady + * SPDX-FileCopyrightText: 2024 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.util; + +import net.minecraft.SharedConstants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.util.Mth; + + +/** + * Based on https://github.com/mekanism/Mekanism/blob/d22f6e2028009ed043f8b40c4ea1f7912be3002c/src/main/java/mekanism/client/render/lib/ScrollIncrementer.java + */ +public class ScrollHelper { + + private static long lastScrollTime = -1; + private static double scrollDelta; + + private static long getTime() { + ClientLevel level = Minecraft.getInstance().level; + return level == null ? -1 : level.getGameTime(); + } + + public static int scroll(double delta) { + long time = getTime(); + if (time - lastScrollTime > SharedConstants.TICKS_PER_SECOND) { + scrollDelta = 0; + } + lastScrollTime = time; + scrollDelta += delta; + int shift = (int) scrollDelta; + scrollDelta %= 1; + + shift = Mth.clamp(shift, -1, 1); + + return shift; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java b/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java index a359a1be7..e9c1ee4f0 100644 --- a/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java +++ b/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java @@ -4,10 +4,56 @@ package com.klikli_dev.theurgy.util; +import com.google.common.graph.EndpointPair; +import com.google.common.graph.MutableGraph; import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.neoforge.fluids.FluidStack; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Supplier; + public class TheurgyExtraCodecs { public static final Codec SINGLE_FLUID_CODEC = BuiltInRegistries.FLUID.byNameCodec().xmap(fluid -> new FluidStack(fluid, 1), FluidStack::getFluid); -} + + @SuppressWarnings("UnstableApiUsage") + public static Codec> graph(Codec elementCodec, Supplier> graphSupplier) { + return internalGraph(elementCodec).xmap( + internalGraph -> { + MutableGraph g = graphSupplier.get(); + internalGraph.nodes().forEach(g::addNode); + internalGraph.edges().forEach(g::putEdge); + return g; + }, + graph -> { + List nodes = new ArrayList<>(graph.nodes()); + List> edges = new ArrayList<>(graph.edges()); + return new InternalGraph<>(nodes, edges); + } + ); + } + + @SuppressWarnings("UnstableApiUsage") + private static Codec> unorderedEndpointPair(Codec elementCodec) { + return RecordCodecBuilder.create(instance -> instance.group( + elementCodec.fieldOf("nodeU").forGetter(EndpointPair::nodeU), + elementCodec.fieldOf("nodeV").forGetter(EndpointPair::nodeV) + ).apply(instance, EndpointPair::unordered)); + } + + @SuppressWarnings("UnstableApiUsage") + private static Codec> internalGraph(Codec elementCodec) { + return RecordCodecBuilder.create(instance -> instance.group( + Codec.list(elementCodec).fieldOf("nodes").forGetter(InternalGraph::nodes), + Codec.list(unorderedEndpointPair(elementCodec)).fieldOf("edges").forGetter(InternalGraph::edges) + ).apply(instance, InternalGraph::new)); + } + + @SuppressWarnings("UnstableApiUsage") + private record InternalGraph(List nodes, List> edges) { + + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index c8561e696..e89182e16 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -4,4 +4,5 @@ public net.minecraft.data.loot.BlockLootSubProvider map public net.minecraft.world.item.crafting.RecipeManager byType(Lnet/minecraft/world/item/crafting/RecipeType;)Ljava/util/Map; # byType public net.minecraft.world.level.block.DoublePlantBlock preventDropFromBottomPart(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/player/Player;)V # preventCreativeDropFromBottomPart public net.minecraft.client.Minecraft pausePartialTick -public net.minecraft.world.item.crafting.ShapedRecipe pattern \ No newline at end of file +public net.minecraft.world.item.crafting.ShapedRecipe pattern +public net.minecraft.client.gui.Gui overlayMessageTime \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/logistics_connector_template.json b/src/main/resources/assets/theurgy/models/block/logistics_connector_template.json new file mode 100644 index 000000000..5203282cf --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/logistics_connector_template.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "minecraft:block/block", + "textures": { + "particle": "logistics_connector", + "texture": "logistics_connector" + }, + "elements": [ + { + "from": [6.99, -4.01, 6.99], + "to": [9.01, 8.01, 9.01], + "faces": { + "north": {"uv": [4, 2, 2, 14], "texture": "#texture"}, + "east": {"uv": [6, 2, 4, 14], "texture": "#texture"}, + "south": {"uv": [8, 2, 6, 14], "texture": "#texture"}, + "west": {"uv": [2, 2, 0, 14], "texture": "#texture"}, + "up": {"uv": [2, 2, 4, 0], "texture": "#texture"}, + "down": {"uv": [4, 0, 6, 2], "texture": "#texture"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/logistics_node_template.json b/src/main/resources/assets/theurgy/models/block/logistics_node_template.json new file mode 100644 index 000000000..d50193641 --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/logistics_node_template.json @@ -0,0 +1,76 @@ +{ + "credit": "Made with Blockbench", + "parent": "minecraft:block/block", + "textures": { + "particle": "logistics_node_connector", + "connector": "logistics_node_connector", + "base": "logistics_node_base" + }, + "elements": [ + { + "name": "Connector", + "from": [7, 5, 7], + "to": [9, 8, 9], + "faces": { + "north": {"uv": [2, 5, 4, 8], "texture": "#connector"}, + "east": {"uv": [0, 5, 2, 8], "texture": "#connector"}, + "south": {"uv": [6, 5, 8, 8], "texture": "#connector"}, + "west": {"uv": [4, 5, 6, 8], "texture": "#connector"}, + "up": {"uv": [4, 5, 2, 3], "texture": "#connector"}, + "down": {"uv": [6, 3, 4, 5], "texture": "#connector"} + } + }, + { + "name": "InsulatorBase", + "from": [7, 1, 7], + "to": [9, 4, 9], + "faces": { + "north": {"uv": [2, 7, 4, 10], "texture": "#base"}, + "east": {"uv": [0, 7, 2, 10], "texture": "#base"}, + "south": {"uv": [6, 7, 8, 10], "texture": "#base"}, + "west": {"uv": [4, 7, 6, 10], "texture": "#base"}, + "up": {"uv": [4, 7, 2, 5], "texture": "#base"}, + "down": {"uv": [6, 5, 4, 7], "texture": "#base"} + } + }, + { + "name": "InsulatorFrill1", + "from": [6, 0, 6], + "to": [10, 1, 10], + "faces": { + "north": {"uv": [4, 4, 8, 5], "texture": "#base"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#base"}, + "south": {"uv": [12, 4, 16, 5], "texture": "#base"}, + "west": {"uv": [8, 4, 12, 5], "texture": "#base"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#base"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#base"} + } + }, + { + "name": "InsulatorFrill2", + "from": [6, 2, 6], + "to": [10, 3, 10], + "faces": { + "north": {"uv": [4, 4, 8, 5], "texture": "#base"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#base"}, + "south": {"uv": [12, 4, 16, 5], "texture": "#base"}, + "west": {"uv": [8, 4, 12, 5], "texture": "#base"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#base"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#base"} + } + }, + { + "name": "InsulatorFrill3", + "from": [6, 4, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [4, 4, 8, 5], "texture": "#base"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#base"}, + "south": {"uv": [12, 4, 16, 5], "texture": "#base"}, + "west": {"uv": [8, 4, 12, 5], "texture": "#base"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#base"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#base"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/textures/block/logistics_extractor.png b/src/main/resources/assets/theurgy/textures/block/logistics_extractor.png new file mode 100644 index 000000000..96619fae9 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/logistics_extractor.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/logistics_inserter.png b/src/main/resources/assets/theurgy/textures/block/logistics_inserter.png new file mode 100644 index 000000000..1c3135b98 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/logistics_inserter.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/logistics_node.png b/src/main/resources/assets/theurgy/textures/block/logistics_node.png new file mode 100644 index 000000000..522cae3ec Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/logistics_node.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/logistics_node_base.png b/src/main/resources/assets/theurgy/textures/block/logistics_node_base.png new file mode 100644 index 000000000..5763def54 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/logistics_node_base.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/logistics_node_connector.png b/src/main/resources/assets/theurgy/textures/block/logistics_node_connector.png new file mode 100644 index 000000000..a510c4b89 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/logistics_node_connector.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/overlay/white.png b/src/main/resources/assets/theurgy/textures/block/overlay/white.png new file mode 100644 index 000000000..faf0ec13d Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/overlay/white.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/connection_node_example.png b/src/main/resources/assets/theurgy/textures/gui/book/connection_node_example.png new file mode 100644 index 000000000..8240327d9 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/connection_node_example.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/furnace_automation.png b/src/main/resources/assets/theurgy/textures/gui/book/furnace_automation.png new file mode 100644 index 000000000..0a1a24eca Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/furnace_automation.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/logistics_network.png b/src/main/resources/assets/theurgy/textures/gui/book/logistics_network.png new file mode 100644 index 000000000..800671dad Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/logistics_network.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/copper_wire.png b/src/main/resources/assets/theurgy/textures/item/copper_wire.png new file mode 100644 index 000000000..e46f20581 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/copper_wire.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/mercurial_wand.png b/src/main/resources/assets/theurgy/textures/item/mercurial_wand.png new file mode 100644 index 000000000..2d2bf42d7 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/mercurial_wand.png differ