From db1907f09e3456f7af3eab5f52831e746aab4978 Mon Sep 17 00:00:00 2001 From: DrMangoTea Date: Sun, 17 Sep 2023 16:10:54 +0200 Subject: [PATCH] distillation tower --- .../9047e4e94996e73e9dfde3738763637fb609e07e | 4 +- .../ad795fb8576279849034d802e60366ec43bb396a | 26 +- .../cast_iron_distillation_controller.json | 7 + .../cast_iron_distillation_output.json | 7 + .../steel_distillation_controller.json | 7 + .../steel_distillation_output.json | 7 + .../resources/assets/tfmg/lang/en_ud.json | 4 + .../resources/assets/tfmg/lang/en_us.json | 25 ++ .../cast_iron_distillation_controller.json | 6 + .../block/cast_iron_distillation_output.json | 6 + .../block/steel_distillation_controller.json | 6 + .../block/steel_distillation_output.json | 6 + .../cast_iron_distillation_controller.json | 3 + .../item/cast_iron_distillation_output.json | 3 + .../item/steel_distillation_controller.json | 3 + .../item/steel_distillation_output.json | 3 + .../minecraft/tags/blocks/mineable/axe.json | 4 +- .../tags/blocks/mineable/pickaxe.json | 2 + .../cast_iron_distillation_controller.json | 20 + .../blocks/cast_iron_distillation_output.json | 20 + .../blocks/steel_distillation_controller.json | 20 + .../blocks/steel_distillation_output.json | 20 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../tfmg/recipes/cut_bauxite_brick_slab.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../cut_bauxite_brick_slab_recycling.json | 14 + .../recipes/cut_bauxite_brick_stairs.json | 18 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../tfmg/recipes/cut_bauxite_brick_wall.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../data/tfmg/recipes/cut_bauxite_slab.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../recipes/cut_bauxite_slab_recycling.json | 14 + .../data/tfmg/recipes/cut_bauxite_stairs.json | 18 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../data/tfmg/recipes/cut_bauxite_wall.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../recipes/polished_cut_bauxite_slab.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../polished_cut_bauxite_slab_recycling.json | 14 + .../recipes/polished_cut_bauxite_stairs.json | 18 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../recipes/polished_cut_bauxite_wall.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../recipes/small_bauxite_brick_slab.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../small_bauxite_brick_slab_recycling.json | 14 + .../recipes/small_bauxite_brick_stairs.json | 18 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../recipes/small_bauxite_brick_wall.json | 16 + ...from_stone_types_bauxite_stonecutting.json | 8 + ...from_stone_types_bauxite_stonecutting.json | 8 + .../FluidProcessingBlockEntity.java | 9 +- .../DistillationControllerBlock.java | 99 +++++ .../DistillationControllerBlockEntity.java | 228 ++++++++++ .../DistillationOutputBlock.java | 42 ++ .../DistillationOutputBlockEntity.java | 393 +++++++++++++++++ .../DistillationTowerData.java | 400 ++++++++++++++++++ .../DistilleryControllerBlockEntity.java | 12 +- .../DistilleryOutputBlockEntity.java | 21 +- .../tanks/SteelFluidTankRenderer.java | 19 +- .../machines/tanks/SteelTankBlockEntity.java | 91 ++-- .../AdvancedDistillationRecipe.java | 25 +- .../recipes/distillation/ItemlessRecipe.java | 106 ++++- .../jei/AdvancedDistillationCategory.java | 78 ++++ .../drmangotea/tfmg/recipes/jei/TFMGJei.java | 14 +- .../tfmg/registry/TFMGBlockEntities.java | 16 +- .../drmangotea/tfmg/registry/TFMGBlocks.java | 18 +- .../tfmg/registry/TFMGPartialModels.java | 1 + .../tfmg/registry/TFMGRecipeTypes.java | 2 +- .../assets/tfmg/lang/default/interface.json | 9 +- .../block/distillation_tower/gauge.json | 37 ++ .../cast_iron_distillation_controller.png | Bin 0 -> 19028 bytes .../block/cast_iron_distillation_output.png | Bin 0 -> 19028 bytes .../block/steel_distillation_controller.png | Bin 0 -> 19028 bytes .../block/steel_distillation_output.png | Bin 0 -> 19028 bytes .../fractional_distillation/heavy_oil.json | 39 ++ .../fractional_distillation/naphtha.json | 32 ++ .../fractional_distillation/sussy.json | 19 + 84 files changed, 2221 insertions(+), 106 deletions(-) create mode 100644 src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_output.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/steel_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/steel_distillation_output.json create mode 100644 src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_output.json create mode 100644 src/generated/resources/assets/tfmg/models/block/steel_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/models/block/steel_distillation_output.json create mode 100644 src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_output.json create mode 100644 src/generated/resources/assets/tfmg/models/item/steel_distillation_controller.json create mode 100644 src/generated/resources/assets/tfmg/models/item/steel_distillation_output.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_controller.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_output.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_controller.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_output.json create mode 100644 src/generated/resources/data/tfmg/recipes/bauxite_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/bauxite_pillar_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_recycling.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_bricks_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_slab.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_recycling.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_wall.json create mode 100644 src/generated/resources/data/tfmg/recipes/cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/layered_bauxite_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_recycling.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall.json create mode 100644 src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_recycling.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/tfmg/recipes/small_bauxite_bricks_from_stone_types_bauxite_stonecutting.json create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlockEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java rename src/main/java/com/drmangotea/tfmg/recipes/distillation/{advanced => }/AdvancedDistillationRecipe.java (72%) create mode 100644 src/main/java/com/drmangotea/tfmg/recipes/jei/AdvancedDistillationCategory.java create mode 100644 src/main/resources/assets/tfmg/models/block/distillation_tower/gauge.json create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_output.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_distillation_controller.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_distillation_output.png create mode 100644 src/main/resources/data/tfmg/recipes/fractional_distillation/heavy_oil.json create mode 100644 src/main/resources/data/tfmg/recipes/fractional_distillation/naphtha.json create mode 100644 src/main/resources/data/tfmg/recipes/fractional_distillation/sussy.json diff --git a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e index 5bae86a7..d4b037dd 100644 --- a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e +++ b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e @@ -1,2 +1,2 @@ -// 1.19.2 2023-09-09T21:03:24.5059888 Create: The Factory Must Grow's lang merger -165747b064e1eafffc6b4a6d91249ad3c7e6ca39 assets/tfmg/lang/en_us.json +// 1.19.2 2023-09-17T13:43:24.4728645 Create: The Factory Must Grow's lang merger +b20b2d55c4ecebb0f868c512c69646ba4d3d98cf assets/tfmg/lang/en_us.json diff --git a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a index 7700ac63..bf740663 100644 --- a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a +++ b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a @@ -1,8 +1,10 @@ -// 1.19.2 2023-09-09T11:58:31.6412487 Registrate Provider for tfmg [Recipes, Advancements, Loot tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.19.2 2023-09-17T11:15:14.4329646 Registrate Provider for tfmg [Recipes, Advancements, Loot tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] b7f5146505c40c08cdea7ad01fa99048b7ac5451 assets/tfmg/blockstates/aluminum_block.json 933485fa587fccc649b4cbe8f76f15e590cc8bb1 assets/tfmg/blockstates/bauxite.json 2b53ff8e880d35a42388584cb3ca896c55bfaf95 assets/tfmg/blockstates/bauxite_pillar.json 9ca537517fb8baeff3d4e4137c93aebd6b874c81 assets/tfmg/blockstates/cast_iron_block.json +e13ba2fa789c784e4b7cfec3dd4603e29152387e assets/tfmg/blockstates/cast_iron_distillation_controller.json +61bcb8f09523c05fe8ee07a4b8b71a59e98393fe assets/tfmg/blockstates/cast_iron_distillation_output.json ec94bedd045ade74274ffe009569d65083b9fff5 assets/tfmg/blockstates/coal_coke_block.json c67b91a7fd9f16cd2d7eaa92dd9b945042d58130 assets/tfmg/blockstates/concrete.json dca4728ef33ca9d54fb55d707761c2eeb77c32b1 assets/tfmg/blockstates/cooling_fluid.json @@ -45,6 +47,8 @@ e80f4610e3272a4edfb47572aff71f1db3d283d7 assets/tfmg/blockstates/small_bauxite_b a2eed7173d7f528d0f068c5fa9ea358f61ef1436 assets/tfmg/blockstates/small_bauxite_brick_wall.json e6983072149d1a9a2f4d39e4e1feac599ff7413e assets/tfmg/blockstates/steel_block.json df44115876045e6f863de2f8be6a9166b336a2f1 assets/tfmg/blockstates/steel_casing.json +d5dfa13540bc12cb5b1d0eb29702242ad757a5da assets/tfmg/blockstates/steel_distillation_controller.json +f1763cd1ea42da0645e17ecc9e0c1a1b02502be1 assets/tfmg/blockstates/steel_distillation_output.json 7334c94b5fe23df91f43048b19c2b22121405603 assets/tfmg/blockstates/steel_door.json 72bfce2a2795dfe461beed7c3a074e328de14d96 assets/tfmg/blockstates/steel_fluid_tank.json e29906d296994a13fefc2beb22f7693e1027dd1b assets/tfmg/blockstates/steel_fluid_valve.json @@ -53,8 +57,8 @@ e29906d296994a13fefc2beb22f7693e1027dd1b assets/tfmg/blockstates/steel_fluid_val 71b4c68d8a02062252c4dfde41650b7667d8c0ca assets/tfmg/blockstates/steel_sheetmetal.json 47b56dad1f2715aae7430b5f9acb1d51a26cf562 assets/tfmg/blockstates/steel_smart_fluid_pipe.json 942bb86fa92b3c40fc535dccdd2e9f3b79a36d92 assets/tfmg/blockstates/surface_scanner.json -a82f4a5b9cd04dbd195934b459e4c04b2110718d assets/tfmg/lang/en_ud.json -555b7657893b06e861781e9ad7b8d4d557ef6869 assets/tfmg/lang/en_us.json +587858610506ca0b063af552a67b96dd3a85e232 assets/tfmg/lang/en_ud.json +595fc774dfdc75f633a922ef452984d0c5d4df1d assets/tfmg/lang/en_us.json 9e6a6b62f5e7528c4e4d4f72f3510edcd8f0c078 assets/tfmg/models/block/aluminum_block.json 5a4c785e8d8394ccd125732c0017459648574c4e assets/tfmg/models/block/bauxite_natural_0.json 4ace0da00498fcbb9ddfdf321767b40b095c8778 assets/tfmg/models/block/bauxite_natural_1.json @@ -63,6 +67,8 @@ b43711f35915b71b15db638538a83a4ea46480dc assets/tfmg/models/block/bauxite_natura 920f96d4b648414ce8331e5a81e6b7ddbce7e225 assets/tfmg/models/block/bauxite_pillar.json cd5ade5f9a0b3b5e28b5d11a685408dd922dbe2d assets/tfmg/models/block/bauxite_pillar_horizontal.json 37789d06ec6cfc0312be7b1b66ac1ec6403d4516 assets/tfmg/models/block/cast_iron_block.json +925d61d0f1379e02c1f8892e3b86be5aa623b9ae assets/tfmg/models/block/cast_iron_distillation_controller.json +73cb08b1b298a3e02731e61326b65f94ef39e9bb assets/tfmg/models/block/cast_iron_distillation_output.json 50c47672a7e9f7180af78c4bef42d5db1822b08b assets/tfmg/models/block/coal_coke_block.json 75c31d328fc5d6d46c8b43e8bde7504f4e51dadc assets/tfmg/models/block/concrete.json 80fb4a90f861992322bfd63f1232593e8cce708e assets/tfmg/models/block/cooling_fluid.json @@ -122,6 +128,8 @@ d29800a63ca2717e056798cf8bb29bf55d29a07c assets/tfmg/models/block/small_bauxite_ a07354a238bd4d5aadee6e60e1d61fcffde43f5b assets/tfmg/models/block/small_bauxite_brick_stairs_outer.json 0ceb30eaff16a495c9a165ca16c925cbff836755 assets/tfmg/models/block/steel_block.json 465b1fed10d06090e5e8d19457f9fa48fe890bb4 assets/tfmg/models/block/steel_casing.json +8ec65bf20fa41bb1b246b4a60feed65c48befb2f assets/tfmg/models/block/steel_distillation_controller.json +2a5a4724f942aab7296062cdaa5259c4a7904e1a assets/tfmg/models/block/steel_distillation_output.json 0c4fcf6e901d8eba56ba67999fcf0801534779d6 assets/tfmg/models/block/steel_pipe/d_x.json 6060082caaef1e6e6fc72606d6a74e64aaeb27ac assets/tfmg/models/block/steel_pipe/d_y.json dc62a6a3de9e73e7341481df09951a7ec3caf944 assets/tfmg/models/block/steel_pipe/d_z.json @@ -158,6 +166,8 @@ f685ca653c8e197986b1ac8f43297989816d39d2 assets/tfmg/models/item/aluminum_ingot. 4ace0da00498fcbb9ddfdf321767b40b095c8778 assets/tfmg/models/item/bauxite.json 41091873d85bac787e4752d0ff81189432f1e28e assets/tfmg/models/item/bauxite_pillar.json ec38882fb9010884823d6d6afa604f8a6512d279 assets/tfmg/models/item/cast_iron_block.json +25acd7ba8827401619c5faf7bdbe60228b411864 assets/tfmg/models/item/cast_iron_distillation_controller.json +fc48286f0e70651f3d5a915558c3c91ae3ad0da6 assets/tfmg/models/item/cast_iron_distillation_output.json da2c28e98d0ddf7166bdf7214c06e81ad8581b90 assets/tfmg/models/item/cast_iron_ingot.json d45fc5511b4c4027889afd3088cd91ba1d8b0501 assets/tfmg/models/item/coal_coke.json 3789a9d72a7ba5daf8c39cccaa665057e63302c6 assets/tfmg/models/item/coal_coke_block.json @@ -204,6 +214,8 @@ a1149d3ee5596f2c1038b225b0086ae1601da82c assets/tfmg/models/item/small_bauxite_b 0f3f7918e41afa95cc14bc6641a7beaf36c27621 assets/tfmg/models/item/small_bauxite_brick_wall.json 57bf86df814741f846feb8be4a10afe633f51721 assets/tfmg/models/item/steel_block.json d34ca92f5288cbb5cecee06f046a072763b2926c assets/tfmg/models/item/steel_casing.json +ec731aefdbbbaca3a4dac8ac2d6bd2d0aa6ebef5 assets/tfmg/models/item/steel_distillation_controller.json +77fe5209bfb0a78b94e67b807401cde95975d402 assets/tfmg/models/item/steel_distillation_output.json 7f012e3d947b08beb69d28a6d47730878f2b85cf assets/tfmg/models/item/steel_door.json 19dcd68a6658fd8fa8466180e26cb3f6a2b2c4f1 assets/tfmg/models/item/steel_fluid_tank.json 57bc28274df7d54eaa3fa1991481c6339f9e2247 assets/tfmg/models/item/steel_fluid_valve.json @@ -246,8 +258,8 @@ d26621b9617890011a68780cf7ab40fbb4658edc data/forge/tags/items/storage_blocks/le 1fdd0efd4d4b48c3d5989a7c43e53a6d1c2adc2b data/minecraft/tags/blocks/doors.json 63c4a8d8e713db70730e766f1a10f8dd9072f98f data/minecraft/tags/blocks/dripstone_replaceable_blocks.json 63c4a8d8e713db70730e766f1a10f8dd9072f98f data/minecraft/tags/blocks/lush_ground_replaceable.json -2acceda2af7fd542e47641315a13d98c74f9b8f0 data/minecraft/tags/blocks/mineable/axe.json -2acf4cf271b27f01f5581199338af9054b239529 data/minecraft/tags/blocks/mineable/pickaxe.json +9b558f29e672499a30354b9113c1d494e858b208 data/minecraft/tags/blocks/mineable/axe.json +cd64e606ab00398ec320c641e554951e7f30aedd data/minecraft/tags/blocks/mineable/pickaxe.json 63c4a8d8e713db70730e766f1a10f8dd9072f98f data/minecraft/tags/blocks/moss_replaceable.json f67e51a16b6d140324ca0201f1b05e672eb63774 data/minecraft/tags/blocks/needs_iron_tool.json 755548d9019c1bb26a568488912ebfdf399e02d2 data/minecraft/tags/blocks/needs_stone_tool.json @@ -299,6 +311,8 @@ a4b393a2526bd10fa38095ac80769f913f139889 data/tfmg/loot_tables/blocks/aluminum_b 56d114d40ea3160b5c06cf9cfaa2e5107543c460 data/tfmg/loot_tables/blocks/bauxite.json 473b0effd9a768189aa232855cd09e7b380c3adc data/tfmg/loot_tables/blocks/bauxite_pillar.json 60857d034446187e758de87644a80a7bc4d6b150 data/tfmg/loot_tables/blocks/cast_iron_block.json +300a96dcae25ba9bc085ee75f066b4ad2590b6e0 data/tfmg/loot_tables/blocks/cast_iron_distillation_controller.json +24517e07383f7a7eb8651f58721cf9f6f49393c0 data/tfmg/loot_tables/blocks/cast_iron_distillation_output.json 5158b18945a39616eef93de8de61dd948fc96f0a data/tfmg/loot_tables/blocks/coal_coke_block.json d32a75f20ca3f2da6ba69b0a91e295c63f65de92 data/tfmg/loot_tables/blocks/concrete.json 1622328d319fc3c71269b0f9f1aef43a77132f3a data/tfmg/loot_tables/blocks/copper_encased_steel_pipe.json @@ -329,6 +343,8 @@ b43d1fa7a2ac0534ab2867dec787d97f205f4a8d data/tfmg/loot_tables/blocks/small_baux 47af1defc5e03a0806d8afd5f119fab420aa1da8 data/tfmg/loot_tables/blocks/small_bauxite_brick_wall.json 01298989d0fe79936cdfa1e6cc07fd05f143ae09 data/tfmg/loot_tables/blocks/steel_block.json 62cd229b00eb2c95187d1b7b8e968aa26e54c412 data/tfmg/loot_tables/blocks/steel_casing.json +d0dfd69e4ebbcd28a2f0666bb3f3713a0bfa9863 data/tfmg/loot_tables/blocks/steel_distillation_controller.json +9a6f972c9424afccebf48048ce1efacacd7da2a7 data/tfmg/loot_tables/blocks/steel_distillation_output.json b0adec80b5b6c3226bd6d7044556351244474cd4 data/tfmg/loot_tables/blocks/steel_door.json da3aa200dc67d6a7bfbb0bb9e988a325fed4c670 data/tfmg/loot_tables/blocks/steel_fluid_tank.json 7b78ebb7567c8b6b88a334761fbb702d17e5b337 data/tfmg/loot_tables/blocks/steel_fluid_valve.json diff --git a/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_controller.json b/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_controller.json new file mode 100644 index 00000000..1ebaa6c7 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_controller.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/cast_iron_distillation_controller" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_output.json b/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_output.json new file mode 100644 index 00000000..bcc52d42 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/cast_iron_distillation_output.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/cast_iron_distillation_output" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/steel_distillation_controller.json b/src/generated/resources/assets/tfmg/blockstates/steel_distillation_controller.json new file mode 100644 index 00000000..c9d593a8 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/steel_distillation_controller.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/steel_distillation_controller" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/steel_distillation_output.json b/src/generated/resources/assets/tfmg/blockstates/steel_distillation_output.json new file mode 100644 index 00000000..0bde4bf0 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/steel_distillation_output.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/steel_distillation_output" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/lang/en_ud.json b/src/generated/resources/assets/tfmg/lang/en_ud.json index 4821972a..278d4fb6 100644 --- a/src/generated/resources/assets/tfmg/lang/en_ud.json +++ b/src/generated/resources/assets/tfmg/lang/en_ud.json @@ -3,6 +3,8 @@ "block.tfmg.bauxite": "ǝʇıxnɐᗺ", "block.tfmg.bauxite_pillar": "ɹɐןןıԀ ǝʇıxnɐᗺ", "block.tfmg.cast_iron_block": "uoɹI ʇsɐƆ ɟo ʞɔoןᗺ", + "block.tfmg.cast_iron_distillation_controller": "ɹǝןןoɹʇuoƆ uoıʇɐןןıʇsıᗡ uoɹI ʇsɐƆ", + "block.tfmg.cast_iron_distillation_output": "ʇndʇnO uoıʇɐןןıʇsıᗡ uoɹI ʇsɐƆ", "block.tfmg.coal_coke_block": "ǝʞoƆ ןɐoƆ ɟo ʞɔoןᗺ", "block.tfmg.concrete": "ǝʇǝɹɔuoƆ", "block.tfmg.cooling_fluid": "pınןℲ buıןooƆ", @@ -45,6 +47,8 @@ "block.tfmg.small_bauxite_bricks": "sʞɔıɹᗺ ǝʇıxnɐᗺ ןןɐɯS", "block.tfmg.steel_block": "ןǝǝʇS ɟo ʞɔoןᗺ", "block.tfmg.steel_casing": "buısɐƆ ןǝǝʇS", + "block.tfmg.steel_distillation_controller": "ɹǝןןoɹʇuoƆ uoıʇɐןןıʇsıᗡ ןǝǝʇS", + "block.tfmg.steel_distillation_output": "ʇndʇnO uoıʇɐןןıʇsıᗡ ןǝǝʇS", "block.tfmg.steel_door": "ɹooᗡ ןǝǝʇS", "block.tfmg.steel_fluid_tank": "ʞuɐ⟘ pınןℲ ןǝǝʇS", "block.tfmg.steel_fluid_valve": "ǝʌןɐΛ pınןℲ ןǝǝʇS", diff --git a/src/generated/resources/assets/tfmg/lang/en_us.json b/src/generated/resources/assets/tfmg/lang/en_us.json index 1981eff5..20a5fadf 100644 --- a/src/generated/resources/assets/tfmg/lang/en_us.json +++ b/src/generated/resources/assets/tfmg/lang/en_us.json @@ -6,6 +6,8 @@ "block.tfmg.bauxite": "Bauxite", "block.tfmg.bauxite_pillar": "Bauxite Pillar", "block.tfmg.cast_iron_block": "Block of Cast Iron", + "block.tfmg.cast_iron_distillation_controller": "Cast Iron Distillation Controller", + "block.tfmg.cast_iron_distillation_output": "Cast Iron Distillation Output", "block.tfmg.coal_coke_block": "Block of Coal Coke", "block.tfmg.concrete": "Concrete", "block.tfmg.cooling_fluid": "Cooling Fluid", @@ -48,6 +50,8 @@ "block.tfmg.small_bauxite_bricks": "Small Bauxite Bricks", "block.tfmg.steel_block": "Block of Steel", "block.tfmg.steel_casing": "Steel Casing", + "block.tfmg.steel_distillation_controller": "Steel Distillation Controller", + "block.tfmg.steel_distillation_output": "Steel Distillation Output", "block.tfmg.steel_door": "Steel Door", "block.tfmg.steel_fluid_tank": "Steel Fluid Tank", "block.tfmg.steel_fluid_valve": "Steel Fluid Valve", @@ -111,6 +115,20 @@ "itemGroup.tfmg.building": "Create: TFMG's Building Blocks", "create.goggles.misc.number": "%1$s", + "create.goggles.misc.dot_one": ".", + "create.goggles.misc.dot_two": "..", + "create.goggles.misc.dot_three": "...", + "create.goggles.surface_scanner.no_rotation": "No Rotation Provided", + "create.goggles.surface_scanner.no_deposit": "No Deposit Found", + "create.goggles.surface_scanner.deposit_found": "Found Deposit", + "create.goggles.surface_scanner.distance": "Distance: %1$s Blocks", + "create.goggles.surface_scanner.scanning_surface": "Scanning Surface", + "create.goggles.distillation_tower.tank_not_found": "Steel Fluid Tank Not Found", + "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", + "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", + "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found", + "create.goggles.distillation_tower.status": "Distillation Tower Info:", + "create.goggles.fluid_in_tank": "Fluid In Tank:", "_": "->------------------------] UI & Messages [------------------------<-", @@ -122,11 +140,18 @@ "create.goggles.misc.dot_one": ".", "create.goggles.misc.dot_two": "..", "create.goggles.misc.dot_three": "...", + "create.goggles.fluid_in_tank": "Fluid In Tank:", "create.goggles.surface_scanner.no_rotation": "No Rotation Provided", "create.goggles.surface_scanner.no_deposit": "No Deposit Found", "create.goggles.surface_scanner.deposit_found": "Found Deposit", "create.goggles.surface_scanner.distance": "Distance: %1$s Blocks", "create.goggles.surface_scanner.scanning_surface": "Scanning Surface", + "create.goggles.distillation_tower.status": "Distillation Tower Info:", + "create.goggles.distillation_tower.tank_not_found": "Steel Fluid Tank Not Found", + "create.goggles.distillation_tower.not_tall_enough": "Distillation Tower is Not Tall Enough", + "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", + "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", + "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found", "_": "Thank you for translating Create: The Factory Must Grow!" diff --git a/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_controller.json b/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_controller.json new file mode 100644 index 00000000..1b0dbbfb --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_controller.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/cast_iron_distillation_controller" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_output.json b/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_output.json new file mode 100644 index 00000000..701cebe4 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/cast_iron_distillation_output.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/cast_iron_distillation_output" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/steel_distillation_controller.json b/src/generated/resources/assets/tfmg/models/block/steel_distillation_controller.json new file mode 100644 index 00000000..d677a239 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/steel_distillation_controller.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/steel_distillation_controller" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/steel_distillation_output.json b/src/generated/resources/assets/tfmg/models/block/steel_distillation_output.json new file mode 100644 index 00000000..b047357c --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/steel_distillation_output.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/steel_distillation_output" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_controller.json b/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_controller.json new file mode 100644 index 00000000..ffef5b8d --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_controller.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/cast_iron_distillation_controller" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_output.json b/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_output.json new file mode 100644 index 00000000..31310d25 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/cast_iron_distillation_output.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/cast_iron_distillation_output" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/steel_distillation_controller.json b/src/generated/resources/assets/tfmg/models/item/steel_distillation_controller.json new file mode 100644 index 00000000..95930b56 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/steel_distillation_controller.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/steel_distillation_controller" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/steel_distillation_output.json b/src/generated/resources/assets/tfmg/models/item/steel_distillation_output.json new file mode 100644 index 00000000..3517bc6e --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/steel_distillation_output.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/steel_distillation_output" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 74f42144..a5260c83 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -3,6 +3,8 @@ "tfmg:steel_casing", "tfmg:heavy_machinery_casing", "tfmg:formwork_block", - "tfmg:copper_encased_steel_pipe" + "tfmg:copper_encased_steel_pipe", + "tfmg:cast_iron_distillation_output", + "tfmg:steel_distillation_output" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index f6100e1f..966401a4 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -12,6 +12,8 @@ "tfmg:steel_smart_fluid_pipe", "tfmg:steel_fluid_valve", "tfmg:steel_fluid_tank", + "tfmg:cast_iron_distillation_output", + "tfmg:steel_distillation_output", "tfmg:steel_block", "tfmg:cast_iron_block", "tfmg:aluminum_block", diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_controller.json b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_controller.json new file mode 100644 index 00000000..52fc6acc --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_controller.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:cast_iron_distillation_controller" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_output.json b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_output.json new file mode 100644 index 00000000..d997af23 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_distillation_output.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:cast_iron_distillation_output" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_controller.json b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_controller.json new file mode 100644 index 00000000..bae47806 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_controller.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:steel_distillation_controller" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_output.json b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_output.json new file mode 100644 index 00000000..9f8ab778 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_distillation_output.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:steel_distillation_output" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/bauxite_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/bauxite_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..d7408f0f --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/bauxite_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:bauxite" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/bauxite_pillar_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/bauxite_pillar_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..dbab2729 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/bauxite_pillar_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:bauxite_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab.json new file mode 100644 index 00000000..7e9b6110 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_brick_slab", + "key": { + "X": { + "item": "tfmg:cut_bauxite_bricks" + } + }, + "pattern": [ + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:cut_bauxite_brick_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..82519606 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_brick_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_recycling.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_recycling.json new file mode 100644 index 00000000..443965fb --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_slab_recycling.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "tfmg:cut_bauxite_brick_slab" + }, + { + "item": "tfmg:cut_bauxite_brick_slab" + } + ], + "result": { + "item": "tfmg:cut_bauxite_bricks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs.json new file mode 100644 index 00000000..c8cd57be --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_brick_stairs", + "key": { + "X": { + "item": "tfmg:cut_bauxite_bricks" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "tfmg:cut_bauxite_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..fd25aaa1 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall.json new file mode 100644 index 00000000..4ee119a7 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "X": { + "item": "tfmg:cut_bauxite_bricks" + } + }, + "pattern": [ + "XXX", + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:cut_bauxite_brick_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..cbbba670 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_brick_wall" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_bricks_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_bricks_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..2b915ab5 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_bricks_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..8fc25b0f --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab.json new file mode 100644 index 00000000..4ce5bebc --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_slab", + "key": { + "X": { + "item": "tfmg:cut_bauxite" + } + }, + "pattern": [ + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:cut_bauxite_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..f7319fa1 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_recycling.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_recycling.json new file mode 100644 index 00000000..2aa94ac8 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_slab_recycling.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "tfmg:cut_bauxite_slab" + }, + { + "item": "tfmg:cut_bauxite_slab" + } + ], + "result": { + "item": "tfmg:cut_bauxite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs.json new file mode 100644 index 00000000..022fd22e --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_stairs", + "key": { + "X": { + "item": "tfmg:cut_bauxite" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "tfmg:cut_bauxite_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..7eba9d75 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall.json new file mode 100644 index 00000000..703f941c --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "X": { + "item": "tfmg:cut_bauxite" + } + }, + "pattern": [ + "XXX", + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:cut_bauxite_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..cb930e93 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:cut_bauxite_wall" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/layered_bauxite_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/layered_bauxite_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..4a325a71 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/layered_bauxite_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:layered_bauxite" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..0a7ee73b --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:polished_cut_bauxite" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab.json new file mode 100644 index 00000000..b8ef9836 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "polished_cut_bauxite_slab", + "key": { + "X": { + "item": "tfmg:polished_cut_bauxite" + } + }, + "pattern": [ + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:polished_cut_bauxite_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..c9d0e8aa --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:polished_cut_bauxite_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_recycling.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_recycling.json new file mode 100644 index 00000000..70ec8875 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_slab_recycling.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "tfmg:polished_cut_bauxite_slab" + }, + { + "item": "tfmg:polished_cut_bauxite_slab" + } + ], + "result": { + "item": "tfmg:polished_cut_bauxite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs.json new file mode 100644 index 00000000..d3e11707 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "polished_cut_bauxite_stairs", + "key": { + "X": { + "item": "tfmg:polished_cut_bauxite" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "tfmg:polished_cut_bauxite_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..1f960e94 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_stairs_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:polished_cut_bauxite_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall.json new file mode 100644 index 00000000..f69491a3 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "X": { + "item": "tfmg:polished_cut_bauxite" + } + }, + "pattern": [ + "XXX", + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:polished_cut_bauxite_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..9615f1e0 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/polished_cut_bauxite_wall_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:polished_cut_bauxite_wall" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab.json new file mode 100644 index 00000000..ebd34d9a --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "small_bauxite_brick_slab", + "key": { + "X": { + "item": "tfmg:small_bauxite_bricks" + } + }, + "pattern": [ + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:small_bauxite_brick_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..71c122e2 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:small_bauxite_brick_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_recycling.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_recycling.json new file mode 100644 index 00000000..62266244 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_slab_recycling.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "tfmg:small_bauxite_brick_slab" + }, + { + "item": "tfmg:small_bauxite_brick_slab" + } + ], + "result": { + "item": "tfmg:small_bauxite_bricks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs.json new file mode 100644 index 00000000..7295b4df --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "small_bauxite_brick_stairs", + "key": { + "X": { + "item": "tfmg:small_bauxite_bricks" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "tfmg:small_bauxite_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..ce303468 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_stairs_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:small_bauxite_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall.json new file mode 100644 index 00000000..f87a2789 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "X": { + "item": "tfmg:small_bauxite_bricks" + } + }, + "pattern": [ + "XXX", + "XXX" + ], + "result": { + "count": 6, + "item": "tfmg:small_bauxite_brick_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..7d1f84b6 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_brick_wall_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:small_bauxite_brick_wall" +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/recipes/small_bauxite_bricks_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/tfmg/recipes/small_bauxite_bricks_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..9c614555 --- /dev/null +++ b/src/generated/resources/data/tfmg/recipes/small_bauxite_bricks_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "tag": "tfmg:stone_types/bauxite" + }, + "result": "tfmg:small_bauxite_bricks" +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/FluidProcessingBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/FluidProcessingBlockEntity.java index a96872ea..196fd36e 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/FluidProcessingBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/FluidProcessingBlockEntity.java @@ -83,10 +83,11 @@ public abstract class FluidProcessingBlockEntity extends KineticBlockEntity { protected boolean matchItemlessRecipe(Recipe recipe) { if (recipe == null) return false; - Optional basin = getController(); - if (!basin.isPresent()) + Optional controller = getController(); + + if (!controller.isPresent()) return false; - return ItemlessRecipe.match(basin.get(), recipe); + return ItemlessRecipe.match(controller.get(), recipe); } @@ -105,7 +106,7 @@ public abstract class FluidProcessingBlockEntity extends KineticBlockEntity { protected abstract void onBasinRemoved(); - protected Optional getController() { + public Optional getController() { if (level == null) return Optional.empty(); BlockEntity basinTE = level.getBlockEntity(worldPosition.below(1)); diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java new file mode 100644 index 00000000..49d60149 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java @@ -0,0 +1,99 @@ +package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; + + +import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock; +import com.drmangotea.tfmg.registry.TFMGBlockEntities; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; + + +import com.simibubi.create.AllShapes; + +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +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.FaceAttachedHorizontalDirectionalBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.StateDefinition; + +public class DistillationControllerBlock extends FaceAttachedHorizontalDirectionalBlock + implements IWrenchable, IBE { + + + public DistillationControllerBlock(Properties properties) { + super(properties); + + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACE, FACING)); + } + + + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + return canAttach(pLevel, pPos, getConnectedDirection(pState).getOpposite()); + } + + public static boolean canAttach(LevelReader pReader, BlockPos pPos, Direction pDirection) { + + return true; + } + + @Override + public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) { + SteelTankBlock.updateTowerState(pState, pLevel, pPos.relative(getFacing(pState).getOpposite())); + + } + + @Override + public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean pIsMoving) { + if (state.hasBlockEntity() && (!state.is(newState.getBlock()) || !newState.hasBlockEntity())) + world.removeBlockEntity(pos); + SteelTankBlock.updateTowerState(state, world, pos.relative(getFacing(state).getOpposite())); + + } + + + + @Override + public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { + return false; + } + + public static Direction getFacing(BlockState sideState) { + return getConnectedDirection(sideState); + } + + + @Override + public Class getBlockEntityClass() { + return DistillationControllerBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return TFMGBlockEntities.STEEL_DISTILLATION_CONTROLLER.get(); + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java new file mode 100644 index 00000000..35879487 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java @@ -0,0 +1,228 @@ +package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; + +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity; +import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity; +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.LangBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +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.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import javax.annotation.Nullable; +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.Optional; + +public class DistillationControllerBlockEntity extends DistilleryControllerBlockEntity implements IHaveGoggleInformation { + + public WeakReference source; + + public int towerLevel =0; + public boolean hasTank = false; + public boolean isTallEnough = true; + public boolean hasMainOutput = false; + public DistillationOutputBlockEntity mainOutput; + + public DistillationControllerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void tick() { + source = new WeakReference<>(null); + super.tick(); + + + + BlockEntity entityAbove = level.getBlockEntity(getBlockPos().above()); + + if(entityAbove instanceof DistillationOutputBlockEntity){ + mainOutput = (DistillationOutputBlockEntity) entityAbove; + + hasMainOutput = true; + }else { + hasMainOutput = false; + } + + + @Nullable + SteelTankBlockEntity tank = getTank(); + + if(tank==null){ + hasTank=false; + towerLevel = 0; + return; + } + hasTank = true; + + + towerLevel = tank.tower.towerLevel; + + + + } + + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + LangBuilder mb = Lang.translate("generic.unit.millibuckets"); + + + Lang.translate("goggles.distillation_tower.status") + .style(ChatFormatting.GRAY) + .space() + .forGoggles(tooltip, 1); + + + if(!hasTank) { + Lang.translate("goggles.distillation_tower.tank_not_found") + .style(ChatFormatting.DARK_RED) + .forGoggles(tooltip); + return true; + + }else { + + if(towerLevel<4) { + Lang.translate("goggles.distillation_tower.level", this.towerLevel) + .style(ChatFormatting.DARK_RED) + .forGoggles(tooltip, 1); + return true; + } + + if(!hasMainOutput) { + Lang.translate("goggles.distillation_tower.no_outputs") + .style(ChatFormatting.DARK_RED) + .forGoggles(tooltip, 1); + return true; + } + + // if(getTank().getHeight()<((DistillationOutputBlockEntity)level.getBlockEntity(getBlockPos().above())).foundOutputs*2) { + // Lang.translate("goggles.distillation_tower.not_tall_enough") + // .style(ChatFormatting.DARK_RED) + // .forGoggles(tooltip, 1); + // return true; + // } + + Lang.translate("goggles.distillation_tower.level", this.towerLevel) + .style(ChatFormatting.GREEN) + .forGoggles(tooltip, 1); + + Lang.translate("goggles.distillation_tower.found_outputs", this.getOutputCount()) + .style(ChatFormatting.GREEN) + .space() + .forGoggles(tooltip, 1); + + + } + + + /////////////////////////////////////////// + LazyOptional handler = this.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + Optional resolve = handler.resolve(); + if (!resolve.isPresent()) + return false; + + IFluidHandler tank = resolve.get(); + if (tank.getTanks() == 0) + return false; + + Lang.translate("goggles.fluid_in_tank") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + + boolean isEmpty = true; + for (int i = 0; i < tank.getTanks(); i++) { + FluidStack fluidStack = tank.getFluidInTank(i); + if (fluidStack.isEmpty()) + continue; + + Lang.fluidName(fluidStack) + .style(ChatFormatting.GRAY) + .forGoggles(tooltip, 1); + + Lang.builder() + .add(Lang.number(fluidStack.getAmount()) + .add(mb) + .style(ChatFormatting.GOLD)) + .text(ChatFormatting.GRAY, " / ") + .add(Lang.number(tank.getTankCapacity(i)) + .add(mb) + .style(ChatFormatting.DARK_GRAY)) + .forGoggles(tooltip, 1); + + isEmpty = false; + } + + if (tank.getTanks() > 1) { + if (isEmpty) + tooltip.remove(tooltip.size() - 1); + return true; + } + + if (!isEmpty) + return true; + + Lang.translate("gui.goggles.fluid_container.capacity") + .add(Lang.number(tank.getTankCapacity(0)) + .add(mb) + .style(ChatFormatting.GOLD)) + .style(ChatFormatting.DARK_GRAY) + .forGoggles(tooltip, 1); + + + return true; + } + + + public int getOutputCount(){ + BlockPos checkedPos = this.getBlockPos().above(3); + int outputCount = 1; + + for(int i = 0; i <5;i++){ + if( + level.getBlockState(checkedPos).is(TFMGBlocks.STEEL_DISTILLATION_OUTPUT.get())&& + level.getBlockState(checkedPos.below()).is(TFMGBlocks.ALUMINUM_BLOCK.get()) + ){ + outputCount++; + checkedPos = checkedPos.above(2); + continue; + } + return outputCount; + + } + + + return outputCount; + } + + + + + public SteelTankBlockEntity getTank() { + SteelTankBlockEntity tank = source.get(); + if (tank == null || tank.isRemoved()) { + if (tank != null) + source = new WeakReference<>(null); + Direction facing = DistillationControllerBlock.getFacing(getBlockState()); + BlockEntity be = level.getBlockEntity(worldPosition.relative(facing.getOpposite())); + if (be instanceof SteelTankBlockEntity tankTe) + source = new WeakReference<>(tank = tankTe); + } + if (tank == null) + return null; + return (SteelTankBlockEntity) tank.getControllerBE(); + } + + +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlock.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlock.java new file mode 100644 index 00000000..6d9722f5 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlock.java @@ -0,0 +1,42 @@ +package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; + + +import com.drmangotea.tfmg.registry.TFMGBlockEntities; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; + +public class DistillationOutputBlock extends Block implements IBE { + + public DistillationOutputBlock(Properties properties) { + super(properties); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) { + return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.below())); + } + + + @Override + public Class getBlockEntityClass() { + return DistillationOutputBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return TFMGBlockEntities.STEEL_DISTILLATION_OUTPUT.get(); + } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlockEntity.java new file mode 100644 index 00000000..b106eb7a --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationOutputBlockEntity.java @@ -0,0 +1,393 @@ +package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; + + + +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryOutputBlockEntity; +import com.drmangotea.tfmg.recipes.distillation.ItemlessRecipe; +import com.drmangotea.tfmg.recipes.distillation.AdvancedDistillationRecipe; +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.drmangotea.tfmg.registry.TFMGRecipeTypes; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.content.kinetics.press.MechanicalPressBlockEntity; +import com.simibubi.create.foundation.recipe.RecipeFinder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Container; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.block.Block; +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.minecraftforge.common.crafting.IShapedRecipe; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.checkerframework.checker.units.qual.C; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class DistillationOutputBlockEntity extends DistilleryOutputBlockEntity implements IHaveGoggleInformation { + + private static final Object AdvancedDistillationRecipesKey = new Object(); + + public int speed=3; + public int processTimer=0; + + public int foundOutputs=0; + public int recipeOutputs=6; + + public DistillationOutputBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + protected boolean matchItemlessRecipe(Recipe recipe) { + if (recipe == null) + return false; + Optional controller = getDistillationController(); + if (!controller.isPresent()) + return false; + return ItemlessRecipe.match2(controller.get(), recipe); + } + + @Override + protected boolean updateController() { + + + if (level == null || level.isClientSide) + return true; + + List> recipes = getMatchingRecipes(); + if (recipes.isEmpty()) + return true; + currentRecipe = recipes.get(0); + startProcessing(); + sendData(); + return true; + } + + + @Override + public void tick() { + super.tick(); + + + if (level != null) { + if ((!level.isClientSide || isVirtual())) { + process(); + sendData(); + } + } + if (syncCooldown > 0) { + syncCooldown--; + if (syncCooldown == 0 && queuedSync) + sendData(); + } + } + @Override + protected void process() { + updateController(); + + if (currentRecipe == null) + return; + + + + // if((currentRecipe instanceof ShapelessRecipe)) + // return; + + BlockEntity above1 = level.getBlockEntity(this.getBlockPos().above(2)); + BlockEntity above2 = level.getBlockEntity(this.getBlockPos().above(4)); + BlockEntity above3 = level.getBlockEntity(this.getBlockPos().above(6)); + BlockEntity above4 = level.getBlockEntity(this.getBlockPos().above(8)); + BlockEntity above5 = level.getBlockEntity(this.getBlockPos().above(10)); + + + + + + Optional optionalController = getDistillationController(); + if (!optionalController.isPresent()) + return; + foundOutputs = 1; + + if(above1 instanceof DistillationOutputBlockEntity) + foundOutputs = 2; + + + if(above2 instanceof DistillationOutputBlockEntity) { + if(foundOutputs==2) { + foundOutputs = 3; + }else foundOutputs = 1; + } + + + if(above3 instanceof DistillationOutputBlockEntity) { + if(foundOutputs==3) { + foundOutputs = 4; + }else foundOutputs = 2; + } + + if(above4 instanceof DistillationOutputBlockEntity) { + if(foundOutputs==4) { + foundOutputs = 5; + }else foundOutputs = 3; + } + if(above5 instanceof DistillationOutputBlockEntity) { + if(foundOutputs==5) { + foundOutputs = 6; + }else foundOutputs = 4; + } + + + + + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe)currentRecipe)>foundOutputs) + return; + FluidStack fluidInRecipe1=null; + FluidStack fluidInRecipe2=null; + FluidStack fluidInRecipe3=null; + FluidStack fluidInRecipe4=null; + FluidStack fluidInRecipe5=null; + FluidStack fluidInRecipe6=null; + + fluidInRecipe1 = ((AdvancedDistillationRecipe) currentRecipe).getFirstFluidResult(); + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=2) + fluidInRecipe2 = ((AdvancedDistillationRecipe) currentRecipe).getSecondFluidResult(); + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=3) + fluidInRecipe3 = ((AdvancedDistillationRecipe) currentRecipe).getThirdFluidResult(); + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=4) + fluidInRecipe4 = ((AdvancedDistillationRecipe) currentRecipe).getFourthFluidResult(); + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=5) + fluidInRecipe5 = ((AdvancedDistillationRecipe) currentRecipe).getFifthFluidResult(); + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=6) + fluidInRecipe6 = ((AdvancedDistillationRecipe) currentRecipe).getSixthFluidResult(); + + + + + if(!hasIndustrialPipes(foundOutputs)) + return; + +// + if (fluidInRecipe1.getFluid() != this.tankInventory.getFluid().getFluid() + && tankInventory.getFluidAmount()!=0 + ) + return; +if(fluidInRecipe2!=null) + if(above1 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=2) + if (fluidInRecipe2.getFluid() != (((DistillationOutputBlockEntity) above1).tankInventory.getFluid().getFluid()) + &&((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()!=0 + ) + return; + if(fluidInRecipe3!=null) + if(above2 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=3) + if (fluidInRecipe3.getFluid() != (((DistillationOutputBlockEntity) above2).tankInventory.getFluid().getFluid()) + &&((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()!=0 + ) + return; + if(fluidInRecipe4!=null) + if(above3 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=4) + if (fluidInRecipe4.getFluid() != (((DistillationOutputBlockEntity) above3).tankInventory.getFluid().getFluid()) + &&((DistillationOutputBlockEntity) above3).tankInventory.getFluidAmount()!=0 + ) + return; + if(fluidInRecipe5!=null) + if(above4 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=5) + if (fluidInRecipe5.getFluid() != (((DistillationOutputBlockEntity) above4).tankInventory.getFluid().getFluid()) + &&((DistillationOutputBlockEntity) above4).tankInventory.getFluidAmount()!=0 + ) + return; + if(fluidInRecipe6!=null) + if(above5 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=6) + if (fluidInRecipe6.getFluid() != (((DistillationOutputBlockEntity) above5).tankInventory.getFluid().getFluid()) + &&((DistillationOutputBlockEntity) above5).tankInventory.getFluidAmount()!=0 + ) + return; +// + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=1) + if(tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getFirstFluidResult().getAmount()>8000) + return; + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=2) + if(((DistillationOutputBlockEntity)above1).tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getSecondFluidResult().getAmount()>8000) + return; + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=3) + if(((DistillationOutputBlockEntity)above2).tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getThirdFluidResult().getAmount()>8000) + return; + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=4) + if(((DistillationOutputBlockEntity)above3).tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getFourthFluidResult().getAmount()>8000) + return; + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=5) + if(((DistillationOutputBlockEntity)above4).tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getFifthFluidResult().getAmount()>8000) + return; + if(((AdvancedDistillationRecipe) currentRecipe).getOutputCount((AdvancedDistillationRecipe) currentRecipe)>=6) + if(((DistillationOutputBlockEntity)above5).tankInventory.getFluidAmount()+((AdvancedDistillationRecipe) currentRecipe).getSixthFluidResult().getAmount()>8000) + return; + + if(getDistillationController().get().getTanks().get(true).getPrimaryHandler().getFluid().getFluid() != ((AdvancedDistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid()) + return; + + DistillationControllerBlockEntity controller = optionalController.get(); + + + + if (!controller.getTanks().get(true).isEmpty()) { + if(!level.isClientSide) { + // if(((AdvancedDistillationRecipe)currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid() != TFMGFluids.HEAVY_OIL.get()) + // return; + if(!controller.hasTank) + return; + if(controller.towerLevel<4) + return; + + if(controller.towerLevel>=12) { + speed = 1; + } else speed=3; + + if(processTimer=2) + if (((AdvancedDistillationRecipe) currentRecipe).getResults().toArray().length>1) + ((DistillationOutputBlockEntity) above1).tankInventory.setFluid(new FluidStack(((AdvancedDistillationRecipe) currentRecipe).getSecondFluidResult().getFluid(), ((AdvancedDistillationRecipe) currentRecipe).getSecondFluidResult().getAmount() + ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount())); + if(above2 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=3) + if (((AdvancedDistillationRecipe) currentRecipe).getResults().toArray().length>2) + ((DistillationOutputBlockEntity) above2).tankInventory.setFluid(new FluidStack(((AdvancedDistillationRecipe) currentRecipe).getThirdFluidResult().getFluid(), ((AdvancedDistillationRecipe) currentRecipe).getThirdFluidResult().getAmount() + ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount())); + if(above3 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=4) + if (((AdvancedDistillationRecipe) currentRecipe).getResults().toArray().length>3) + ((DistillationOutputBlockEntity) above3).tankInventory.setFluid(new FluidStack(((AdvancedDistillationRecipe) currentRecipe).getFourthFluidResult().getFluid(), ((AdvancedDistillationRecipe) currentRecipe).getFourthFluidResult().getAmount() + ((DistillationOutputBlockEntity) above3).tankInventory.getFluidAmount())); + if(above4 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=5) + if (((AdvancedDistillationRecipe) currentRecipe).getResults().toArray().length>4) + ((DistillationOutputBlockEntity) above4).tankInventory.setFluid(new FluidStack(((AdvancedDistillationRecipe) currentRecipe).getFifthFluidResult().getFluid(), ((AdvancedDistillationRecipe) currentRecipe).getFifthFluidResult().getAmount() + ((DistillationOutputBlockEntity) above4).tankInventory.getFluidAmount())); + if(above5 instanceof DistillationOutputBlockEntity) + if(foundOutputs>=6) + if (((AdvancedDistillationRecipe) currentRecipe).getResults().toArray().length>5) + ((DistillationOutputBlockEntity) above5).tankInventory.setFluid(new FluidStack(((AdvancedDistillationRecipe) currentRecipe).getSixthFluidResult().getFluid(), ((AdvancedDistillationRecipe) currentRecipe).getSixthFluidResult().getAmount() + ((DistillationOutputBlockEntity) above5).tankInventory.getFluidAmount())); + +} +/* +if(!(((AdvancedDistillationRecipe) currentRecipe).getThirdItemResult().isEmpty())) + controller.outputInventory.setItem(2,((AdvancedDistillationRecipe) currentRecipe).getFirstItemResult()); + + + */ + + controller.notifyChangeOfContents(); + } + + + +} + + @Override + protected List> getMatchingRecipes() { + + + List> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters); + return list.stream() + .filter(this::matchItemlessRecipe) + .sorted((r1, r2) -> r2.getIngredients() + .size() + - r1.getIngredients() + .size()) + .collect(Collectors.toList()); + } + + @Override + protected boolean matchStaticFilters(Recipe r) { + return ((r instanceof CraftingRecipe && !(r instanceof IShapedRecipe) + && r.getIngredients() + .size() > 1 + && !MechanicalPressBlockEntity.canCompress(r)) && !AllRecipeTypes.shouldIgnoreInAutomation(r) + || r.getType() == TFMGRecipeTypes.ADVANCED_DISTILLATION.getType()); + } + + @Override + public void startProcessing() { + if (running ) + return; + super.startProcessing(); + running = true; + + } + + @Override + public boolean continueWithPreviousRecipe() { + return true; + } + + @Override + protected void onBasinRemoved() { + if (!running) + return; + + running = false; + } + + @Override + protected Object getRecipeCacheKey() { + return AdvancedDistillationRecipesKey; + } + + @Override + protected boolean isRunning() { + return running; + } +/* + @Override + protected Optional getProcessedRecipeTrigger() { + return Optional.of(AllAdvancements.MIXER); + } + */ + + + public Optional getDistillationController() { + if (level == null) + return Optional.empty(); + BlockEntity basinTE = level.getBlockEntity(worldPosition.below(1)); + if (!(basinTE instanceof DistillationControllerBlockEntity)) + return Optional.empty(); + return Optional.of((DistillationControllerBlockEntity) basinTE); + } + + public boolean hasIndustrialPipes(int outputAmount){ + BlockPos checkedPos = this.getBlockPos().above(); + Block checkedBlock; + + + for(int i = 0;i<(outputAmount-1);i++){ + checkedBlock = level.getBlockState(checkedPos).getBlock(); + if(checkedBlock == TFMGBlocks.ALUMINUM_BLOCK.get()){ + checkedPos=checkedPos.above(2); + continue; + } + return false; + } + return true; + } + +} + diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java new file mode 100644 index 00000000..9d0725f2 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java @@ -0,0 +1,400 @@ +package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; + + +import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock; +import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity; +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.drmangotea.tfmg.registry.TFMGFluids; +import com.simibubi.create.Create; +import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.content.fluids.tank.BoilerHeaters; +import com.simibubi.create.foundation.utility.Components; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import joptsimple.internal.Strings; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +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.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + +import static com.simibubi.create.foundation.fluid.FluidHelper.convertToStill; + +public class DistillationTowerData { + + static final int SAMPLE_RATE = 1; + + private static final int waterSupplyPerLevel = 10; + private static final float passiveEngineEfficiency = 0; + + private SteelTankBlockEntity tank; + + // pooled water supply + int gatheredSupply; + float[] supplyOverTime = new float[10]; + int ticksUntilNextSample; + int currentIndex; + + // heat score + public boolean needsHeatLevelUpdate; + public boolean passiveHeat; + public int activeHeat; + + public float oilSupply; + public int attachedControllers; + public int attachedWhistles; + + // display + public int maxHeatForSize = 0; + private int maxHeatForOil = 0; + private int minValue = 0; + private int maxValue = 0; + + public int towerLevel = Math.min(activeHeat, maxHeatForSize); + + public LerpedFloat gauge = LerpedFloat.linear(); + + public void tick(SteelTankBlockEntity controller) { + towerLevel = Math.min(activeHeat, maxHeatForSize); + tank=controller; + // tank.tankInventory.drain(2, IFluidHandler.FluidAction.EXECUTE); + + if (controller.getLevel().isClientSide) { + gauge.tickChaser(); + float current = gauge.getValue(1); + if (current > 1 && Create.RANDOM.nextFloat() < 1 / 2f) + gauge.setValueNoUpdate(current + Math.min(-(current - 1) * Create.RANDOM.nextFloat(), 0)); + return; + } + + if (needsHeatLevelUpdate && updateTemperature(controller)) + controller.notifyUpdate(); + ticksUntilNextSample--; + if (ticksUntilNextSample > 0) + return; + int capacity = controller.tankInventory.getCapacity(); + if (capacity == 0) + return; + + + ticksUntilNextSample = SAMPLE_RATE; + supplyOverTime[currentIndex] = gatheredSupply / (float) SAMPLE_RATE; + oilSupply = Math.max(oilSupply, supplyOverTime[currentIndex]); + currentIndex = (currentIndex + 1) % supplyOverTime.length; + gatheredSupply = 0; + + + if (currentIndex == 0) { + oilSupply = 0; + for (float i : supplyOverTime) + oilSupply = Math.max(i, oilSupply); + } + +/* + if (getActualHeat(controller.getTotalTankSize()) == 18) + controller.award(AllAdvancements.STEAM_ENGINE_MAXED); +*/ + controller.notifyUpdate(); + + } + + public int getTheoreticalHeatLevel() { + return activeHeat; + } + + public int getMaxHeatLevelForBoilerSize(int towerSize) { + return (int) Math.min(12, towerSize / 4); + } + + public int getMaxHeatLevelForOilSupply() { + return (int) Math.min(12, Mth.ceil(oilSupply) / waterSupplyPerLevel); + } + + public boolean isPassive() { + return passiveHeat && maxHeatForSize > 0 && maxHeatForOil > 0; + } + + public boolean isPassive(int towerSize) { + calcMinMaxForSize(towerSize); + return isPassive(); + } + + public float getTowerEfficiency(int towerSize) { + if (isPassive(towerSize)) + return 0; + if (activeHeat == 0) + return 0; + int actualHeat = getActualHeat(towerSize); + return this.towerLevel; + } + + public int getActualHeat(int towerSize) { + int forBoilerSize = getMaxHeatLevelForBoilerSize(towerSize); + int forWaterSupply = getMaxHeatLevelForOilSupply(); + int actualHeat = Math.min(activeHeat, Math.min(forWaterSupply, forBoilerSize)); + return actualHeat; + } + + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking, int towerSize) { + if (!isActive()) + return false; + + Component indent = Components.literal(IHaveGoggleInformation.spacing); + Component indent2 = Components.literal(IHaveGoggleInformation.spacing + " "); + + calcMinMaxForSize(towerSize); + + tooltip.add(indent.plainCopy() + .append( + Lang.translateDirect("distillation_tower.status", getHeatLevelTextComponent().withStyle(ChatFormatting.AQUA)))); + tooltip.add(indent2.plainCopy() + .append(getSizeComponent(true, false))); + // tooltip.add(indent2.plainCopy() + //.append(getOilComponent(true, false))); + tooltip.add(indent2.plainCopy() + .append(getHeatComponent(true, false))); + + if (attachedControllers == 0) + return true; + + int boilerLevel = Math.min(activeHeat, maxHeatForSize); + + + tooltip.add(Components.immutableEmpty()); + + return true; + } + + public void calcMinMaxForSize(int towerSize) { + maxHeatForSize = getMaxHeatLevelForBoilerSize(towerSize); + maxHeatForOil = getMaxHeatLevelForOilSupply(); + + minValue = Math.min(passiveHeat ? 1 : activeHeat, Math.min(maxHeatForOil, maxHeatForSize)); + maxValue = Math.max(passiveHeat ? 1 : activeHeat, Math.max(maxHeatForOil, maxHeatForSize)); + } + + @NotNull + public MutableComponent getHeatLevelTextComponent() { + int boilerLevel = Math.min(activeHeat, Math.min(maxHeatForOil, maxHeatForSize)); + + return isPassive() ? Lang.translateDirect("boiler.passive") + : (boilerLevel == 0 ? Lang.translateDirect("boiler.idle") + : boilerLevel == 18 ? Lang.translateDirect("boiler.max_lvl") + : Lang.translateDirect("boiler.lvl", String.valueOf(boilerLevel))); + } + + public MutableComponent getSizeComponent(boolean forGoggles, boolean useBlocksAsBars, ChatFormatting... styles) { + return componentHelper("size", maxHeatForSize, forGoggles, useBlocksAsBars, styles); + } +/* + public MutableComponent getOilComponent(boolean forGoggles, boolean useBlocksAsBars, ChatFormatting... styles) { + return componentHelper("crude_oil", maxHeatForOil, forGoggles, useBlocksAsBars, styles); + } + + */ + + public MutableComponent getHeatComponent(boolean forGoggles, boolean useBlocksAsBars, ChatFormatting... styles) { + return componentHelper("heat", passiveHeat ? 1 : activeHeat, forGoggles, useBlocksAsBars, styles); + } + + private MutableComponent componentHelper(String label, int level, boolean forGoggles, boolean useBlocksAsBars, + ChatFormatting... styles) { + MutableComponent base = useBlocksAsBars ? blockComponent(level) : barComponent(level); + + if (!forGoggles) + return base; + + ChatFormatting style1 = styles.length >= 1 ? styles[0] : ChatFormatting.GRAY; + ChatFormatting style2 = styles.length >= 2 ? styles[1] : ChatFormatting.DARK_GRAY; + + return Lang.translateDirect("distillation_tower." + label) + .withStyle(style1) + .append(Lang.translateDirect("boiler." + label + "_dots") + .withStyle(style2)) + .append(base); + } + + private MutableComponent blockComponent(int level) { + return Components.literal( + "" + "\u2588".repeat(minValue) + "\u2592".repeat(level - minValue) + "\u2591".repeat(maxValue - level)); + } + + private MutableComponent barComponent(int level) { + return Components.empty() + .append(bars(Math.max(0, minValue - 1), ChatFormatting.DARK_GREEN)) + .append(bars(minValue > 0 ? 1 : 0, ChatFormatting.GREEN)) + .append(bars(Math.max(0, level - minValue), ChatFormatting.DARK_GREEN)) + .append(bars(Math.max(0, maxValue - level), ChatFormatting.DARK_RED)) + .append(bars(Math.max(0, Math.min(18 - maxValue, ((maxValue / 5 + 1) * 5) - maxValue)), + ChatFormatting.DARK_GRAY)); + + } + + private MutableComponent bars(int level, ChatFormatting format) { + return Components.literal(Strings.repeat('|', level)).withStyle(format); + } + + public boolean evaluate(SteelTankBlockEntity controller) { + BlockPos controllerPos = controller.getBlockPos(); + Level level = controller.getLevel(); + int prevEngines = attachedControllers; + int prevWhistles = attachedWhistles; + attachedControllers = 0; + attachedWhistles = 0; + + for (int yOffset = 0; yOffset < controller.height; yOffset++) { + for (int xOffset = 0; xOffset < controller.width; xOffset++) { + for (int zOffset = 0; zOffset < controller.width; zOffset++) { + + BlockPos pos = controllerPos.offset(xOffset, yOffset, zOffset); + BlockState blockState = level.getBlockState(pos); + if (!SteelTankBlock.isTank(blockState)) + continue; + for (Direction d : Iterate.directions) { + BlockPos attachedPos = pos.relative(d); + BlockState attachedState = level.getBlockState(attachedPos); + if (TFMGBlocks.STEEL_DISTILLATION_CONTROLLER.has(attachedState) && DistillationControllerBlock.getFacing(attachedState) == d) + attachedControllers++; + + } + } + } + } + + needsHeatLevelUpdate = true; + return prevEngines != attachedControllers || prevWhistles != attachedWhistles; + } + + + + public boolean updateTemperature(SteelTankBlockEntity controller) { + BlockPos controllerPos = controller.getBlockPos(); + Level level = controller.getLevel(); + needsHeatLevelUpdate = false; + + boolean prevPassive = passiveHeat; + int prevActive = activeHeat; + passiveHeat = false; + activeHeat = 0; + + for (int xOffset = 0; xOffset < controller.width; xOffset++) { + for (int zOffset = 0; zOffset < controller.width; zOffset++) { + BlockPos pos = controllerPos.offset(xOffset, -1, zOffset); + BlockState blockState = level.getBlockState(pos); + float heat = BoilerHeaters.getActiveHeat(level, pos, blockState); + if (heat == 0) { + passiveHeat = true; + } else if (heat > 0) { + activeHeat += heat; + } + } + } + + passiveHeat &= activeHeat == 0; + + return prevActive != activeHeat || prevPassive != passiveHeat; + } + + public boolean isActive() { + return attachedControllers == 1; + } + + public void clear() { + oilSupply = 0; + activeHeat = 0; + passiveHeat = false; + attachedControllers = 0; + Arrays.fill(supplyOverTime, 0); + } + + public CompoundTag write() { + CompoundTag nbt = new CompoundTag(); + nbt.putFloat("Supply", oilSupply); + nbt.putInt("ActiveHeat", activeHeat); + nbt.putBoolean("PassiveHeat", passiveHeat); + nbt.putInt("Engines", attachedControllers); + nbt.putInt("Whistles", attachedWhistles); + nbt.putBoolean("Update", needsHeatLevelUpdate); + return nbt; + } + + public void read(CompoundTag nbt, int towerSize) { + oilSupply = nbt.getFloat("Supply"); + activeHeat = nbt.getInt("ActiveHeat"); + passiveHeat = nbt.getBoolean("PassiveHeat"); + attachedControllers = nbt.getInt("Engines"); + attachedWhistles = nbt.getInt("Whistles"); + needsHeatLevelUpdate = nbt.getBoolean("Update"); + Arrays.fill(supplyOverTime, (int) oilSupply); + + int forBoilerSize = getMaxHeatLevelForBoilerSize(towerSize); + int forOilSupply = getMaxHeatLevelForOilSupply(); + int actualHeat = Math.min(activeHeat, Math.min(forOilSupply, forBoilerSize)); + float target = isPassive(towerSize) ? 1 / 8f : forBoilerSize == 0 ? 0 : actualHeat / (forBoilerSize * 1f); + gauge.chase(target, 0.125f, Chaser.EXP); + } + + public DistillationFluidHandler createHandler() { + return new DistillationFluidHandler(); + } + + public class DistillationFluidHandler implements IFluidHandler { + + @Override + public int getTanks() { + return 1; + } + + @Override + public FluidStack getFluidInTank(int tank) { + return FluidStack.EMPTY; + } + + @Override + public int getTankCapacity(int tank) { + return 10000; + } + + @Override + public boolean isFluidValid(int tank, FluidStack stack) { + return false; + } + public static boolean isOil(Fluid fluid) { + return convertToStill(fluid) == TFMGFluids.CRUDE_OIL.get(); + } + @Override + public int fill(FluidStack resource, FluidAction action) { + if (!isFluidValid(0, resource)) + return 0; + int amount = resource.getAmount(); + if (action.execute()) + gatheredSupply += amount; + return amount; + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + return FluidStack.EMPTY; + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + return FluidStack.EMPTY; + } + + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryControllerBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryControllerBlockEntity.java index 105f084e..685cbdcb 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryControllerBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryControllerBlockEntity.java @@ -40,17 +40,17 @@ import java.util.*; public class DistilleryControllerBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation { public SmartFluidTankBehaviour inputTank; - protected SmartInventory outputInventory; - protected SmartFluidTankBehaviour outputTank; + public SmartInventory outputInventory; + public SmartFluidTankBehaviour outputTank; - private boolean contentsChanged; + public boolean contentsChanged; - private Couple tanks; + public Couple tanks; public LazyOptional itemCapability; protected LazyOptional fluidCapability; - int recipeBackupCheck; + public int recipeBackupCheck; public DistilleryControllerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -182,7 +182,7 @@ public class DistilleryControllerBlockEntity extends SmartBlockEntity implements - private Optional getOperator() { + protected Optional getOperator() { if (level == null) return Optional.empty(); BlockEntity te = level.getBlockEntity(worldPosition.above()); diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryOutputBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryOutputBlockEntity.java index d64e46aa..fefbe0e2 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryOutputBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillery/DistilleryOutputBlockEntity.java @@ -3,6 +3,7 @@ package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distill import com.drmangotea.tfmg.CreateTFMG; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.FluidProcessingBlockEntity; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationOutputBlockEntity; import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe; import com.drmangotea.tfmg.registry.TFMGRecipeTypes; import com.simibubi.create.AllRecipeTypes; @@ -132,7 +133,8 @@ public class DistilleryOutputBlockEntity extends FluidProcessingBlockEntity impl @Override public void tick() { super.tick(); - + if(this instanceof DistillationOutputBlockEntity) + return; if (level != null) { @@ -214,15 +216,19 @@ if(above1 !=null&& above2 !=null ) return; - + if( + tankInventory.getFluidAmount()+((DistillationRecipe) currentRecipe).getFirstFluidResult().getAmount()>8000|| + ((DistilleryOutputBlockEntity)above1).tankInventory.getFluidAmount()+((DistillationRecipe) currentRecipe).getFirstFluidResult().getAmount()>8000|| + ((DistilleryOutputBlockEntity)above2).tankInventory.getFluidAmount()+((DistillationRecipe) currentRecipe).getFirstFluidResult().getAmount()>8000 + ) + return; if(getController().get().getTanks().get(true).getPrimaryHandler().getFluid().getFluid() != ((DistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid()) return; DistilleryControllerBlockEntity controller = optionalController.get(); - IFluidHandler availableFluids = controller.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - .orElse(null); + if(controller.outputInventory.getStackInSlot(0).getCount()>=1|| controller.outputInventory.getStackInSlot(1).getCount()>=1|| @@ -318,12 +324,6 @@ if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty())) protected boolean isRunning() { return running; } -/* - @Override - protected Optional getProcessedRecipeTrigger() { - return Optional.of(AllAdvancements.MIXER); - } - */ @@ -340,7 +340,6 @@ if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty())) } - @Override public void sendData() { if (syncCooldown > 0) { diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java b/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java index 034838eb..9aabab1d 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java @@ -1,6 +1,7 @@ package com.drmangotea.tfmg.content.machines.tanks; +import com.drmangotea.tfmg.registry.TFMGPartialModels; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -29,8 +30,8 @@ public class SteelFluidTankRenderer extends SafeBlockEntityRenderer=13){ - ////// gaugeRotation=90; - ////// } else - ////// if(level>=4){ - ////// gaugeRotation=45; - ////// } else{ - ////// gaugeRotation=0; - ////// } + if(level>=12){ + gaugeRotation=90; + } else + if(level>=4){ + gaugeRotation=45; + } else{ + gaugeRotation=0; + } } @@ -478,7 +479,7 @@ public class SteelTankBlockEntity extends FluidTankBlockEntity implements IHaveG if (updateConnectivity) compound.putBoolean("Uninitialized", true); - /////// compound.put("Boiler", tower.write()); + compound.put("Boiler", tower.write()); if (lastKnownPos != null) compound.put("LastKnownPos", NbtUtils.writeBlockPos(lastKnownPos)); if (!isController()) @@ -490,8 +491,6 @@ public class SteelTankBlockEntity extends FluidTankBlockEntity implements IHaveG compound.putInt("Height", height); } compound.putInt("Luminosity", luminosity); - // super.write(compound, clientPacket); - //super.saveAdditional(compound); forEachBehaviour(tb -> tb.write(compound, clientPacket)); diff --git a/src/main/java/com/drmangotea/tfmg/recipes/distillation/advanced/AdvancedDistillationRecipe.java b/src/main/java/com/drmangotea/tfmg/recipes/distillation/AdvancedDistillationRecipe.java similarity index 72% rename from src/main/java/com/drmangotea/tfmg/recipes/distillation/advanced/AdvancedDistillationRecipe.java rename to src/main/java/com/drmangotea/tfmg/recipes/distillation/AdvancedDistillationRecipe.java index 0ba2a6ec..51daac1e 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/distillation/advanced/AdvancedDistillationRecipe.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/distillation/AdvancedDistillationRecipe.java @@ -1,11 +1,11 @@ -package com.drmangotea.tfmg.recipes.distillation.advanced; +package com.drmangotea.tfmg.recipes.distillation; -import com.drmangotea.tfmg.recipes.distillation.ItemlessRecipe; import com.drmangotea.tfmg.registry.TFMGRecipeTypes; import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; import com.simibubi.create.foundation.fluid.FluidIngredient; +import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -38,13 +38,22 @@ public class AdvancedDistillationRecipe extends ItemlessRecipe { return fluidResults.get(5); } - public ItemStack getFirstItemResult(){ - return results.get(0).getStack(); + + public int getOutputCount(AdvancedDistillationRecipe recipe){ + return recipe.fluidResults.toArray().length; } - public ItemStack getSecondItemResult(){ - return results.get(1).getStack(); + public NonNullList getResults(){ + return fluidResults; } - public ItemStack getThirdItemResult(){ - return results.get(2).getStack(); + + + @Override + protected int getMaxFluidOutputCount() { + return 6; + } + + @Override + protected int getMaxOutputCount() { + return 0; } } diff --git a/src/main/java/com/drmangotea/tfmg/recipes/distillation/ItemlessRecipe.java b/src/main/java/com/drmangotea/tfmg/recipes/distillation/ItemlessRecipe.java index 22a4586f..eea4d71b 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/distillation/ItemlessRecipe.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/distillation/ItemlessRecipe.java @@ -1,5 +1,6 @@ package com.drmangotea.tfmg.recipes.distillation; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.recipe.ProcessingRecipe; @@ -10,7 +11,6 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; @@ -22,7 +22,6 @@ import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedList; import java.util.List; public class ItemlessRecipe extends ProcessingRecipe { @@ -33,9 +32,6 @@ public class ItemlessRecipe extends ProcessingRecipe { if(recipe instanceof ItemlessRecipe) { - - - return apply(controller, recipe, true); } @@ -44,8 +40,8 @@ public class ItemlessRecipe extends ProcessingRecipe { } - public static boolean apply(DistilleryControllerBlockEntity basin, Recipe recipe) { - return apply(basin, recipe, false); + public static boolean apply(DistilleryControllerBlockEntity controller, Recipe recipe) { + return apply(controller, recipe, false); } private static boolean apply(DistilleryControllerBlockEntity controller, Recipe recipe, boolean test) { @@ -133,8 +129,102 @@ public class ItemlessRecipe extends ProcessingRecipe { return true; } + public static boolean match2(DistillationControllerBlockEntity controller, Recipe recipe) { + if(recipe instanceof ItemlessRecipe) { + return apply(controller, recipe, true); + } + + + return false; + + } + private static boolean apply2(DistillationControllerBlockEntity controller, Recipe recipe, boolean test) { + boolean isItemlessRecipe = recipe instanceof ItemlessRecipe; + IItemHandler availableItems = controller.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + .orElse(null); + IFluidHandler availableFluids = controller.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + .orElse(null); + + if (availableItems == null || availableFluids == null) + return false; + + BlazeBurnerBlock.HeatLevel heat = DistilleryControllerBlockEntity.getHeatLevelOf(controller.getLevel() + .getBlockState(controller.getBlockPos() + .below(1))); + if (isItemlessRecipe && !((ItemlessRecipe) recipe).getRequiredHeat() + .testBlazeBurner(heat)) + return false; + + List recipeOutputItems = new ArrayList<>(); + List recipeOutputFluids = new ArrayList<>(); + + + List fluidIngredients = + isItemlessRecipe ? ((ItemlessRecipe) recipe).getFluidIngredients() : Collections.emptyList(); + if(!fluidIngredients.isEmpty()) + + + + + for (boolean simulate : Iterate.trueAndFalse) { + + if (!simulate && test) + return true; + + int[] extractedFluidsFromTank = new int[availableFluids.getTanks()]; + + + boolean fluidsAffected = false; + FluidIngredients: for (int i = 0; i < fluidIngredients.size(); i++) { + FluidIngredient fluidIngredient = fluidIngredients.get(i); + int amountRequired = fluidIngredient.getRequiredAmount(); + + + for (int tank = 0; tank < availableFluids.getTanks(); tank++) { + FluidStack fluidStack = availableFluids.getFluidInTank(tank); + if (simulate && fluidStack.getAmount() <= extractedFluidsFromTank[tank]) + continue; + if (!fluidIngredient.test(fluidStack)) + continue; + int drainedAmount = Math.min(amountRequired, fluidStack.getAmount()); + if (!simulate) { + fluidStack.shrink(drainedAmount); + fluidsAffected = true; + } + amountRequired -= drainedAmount; + if (amountRequired != 0) + continue; + extractedFluidsFromTank[tank] += drainedAmount; + continue FluidIngredients; + } + + // something wasn't found + return false; + } + + if (fluidsAffected) { + controller.getBehaviour(SmartFluidTankBehaviour.INPUT) + .forEach(SmartFluidTankBehaviour.TankSegment::onFluidStackChanged); + controller.getBehaviour(SmartFluidTankBehaviour.OUTPUT) + .forEach(SmartFluidTankBehaviour.TankSegment::onFluidStackChanged); + } + + if (simulate) { + if (recipe instanceof ItemlessRecipe ItemlessRecipe) { + recipeOutputItems.addAll(ItemlessRecipe.rollResults()); + recipeOutputFluids.addAll(ItemlessRecipe.getFluidResults()); + + } else { + recipeOutputItems.add(recipe.getResultItem()); + } + } + + } + + return true; + } protected ItemlessRecipe(IRecipeTypeInfo type, ProcessingRecipeBuilder.ProcessingRecipeParams params) { super(type, params); @@ -158,7 +248,7 @@ public class ItemlessRecipe extends ProcessingRecipe { @Override protected int getMaxFluidOutputCount() { - return 6; + return 3; } @Override diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/AdvancedDistillationCategory.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/AdvancedDistillationCategory.java new file mode 100644 index 00000000..54aa38b2 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/AdvancedDistillationCategory.java @@ -0,0 +1,78 @@ +package com.drmangotea.tfmg.recipes.jei; + + + + +import com.drmangotea.tfmg.recipes.distillation.AdvancedDistillationRecipe; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.compat.jei.category.CreateRecipeCategory; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import mezz.jei.api.forge.ForgeTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class AdvancedDistillationCategory extends CreateRecipeCategory { + + private final AnimatedDistiller distiller = new AnimatedDistiller(); + + public AdvancedDistillationCategory(Info info) { + super(info); + } + + + + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, AdvancedDistillationRecipe recipe, IFocusGroup focuses) { + FluidIngredient fluidIngredient=recipe.getInputFluid(); + + + builder + .addSlot(RecipeIngredientRole.INPUT, 2, 75) + .setBackground(getRenderedSlot(), -1, -1) + .addIngredients(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getInputFluid().getMatchingFluidStacks())) + .addTooltipCallback(addFluidTooltip(recipe.getInputFluid().getRequiredAmount())); + + + + builder + .addSlot(RecipeIngredientRole.OUTPUT,150, 55) + .setBackground(getRenderedSlot(), -1, -1) + .addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getFirstFluidResult())) + .addTooltipCallback(addFluidTooltip(recipe.getFirstFluidResult().getAmount())); + builder + .addSlot(RecipeIngredientRole.OUTPUT,150, 33) + .setBackground(getRenderedSlot(), -1, -1) + .addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getSecondFluidResult())) + .addTooltipCallback(addFluidTooltip(recipe.getSecondFluidResult().getAmount())); + + builder + .addSlot(RecipeIngredientRole.OUTPUT,150, 12) + .setBackground(getRenderedSlot(), -1, -1) + .addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getThirdFluidResult())) + .addTooltipCallback(addFluidTooltip(recipe.getThirdFluidResult().getAmount())); + + + + + } + + @Override + public void draw(AdvancedDistillationRecipe recipe, IRecipeSlotsView iRecipeSlotsView, PoseStack matrixStack, double mouseX, double mouseY) { + distiller + .draw(matrixStack, 65, 27); + AllGuiTextures.JEI_ARROW.render(matrixStack, 20, 80); + AllGuiTextures.JEI_ARROW.render(matrixStack, 100, 14); + AllGuiTextures.JEI_ARROW.render(matrixStack, 100, 35); + AllGuiTextures.JEI_ARROW.render(matrixStack, 100, 57); + AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 100, 79); + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/TFMGJei.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/TFMGJei.java index e9a895b4..839c1066 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/jei/TFMGJei.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/TFMGJei.java @@ -2,6 +2,7 @@ package com.drmangotea.tfmg.recipes.jei; import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe; +import com.drmangotea.tfmg.recipes.distillation.AdvancedDistillationRecipe; import com.drmangotea.tfmg.registry.TFMGBlocks; import com.drmangotea.tfmg.registry.TFMGFluids; import com.drmangotea.tfmg.registry.TFMGRecipeTypes; @@ -60,7 +61,18 @@ public class TFMGJei implements IModPlugin { .catalyst(TFMGBlocks.CAST_IRON_DISTILLATION_CONTROLLER::get) .itemIcon(TFMGFluids.CRUDE_OIL.getBucket().get()) .emptyBackground(177, 123) - .build("distillation", DistillationCategory::new); + .build("distillation", DistillationCategory::new) + , + + advancedDistillation = builder(AdvancedDistillationRecipe.class) + .addTypedRecipes(TFMGRecipeTypes.ADVANCED_DISTILLATION) + .catalyst(TFMGBlocks.CAST_IRON_DISTILLATION_CONTROLLER::get) + .itemIcon(TFMGFluids.KEROSENE.getBucket().get()) + .emptyBackground(177, 123) + .build("advanced_distillation", AdvancedDistillationCategory::new) + + + ; } diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java index 74059a21..6a54c939 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java @@ -7,6 +7,8 @@ import com.drmangotea.tfmg.content.decoration.doors.TFMGSlidingDoorRenderer; import com.drmangotea.tfmg.content.deposits.FluidDepositBlockEntity; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerRenderer; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerTileEntity; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlockEntity; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationOutputBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryOutputBlockEntity; import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity; @@ -103,15 +105,25 @@ public class TFMGBlockEntities { public static final BlockEntityEntry CAST_IRON_DISTILLATION_OUTPUT = REGISTRATE - .blockEntity("distiller", DistilleryOutputBlockEntity::new) + .blockEntity("distillery", DistilleryOutputBlockEntity::new) .validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_OUTPUT) .register(); public static final BlockEntityEntry CAST_IRON_DISTILLATION_CONTROLLER = REGISTRATE - .blockEntity("distiller_controller", DistilleryControllerBlockEntity::new) + .blockEntity("distillery_controller", DistilleryControllerBlockEntity::new) .validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_CONTROLLER) .register(); + public static final BlockEntityEntry STEEL_DISTILLATION_OUTPUT = REGISTRATE + .blockEntity("distillation_tower_output", DistillationOutputBlockEntity::new) + .validBlocks(TFMGBlocks.STEEL_DISTILLATION_OUTPUT) + .register(); + + public static final BlockEntityEntry STEEL_DISTILLATION_CONTROLLER = REGISTRATE + .blockEntity("distillation_tower_controller", DistillationControllerBlockEntity::new) + .validBlocks(TFMGBlocks.STEEL_DISTILLATION_CONTROLLER) + .register(); + public static void register() {} } diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java index fb1d7317..a5bea9a3 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java @@ -10,6 +10,8 @@ import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombBlock; import com.drmangotea.tfmg.content.items.CoalCokeBlockItem; import com.drmangotea.tfmg.content.items.FossilstoneItem; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerBlock; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlock; +import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationOutputBlock; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlock; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryOutputBlock; import com.drmangotea.tfmg.content.machines.pipes.normal.steel.EncasedSteelPipeBlock; @@ -255,7 +257,21 @@ public class TFMGBlocks { .build() .register(); // - +public static final BlockEntry STEEL_DISTILLATION_OUTPUT = + REGISTRATE.block("steel_distillation_output", DistillationOutputBlock::new) + .initialProperties(SharedProperties::copperMetal) + .properties(p -> p.color(MaterialColor.STONE)) + .properties(BlockBehaviour.Properties::noOcclusion) + .transform(axeOrPickaxe()) + .item(AssemblyOperatorBlockItem::new) + .build() + .register(); + public static final BlockEntry STEEL_DISTILLATION_CONTROLLER = + REGISTRATE.block("steel_distillation_controller", DistillationControllerBlock::new) + .initialProperties(SharedProperties::copperMetal) + .item() + .build() + .register(); ////// diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java index db6aecd5..e687d189 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java @@ -18,6 +18,7 @@ import java.util.Map; public class TFMGPartialModels { public static final PartialModel + TOWER_GAUGE = block("distillation_tower/gauge"), STEEL_FLUID_PIPE_CASING = block("steel_pipe/casing"), SURFACE_SCANNER_DIAL = block("surface_scanner/dial"), SURFACE_SCANNER_FLAG = block("surface_scanner/flag"), diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java index 209f1468..b428f3da 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java @@ -3,7 +3,7 @@ package com.drmangotea.tfmg.registry; import com.drmangotea.tfmg.CreateTFMG; import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe; -import com.drmangotea.tfmg.recipes.distillation.advanced.AdvancedDistillationRecipe; +import com.drmangotea.tfmg.recipes.distillation.AdvancedDistillationRecipe; import com.google.common.collect.ImmutableSet; import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeFactory; import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; diff --git a/src/main/resources/assets/tfmg/lang/default/interface.json b/src/main/resources/assets/tfmg/lang/default/interface.json index eae3c3d9..16e84860 100644 --- a/src/main/resources/assets/tfmg/lang/default/interface.json +++ b/src/main/resources/assets/tfmg/lang/default/interface.json @@ -5,9 +5,16 @@ "create.goggles.misc.dot_one": ".", "create.goggles.misc.dot_two": "..", "create.goggles.misc.dot_three": "...", + "create.goggles.fluid_in_tank": "Fluid In Tank:", "create.goggles.surface_scanner.no_rotation": "No Rotation Provided", "create.goggles.surface_scanner.no_deposit": "No Deposit Found", "create.goggles.surface_scanner.deposit_found": "Found Deposit", "create.goggles.surface_scanner.distance": "Distance: %1$s Blocks", - "create.goggles.surface_scanner.scanning_surface": "Scanning Surface" + "create.goggles.surface_scanner.scanning_surface": "Scanning Surface", + "create.goggles.distillation_tower.status": "Distillation Tower Info:", + "create.goggles.distillation_tower.tank_not_found": "Steel Fluid Tank Not Found", + "create.goggles.distillation_tower.not_tall_enough": "Distillation Tower is Not Tall Enough", + "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", + "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", + "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found" } \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/distillation_tower/gauge.json b/src/main/resources/assets/tfmg/models/block/distillation_tower/gauge.json new file mode 100644 index 00000000..e8e721c0 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/distillation_tower/gauge.json @@ -0,0 +1,37 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "tfmg:block/gauge", + "2": "create:block/gauge", + "particle": "tfmg:block/gauge" + }, + "elements": [ + { + "name": "GaugeButton", + "from": [15.5, 5.2, 5.2], + "to": [16.5, 6.3, 6.3], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 8]}, + "faces": { + "north": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, + "east": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, + "south": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, + "west": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, + "up": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, + "down": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"} + } + }, + { + "name": "GuageMetalBack", + "from": [14, 3.05, 3.05], + "to": [15.95, 12.95, 12.95], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]}, + "faces": { + "north": {"uv": [11, 0, 13, 10], "texture": "#1"}, + "east": {"uv": [0, 0, 10, 10], "texture": "#1"}, + "south": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"}, + "up": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"}, + "down": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller.png b/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 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 QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_output.png b/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_output.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 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 QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_distillation_controller.png b/src/main/resources/assets/tfmg/textures/block/steel_distillation_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 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 QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_distillation_output.png b/src/main/resources/assets/tfmg/textures/block/steel_distillation_output.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 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 QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/tfmg/recipes/fractional_distillation/heavy_oil.json b/src/main/resources/data/tfmg/recipes/fractional_distillation/heavy_oil.json new file mode 100644 index 00000000..ab50b602 --- /dev/null +++ b/src/main/resources/data/tfmg/recipes/fractional_distillation/heavy_oil.json @@ -0,0 +1,39 @@ +{ + "type": "tfmg:advanced_distillation", + "ingredients": [ + + { + "fluid": "tfmg:heavy_oil", + "nbt": {}, + "amount": 90 + } + ], + "results": [ + { + "fluid": "tfmg:diesel", + "amount": 30 + }, + { + "fluid": "tfmg:lubrication_oil", + "amount": 30 + }, + { + "fluid": "tfmg:lubrication_oil", + "amount": 30 + }, + { + "fluid": "tfmg:lubrication_oil", + "amount": 30 + }, + { + "fluid": "tfmg:lubrication_oil", + "amount": 30 + }, + { + "fluid": "tfmg:lubrication_oil", + "amount": 30 + } + ] + + +} diff --git a/src/main/resources/data/tfmg/recipes/fractional_distillation/naphtha.json b/src/main/resources/data/tfmg/recipes/fractional_distillation/naphtha.json new file mode 100644 index 00000000..85a57bab --- /dev/null +++ b/src/main/resources/data/tfmg/recipes/fractional_distillation/naphtha.json @@ -0,0 +1,32 @@ +{ + "type": "tfmg:advanced_distillation", + "ingredients": [ + + { + "fluid": "tfmg:naphtha", + "nbt": {}, + "amount": 9 + } + ], + "results": [ + { + "fluid": "tfmg:propylene", + "amount": 3 + }, + { + "fluid": "tfmg:ethylene", + "amount": 3 + }, + { + "fluid": "tfmg:ethylene", + "amount": 3 + } + , + { + "fluid": "tfmg:ethylene", + "amount": 3 + } + ] + + +} diff --git a/src/main/resources/data/tfmg/recipes/fractional_distillation/sussy.json b/src/main/resources/data/tfmg/recipes/fractional_distillation/sussy.json new file mode 100644 index 00000000..69a83912 --- /dev/null +++ b/src/main/resources/data/tfmg/recipes/fractional_distillation/sussy.json @@ -0,0 +1,19 @@ +{ + "type": "tfmg:advanced_distillation", + "ingredients": [ + + { + "fluid": "tfmg:diesel", + "nbt": {}, + "amount": 5 + } + ], + "results": [ + { + "fluid": "tfmg:propylene", + "amount": 3 + } + ] + + +}