From 1dbe3a78688865d918159bee7726cb2d39cfdcbb Mon Sep 17 00:00:00 2001 From: DrMangoTea Date: Tue, 10 Oct 2023 14:08:55 +0200 Subject: [PATCH] casting --- .../9047e4e94996e73e9dfde3738763637fb609e07e | 4 +- .../ad795fb8576279849034d802e60366ec43bb396a | 17 +- .../tfmg/blockstates/casting_basin.json | 7 + .../tfmg/blockstates/casting_spout.json | 7 + .../assets/tfmg/blockstates/molten_metal.json | 7 + .../resources/assets/tfmg/lang/en_ud.json | 5 + .../resources/assets/tfmg/lang/en_us.json | 47 +-- .../assets/tfmg/models/item/block_mold.json | 6 + .../tfmg/models/item/casting_basin.json | 3 + .../tfmg/models/item/casting_spout.json | 3 + .../assets/tfmg/models/item/ingot_mold.json | 6 + .../tags/blocks/mineable/pickaxe.json | 2 + .../loot_tables/blocks/casting_basin.json | 20 ++ .../loot_tables/blocks/casting_spout.json | 20 ++ .../formwork/FormWorkBlockEntity.java | 28 ++ .../BlastFurnaceOutputBlockEntity.java | 2 + .../casting_basin/CastingBasinBlock.java | 83 +++++ .../CastingBasinBlockEntity.java | 317 ++++++++++++++++++ .../casting_basin/CastingBasinRenderer.java | 4 + .../casting_basin/CastingMoldItem.java | 19 ++ .../casting_spout/CastingSpoutBlock.java | 23 ++ .../CastingSpoutBlockEntity.java | 152 +++++++++ .../casting_spout/CastingSpoutRenderer.java | 102 ++++++ .../tfmg/recipes/casting/CastingRecipe.java | 56 ++++ .../tfmg/registry/TFMGBlockEntities.java | 14 + .../drmangotea/tfmg/registry/TFMGBlocks.java | 32 +- .../drmangotea/tfmg/registry/TFMGItems.java | 6 +- .../tfmg/registry/TFMGPartialModels.java | 2 + .../tfmg/registry/TFMGRecipeTypes.java | 2 + .../models/block/casting_basin/block.json | 58 ++++ .../models/block/casting_spout/block.json | 44 +++ .../models/block/casting_spout/bottom.json | 31 ++ .../models/block/casting_spout/connector.json | 18 + .../tfmg/models/block/casting_spout/item.json | 83 +++++ .../assets/tfmg/textures/item/block_mold.png | Bin 0 -> 19028 bytes .../assets/tfmg/textures/item/ingot_mold.png | Bin 0 -> 19028 bytes .../tfmg/recipes/casting/test_caasting.json | 22 ++ .../tfmg/recipes/casting/test_casting.json | 22 ++ 38 files changed, 1224 insertions(+), 50 deletions(-) create mode 100644 src/generated/resources/assets/tfmg/blockstates/casting_basin.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/casting_spout.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/molten_metal.json create mode 100644 src/generated/resources/assets/tfmg/models/item/block_mold.json create mode 100644 src/generated/resources/assets/tfmg/models/item/casting_basin.json create mode 100644 src/generated/resources/assets/tfmg/models/item/casting_spout.json create mode 100644 src/generated/resources/assets/tfmg/models/item/ingot_mold.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/casting_basin.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/casting_spout.json create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlockEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingMoldItem.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlockEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/recipes/casting/CastingRecipe.java create mode 100644 src/main/resources/assets/tfmg/models/block/casting_basin/block.json create mode 100644 src/main/resources/assets/tfmg/models/block/casting_spout/block.json create mode 100644 src/main/resources/assets/tfmg/models/block/casting_spout/bottom.json create mode 100644 src/main/resources/assets/tfmg/models/block/casting_spout/connector.json create mode 100644 src/main/resources/assets/tfmg/models/block/casting_spout/item.json create mode 100644 src/main/resources/assets/tfmg/textures/item/block_mold.png create mode 100644 src/main/resources/assets/tfmg/textures/item/ingot_mold.png create mode 100644 src/main/resources/data/tfmg/recipes/casting/test_caasting.json create mode 100644 src/main/resources/data/tfmg/recipes/casting/test_casting.json diff --git a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e index 342b88ee..a7e3143d 100644 --- a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e +++ b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e @@ -1,2 +1,2 @@ -// 1.19.2 2023-09-30T14:59:41.5616989 Create: The Factory Must Grow's lang merger -edc972fa77e26fb6efb1cae553a9252d3b84e6d7 assets/tfmg/lang/en_us.json +// 1.19.2 2023-10-08T21:01:08.3213175 Create: The Factory Must Grow's lang merger +57fee01fa3d508c93985417faba6daa1c69d4dd7 assets/tfmg/lang/en_us.json diff --git a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a index 49067c8c..aaa173b5 100644 --- a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a +++ b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a @@ -1,8 +1,10 @@ -// 1.19.2 2023-09-28T15:00:28.8610672 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-10-08T21:01:08.324319 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 83154b3fd031e4e10e1103d4befc800a82da4bbe assets/tfmg/blockstates/blast_furnace_output.json +06919cd6d4a6a91ca37c30aebbb68c51feab4f74 assets/tfmg/blockstates/casting_basin.json +5771fe31474df0e15c3a2756bac1b31a7d898868 assets/tfmg/blockstates/casting_spout.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 @@ -39,6 +41,7 @@ a8f81ce72c3f074ffef304b238ae805f3b4ea763 assets/tfmg/blockstates/layered_bauxite d3ba2682652fd44337d1f82ec382df17611fabe1 assets/tfmg/blockstates/liquid_plastic.json 2dc4b1da2bee0275cbb13ef89003d56f62d4443d assets/tfmg/blockstates/lubrication_oil.json 6c819d5f63ca53146d069ba0d00b3e1b10391a68 assets/tfmg/blockstates/machine_input.json +3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/tfmg/blockstates/molten_metal.json ebd6804b999acea36abbf07c2381ee6dee0d7a16 assets/tfmg/blockstates/napalm.json 0f33dc6b2a736164b17f416ce7d127c87bfb6441 assets/tfmg/blockstates/napalm_bomb.json 89f2902010903aad686571ef37c781b111147456 assets/tfmg/blockstates/naphtha.json @@ -66,8 +69,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 -2c438721675e87e549f147887e3d0604acae4e20 assets/tfmg/lang/en_ud.json -eda6d43bb8bd4174ddbfa181989dce755756e941 assets/tfmg/lang/en_us.json +4ac8f2584be9abd987a4cd0516a5dc6cf08b5f58 assets/tfmg/lang/en_ud.json +5280ab5d23d323e2d440c1baf054e5d7f33f94ab 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 @@ -185,6 +188,9 @@ f685ca653c8e197986b1ac8f43297989816d39d2 assets/tfmg/models/item/aluminum_ingot. 4ace0da00498fcbb9ddfdf321767b40b095c8778 assets/tfmg/models/item/bauxite.json 41091873d85bac787e4752d0ff81189432f1e28e assets/tfmg/models/item/bauxite_pillar.json 8ef0374ff08be7e1501c64fce1e075144e0c070f assets/tfmg/models/item/blast_furnace_output.json +a846fbfd51826403a8695e89fccaa9d54a7e3ea6 assets/tfmg/models/item/block_mold.json +1e73706492a2cc569bb603443d56b2e9773b9c6b assets/tfmg/models/item/casting_basin.json +94fd821fec37d1f451c1094d19ead45ed8c98f45 assets/tfmg/models/item/casting_spout.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 @@ -216,6 +222,7 @@ ed2830b2988403aebaca633b2e315878b41f7503 assets/tfmg/models/item/gasoline_bucket 3fdff9e88db39939ee31968358eb51c060006766 assets/tfmg/models/item/heavy_machinery_casing.json f3bea42a905b7df9395bda18f751e2ee0c023e65 assets/tfmg/models/item/heavy_oil_bucket.json 81bf095f356d9dc74a83af78b860ef8d3aed9b72 assets/tfmg/models/item/industrial_pipe.json +858a4fb7e2e1874fc4e5f018453ccc8d272dbc03 assets/tfmg/models/item/ingot_mold.json 8996fe57623ded9433d6766e80a39e41a2aba1ca assets/tfmg/models/item/kerosene_bucket.json c0f668fca568bc4c35aba97d9ac93986720e501f assets/tfmg/models/item/layered_bauxite.json ee1682c21054b9a9ffde5983141d49e8177f9a2a assets/tfmg/models/item/lead_block.json @@ -289,7 +296,7 @@ d26621b9617890011a68780cf7ab40fbb4658edc data/forge/tags/items/storage_blocks/le 63c4a8d8e713db70730e766f1a10f8dd9072f98f data/minecraft/tags/blocks/dripstone_replaceable_blocks.json 63c4a8d8e713db70730e766f1a10f8dd9072f98f data/minecraft/tags/blocks/lush_ground_replaceable.json 694d1673a052cf6c604fd75f5f0b8954a04a05e3 data/minecraft/tags/blocks/mineable/axe.json -02cc402fd90edb75d6a0e43851d4eca2912bd0bc data/minecraft/tags/blocks/mineable/pickaxe.json +4f5ce2d2b247c3271434a846a5172de74ac10b39 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 @@ -341,6 +348,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 42f0a002820ca15e79fbc28e45e0f34638e9aeab data/tfmg/loot_tables/blocks/blast_furnace_output.json +b856690500dccf0e5407bcb45e057710259f48e3 data/tfmg/loot_tables/blocks/casting_basin.json +5627226e6bd089259395af9338db044278133033 data/tfmg/loot_tables/blocks/casting_spout.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 diff --git a/src/generated/resources/assets/tfmg/blockstates/casting_basin.json b/src/generated/resources/assets/tfmg/blockstates/casting_basin.json new file mode 100644 index 00000000..fe8e1295 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/casting_basin.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/casting_basin/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/casting_spout.json b/src/generated/resources/assets/tfmg/blockstates/casting_spout.json new file mode 100644 index 00000000..5663f28e --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/casting_spout.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/casting_spout/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/molten_metal.json b/src/generated/resources/assets/tfmg/blockstates/molten_metal.json new file mode 100644 index 00000000..2c8f02f0 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/molten_metal.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ 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 cb4b4bbc..94460135 100644 --- a/src/generated/resources/assets/tfmg/lang/en_ud.json +++ b/src/generated/resources/assets/tfmg/lang/en_ud.json @@ -6,6 +6,8 @@ "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.casting_basin": "uısɐᗺ buıʇsɐƆ", + "block.tfmg.casting_spout": "ʇnodS buıʇsɐƆ", "block.tfmg.coal_coke_block": "ǝʞoƆ ןɐoƆ ɟo ʞɔoןᗺ", "block.tfmg.coke_oven": "uǝʌO ǝʞoƆ", "block.tfmg.concrete": "ǝʇǝɹɔuoƆ", @@ -39,6 +41,7 @@ "block.tfmg.liquid_plastic": "ɔıʇsɐןԀ pınbıꞀ", "block.tfmg.lubrication_oil": "ןıO uoıʇɐɔıɹqnꞀ", "block.tfmg.machine_input": "ʇnduI ǝuıɥɔɐW", + "block.tfmg.molten_metal": "ןɐʇǝW uǝʇןoW", "block.tfmg.napalm": "ɯןɐdɐN", "block.tfmg.napalm_bomb": "qɯoᗺ ɯןɐdɐN", "block.tfmg.naphtha": "ɐɥʇɥdɐN", @@ -92,6 +95,7 @@ "fluid.tfmg.propane": "ǝuɐdoɹԀ", "fluid.tfmg.propylene": "ǝuǝןʎdoɹԀ", "item.tfmg.aluminum_ingot": "ʇobuI ɯnuıɯnןⱯ", + "item.tfmg.block_mold": "pןoW ʞɔoןᗺ", "item.tfmg.cast_iron_ingot": "ʇobuI uoɹI ʇsɐƆ", "item.tfmg.coal_coke": "ǝʞoƆ ןɐoƆ", "item.tfmg.coal_coke_dust": "ʇsnᗡ ǝʞoƆ ןɐoƆ", @@ -102,6 +106,7 @@ "item.tfmg.diesel_bucket": "ʇǝʞɔnᗺ ןǝsǝıᗡ", "item.tfmg.gasoline_bucket": "ʇǝʞɔnᗺ ǝuıןosɐ⅁", "item.tfmg.heavy_oil_bucket": "ʇǝʞɔnᗺ ןıO ʎʌɐǝH", + "item.tfmg.ingot_mold": "pןoW ʇobuI", "item.tfmg.kerosene_bucket": "ʇǝʞɔnᗺ ǝuǝsoɹǝʞ", "item.tfmg.lead_ingot": "ʇobuI pɐǝꞀ", "item.tfmg.liquid_concrete_bucket": "ʇǝʞɔnᗺ ǝʇǝɹɔuoƆ pınbıꞀ", diff --git a/src/generated/resources/assets/tfmg/lang/en_us.json b/src/generated/resources/assets/tfmg/lang/en_us.json index 618cd4f0..601081fe 100644 --- a/src/generated/resources/assets/tfmg/lang/en_us.json +++ b/src/generated/resources/assets/tfmg/lang/en_us.json @@ -9,6 +9,8 @@ "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.casting_basin": "Casting Basin", + "block.tfmg.casting_spout": "Casting Spout", "block.tfmg.coal_coke_block": "Block of Coal Coke", "block.tfmg.coke_oven": "Coke Oven", "block.tfmg.concrete": "Concrete", @@ -42,6 +44,7 @@ "block.tfmg.liquid_plastic": "Liquid Plastic", "block.tfmg.lubrication_oil": "Lubrication Oil", "block.tfmg.machine_input": "Machine Input", + "block.tfmg.molten_metal": "Molten Metal", "block.tfmg.napalm": "Napalm", "block.tfmg.napalm_bomb": "Napalm Bomb", "block.tfmg.naphtha": "Naphtha", @@ -98,6 +101,7 @@ "fluid.tfmg.propylene": "Propylene", "item.tfmg.aluminum_ingot": "Aluminum Ingot", + "item.tfmg.block_mold": "Block Mold", "item.tfmg.cast_iron_ingot": "Cast Iron Ingot", "item.tfmg.coal_coke": "Coal Coke", "item.tfmg.coal_coke_dust": "Coal Coke Dust", @@ -108,6 +112,7 @@ "item.tfmg.diesel_bucket": "Diesel Bucket", "item.tfmg.gasoline_bucket": "Gasoline Bucket", "item.tfmg.heavy_oil_bucket": "Heavy Oil Bucket", + "item.tfmg.ingot_mold": "Ingot Mold", "item.tfmg.kerosene_bucket": "Kerosene Bucket", "item.tfmg.lead_ingot": "Lead Ingot", "item.tfmg.liquid_concrete_bucket": "Liquid Concrete Bucket", @@ -121,48 +126,6 @@ "item.tfmg.thermite_grenade": "Thermite Grenade", "item.tfmg.zinc_grenade": "Zinc Grenade", - "itemGroup.tfmg.base": "Create: The Factory Must Grow", - "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.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", - "create.goggles.blast_furnace.stats": "Blast Furnace:", - "create.goggles.blast_furnace.size_stats": "Size Stats:", - "create.goggles.blast_furnace.fuel_amount": "Fuel Amount: %1$s", - "create.goggles.blast_furnace.item_count": "Item Count: %1$s", - "create.goggles.blast_furnace.height": "Height: %1$s", - "create.goggles.blast_furnace.reinforcement_height": "Reinforcement Height: %1$s", - "create.goggles.blast_furnace.status.off": "Status: Off", - "create.goggles.blast_furnace.status.running": "Status: Running", - "create.goggles.blast_furnace.status.finished": "Status: Process Finished", - "create.goggles.blast_furnace.diameter.one": "Diameter: 1", - "create.goggles.blast_furnace.diameter.two": "Diameter: 2", - "create.goggles.misc.storage_info": "Storage Info:", - "create.goggles.coke_oven.status": "Coke Oven:", - "create.goggles.coke_oven.fluid_amount_output": "Fluid Amount In Internal Tank: %1$s mb", - "create.goggles.coke_oven.fluid_amount_exhaust": "Carbon Dioxide: %1$s mb", - "create.goggles.coke_oven.item_count": "Item Count In Internal Storage: %1$s", - "create.goggles.coke_oven.invalid": "Coke Oven Invalid", - "create.goggles.coke_oven.tank_full": "One of Internal Tanks Is Full", - "create.goggles.coke_oven.progress": "Progress: %1$s", - "create.goggles.misc.percent_symboll": "%", - "create.goggles.misc.percent_symbol": "%", - "create.goggles.blast_furnace.invalid": "Blast Furnace is Not Built Correctly", - "_": "->------------------------] UI & Messages [------------------------<-", diff --git a/src/generated/resources/assets/tfmg/models/item/block_mold.json b/src/generated/resources/assets/tfmg/models/item/block_mold.json new file mode 100644 index 00000000..a563477f --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/block_mold.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/block_mold" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/casting_basin.json b/src/generated/resources/assets/tfmg/models/item/casting_basin.json new file mode 100644 index 00000000..55a81c97 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/casting_basin.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/casting_basin/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/casting_spout.json b/src/generated/resources/assets/tfmg/models/item/casting_spout.json new file mode 100644 index 00000000..39f471a1 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/casting_spout.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/casting_spout/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/ingot_mold.json b/src/generated/resources/assets/tfmg/models/item/ingot_mold.json new file mode 100644 index 00000000..c946a317 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/ingot_mold.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/ingot_mold" + } +} \ 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 dcb005ab..f29e7b3a 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -20,6 +20,8 @@ "tfmg:fireproof_bricks", "tfmg:fireproof_brick_reinforcement", "tfmg:blast_furnace_output", + "tfmg:casting_basin", + "tfmg:casting_spout", "tfmg:coke_oven", "tfmg:steel_block", "tfmg:cast_iron_block", diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/casting_basin.json b/src/generated/resources/data/tfmg/loot_tables/blocks/casting_basin.json new file mode 100644 index 00000000..16e10f00 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/casting_basin.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:casting_basin" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/casting_spout.json b/src/generated/resources/data/tfmg/loot_tables/blocks/casting_spout.json new file mode 100644 index 00000000..6005a5fb --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/casting_spout.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:casting_spout" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/blocks/concrete/formwork/FormWorkBlockEntity.java b/src/main/java/com/drmangotea/tfmg/blocks/concrete/formwork/FormWorkBlockEntity.java index d737e64c..891279a6 100644 --- a/src/main/java/com/drmangotea/tfmg/blocks/concrete/formwork/FormWorkBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/blocks/concrete/formwork/FormWorkBlockEntity.java @@ -1,7 +1,9 @@ package com.drmangotea.tfmg.blocks.concrete.formwork; import com.drmangotea.tfmg.blocks.machines.TFMGMachineBlockEntity; +import com.drmangotea.tfmg.registry.TFMGBlocks; import com.drmangotea.tfmg.registry.TFMGFluids; +import com.simibubi.create.Create; import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; @@ -22,6 +24,8 @@ public class FormWorkBlockEntity extends TFMGMachineBlockEntity { public boolean south = true; public boolean bottom = true; + public int timer = -1; + protected FluidTank tankInventory; @@ -49,6 +53,26 @@ public class FormWorkBlockEntity extends TFMGMachineBlockEntity { @Override public void tick() { + + + + if(tankInventory.getFluidAmount()==tankInventory.getCapacity()){ + if(timer==-1) { + timer = 180 * 24; + }else { + + timer--; + + if(timer==0){ + level.setBlock(getBlockPos(), TFMGBlocks.CONCRETE.getDefaultState(),1); + } + } + + + } else + timer = -1; + + super.tick(); fluidLevel.chase(tankInventory.getFluidAmount(), 0.3f, LerpedFloat.Chaser.EXP); fluidLevel.tickChaser(); @@ -171,6 +195,8 @@ public class FormWorkBlockEntity extends TFMGMachineBlockEntity { protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); + timer = compound.getInt("Timer"); + bottom = compound.getBoolean("Bottom"); east = compound.getBoolean("East"); @@ -188,6 +214,8 @@ public class FormWorkBlockEntity extends TFMGMachineBlockEntity { super.write(compound, clientPacket); + compound.putInt("Timer", timer); + compound.putBoolean("Bottom", bottom); compound.putBoolean("East", east); diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/blast_furnace/BlastFurnaceOutputBlockEntity.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/blast_furnace/BlastFurnaceOutputBlockEntity.java index 1ba862c4..d51453d5 100644 --- a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/blast_furnace/BlastFurnaceOutputBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/blast_furnace/BlastFurnaceOutputBlockEntity.java @@ -491,6 +491,7 @@ public class BlastFurnaceOutputBlockEntity extends TFMGMachineBlockEntity implem super.read(compound, clientPacket); inputInventory.deserializeNBT(compound.getCompound("InputItems")); fuelInventory.deserializeNBT(compound.getCompound("Fuel")); + timer = compound.getInt("Timer"); } @Override @@ -499,6 +500,7 @@ public class BlastFurnaceOutputBlockEntity extends TFMGMachineBlockEntity implem compound.put("InputItems", inputInventory.serializeNBT()); compound.put("Fuel", fuelInventory.serializeNBT()); + compound.putInt("Timer", timer); } @Override diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlock.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlock.java new file mode 100644 index 00000000..ebf8ae87 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlock.java @@ -0,0 +1,83 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin; + + +import com.drmangotea.tfmg.blocks.machines.metal_processing.coke_oven.CokeOvenBlock; +import com.drmangotea.tfmg.registry.TFMGBlockEntities; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +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.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; + +public class CastingBasinBlock extends Block implements IBE, IWrenchable { + + public static final EnumProperty MOLD_TYPE = EnumProperty.create("mold_type", CastingBasinBlockEntity.MoldType.class); + + public CastingBasinBlock(Properties p_49795_) { + super(p_49795_); + registerDefaultState(defaultBlockState().setValue(MOLD_TYPE, CastingBasinBlockEntity.MoldType.NONE)); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + CastingBasinBlockEntity be; + + + + if(level.getBlockEntity(pos) instanceof CastingBasinBlockEntity) { + be = (CastingBasinBlockEntity) level.getBlockEntity(pos); + }else return InteractionResult.PASS; + + if(be ==null) + return InteractionResult.PASS; + /// + + if(!be.tank1.isEmpty()) + return InteractionResult.PASS; + + if(player.getItemInHand(interactionHand).is(Items.AIR)&&!(((CastingBasinBlockEntity) level.getBlockEntity(pos)).moldInventory.isEmpty())){ + player.setItemInHand(interactionHand,new ItemStack(be.moldInventory.getStackInSlot(0).getItem(),1)); + ((CastingBasinBlockEntity) level.getBlockEntity(pos)).moldInventory.getStackInSlot(0).shrink(1); + + + return InteractionResult.SUCCESS; + } + + + /// + if(player.getItemInHand(interactionHand).getItem() instanceof CastingMoldItem&&((CastingBasinBlockEntity) level.getBlockEntity(pos)).moldInventory.isEmpty()){ + ((CastingBasinBlockEntity) level.getBlockEntity(pos)).moldInventory.setStackInSlot(0, new ItemStack(player.getItemInHand(interactionHand).getItem(),1)); + player.getItemInHand(interactionHand).shrink(1); + + + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(MOLD_TYPE); + super.createBlockStateDefinition(pBuilder); + } + + @Override + public Class getBlockEntityClass() { + return CastingBasinBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return TFMGBlockEntities.CASTING_BASIN.get(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlockEntity.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlockEntity.java new file mode 100644 index 00000000..43a1408f --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinBlockEntity.java @@ -0,0 +1,317 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin; + +import com.drmangotea.tfmg.CreateTFMG; +import com.drmangotea.tfmg.blocks.machines.TFMGMachineBlockEntity; +import com.drmangotea.tfmg.recipes.casting.CastingRecipe; +import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.fluid.CombinedTankWrapper; +import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.recipe.RecipeFinder; +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.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Optional; + +import static com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingBasinBlock.MOLD_TYPE; + +public class CastingBasinBlockEntity extends TFMGMachineBlockEntity implements IHaveGoggleInformation { + + + public MoldType type; + + private CastingRecipe recipe; + + public int timer = -1; + + public SmartInventory outputInventory; + public SmartInventory moldInventory; + + public LazyOptional itemCapability; + + private static final Object CastingRecipesKey = new Object(); + + public CastingBasinBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + + outputInventory = new SmartInventory(1, this) + .withMaxStackSize(64); + + moldInventory = new SmartInventory(1, this) + .withMaxStackSize(1); + + itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(outputInventory,moldInventory)); + tank1.getPrimaryHandler().setCapacity(4000); + tank2.forbidExtraction(); + tank2.forbidInsertion(); + + moldInventory.forbidExtraction(); + moldInventory.forbidInsertion(); + outputInventory.forbidInsertion(); + } + + + public void tick(){ + super.tick(); + type = getBlockState().getValue(MOLD_TYPE); + + + findRecipe(); + // + + setMold(); + + if(tank1.isEmpty()){ + setCapacity(); + } + + if(type==MoldType.NONE) + return; + + if(recipe==null) + return; + + if(outputInventory.getStackInSlot(0).getCount()!=0) + return; + + + if(tank1.getPrimaryHandler().getCapacity()==tank1.getPrimaryHandler().getFluidAmount()){ + + if(timer ==-1) { + //if(type==MoldType.BLOCK) + timer = recipe.getProcessingDuration(); + //if(type==MoldType.INGOT) + // timer = recipe.getProcessingDuration()/9; + + } + + if (timer >0) + timer--; + + if(timer == 0){ + + if(type==MoldType.INGOT) + outputInventory.setStackInSlot(0,recipe.getIngotResult()); + if(type==MoldType.BLOCK) + outputInventory.setStackInSlot(0,recipe.getBlockResult()); + + + tank1.getPrimaryHandler().setFluid(new FluidStack(Fluids.EMPTY,0)); + timer = -1; + } + + } + + } + + + public void setMold(){ + if(moldInventory.isEmpty()) + return; + + MoldType moldType = ((CastingMoldItem)moldInventory.getStackInSlot(0).getItem()).getType(); + MoldType oldMoldType = this.getBlockState().getValue(MOLD_TYPE); + if(moldType==oldMoldType) + return; + + level.setBlock(getBlockPos(),this.getBlockState().setValue(MOLD_TYPE,moldType),2); + type = getBlockState().getValue(MOLD_TYPE); + } + + public void findRecipe(){ + CombinedTankWrapper tankIn = new CombinedTankWrapper(tank1.getPrimaryHandler(),tank2.getPrimaryHandler()); + if (recipe == null || !recipe.matches(tankIn, level)) { + CastingRecipe recipe = getMatchingRecipes(); + if (recipe!=null) { + this.recipe = recipe; + sendData(); + } + } + } + + public void setCapacity(){ + if(type == null){ + if(tank1.getPrimaryHandler().getCapacity()<4000) + tank1.getPrimaryHandler().setCapacity(4000); + }else { + if(tank1.getPrimaryHandler().getCapacity()!=type.getRequiredFluidAmount()) + tank1.getPrimaryHandler().setCapacity(type.getRequiredFluidAmount()); + } + } + + protected CastingRecipe getMatchingRecipes() { + + + List> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters); + + + for(int i = 0; i < list.toArray().length;i++){ + CastingRecipe recipe = (CastingRecipe) list.get(i); + for(int y = 0; y < recipe.getFluidIngredients().get(0).getMatchingFluidStacks().toArray().length;y++) + if(tank1.getPrimaryHandler().getFluid().getFluid()==recipe.getFluidIngredients().get(0).getMatchingFluidStacks().get(y).getFluid()) + if(tank1.getPrimaryHandler().getFluidAmount()>=recipe.getFluidIngredients().get(0).getRequiredAmount()) + return recipe; + } + + return null; + } + @Override + @SuppressWarnings("removal") + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + + + + //--Fluid Info--// + 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; + + LangBuilder mb = Lang.translate("generic.unit.millibuckets"); + + 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.DARK_GREEN)) + .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.DARK_GREEN)) + .style(ChatFormatting.DARK_GRAY) + .forGoggles(tooltip, 1); + + + return true; + } + protected boolean matchStaticFilters(Recipe r) { + return r instanceof CastingRecipe; + } + + @Override + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + + outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + moldInventory.deserializeNBT(compound.getCompound("CurrentMold")); + + + timer = compound.getInt("Timer"); + + + } + + @Override + public void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + + compound.put("OutputItems", outputInventory.serializeNBT()); + compound.put("CurrentMold", moldInventory.serializeNBT()); + compound.putInt("Timer", timer); + + + + } + @Override + public void invalidate() { + super.invalidate(); + itemCapability.invalidate(); + } + @Nonnull + @Override + @SuppressWarnings("removal") + public LazyOptional getCapability(@Nonnull Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return itemCapability.cast(); + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + return fluidCapability.cast(); + return super.getCapability(cap, side); + } + protected Object getRecipeCacheKey() { + return CastingRecipesKey; + } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + } + + + public enum MoldType implements StringRepresentable { + INGOT("ingot",112), + BLOCK("block",1000), + + NONE("none", 4000); + + + + private final String name; + + private final int fluidAmountNeeded; + + MoldType(String name, int amountNeeded) { + this.name = name; + this.fluidAmountNeeded = amountNeeded; + } + + public int getRequiredFluidAmount(){return this.fluidAmountNeeded;} + + @Override + public String getSerializedName() { + return this.name; + } + + } +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinRenderer.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinRenderer.java new file mode 100644 index 00000000..e20e29c8 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingBasinRenderer.java @@ -0,0 +1,4 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin; + +public class CastingBasinRenderer { +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingMoldItem.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingMoldItem.java new file mode 100644 index 00000000..475214b0 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_basin/CastingMoldItem.java @@ -0,0 +1,19 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin; + +import net.minecraft.world.item.Item; + +public class CastingMoldItem extends Item { + + + private final CastingBasinBlockEntity.MoldType type; + public CastingMoldItem(Properties p_41383_, CastingBasinBlockEntity.MoldType type) { + super(p_41383_); + this.type = type; + } + + + public CastingBasinBlockEntity.MoldType getType(){ + return this.type; + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlock.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlock.java new file mode 100644 index 00000000..8199b0ca --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlock.java @@ -0,0 +1,23 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout; + + +import com.drmangotea.tfmg.registry.TFMGBlockEntities; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; + +public class CastingSpoutBlock extends Block implements IBE { + public CastingSpoutBlock(Properties p_49795_) { + super(p_49795_); + } + + @Override + public Class getBlockEntityClass() { + return CastingSpoutBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return TFMGBlockEntities.CASTING_SPOUT.get(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlockEntity.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlockEntity.java new file mode 100644 index 00000000..ac058e4c --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutBlockEntity.java @@ -0,0 +1,152 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout; + +import com.drmangotea.tfmg.CreateTFMG; +import com.drmangotea.tfmg.blocks.machines.TFMGMachineBlockEntity; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingBasinBlockEntity; +import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +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 java.util.List; +import java.util.Optional; + +public class CastingSpoutBlockEntity extends TFMGMachineBlockEntity { + + CastingBasinBlockEntity basin; + + public boolean isRunning=false; + + public LerpedFloat movement = LerpedFloat.linear(); + public CastingSpoutBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + + tank2.forbidInsertion(); + tank2.forbidExtraction(); + tank1.forbidExtraction(); + + + } + public void tick(){ + super.tick(); + + if(isRunning) { + movement.chase(0.03, 0.1f, LerpedFloat.Chaser.EXP); + }else + movement.chase(0, 0.1f, LerpedFloat.Chaser.EXP); + movement.tickChaser(); + + + if(tank1.isEmpty()) + { + isRunning = false; + return; + } + + if(level.getBlockEntity(getBlockPos().below(2)) instanceof CastingBasinBlockEntity){ + basin = (CastingBasinBlockEntity) level.getBlockEntity(getBlockPos().below(2)); + }else { + isRunning = false; + return; + } + if(basin.moldInventory.isEmpty()) + { + isRunning = false; + return; + } + if(basin.tank1.getPrimaryHandler().getFluidAmount()==basin.tank1.getPrimaryHandler().getCapacity()) + { + isRunning = false; + return; + } + + if(basin.outputInventory.getStackInSlot(0).getCount()!=0) + { + isRunning = false; + return; + } + + if(basin.tank1.getPrimaryHandler().getCapacity()==4000) + { + isRunning = false; + return; + } + + + basin.tank1.getPrimaryHandler().setFluid(new FluidStack(tank1.getPrimaryHandler().getFluid().getFluid(),basin.tank1.getPrimaryHandler().getFluidAmount()+1)); + tank1.getPrimaryHandler().drain(1, IFluidHandler.FluidAction.EXECUTE); + isRunning = true; + + } + + @Override + @SuppressWarnings("removal") + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + + + + //--Fluid Info--// + 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; + + LangBuilder mb = Lang.translate("generic.unit.millibuckets"); + + 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.DARK_GREEN)) + .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.DARK_GREEN)) + .style(ChatFormatting.DARK_GRAY) + .forGoggles(tooltip, 1); + + + return true; + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutRenderer.java b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutRenderer.java new file mode 100644 index 00000000..4aa618c3 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/blocks/machines/metal_processing/casting_spout/CastingSpoutRenderer.java @@ -0,0 +1,102 @@ +package com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout; + + +import com.drmangotea.tfmg.registry.TFMGPartialModels; +import com.jozufozu.flywheel.core.PartialModel; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; +import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; +import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.render.CachedBufferer; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.fluids.FluidStack; + +public class CastingSpoutRenderer extends SafeBlockEntityRenderer { + + public CastingSpoutRenderer(BlockEntityRendererProvider.Context context) { + } + + static final PartialModel[] BITS = + {TFMGPartialModels.CASTING_SPOUT_CONNECTOR, TFMGPartialModels.CASTING_SPOUT_BOTTOM }; + + @Override + protected void renderSafe(CastingSpoutBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + + SmartFluidTankBehaviour tank = be.tank1; + if (tank == null) + return; + + TankSegment primaryTank = be.tank1.getPrimaryTank(); + FluidStack fluidStack = primaryTank.getRenderedFluid(); + float level = primaryTank.getFluidLevel() + .getValue(partialTicks); + + if (!fluidStack.isEmpty() && level != 0) { + boolean top = fluidStack.getFluid() + .getFluidType() + .isLighterThanAir(); + + level = Math.max(level, 0.175f); + float min = 2.5f / 16f; + float max = min + (11 / 16f); + float yOffset = (11 / 16f) * level; + + ms.pushPose(); + if (!top) ms.translate(0, yOffset, 0); + else ms.translate(0, max - min, 0); + + FluidRenderer.renderFluidBox(fluidStack, + min, min - yOffset, min, + max, min, max, + buffer, ms, light, false); + + ms.popPose(); + } + + int processingTicks; + if(be.basin==null){ + processingTicks = 0; + }else + processingTicks = be.basin.timer; + + float processingPT = processingTicks - partialTicks; + float processingProgress = 1 - (processingPT - 5) / 10; + processingProgress = Mth.clamp(processingProgress, 0, 1); + float radius = 0; + + if (be.isRunning) { + radius = (float) (Math.pow(((0.3) - 1), 2) - 1); + AABB bb = new AABB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); + FluidRenderer.renderFluidBox(fluidStack, (float) bb.minX, (float) bb.minY, (float) bb.minZ, + (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); + } + + + ms.pushPose(); + BlockState blockState = be.getBlockState(); + VertexConsumer vb = buffer.getBuffer(RenderType.solid()); + CachedBufferer.partial(TFMGPartialModels.CASTING_SPOUT_BOTTOM, blockState) + .translateY(be.movement.getValue(partialTicks)*2) + .light(light) + .renderInto(ms, vb); + + CachedBufferer.partial(TFMGPartialModels.CASTING_SPOUT_CONNECTOR, blockState) + .translateY(be.movement.getValue(partialTicks)) + .light(light) + .renderInto(ms, vb); + + ms.popPose(); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/recipes/casting/CastingRecipe.java b/src/main/java/com/drmangotea/tfmg/recipes/casting/CastingRecipe.java new file mode 100644 index 00000000..b7ddd1ff --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/recipes/casting/CastingRecipe.java @@ -0,0 +1,56 @@ +package com.drmangotea.tfmg.recipes.casting; + +import com.drmangotea.tfmg.registry.TFMGRecipeTypes; +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeParams; +import com.simibubi.create.foundation.fluid.CombinedTankWrapper; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class CastingRecipe extends ProcessingRecipe { + + public CastingRecipe(ProcessingRecipeParams params) { + super(TFMGRecipeTypes.CASTING, params); + } + + @Override + protected int getMaxInputCount() { + return 0; + } + + @Override + protected int getMaxOutputCount() { + return 3; + } + @Override + protected int getMaxFluidOutputCount() { + return 1; + } + + + public boolean matches(CombinedTankWrapper inv, Level worldIn) { + if (inv.getFluidInTank(0).getAmount()==0) + return false; + return fluidIngredients.get(0) + .test(inv.getFluidInTank(0)); + } + public FluidIngredient getInputFluid(){ + return getFluidIngredients().get(0); + } + public ItemStack getIngotResult(){ + return results.get(0).getStack(); + } + public ItemStack getBlockResult(){ + return results.get(1).getStack(); + } + + + @Override + public boolean matches(RecipeWrapper pContainer, Level pLevel) { + return false; + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java index acd18277..6c318c53 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java @@ -10,6 +10,9 @@ import com.drmangotea.tfmg.blocks.deposits.surface_scanner.SurfaceScannerRendere import com.drmangotea.tfmg.blocks.machines.metal_processing.blast_furnace.BlastFurnaceOutputBlockEntity; import com.drmangotea.tfmg.blocks.machines.metal_processing.blast_furnace.BlastFurnaceRenderer; import com.drmangotea.tfmg.blocks.machines.metal_processing.blast_furnace.MoltenMetalBlockEntity; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingBasinBlockEntity; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout.CastingSpoutBlockEntity; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout.CastingSpoutRenderer; import com.drmangotea.tfmg.blocks.machines.metal_processing.coke_oven.CokeOvenBlockEntity; import com.drmangotea.tfmg.blocks.machines.metal_processing.coke_oven.CokeOvenRenderer; import com.drmangotea.tfmg.blocks.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlockEntity; @@ -184,6 +187,17 @@ public class TFMGBlockEntities { .validBlocks(TFMGBlocks.MOLTEN_METAL) .register(); + public static final BlockEntityEntry CASTING_BASIN = REGISTRATE + .blockEntity("casting_basin", CastingBasinBlockEntity::new) + .validBlocks(TFMGBlocks.CASTING_BASIN) + .register(); + + public static final BlockEntityEntry CASTING_SPOUT = REGISTRATE + .blockEntity("casting_spout", CastingSpoutBlockEntity::new) + .renderer(()->CastingSpoutRenderer::new) + .validBlocks(TFMGBlocks.CASTING_SPOUT) + .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 c15e2243..489e0602 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java @@ -8,6 +8,8 @@ import com.drmangotea.tfmg.blocks.concrete.formwork.FormWorkGenerator; import com.drmangotea.tfmg.blocks.decoration.doors.TFMGSlidingDoorBlock; import com.drmangotea.tfmg.blocks.deposits.FluidDepositBlock; import com.drmangotea.tfmg.blocks.gadgets.explosives.napalm.NapalmBombBlock; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingBasinBlock; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_spout.CastingSpoutBlock; import com.drmangotea.tfmg.items.CoalCokeBlockItem; import com.drmangotea.tfmg.items.FossilstoneItem; import com.drmangotea.tfmg.blocks.deposits.surface_scanner.SurfaceScannerBlock; @@ -68,7 +70,7 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.*; - +@SuppressWarnings("removal") public class TFMGBlocks { @@ -376,6 +378,32 @@ public static final BlockEntry STEEL_DISTILLATION_OUTPU .forAllStatesExcept(BlockStateGen.mapToAir(p))) .register(); + //--Casting Basin + public static final BlockEntry CASTING_BASIN = REGISTRATE.block("casting_basin", CastingBasinBlock::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.color(MaterialColor.TERRACOTTA_BLACK)) + .properties(p -> p.requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) + .addLayer(() -> RenderType::cutoutMipped) + .item() + .build() + .lang("Casting Basin") + .register(); + + public static final BlockEntry CASTING_SPOUT = REGISTRATE.block("casting_spout", CastingSpoutBlock::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.color(MaterialColor.TERRACOTTA_BLACK)) + .properties(p -> p.requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) + .addLayer(() -> RenderType::cutoutMipped) + .item() + .build() + .lang("Casting Spout") + .register(); + + ////////// public static final BlockEntry COKE_OVEN = REGISTRATE.block("coke_oven", CokeOvenBlock::new) .initialProperties(() -> Blocks.BRICKS) @@ -387,6 +415,8 @@ public static final BlockEntry STEEL_DISTILLATION_OUTPU .transform(customItemModel()) .lang("Coke Oven") .register(); + /////// + diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java index 87c83389..c4cce748 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java @@ -3,6 +3,8 @@ package com.drmangotea.tfmg.registry; import com.drmangotea.tfmg.blocks.gadgets.explosives.thermite_grenades.ChemicalColor; import com.drmangotea.tfmg.blocks.gadgets.explosives.thermite_grenades.ThermiteGrenadeItem; import com.drmangotea.tfmg.blocks.gadgets.quad_potato_cannon.QuadPotatoCannonItem; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingBasinBlockEntity; +import com.drmangotea.tfmg.blocks.machines.metal_processing.casting_basin.CastingMoldItem; import com.drmangotea.tfmg.items.CoalCokeItem; import com.drmangotea.tfmg.items.ScrewdriverItem; import com.simibubi.create.foundation.data.AssetLookup; @@ -38,7 +40,9 @@ public class TFMGItems { REGISTRATE.item("quad_potato_cannon", QuadPotatoCannonItem::new) .model(AssetLookup.itemModelWithPartials()) .register(); - + public static final ItemEntry + BLOCK_MOLD = REGISTRATE.item("block_mold", p -> new CastingMoldItem(p, CastingBasinBlockEntity.MoldType.BLOCK)).properties(p -> p.stacksTo(1)).register(), + INGOT_MOLD = REGISTRATE.item("ingot_mold", p -> new CastingMoldItem(p, CastingBasinBlockEntity.MoldType.INGOT)).properties(p -> p.stacksTo(1)).register(); public static final ItemEntry COAL_COKE = REGISTRATE.item("coal_coke", CoalCokeItem::new) .register(); diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java index 8ec95982..dd6cb3ea 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java @@ -19,6 +19,8 @@ public class TFMGPartialModels { public static final PartialModel + CASTING_SPOUT_CONNECTOR = block("casting_spout/connector"), + CASTING_SPOUT_BOTTOM = block("casting_spout/bottom"), COKE_OVEN_DOOR_LEFT = block("coke_oven/door_left"), COKE_OVEN_DOOR_RIGHT = block("coke_oven/door_right"), COKE_OVEN_DOOR_LEFT_TOP = block("coke_oven/door_left_top"), diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java index 6eff2545..0d085411 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGRecipeTypes.java @@ -2,6 +2,7 @@ package com.drmangotea.tfmg.registry; import com.drmangotea.tfmg.CreateTFMG; +import com.drmangotea.tfmg.recipes.casting.CastingRecipe; import com.drmangotea.tfmg.recipes.coking.CokingRecipe; import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe; import com.drmangotea.tfmg.recipes.distillation.AdvancedDistillationRecipe; @@ -31,6 +32,7 @@ import java.util.function.Supplier; public enum TFMGRecipeTypes implements IRecipeTypeInfo { +CASTING(CastingRecipe::new), INDUSTRIAL_BLASTING(IndustrialBlastingRecipe::new), COKING(CokingRecipe::new), DISTILLATION(DistillationRecipe::new), diff --git a/src/main/resources/assets/tfmg/models/block/casting_basin/block.json b/src/main/resources/assets/tfmg/models/block/casting_basin/block.json new file mode 100644 index 00000000..e12a8ccb --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/casting_basin/block.json @@ -0,0 +1,58 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "12": "create:block/basin", + "particle": "create:block/industrial_iron_block" + }, + "elements": [ + { + "name": "Basin", + "from": [0, 2, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 7], "texture": "#12"}, + "east": {"uv": [0, 0, 8, 7], "texture": "#12"}, + "south": {"uv": [0, 0, 8, 7], "texture": "#12"}, + "west": {"uv": [0, 0, 8, 7], "texture": "#12"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#12"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#12"} + } + }, + { + "name": "Basin Interior", + "from": [1.95, 16, 1.95], + "to": [14.05, 2, 14.05], + "faces": { + "north": {"uv": [9, 0, 15, 7], "rotation": 180, "texture": "#12"}, + "east": {"uv": [9, 0, 15, 7], "rotation": 180, "texture": "#12"}, + "south": {"uv": [9, 0, 15, 7], "rotation": 180, "texture": "#12"}, + "west": {"uv": [9, 0, 15, 7], "rotation": 180, "texture": "#12"}, + "up": {"uv": [9, 9, 15, 15], "rotation": 90, "texture": "#12"} + } + }, + { + "name": "Basin Base", + "from": [2, 0, 2], + "to": [14, 2, 14], + "faces": { + "north": {"uv": [1, 7, 7, 8], "texture": "#12"}, + "east": {"uv": [1, 7, 7, 8], "texture": "#12"}, + "south": {"uv": [1, 7, 7, 8], "texture": "#12"}, + "west": {"uv": [1, 7, 7, 8], "texture": "#12"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#12"} + } + } + ], + "groups": [ + { + "name": "Basin", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, + 0, + 1, + 2 + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/casting_spout/block.json b/src/main/resources/assets/tfmg/models/block/casting_spout/block.json new file mode 100644 index 00000000..c49ac478 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/casting_spout/block.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [1, 2, 1], + "to": [15, 14, 15], + "color": 2, + "faces": { + "north": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "east": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "south": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "west": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "up": {"uv": [0, 0, 14, 14], "texture": "#missing"}, + "down": {"uv": [0, 0, 14, 14], "texture": "#missing"} + } + }, + { + "from": [2, 0, 2], + "to": [14, 2, 14], + "color": 7, + "faces": { + "north": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 12, 12], "texture": "#missing"}, + "down": {"uv": [0, 0, 12, 12], "texture": "#missing"} + } + }, + { + "from": [2, 14, 2], + "to": [14, 16, 14], + "color": 7, + "faces": { + "north": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 12, 12], "texture": "#missing"}, + "down": {"uv": [0, 0, 12, 12], "texture": "#missing"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/casting_spout/bottom.json b/src/main/resources/assets/tfmg/models/block/casting_spout/bottom.json new file mode 100644 index 00000000..d10dede4 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/casting_spout/bottom.json @@ -0,0 +1,31 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [6, -5, 6], + "to": [10, -2, 10], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "east": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "south": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "west": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#missing"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#missing"} + } + }, + { + "from": [5, -7, 5], + "to": [11, -5, 11], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 6, 6], "texture": "#missing"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#missing"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/casting_spout/connector.json b/src/main/resources/assets/tfmg/models/block/casting_spout/connector.json new file mode 100644 index 00000000..3b0e6f17 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/casting_spout/connector.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [4, -2, 4], + "to": [12, 0, 12], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#missing"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#missing"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/casting_spout/item.json b/src/main/resources/assets/tfmg/models/block/casting_spout/item.json new file mode 100644 index 00000000..4f64b8ea --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/casting_spout/item.json @@ -0,0 +1,83 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [1, 2, 1], + "to": [15, 14, 15], + "color": 2, + "faces": { + "north": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "east": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "south": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "west": {"uv": [0, 0, 14, 12], "texture": "#missing"}, + "up": {"uv": [0, 0, 14, 14], "texture": "#missing"}, + "down": {"uv": [0, 0, 14, 14], "texture": "#missing"} + } + }, + { + "from": [2, 0, 2], + "to": [14, 2, 14], + "color": 7, + "faces": { + "north": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 12, 12], "texture": "#missing"}, + "down": {"uv": [0, 0, 12, 12], "texture": "#missing"} + } + }, + { + "from": [2, 14, 2], + "to": [14, 16, 14], + "color": 7, + "faces": { + "north": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 12, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 12, 12], "texture": "#missing"}, + "down": {"uv": [0, 0, 12, 12], "texture": "#missing"} + } + }, + { + "from": [4, -2, 4], + "to": [12, 0, 12], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 8, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#missing"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#missing"} + } + }, + { + "from": [5, -7, 5], + "to": [11, -5, 11], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "east": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "south": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "west": {"uv": [0, 0, 6, 2], "texture": "#missing"}, + "up": {"uv": [0, 0, 6, 6], "texture": "#missing"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#missing"} + } + }, + { + "from": [6, -5, 6], + "to": [10, -2, 10], + "color": 5, + "faces": { + "north": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "east": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "south": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "west": {"uv": [0, 0, 4, 3], "texture": "#missing"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#missing"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#missing"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/item/block_mold.png b/src/main/resources/assets/tfmg/textures/item/block_mold.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/item/ingot_mold.png b/src/main/resources/assets/tfmg/textures/item/ingot_mold.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 zcmc$`cRZVK^gkTcY8BN|YR0Hpo1zGcs#T-*RJ-qgJ#{ zY@uS+es2AIf8+W4`Q!0=c}ed3oa;LGeXVoe=Y53hXsJ-#WVi_efhg2epXh=>S3-c_ zk2kIWSHdUnSpa{CJattRLFGeCYrvPQFBLQuK%goF*{St4;5+GSRTEDTh|25omk8s) z;s*k$t*Jdx(D$>%FUYvyjD0S4zJ7a4?($_o^z_FqCLaC57jN&p=ok-uzt$u3=Dq8S zcgdA6uG0#?{nkwqsu*%}?(N&?a~&QR{VWMR9u-4l>w=5%LFcCR>aAZJazmW$*ID=- zCiTOWtN&sHWA+CxPBPnxKp^{AGzgTS0wxCOfMMjI$1t1-2(VK7KWQ&Lh21|cR3v@=_lh(N;SeUL=j zKdF-L=BGaE%gfznU=RrVDt&l=2di?gJw3ah0i=^|x@+vtE>=PY(n$h7@@U#Ml@fux ziyk46T!f<|sbLZ#kbdrO2rY|Tz-!WZUUqtrPHfYzar;hqxCQ8q=|npExKxmr%ZCV5 ztm6wNvo}n-t7!*%OjA5;dui6SLODd2PqVCy3}9%H3w3jfkZs$MX#l4f=tTl2u8L>Q zdErcSIsdP^1E}LMSuYl2xsf~Sx7YtU)ds`}68^48FkWq)(&fz-nGnSYwYlE}jW|oe z`1dTGi&jSqYoq3V|4IkFv5f4y)ciR5cW-ZEPSkDv{2X&)0UCc;!<8%)u579gj>Lpp z?5f0u?L9|%L!pG@pM%ItG%yf8!TG_^0;l-iN8Oc$F$VGAnlI8b@R(SAFb3|$!2gXGr>ZUcPVG0@q zjnnu+I%osWs(gSGc~i>~r7}2|{hndt37A;bQJ-bsp(d6i|9`&Q=(E(-hBqQv_<#lX z(cO!p{OWQ+b_z1l*0?jIu4P;9bzzn?lBW_ zbCDA*u?nz0+3Cha6FHWgOR^Td@EpkTu8(Wd~8~9o1POr zKU&FL%OQaSYWdB;iYsE|aiXX0?zj!~7G6JBrm^sNRFi_-C=e_!E4#3`7<^>;TZFTn zy?wRy?wen5|6poN^r0un$V%|Mem|yHS@V;g+cOzq@Ag(4p=N0t1pO4RS{p@sh0mJ7`H?YyD z!h%3J(e|fYRyFLoWp^=qVfMg&|9Ec|sJd=x?2pE9=OD#m=8XZnhlr*3vh|w$)61!Y z`BLIM-hqLEaQJ!y=xfqL~1 zYXWCG$8HayX}JkmQ=>J7KAUXe44yWl*0Z4~Sy{t@-UKca{Pg?%T&RYt7R9H_2GYF= z_ZGMw@jEd~Y>XSupM$UpH1@`_X5807n_@|5;_DYFydkb1cGQ zsrc*278O*v9^cDL$r>b@_=Isyi~Jhmblz-COe(eH#sip@oA>pEmizACh{WPRckOr( zVe@wUD>~ndRs9+SpvDAGcQxhI!Bzteo!;Umicwynz;H{@lyR@El+?O4|B9Z}Cqijx zsLM^1#Vw7XErG@dS%Xk-@2*(ljz@g3Qc6anQIixs9zVl#elkHl&_w@}%c<8${qoCd z&cTOwDz65It6335m)AE?MXK1(S#rZ+lq~a8YZECoVGt6X3IePY!8EQHm_Wcw<2+D3 zwx9##u&q7r??SV0Z4}~WU~}|c*t`IN?oD9Gt}%;L+ft-{XHSM;J?R@b&CsPF4u@M> z>M{chR2M|LUio6lx$B3T<6UI@T3Hpnxn`3JDm3ba7`8FE*Ub2lbt)ZrRcV4IN{qo9 zh++p^!@ZgDx=L39Ft7jq<;lFey#k^wG6su5A=I$>y3ekJy}jDt#ji_CoWmzqX)BDu zVOr_B52M3a5zUHox!LHCTRzP>zM%3`wZaaD&;7O;-Qu@l^Ldc^(g>CEbulK`EB;EC zF2bXS$s5PVvu0E(Aq2lcMje<-^4UQixLfxb^lD<+GcaF#jqg$0O_5|bP0c9}d-rv8g5+(&xr!?ABO>TT%eVbXFNd?DA!5SjH zcZ^#^VNC1JNShcJRwpuby&tZ1ou<3upT?d@G?*yXpqjd{9&fsUsq$=@VF@tEwV~70 z6C61*YX92K0>+_bM#%cfPGd}L1{<&|f3BG7u>@mcFad@XSONrELDe-=ca3kK6GbYi z>Ir^J3Zk^BJ3RJw3qAZBZx<#$hyZ)1N7s)i72f+By0lboFC@jS$xCm-%ta(@KhBVz zR#a3Fn{^N5lT3v|%8ebxM9JMf35_2-wgWYFYop$Jvm^Mr?U?8wr2=Pr~~PR7&t-yssWh zI_;3J!j-BRv^O@EmCdKkOz~U8;mkyJdlV`PS<(Enne{DC54Nd_Q;CBufy=3$i!eSO zj}c9Ds5(Qt?*|>;r5<^6^iP0>iptH?>w!|d)@-v9*J}aRsJv3y6Y|14FmuWJTt#UnIBB?d5$ zsR-D&+w&(h&mr04-uCuj`+9n{v=Z>V+KnY)pJrm7z7B1!Ma|(mgcIdo1rPZB{ChYW zXO-(t^7##>G|*qCbZQaJ&DJc z9j1VQGiH)b=JVm%;o`XGj~mSHy9Hhp;pO=p9j{=~2HUYydnmrx0qTjjq&-+^a@g_C zXk6`2kI<~=2g&c#D~Q1@lls&zFcotX{<(GAOTT_8gxh6&xfP`ho>n+gT*OGr%O_FH zO`RRLkvvXLd1%evWWLxVksu&t_rZWlBe7Qg#rzoJ;dU!eY=DP{0yRBd2&DYIC<1O; zR=iO9Y%PxA2NW4e7yj${A=XVIwMn8{PTBmHqC4ykLu!)E-Ty5P#iLU1Ejk*e1QHHf zLu74PB1iRU^iT(Dp2d000ky~qb6(L1@+d{Xsv+n2ZFzdjF-OZ+!hD)`+l9`vUkRP{ zB)6zgoTCO7bYy2KSVye!s!_zl*tfrWu&-QDW_jb{ZfaKoHQ9~&Z#cp3Z{e8}Pg_i0 zn9BU%BgLBLyWz(RJbF`a%4$Aq*TwCycD%-UXmSYWeq}RrY7aV@TWlIkYIwy0O>|wt z^jg;?iyTB(yBRQa!?o)Y&hz*9l-cR&K0?YZ9c}Xqi&-MeqP+S}j$0 zA?tzgijJ5z-$q@1_Qv&2k{)1LS@Jjp?Uz_JUPPGgV~mOsUgv+Yh^_W+qdekn3a6GP zlt*c3FvmV)-m6UskSMSdn5$@inKwUaUOdy1@HTrMnz`iNLQ@zbH+D39aXP%!9*VU4 z<51%y;WD}KR~>6iFR>LjSift8B6G$Fw7$&iV=X5=7W1s&{7;zts>Kb$fqmp;+qHwiMu8I^`(3KuH|5X3 z8~0(5BOiV#?@8#=1hN358AbdN&m68qTDXR6daoN zXT}R`p51)&G#QdeStc6C%`N8+TeXX91X{2~4nst!hoi#6E;2Twm=G1Fl3L8)D(FMX9OaaM*4+owmX zy-y9lg-UhXf~c-8%^Svv>YlNslU3f%`mXrgpuraXZG& zTh&^#dibMXVJ!0+zUxu$wpVWfN90$#X<#3#I^SqN?|0475^&GC^uRB+B~{P&#qB?iU9eRu{9a@Pf9JEg96jwE*_y`}^L>n%4zq(g`OnKoV^d_aFZ!`C-I;zi6Xy zuIulRLroVws6vb}bCEo&&$GXa7M{up0Bg)Y@U>DkI15pP#h`Qcz|i(nLgXQz#F}=#`O}>p^rd>1 z{Gduo&$Eq@ShVdLs{8yX^WrG;e2;tEhF3o_-RA2q0Eq^w_-DLj*nZO7?s+lKYx2YY>%^XjJN#RvLnshfYTEIJ z+c{17wO^CMH&J-~bKf@S@IG+r#t6R{Up6-GlVitJ-F7zhpe{2x@tKTcl*pLMr^)I| z-*8b-NGQ+b=h;?DEIR(|{IK1Zkx$29@uGO~Hs`0c2JI5CYG!+{Lgc0Nw~b&ub=~Bx z4H6i{#BsdNVBgbhf9Tgcf#*webigs*8uAt?oP<_v4>(Yt9iPuq1#3^GqIHqCUiC@y zrB7~ST6YtN`D>Swx!z4ye+J~vip==hRgxhYE~;RS$w!4pz-mGrq{mSj?F>hn`!v_B z-Hna%7EM9_-rwIpK8E`#naFjH=~%9yKLa{1z(&(g&Vc~IY~R*COG7R5hcbt4$mX(# z68+1YlS@l^X?8})LEMfV@vd=kxpi!0BpC{W?o)jkC)aYeJebN5M*60=bft=J&bQSn zZqWIL1HrHQ7tH*5q~_Fk*-@dS(iDzVig#27_O}kPRX4pI{QmF^q`*f*FpQd#xb+Ef^%UX>8E=0WN)8nnW@<~ZK4d%UWi`xXnZDHTXY^%Us>H1jDvp^#JjJw~CNsM^?aRbjsAid`%7fnA1)ztr zBa|vW>HBU_N$rH6=eF>#G(t9fhfQF6v~?HgT9T}X_O-mUAuUPV5^K`rYd){i*+UyE zM_*Nw9}|yt$%e5{=k+la>?=3yKMOp^ht=Z7CgOH>LBXsEt_yDr(x=Pg&S;vR3xnCq~B$6D4ox{W_g zv`r7jAjedWl9G!-CuL??orEp@VGm7#lTdy`imoN(Z5Jyd>9LmXmY28juC}G6s+EttZ?GJdFTz zo=NzL|33P?YMxtGXgMh@bvOG%!N*|RuRU1KN*JLpelR}FMX5-FLvtUDCD*iT&`v-wn=N5luBg9X!%c+*^jK075h54C-}RXA8bH?(2*k4x;x~2SF=)l@x)d=(k86JO$!p@)Ht)9al*!s0!Ufll}kN&;0vxCEZ=j^Rww}5D-8qa=p zBWC6Udy;_o?g${dfTsZW?tPU=kf<_(ER%x_*&V=SPJbFXNbfRF|6X73bB%6eM-aW> zWMA>veq22PbG7RE;l;1<@M+Oo0c<{Q8_q`zGS2OR@x$GNAvS{cS(@m*mBiKfv?Gy)IdCXjLU(_TQ@7{)=WDlj#jvbqSTN8 z!2j|=UIiVt_Vvg#HpJSOA=X-!vL%uC^BsLlJ+|RyflYOT8J#1r)Ae=rbElwDh4e6& zSE!YLyMYPq|A=Kt#+IeiGuEY{vr25_LrEIfwz~k?Nad|f**bH4@8!NTS`v{ z+^)|yYcba4wH7t3h1_5heL1Bj*MZE!3r@mPRm_O@%4aQlm+LX;ex0tM06)LiC6m0- zk}o)`m#Z+&uC9jn{;8=f<$T>CDSa{pp;d2BtJ~G0S@GB_wwH&t5b-6+Ado>)&K6T? zEJ9NFGKdhUP<4?WCD5)q*vO+r zZKu%n1;tHV73N9(xE-+M6?&z3Wzc5IdVHW<9acoh*pqtC^~>wSwle? z>Y1S;ZZGf(&Nyi#$fa)xQ~Fzph&3IEfi?@$&&0pq&N}-svA3)_d2xgAsIV#i ze)LVeN(DcJvAjuX3z*bpzb$9h+(GM#;Ohpy(C^Q)&Q_5jTu_U!d7ozQjcMMD9nxoy z!Ph6fp-)sD<$X&2+VXBlm@ z1K7p?rIt~)8lxv&GH2sd=r=o`lVJIGHaT1Af4vE(n72i1}~O{Gia^=Ouc1-#Y)Y6=-AQ@JGP@b{H&ezwVz; zlp3+*v8p(yHA^oqW%FeuNS})nIop*;*|^|V5XGcH*RMQ)#oDeu2zze##V8qKC|HZn zO<#(?A4-N-ajFWL^~_`N1f(&-ZnW_iujTP~W64+ha8(4HSsN4BBjnwa1MDRRd?8h; z+iQIg1AruWtG0mi)1%GJfitB7+?9{v7LQevA-B?faf&CG*lxq!8g3Qxf~(=1Xf#>{ zu+zZKFlk0f>tg-JHUoU(8_3k2@MywLM0^c6lR=z}cJk|=8c!E>>~>@P0|O1XUU^q! z?U$Jzg!8?zzXpWm)qZ66>~?Vpse%;dC}}=q(dzg6ksSEYkbiWiirl^gxAuL?OAzvey`1kukrW08LFxC!kHLY z23so1n4!m$p4-_ zw8x`!qW8`?`FwcR_4lev5K&ELXy3?KVaZE-o6A(_7bGtN@STw8YyIfSiT{!2p+(G-^okO_E3$0X$zgRavP{nAX0Y|h9fn2TDPn>V!k8Xr+g z<<-DVDQnC}cn)D2G^evp9UpO*sRj*tKpPYxCKBx1!}>^iCe?LD|!Z{ska-!{7t=X{IQfuy69bg7E! z0YTd>tFuqIn96j{cN+uK;6m=n-8efaINV$ zHU*ZIKD4lqZq}vBS+?SksyZ4qq$bfYcm1Ci>Y_$GBrs8wOC6nH=rp7qQO$5i=*xbQ zCv^RV&AlmJEwD!SYMFIKwz(sBw!D|5I&5%NXS5|ltv+k+_kRtn*`}?*y`sp$d?h=- zIINJYe;T>UprfTEtBd35EpNo6?_%HzZMuHIYn>uq7(e&NGwq*+9EqZHdJ7{f zGs{A5gK5uhX`${={>u?*_vU)#^kf+fLj0Igq}Vb|wllC?p-O?9v=NlIip3rx=Gs=P z);5qk!fpVF8p!Ur{CjG^DSxSI>`7uKw{(}b*sIjh=NEQa z*t|dS&L1FaP+QqLjpFx;aM_Y?`!7cm4Fe_reHp+v7p)%x^l@kvT)6EwnlyDdHaIYs#A#HOxWQR%bvE{|FmO9&tk8Hiar%hT2aoJXro-6JGdwSI!- z22awhc;4UzzU^Zf8}egMQ&n{(XN5CK z4|H2fKV!v@E}kw+Zf!G{1fQaVPvcsx_~!OeE(V7y2xMBcBfD)8oM61^Bh$!*q|80t zE)KO*bmgD9i-{9fcG}f+v{S#zJ3+pD#<=>diTh9K4J z-3}E~4Bc+K8o`P{#3y)Xo?8Q+3~->f-cz`f^*3$)_cLFiYH0KGb%-JSPA)&>sgj8j zJALF6FpDJK>|Sbxbbgn)ArFF^J54SE^73g2fj>GIRw{q}@O!uIL%SM2Z2|jo@x(BQ z+!iAEH0NYqTcEn}2B*_9M;g>>1XrJO4#*4WFG+Vyq-nO^5t4!L_`+To^kA{TWSkF^ zd)gcR9e}DH2v7vkX ziF&CDqj$EoAma{mhG))A-pyp5h=gP~w^InLoQ;p``PzIo+GY9P@L*<{e1oFyZLq3S zpN6veT%fx4es8ZD&0rs<(L%Fqh5p2tj_^p-DI`E`d8TzHT&qtb4=S*l|qQK!$SE{-cbl&{Zqb}DUi3XM1G@Dd&&^A{kET`n-;VOF)fs9(}F9)B8u zTw&PNR7^rr-6y$D6U4>cU=iM#R6^AlW8a=>&QqKR)HTxN)eDFUBBm?eb)$a4x;OFJ zs6YL&r;@1yTu<(JR!&Z?De0DeUTbr!q=JWXvS9>-l9#T}!$qSg6t=Z#X# zv}b;myoPPyl~$&m(!-CgOsVzO-9gD`vExJ%Sv|oUYPVmpZ>-U^@?NZsb03bqHGM4k zY+K3Sku&FiB*@M%sczIJ01ikK*s}Zk_qW!)stAmvWdz2EO_`6rjulaL^$5szV3QWe zM+!WYw@VYBX8Et#BD39F5-Z;4$EE^h!N zc)^v#Cq1_O3Xb1A#~`$QPn?S+i1*$^WkmNq-k(Fc-;=V|ssHotWt=VNKdIXy$6rcS zSXx}f9+UPAI*hlO-aUT2UshEi8LjHh8IP_+K)R`z@X|xV>a%n9XQ!v7*X{PwV(xhf zE%45;8Z7>t&~V}`XcHw~zK^K7ZMn-c$5Vvik5`>Ksl6{@ynm9KM?3$>jd_8YzI*^k zHQVxsU5$GZ{qXiuuxCav=ii0!3u9i2)dq?wOhIrdN4&a4GLaYn!I;A<>U8gTDsIyx znGR5(l@gkO9#|1?Z|rdqMk5|&^X}Aas@Ps}ehenQ6XnVd_+9=L!eIc{!0X4AgIM%q zrks?XI|T-Z2l`@lbcI)7J$Z;zVvQjv7LZZ=lT2aqIpq|ZCfNzzgQBoQoA3r^96mk|MVd=%Pkte?Zr%p_|pRCqsx z=gb#xEEsn&cYr`2FPblmXCpPYxLhCktUx`l16Z0MV)w@2((ri@zn@K!pr2 z7sZ6_%%I)n!D+8^s$nWTCKCiQehN-XT0JRP5^v8JD|-nl1i{QdKeW^P;DMT*+6@|w zBLM-&kxlmAbCsfePE85o#|k(P`takz6{ETSg}ZDNARsYl@6~S92~|^dN11I4fI#f* z2+x{vP1$-5Wb!={5CFI}QaI7GoSm=fv<6>b&P@~lGU=8 zFwJeDY*sb7)J~QtH;`>C+9ag@u^uq;HMvEHe7k_}b_QT1p26OBY8z<(z`NGL>{oIa zJ9uy&hFJovoC4Up)=ca#J)KH})s{tC=aY@7A|B+giZv0DtAJn9%wE}TE_z9TH|905 zSp;y7GKk*!s@VG$S0?r5Hei2KeMgY0hHXk>6|=9e@773_1z-b^LpG_pcKZ?-l<^|J z_dlJvyq$ytKLG(z-uFiUw%%e33>yuO?^-1RAmB6_vlk&P;UiUUS7+T&3u=V8cPg12 zyI6#L6X&fB-}aMqGxk>^O+)~s^0JH8IBV<4sb7aoNWwwM6B`99r5MBa)c6LP8 zjMPFiW@9}OVbM+T@zgU{0M4K~8=}UBjIL@9k7@N^sXv!oRDG4N%0=pbcwHL#PjX|! z*kEt`DY4dcw<) zVeYDdfB$?nlOv99vX4>fZ=Q(U-!!0$6-O-D;i7XoBObZEWCB$7wpCKZsx)AKpDtTt zX;m!nEh=BOjrLBi=;%yA47>4AIk`&Kp{S=lyw4ixoe0;mp$NV6|0MU;-UcA1Z0rVY zrO+YWcthx`p979z=FI9(o0vz6obG+>>+$%iKp)+7l#v}|vCMP4_qd2B9{fT903xA= z(CeeXO2)+X{QUKc?QSpiZ#@<%!N0kVWW$@KM%fkpOj`6rPLY-y_C4unK1vS4kCYK` z^2qXtO0{A%zM=QvXssf_LH7P!@Tl)wee9xOCp7Y}}ZOWuC$z5Z9O zYV(#vc%lg&x>6NnKP}^%?~}$Pz!+5J82qE5i%l{UI;CDkzn^T5x0=WM^eGtIUC;*q zCq7cKnRwPk1&EIe(au?JV1y;St%SnN?@CGL$i+Kftm+QsDL0iOeyo z02)snbx~ze4p%RFTO@=}=|a!FfyDJDIV0*3E?Z}r_6eeOL@++5mb1$aGwJ%m8vk_u>;71(hLW8?8 z!Ce6sNJYF~j)_#f6+ZGvc~5Vu&?3L|v;I)4c~`7Mz?N?nWN7BXR)r>v|ASo2yg<$3 zUY5p^RV-36Jw{2i)H5cex*f9Qs5FbMn|F+z%M&s)A>h3Mk zyzn$nA%q2fp!oBN1wX>`;Npk%X-t<~pk2AZd(Vag0c=do$lzyz1FlU`GXI%x(jO*7 z51Wm_ku*LgW^#7FVt2O}&+&^*vUdfs=vVl#v?8}|2&3mWE7CLdp?b}XPhy$^p6wdT zJ2#t41z4(An;IHk`}62HgncrrV}a&3(JL{EZ9UNZVNW|Nk%)NMzfoUd2Y$J6QI(U} zd4+ufJvn7{zGRhnGxS%n9In(`EL0+2|GU9W*%s58|CdVSh=b|+ZKy!lweK;_F?h;S z{lFfR4F~;{tSZAb-qSy?mb8r>=XzM6!Gub6d}(0fw5!!Gh~?Zr6-z6t%gu9(bh@i6 zWQPo0OxZZnm(*lAJVI_zeq{;R&<|-AN4tz3Tf-I(Xoj$L6l~K_-`9C_Td?=Jjz(E(d3_kajsmOX3N zmROzjof#GIOU5p}hC0Lkffnz{Gg#t+j5cxU;z##vdE2hsyd1p%aAYnTbqymH8afSR z0bH);eZ+s<3-ki&Kf>fszn*1k^|t-79K2;BiAoGJ=(h-&8lud?)7uAfwfl|LF=YQ| zlpHn8yuUl8^du^)fwM|ecsLipPU+<3<@o~J3knJxP{DX#8dDj04vWlQp$xCGP@ey~ zM?kdPzMX#QwcpkFzPZ6H;pVB)D^W8zIJ^CTJe@_|^-u0f$^TY}7-=#&8HhvoE-WlG z9>(XrTKiC&6iqK39`muDxdz{mUhlXU!qGC{d7| z@JQ;6JR>`?YJsrIEU_hbcWr0qdC*qkBmNpQxxG7l`}&`rC&W9&?rX!_QvUot7D>Y& zdHnC*q(CR2TS zzESeQ&DQHhtXZu>07D?{#b)FN`t{J)(cDyfIc&)^D`J=auLNh~(p_Hpi48{=4Z68B zUAq`eKeyQrv!G1TY~D{a?*+6>@L|F!(pM5G|6<0=MzSWwyp?Xk(uUPB`GN7k#zG)6wEXH2spn*4=z&N}H#3Y2 ziV16Pz*J=%hS)XfoqMSD?Jt2a=6Y-^{@RzPrZmq51ErO|lD8=t zi=VHK+j|fB)8*ToKK2Me!A{6lV!dhxUgFCeb9%4=h6D+L@#dnur~3po#SiQ=%W`!- z*byG}%qPob>3|}xi!*B9xsTn~m;)G$nZ^vg81zvo&NYS8)lfDnuUmo|PyXsw7O+NZ znxX>U#g#wZjyw#lGQUrotP*$G&k9@%cs(_7D5sdTjJ-Ls5P28ZX|>09`%*VWmWPl!X&6T1o4|`7V$#m%Lj+$BdxM z)_E7J>cBOlQ4SqenCU7jNnbeqj(*x@%quxj2WHSK4zMOrb;$z zKGLOf)MUS=6p0*`U=jG&pSsBn+pH)qIw$ryN(REC>q{avmy|x*?q_rOddaB8wm`;1 zQ64XHjpo7G{lqkSCA}tK%z*}cnpEL!H(UJ*qdru{SmXq3@eg3M{~7G517>#F-FWk$ zZVn$hKh054nH)G_q24_Bv$VW8)7~OL&U9>dGKRQ8;3#qwfs;xQbSC58{m<&K5yo5( zrX<4Euk}=Q+zCFZ33X=v$T}ofbY01H?VWMuCYq7<3a56Qu*9S7?|;QABUq$bd$3F# zz5qw7w5vsdEP>wBwbz7yVIeuI)41_Z!1k3fy*}Hy1u-^-QpxU%+ zu!@`m&gaS&=O;U@IjShEjYupyE50aw@L`x}4II!cWz#Fl3j#{GChohcV;}d;Hn>59#ESDUNW2S%%{mPzE_hC5yQS^Z z_w#G%e7=39!lG_D2f+pBRj@z8x1F?uiTv%a66=QUy5!cfQDcqXDe-IznyK=Sb;!Lc znpl`PNr;af{GfNG14=DbJ6pXY=7Jlk{d!d3ZST98RJZmvW2Bkq{El$5O&I~kH2W0F zAh7>p?_+}R%cFpo^FSNCGv~=d@J;zV$IKnlDz?6-T7h@k7u*)C)+bH{Xr(Ru>SkP8 ztR5=E?%7vx43ry}1c1X#r4BOlWuC0w_swCvy&x*nU12VObhS^ms4@iHl7pW+zbho540118W?cFtm=jDaNQSe-m#cKR zayTt^N0#G|$?~F9@Ex5QCRM}o#6GR3V!$JRgE2{W3flhhn=xXPqTkLr;9>FSb>1aW zq<<0IQP}fdEZ(jBtx=k*g}M2U&ALRgYp96y2mTb+K3xm|2ir+*R{kD&mbtpn&sX}DI)hHa#sejH(PR%=?N>UKjHIekYu zLaD^P%5b4jV92uVz(UP6rZ{;k{(+e7uo%%tYU&>j+7gNco%6a_?R~~#Zn*yPnr>E0 zy`6=+ztRc7M~xEDiwk4=7MSP-hMuR^hW6IJ4Xo7MNihG2Zg%IgGR%ut626r*C`{Wo zNHe9V<(^CrnU+*Ed$cgm#3{NW$+ia?KaBmVr+(flrsF81LBpabn21)F$DQ&G>f+dy zek&BOEs^2<-m`$;=W70}H~R97g3gy$(n!_hGh{4oHwUOn@^5$`i{~w81Kda@+uP4m zZXd5H9>j`9DxUXF&}8TwXwAG|Bv|wSRRT^-Mzbah%xf(zEvGwZmW2x`euCc(+2NqS zzpmE|D><%m>o}ty7tMt&>j>W0jSAq?{K%84YWcl&-nvexe9`_z8GX)XdbLUd)P@)1 zVZenzw%u#=+o3K0))70DKalbB*>l3Pxcj?$!UfMAOc%J=mf( zOu4Q5yjpnA@&MHy$4SDy7!qArT?SkF&TdeTx8y=7$&w%?qOV7L)dNLZ9E|n;;R4sg zXYObsmb8PWV<44Jx1WUjrSWKfG=5peHfJTDU8-C?CT3nQ?q1*D^b8y(r##hUPO{Ft zwzm#YZIP{QR`?h(2vAZHeG`@J=7wu8aimA_QyRkT0_Rhh6PKDZ_5vaviRrI_B9X^g z_-$tHzMgjpMd^9KVo0CND>a_cwoiu09rG6FQCDlUtFl-ECEL)4k2ZHAC#jK0wRD^j{7^rUjq#&q~V@y>6SK&n#4Ed(%(BBMgUVo4ld9^> zJ|K*1DesApW^3N-6moPm5Tpa%^TV+4!(2Ej`v4RXs0JtjHr!x=@;D zWe89LKFg9P1f;;=`1F4*(fSC%ja3%k0W3!|rJ-_6MFN$&oJsFH6@AAt2e7ahasV3= zOW6U?OSC4@tNNx>4&ccp$DtXf^wD90kEw-4R#A%>T5mt&*GHM>hGVUc1&Xm3fBt;g zP&hUzqWuj_xMCWE!yjCA2il6`vbOZI5;2u!`$<^9tnn?Gjli;`Pf`tPjhg~#sC z^z6sGoR08T{R|I*SduyM^z(M$G0Fg8+)5xv?3kx|CL?b3{UV%BqpLOhW>;sk?{*8P zY?f6*+}(#`&aQu^4n}HY8SknbT)+l_};GYo#-;VN-3(6x$o!UpUFg$JgBdp9>FME zzFu`|r1jW(zq~Psjom(LT6%8_2hEzmGsa8$>Eb*BvW9m@5gv1&q*}@=DryE9;=Ltg z#=^aD!k#J})-;f}x9+Up18PNBs%NVQfc^O-{dL~oCm$plfaGztMrMu8FH$xVch}6C zuj6cp`v4p2KE|D!!cfXhH)$tUD_3u=Mj>Hx%2q9U7vtce7vAlL!!Dn9{5wz)WBz54 z+oJXnb^5Vtq+*hO>^KiQf`_+Ey&kP}^cyzvjK^W0X*F7Nx?J;8RYk|YsK4OdsR}4%Ch*P_C)n1AZA+EPhOWUl>KkO?_VGkQW zrO3DfV=`Hd>fqsDx4~bPjtLl<2U6lr?EQU`;*jvXxX`MYeUIR^e-3iQg4?|a-0z&8 zzC7L7tvwz_h&16*8$dfcJ2D&-)jG2#$*%Fa!mMh7cS5f0GV+1t0*`S)HF{n5P3RYf z7tPraM!CuE`<;~XJr|}Kh?_hK)P+kL&stY}^zED5Sq&jQOCJfC{-@QVO_}o7Y+e5V zSrQPMmwV**CxLXiD(4qVEi*zk5FTO*UH85~#+)&41+e6$$XZ}K*;XCkNhiA>MAA_b zF#B6?-+4AGx{F;@0Y&PCQF5{mE-DvakHgC}1`j?mQugKarNo``iAK}HQ+1QwvjHGp z|EarUqAYBmfw5Ogrcibi`%B?$ox6zr{;j^K4+CXBKxuklHsoGY!rNGWcO8tz*MiZ! zkJsPF0$k&Mx4s$sbes3XK*{^+9k`&^O#JlYR>a3)h<-pqY3N-3zeFIDa^@T-QYvnL zi`K-<{m6^T^-nTjysS$`OCrZ8?N<66Cnr&IjWtluzQo>fhVSf~c~TEkjYosvAG9pH zx8cRAO@4pC+FrFlv5KeGwyr6D#=#rNBNXeeP0Jc^I6(juz70U@TW!8Tw^Z^bGX!o` zl$XzELim9SVW(rPIRE0leq=6eel;EA?d!X8rY@aDPYQD|0g?cRhtfdONm!HN;XYiTH zz+9+Y4339D*P)X)l+~Y~Yn%OnZVZsBMVjM`bp->pw6uW#FVM0i1`I2?GPvOOY_S@( zq9sg~qaYPS1D^&m_kDSnwbm^myZ_G+N>;WTm+!s{oY(O7eb2Qwdu7RGX6O1VPLCrd z9A{`#>JQe~9a_C#CsNDxcYS@2a|Pn6LYC_;#iYH*jLA zz+q;lX!*76Mc0FmJP3E|>xHUkck)fi^gSkf`<%g2Z%NB(U3LMs?7$ONK2!$pTPk$+ zm!ECR8sMVHnY&8o0q3}6F8ckP=4JjmTGDBr{50T>Y2eV<=~At#;(9fp9RWQ?EjF7w z??@kW&HEGv4DyDgFE8&DD}4qoT-|$W<0QBJ+iMDeYw8!Mq*{G{as{~R^_?nHY4&5_ z)I2Z~Ie1=7k9=)=HE3C$bslJH?T|`&Y>3>o7R4v`45n=|D+2qkwe?d(R!-Tg!^bWe znU(fmwgcHaqv-nO4{D!Yzh3=GLr=50c-42X{wctfcWpJDM^B&bHuB#M6yE`y9|oHH z1=zNTj0GM2^8NeX#GJP;=3PsBm(qtP;N2 zo$@n3Q~3M2#d)i`48(vM4zK`ER|zrRxVrpO*!EQ%$&SF&X?!lEmwE!H+xC^uso1Y` z|LzrFjsyzsUUU3f+Gb0uS2@6a2Mik){oZ@}@~TB?g}@181_>kMNv~fmz6UzoCMWP+ zZIIWb9lPva)q-r8wvqYdq$9wCMUKgTzX(!1!+68>U7nAsZXW>!S%d4|i8_ffr}rLp z28K4nV&Ljp;P&P%4ZBtC*Y9n<f QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/tfmg/recipes/casting/test_caasting.json b/src/main/resources/data/tfmg/recipes/casting/test_caasting.json new file mode 100644 index 00000000..ee034451 --- /dev/null +++ b/src/main/resources/data/tfmg/recipes/casting/test_caasting.json @@ -0,0 +1,22 @@ +{ + "type": "tfmg:casting", + "ingredients": [ + { + "fluid": "tfmg:heavy_oil", + "amount": 1 + } + ], + "processingTime": 300, + "results": [ + { + "count": 1, + "item": "tfmg:steel_ingot" + } + , + { + "count": 1, + "item": "tfmg:steel_block" + } + + ] +} \ No newline at end of file diff --git a/src/main/resources/data/tfmg/recipes/casting/test_casting.json b/src/main/resources/data/tfmg/recipes/casting/test_casting.json new file mode 100644 index 00000000..5b5d03c9 --- /dev/null +++ b/src/main/resources/data/tfmg/recipes/casting/test_casting.json @@ -0,0 +1,22 @@ +{ + "type": "tfmg:casting", + "ingredients": [ + { + "fluid": "tfmg:gasoline", + "amount": 1 + } + ], + "processingTime": 200, + "results": [ + { + "count": 1, + "item": "tfmg:aluminum_ingot" + } + , + { + "count": 1, + "item": "tfmg:aluminum_block" + } + + ] +} \ No newline at end of file