From 17cc2d2e2e06b45ff51c3c2e83e3a16b91c53a4f Mon Sep 17 00:00:00 2001 From: DrMangoTea Date: Sat, 4 Nov 2023 18:13:21 +0100 Subject: [PATCH] ponders --- gradle.properties | 4 +- .../2d06ea55ee27bcb1f7f87fa8ec3e037afa7e1ad9 | 3 +- .../9047e4e94996e73e9dfde3738763637fb609e07e | 4 +- .../assets/createindustry/lang/en_us.json | 133 ++++++ .../cut_bauxite_brick_slab.json | 34 ++ .../cut_bauxite_brick_wall.json | 34 ++ ...from_stone_types_bauxite_stonecutting.json | 32 ++ .../cut_bauxite_wall.json | 34 ++ .../recipes/cut_bauxite_brick_stairs.json | 18 + .../recipes/cut_bauxite_stairs.json | 18 + .../recipes/small_bauxite_brick_slab.json | 16 + .../recipes/small_bauxite_brick_stairs.json | 18 + .../drmangotea/createindustry/CreateTFMG.java | 1 + .../createindustry/CreateTFMGClient.java | 5 +- .../createindustry/base/TFMGLangPartials.java | 3 +- .../createindustry/base/TFMGSpriteShifts.java | 6 + .../blocks/machines/exhaust/ExhaustBlock.java | 8 +- ...ileEntity.java => ExhaustBlockEntity.java} | 6 +- .../coke_oven/CokeOvenCTBehavior.java | 76 +++ .../ponder/TFMGPonderIndex.java | 81 ++++ .../createindustry/ponder/TFMGPonderTag.java | 29 ++ .../ponder/scenes/MetallurgyScenes.java | 261 +++++++++++ .../ponder/scenes/OilScenes.java | 434 ++++++++++++++++++ .../registry/TFMGBlockEntities.java | 7 +- .../createindustry/registry/TFMGBlocks.java | 5 +- .../createindustry/lang/default/ponders.json | 71 +++ .../createindustry/ponder/blast_furnace.nbt | Bin 0 -> 1207 bytes .../assets/createindustry/ponder/casting.nbt | Bin 0 -> 1206 bytes .../createindustry/ponder/coke_oven.nbt | Bin 0 -> 1530 bytes .../createindustry/ponder/diesel_engine.nbt | Bin 0 -> 905 bytes .../ponder/diesel_engine_expansion.nbt | Bin 0 -> 1105 bytes .../ponder/distillation_tower.nbt | Bin 0 -> 1659 bytes .../assets/createindustry/ponder/pumpjack.nbt | Bin 0 -> 688 bytes .../createindustry/ponder/small_engines.nbt | Bin 0 -> 968 bytes .../createindustry/ponder/surface_scanner.nbt | Bin 0 -> 432 bytes .../crude_oil_sus.json | 4 + 36 files changed, 1325 insertions(+), 20 deletions(-) create mode 100644 src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_slab.json create mode 100644 src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_wall.json create mode 100644 src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_from_stone_types_bauxite_stonecutting.json create mode 100644 src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_wall.json create mode 100644 src/generated/resources/data/createindustry/recipes/cut_bauxite_brick_stairs.json create mode 100644 src/generated/resources/data/createindustry/recipes/cut_bauxite_stairs.json create mode 100644 src/generated/resources/data/createindustry/recipes/small_bauxite_brick_slab.json create mode 100644 src/generated/resources/data/createindustry/recipes/small_bauxite_brick_stairs.json rename src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/{ExhaustTileEntity.java => ExhaustBlockEntity.java} (96%) create mode 100644 src/main/java/com/drmangotea/createindustry/blocks/machines/metal_processing/coke_oven/CokeOvenCTBehavior.java create mode 100644 src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderIndex.java create mode 100644 src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderTag.java create mode 100644 src/main/java/com/drmangotea/createindustry/ponder/scenes/MetallurgyScenes.java create mode 100644 src/main/java/com/drmangotea/createindustry/ponder/scenes/OilScenes.java create mode 100644 src/main/resources/assets/createindustry/lang/default/ponders.json create mode 100644 src/main/resources/assets/createindustry/ponder/blast_furnace.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/casting.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/coke_oven.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/diesel_engine.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/diesel_engine_expansion.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/distillation_tower.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/pumpjack.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/small_engines.nbt create mode 100644 src/main/resources/assets/createindustry/ponder/surface_scanner.nbt diff --git a/gradle.properties b/gradle.properties index 5f6a3164..acc154b2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ jei_version = 11.4.0.274 create_minecraft_version = 1.19.2 flywheel_minecraft_version = 1.19.2 -flywheel_version = 0.6.9-18 -create_version = 0.5.1.c-36 +flywheel_version = 0.6.10-20 +create_version = 0.5.1.f-45 registrate_version = MC1.19-1.1.5 \ No newline at end of file diff --git a/src/generated/resources/.cache/2d06ea55ee27bcb1f7f87fa8ec3e037afa7e1ad9 b/src/generated/resources/.cache/2d06ea55ee27bcb1f7f87fa8ec3e037afa7e1ad9 index 7f966a7f..ba8aa929 100644 --- a/src/generated/resources/.cache/2d06ea55ee27bcb1f7f87fa8ec3e037afa7e1ad9 +++ b/src/generated/resources/.cache/2d06ea55ee27bcb1f7f87fa8ec3e037afa7e1ad9 @@ -1,4 +1,4 @@ -// 1.19.2 2023-11-01T14:33:21.8836334 Registrate Provider for createindustry [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-11-02T15:43:25.647238 Registrate Provider for createindustry [Recipes, Advancements, Loot tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 50db526af77cf0ead08cadfd3f7daa8b84a40312 assets/createindustry/blockstates/air_intake.json 429437419b2ec98bd716e7ba15583b84da7488d5 assets/createindustry/blockstates/aluminum_bars.json 9e2417e479011e42ebf00685068e6b6f515f0b11 assets/createindustry/blockstates/aluminum_block.json @@ -1140,6 +1140,7 @@ bb6ed3bebbde28633a04b3c36c5ddfa2b761e2c1 data/forge/tags/items/buckets/naphtha.j 9fbe71f4776547000044bcc08054bb6ab2da4639 data/forge/tags/items/buckets/slag.json 94945bea02cca0bfa9c9c05fa16b5533f47024c0 data/forge/tags/items/buckets/steel.json ecf1a4c60ac630afe103f9d1c8bfea432158bdf9 data/forge/tags/items/concrete.json +d3d09e8b5b11e9272ed9e56093116cd3d82226f3 data/forge/tags/items/dusts/charcoal.json 8d6fdd619eb49c2a6d8ee3f30138b6aa1c24a9a8 data/forge/tags/items/dusts/coal_coke.json a5782b1478ab73e6bc6582e4008338de550b3fc6 data/forge/tags/items/factory_floor.json 6f21498ac0f4c376952c9c596a4813ec0919e966 data/forge/tags/items/ingots/aluminum.json diff --git a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e index db0267d2..907024f6 100644 --- a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e +++ b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e @@ -1,2 +1,2 @@ -// 1.19.2 2023-11-01T15:21:42.7803908 Create: The Factory Must Grow's lang merger -03dd999e2b7c33844c23e1c90ffb51f1098b6c7c assets/createindustry/lang/en_us.json +// 1.19.2 2023-11-04T17:59:14.3408431 Create: The Factory Must Grow's lang merger +d1ce4ba37e273babae91e01f54aba93f4014b80b assets/createindustry/lang/en_us.json diff --git a/src/generated/resources/assets/createindustry/lang/en_us.json b/src/generated/resources/assets/createindustry/lang/en_us.json index ccc60afe..abf63fdb 100644 --- a/src/generated/resources/assets/createindustry/lang/en_us.json +++ b/src/generated/resources/assets/createindustry/lang/en_us.json @@ -336,6 +336,62 @@ "create.goggles.get_engine_efficiency": "%1$s", "create.goggles.engine.stress": "%1$ssu", + "create.goggles.blast_furnace.nothing_lol": "", + "create.goggles.diesel_engine.info": "Diesel Engine:", + "create.goggles.pumpjack_info": "Pumpjack Info:", + "create.goggles.pumpjack.part_missing": "Hammer or Crank Missing", + "create.goggles.pumpjack.wrong_rotation1": "The Pumpjack Base is oriented incorrectly, the red marker must", + "create.goggles.pumpjack.wrong_rotation2": "face away from the Pumpjack Hammer Holder", + "create.goggles.pumpjack_fluid_storage": "Fluid Tank Info:", + + "create.pumpjack_deposit_amount": "%1$s Buckets", + + "create.goggles.pumpjack.deposit_info": "Deposit Info:", + "create.goggles.zero": "No Deposit Found", + "create.goggles.pumpjack.fluid_amount": "Fluid Amount:", + "create.goggles.machine_input.info": "Machine Input Info", + "create.goggles.machine_input.no_rot": "No Rotation Provided!", + "create.goggles.machine_input.power_level": "Power Level: ", + + "createindustry.ponder.small_engines.text_1": "To create a small engine, place front part and back part next to each other", + "createindustry.ponder.small_engines.text_2": "Fuel is inputted to the front part and exhaust is removed from the back part using pipes and an exhaust block", + "createindustry.ponder.small_engines.text_3": "Engine will start when redstone signal is applied to the front part", + "createindustry.ponder.small_engines.text_4": "There are engines with Gasoline, LPG and Kerosene as a fuel", + "createindustry.ponder.diesel_engine_small.text_1": "Diesel Engine is assembled by placing a shaft over a diesel engine block", + "createindustry.ponder.diesel_engine_small.text_2": "Carbon Dioxide has to be outputted by pipes and exhaust block", + "createindustry.ponder.diesel_engine_big.text_1": "Diesel engines can be placed next to each other to form bigger ones", + "createindustry.ponder.diesel_engine_big.text_2": "This way, Diesel Engines can have very big output", + "createindustry.ponder.surface_scanner.text_1": "Surface Scanner is use for finding crude oil deposits", + "createindustry.ponder.surface_scanner.text_2": "When rotation is applied, the machine starts to find a nearest oil deposit", + "createindustry.ponder.surface_scanner.text_3": "When a deposit is found, it will write coordinates of it in a goggle tooltip", + "createindustry.ponder.surface_scanner.text_4": "X: 47 Z: 68", + "createindustry.ponder.pumpjack.text_1": "First step of mining oil is building industrial pipes from deposit to surface", + "createindustry.ponder.pumpjack.text_2": "Then pumpjack has to be built on the top of the pipe", + "createindustry.ponder.distillation_tower.text_1": "Base of a distillation tower are steel tanks", + "createindustry.ponder.distillation_tower.text_2": "Tower is assembled by placing Steel Distillation Controller next to the tanks", + "createindustry.ponder.distillation_tower.text_3": "Placing 5 Distillation outputs and 5 Industrial Pipes finishes the structure", + "createindustry.ponder.distillation_tower.text_4": "Place Blaze Burners under the tanks to power it, dial on the tower shows the power level of the structure", + "createindustry.ponder.distillation_tower.text_5": "Oil is inputted into the controller block", + "createindustry.ponder.distillation_tower.text_6": "Every output block outputs one of the oil products", + "createindustry.ponder.distillation_tower.text_7": "LPG", + "createindustry.ponder.distillation_tower.text_8": "Kerosene", + "createindustry.ponder.distillation_tower.text_9": "Gasoline", + "createindustry.ponder.distillation_tower.text_10": "Diesel", + "createindustry.ponder.distillation_tower.text_11": "Heavy Oil", + + "createindustry.ponder.distillation_tower.header": "Distillation Tower Setup", + + "createindustry.ponder.pumpjack.header": "Building Pumpjack", + + "createindustry.ponder.surface_scanner.header": "Finding Oil", + + "createindustry.ponder.diesel_engine_big.header": "Making Big Engines", + + "createindustry.ponder.diesel_engine_small.header": "Building Diesel Engine", + + "createindustry.ponder.small_engines.header": "Building Small Engines", + "createindustry.ponder.tag.oil": "Oil Related Machines", + "createindustry.ponder.tag.oil.description": "Machines that mine, process or use crude oil and fluids created from it", "_": "->------------------------] UI & Messages [------------------------<-", @@ -391,6 +447,83 @@ "create.goggles.get_engine_efficiency": "%1$s", "create.goggles.engine.stress": "%1$ssu", "create.goggles.diesel_engine.info": "Diesel Engine:", + "create.goggles.pumpjack_info": "Pumpjack Info:", + "create.goggles.pumpjack.part_missing": "Hammer or Crank Missing", + "create.goggles.pumpjack.wrong_rotation1": "The Pumpjack Base is oriented incorrectly, the red marker must", + "create.goggles.pumpjack.wrong_rotation2": "face away from the Pumpjack Hammer Holder", + "create.goggles.pumpjack_fluid_storage": "Fluid Tank Info:", + + "create.pumpjack_deposit_amount": "%1$s Buckets", + + "create.goggles.pumpjack.deposit_info": "Deposit Info:", + "create.goggles.zero": "No Deposit Found", + "create.goggles.pumpjack.fluid_amount": "Fluid Amount:", + "create.goggles.machine_input.info": "Machine Input Info", + "create.goggles.machine_input.no_rot": "No Rotation Provided!", + "create.goggles.machine_input.power_level": "Power Level: ", + + + "_": "->------------------------] Ponders [------------------------<-", + + "createindustry.ponder.small_engines.text_1": "To create a small engine, place a front part and a back part behind it", + "createindustry.ponder.small_engines.text_2": "Fuel is inputted to the front part and exhaust is removed from the back part using pipes and an exhaust block", + "createindustry.ponder.small_engines.text_3": "Engine will start when redstone signal is applied to the front part", + "createindustry.ponder.small_engines.text_4": "There are engines with Gasoline, LPG and Kerosene as a fuel", + "createindustry.ponder.diesel_engine.text_1": "Diesel Engine is assembled by placing a shaft in the front of a diesel engine block", + "createindustry.ponder.diesel_engine.text_2": "Carbon Dioxide has to be outputted by pipes and exhaust block", + "createindustry.ponder.diesel_engine.text_3": "Diesel engines need air that can be collected with air intakes", + "createindustry.ponder.diesel_engine_expansion.text_1": "Diesel engine expansions give diesel engines 2 new fluid slots, for cooling and lubrication", + "createindustry.ponder.surface_scanner.text_1": "Surface Scanner is used for finding crude oil deposits", + "createindustry.ponder.surface_scanner.text_2": "When rotation is applied, the machine starts to find the nearest oil deposit", + "createindustry.ponder.surface_scanner.text_3": "When a deposit is found, compass at the top will show the direction", + "createindustry.ponder.pumpjack.text_1": "First step of mining oil is building industrial pipes from deposit to surface", + "createindustry.ponder.pumpjack.text_2": "Pumpjack base has to be placed on the top of the pipe", + "createindustry.ponder.pumpjack.text_3": "Pumpjack hammer needs to be placed behind it", + "createindustry.ponder.pumpjack.text_4": "The last step is placing a machine input (which is a power input for the pumpjack) with a pumpjack crank above it", + "createindustry.ponder.distillation_tower.text_1": "Base of a distillation tower are steel tanks", + "createindustry.ponder.distillation_tower.text_2": "Tower is assembled by placing Steel Distillation Controller next to the tanks", + "createindustry.ponder.distillation_tower.text_3": "To finish the multiblock place up to 6 Distillation outputs and Industrial Pipes between them", + "createindustry.ponder.distillation_tower.text_4": "Place Blaze Burners under the tanks to power it, dial on the tower shows the power level of the structure", + "createindustry.ponder.distillation_tower.text_5": "Oil is inserted into the controller block", + "createindustry.ponder.distillation_tower.text_6": "Every output block outputs one of the oil products", + "createindustry.ponder.distillation_tower.text_7": "LPG", + "createindustry.ponder.distillation_tower.text_8": "Gasoline", + "createindustry.ponder.distillation_tower.text_9": "Naphtha", + "createindustry.ponder.distillation_tower.text_10": "Kerosene", + "createindustry.ponder.distillation_tower.text_11": "Diesel", + "createindustry.ponder.distillation_tower.text_12": "Heavy Oil", + "createindustry.ponder.blast_furnace.text_1": "Main part of a blast furnace is a blast furnace output", + "createindustry.ponder.blast_furnace.text_2": "To make a blast furnace, make a cylinder of fireproof bricks around it", + "createindustry.ponder.blast_furnace.text_3": "Blast furnaces need reinforcements that are at least half the total height", + "createindustry.ponder.blast_furnace.text_4": "Everything is inserted through a hole at the top", + "createindustry.ponder.coke_oven.text_1": "Coke Oven is created by placing coke oven block as shown and clicking the front block with a wrench", + "createindustry.ponder.coke_oven.text_2": "Coke Ovens are slow so it is beneficial to have long arrays of them", + "createindustry.ponder.coke_oven.text_3": "Coal can be inserted from anywhere", + "createindustry.ponder.coke_oven.text_4": "Creosote and Carbon Dioxide have to be pumped out of the machine", + "createindustry.ponder.coke_oven.text_5": "After some time, coal coke will fall out of the machine at the front", + "createindustry.ponder.casting.text_1": "Casting is done by pouring liquid metal into a casting basin with a casting spout", + "createindustry.ponder.casting.text_2": "Casting basin needs a mold to function", + + "createindustry.ponder.distillation_tower.header": "Distillation Tower Setup", + + "createindustry.ponder.pumpjack.header": "Building Pumpjack", + + "createindustry.ponder.surface_scanner.header": "Finding Oil", + + "createindustry.ponder.diesel_engine.header": "Building Diesel Engine", + + "createindustry.ponder.diesel_engine_expansion.header": "Expanding Diesel Engines", + + "createindustry.ponder.small_engines.header": "Building Small Engines", + + "createindustry.ponder.coke_oven.header": "Building Coke Oven", + "createindustry.ponder.blast_furnace": "Building Blast Furnace", + + "createindustry.ponder.casting.header": "Casting Metal", + "createindustry.ponder.tag.oil": "Oil Related Machines", + "createindustry.ponder.tag.metallurgy": "Metal Processing Related Machines", + "createindustry.ponder.tag.oil.description": "Machines that mine, process or use crude oil and fluids created from it", + "createindustry.ponder.tag.metallurgy.description": "Machines that mine, process or use crude oil and fluids created from it", "_": "Thank you for translating Create: The Factory Must Grow!" diff --git a/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_slab.json b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_slab.json new file mode 100644 index 00000000..858c888c --- /dev/null +++ b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cut_bauxite_bricks": { + "conditions": { + "items": [ + { + "items": [ + "createindustry:cut_bauxite_bricks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createindustry:cut_bauxite_brick_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cut_bauxite_bricks", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createindustry:cut_bauxite_brick_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_wall.json b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_wall.json new file mode 100644 index 00000000..fde4e96f --- /dev/null +++ b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_brick_wall.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cut_bauxite_bricks": { + "conditions": { + "items": [ + { + "items": [ + "createindustry:cut_bauxite_bricks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createindustry:cut_bauxite_brick_wall" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cut_bauxite_bricks", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createindustry:cut_bauxite_brick_wall" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_from_stone_types_bauxite_stonecutting.json b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_from_stone_types_bauxite_stonecutting.json new file mode 100644 index 00000000..ed4b6274 --- /dev/null +++ b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_from_stone_types_bauxite_stonecutting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_stone_types_bauxite": { + "conditions": { + "items": [ + { + "tag": "createindustry:stone_types/bauxite" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createindustry:cut_bauxite_from_stone_types_bauxite_stonecutting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_stone_types_bauxite", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createindustry:cut_bauxite_from_stone_types_bauxite_stonecutting" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_wall.json b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_wall.json new file mode 100644 index 00000000..f4460973 --- /dev/null +++ b/src/generated/resources/data/createindustry/advancements/recipes/createindustry.building/cut_bauxite_wall.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cut_bauxite": { + "conditions": { + "items": [ + { + "items": [ + "createindustry:cut_bauxite" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createindustry:cut_bauxite_wall" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cut_bauxite", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createindustry:cut_bauxite_wall" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/recipes/cut_bauxite_brick_stairs.json b/src/generated/resources/data/createindustry/recipes/cut_bauxite_brick_stairs.json new file mode 100644 index 00000000..26b5b6f7 --- /dev/null +++ b/src/generated/resources/data/createindustry/recipes/cut_bauxite_brick_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_brick_stairs", + "key": { + "X": { + "item": "createindustry:cut_bauxite_bricks" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "createindustry:cut_bauxite_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/recipes/cut_bauxite_stairs.json b/src/generated/resources/data/createindustry/recipes/cut_bauxite_stairs.json new file mode 100644 index 00000000..dc8ec057 --- /dev/null +++ b/src/generated/resources/data/createindustry/recipes/cut_bauxite_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "cut_bauxite_stairs", + "key": { + "X": { + "item": "createindustry:cut_bauxite" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "createindustry:cut_bauxite_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_slab.json b/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_slab.json new file mode 100644 index 00000000..faad3b22 --- /dev/null +++ b/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "small_bauxite_brick_slab", + "key": { + "X": { + "item": "createindustry:small_bauxite_bricks" + } + }, + "pattern": [ + "XXX" + ], + "result": { + "count": 6, + "item": "createindustry:small_bauxite_brick_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_stairs.json b/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_stairs.json new file mode 100644 index 00000000..fc390281 --- /dev/null +++ b/src/generated/resources/data/createindustry/recipes/small_bauxite_brick_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "small_bauxite_brick_stairs", + "key": { + "X": { + "item": "createindustry:small_bauxite_bricks" + } + }, + "pattern": [ + "X ", + "XX ", + "XXX" + ], + "result": { + "count": 4, + "item": "createindustry:small_bauxite_brick_stairs" + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/createindustry/CreateTFMG.java b/src/main/java/com/drmangotea/createindustry/CreateTFMG.java index 009ecc4c..b47a2f40 100644 --- a/src/main/java/com/drmangotea/createindustry/CreateTFMG.java +++ b/src/main/java/com/drmangotea/createindustry/CreateTFMG.java @@ -65,6 +65,7 @@ public class CreateTFMG modEventBus.addListener(this::clientSetup); MinecraftForge.EVENT_BUS.register(this); } + @SuppressWarnings("removal") public static void gatherData(GatherDataEvent event) { DataGenerator gen = event.getGenerator(); gen.addProvider(true, new LangMerger(gen, MOD_ID, NAME, TFMGLangPartials.values())); diff --git a/src/main/java/com/drmangotea/createindustry/CreateTFMGClient.java b/src/main/java/com/drmangotea/createindustry/CreateTFMGClient.java index 0998a2b6..4ff8a5fa 100644 --- a/src/main/java/com/drmangotea/createindustry/CreateTFMGClient.java +++ b/src/main/java/com/drmangotea/createindustry/CreateTFMGClient.java @@ -2,6 +2,7 @@ package com.drmangotea.createindustry; import com.drmangotea.createindustry.items.gadgets.quad_potato_cannon.QuadPotatoCannonRenderHandler; +import com.drmangotea.createindustry.ponder.TFMGPonderIndex; import com.drmangotea.createindustry.registry.TFMGPartialModels; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -19,8 +20,8 @@ public class CreateTFMGClient { @SubscribeEvent public void setup(final FMLClientSetupEvent event) { - // CIPonderIndex.register(); - //CIPonderIndex.registerTags(); + TFMGPonderIndex.register(); + TFMGPonderIndex.registerTags(); } diff --git a/src/main/java/com/drmangotea/createindustry/base/TFMGLangPartials.java b/src/main/java/com/drmangotea/createindustry/base/TFMGLangPartials.java index 41693e82..c15773e9 100644 --- a/src/main/java/com/drmangotea/createindustry/base/TFMGLangPartials.java +++ b/src/main/java/com/drmangotea/createindustry/base/TFMGLangPartials.java @@ -12,7 +12,8 @@ import com.simibubi.create.foundation.utility.FilesHelper; import com.simibubi.create.foundation.utility.Lang; public enum TFMGLangPartials implements LangPartial { - INTERFACE("UI & Messages"); + INTERFACE("UI & Messages"), + PONDERS("Ponders"); ; diff --git a/src/main/java/com/drmangotea/createindustry/base/TFMGSpriteShifts.java b/src/main/java/com/drmangotea/createindustry/base/TFMGSpriteShifts.java index a2522b1d..e5fd1e16 100644 --- a/src/main/java/com/drmangotea/createindustry/base/TFMGSpriteShifts.java +++ b/src/main/java/com/drmangotea/createindustry/base/TFMGSpriteShifts.java @@ -35,6 +35,12 @@ public class TFMGSpriteShifts { ALUMINUM_SCAFFOLD_INSIDE = horizontal("scaffold/aluminum_scaffold_inside"); + public static final CTSpriteShiftEntry + COKE_OVEN_TOP = getCT(AllCTTypes.RECTANGLE, "coke_oven_top"), + COKE_OVEN_BOTTOM = getCT(AllCTTypes.RECTANGLE, "coke_oven_bottom"), + COKE_OVEN_BACK = getCT(AllCTTypes.RECTANGLE, "coke_oven_back"), + COKE_OVEN_SIDE = getCT(AllCTTypes.RECTANGLE, "coke_oven_side"); + public static final CTSpriteShiftEntry STEEL_ENCASED_COGWHEEL_SIDE = vertical("steel_encased_cogwheel_side"), diff --git a/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlock.java b/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlock.java index 0ca3b043..48049d62 100644 --- a/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlock.java +++ b/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlock.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.material.Fluids; import java.util.Random; -public class ExhaustBlock extends RodBlock implements IBE, IWrenchable { +public class ExhaustBlock extends RodBlock implements IBE, IWrenchable { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; //Direction facing = this.defaultBlockState().getValue(FACING); public ExhaustBlock(Properties p_55926_) { @@ -80,12 +80,12 @@ public class ExhaustBlock extends RodBlock implements IBE, IW p_153746_.add(FACING, WATERLOGGED); } @Override - public Class getBlockEntityClass() { - return ExhaustTileEntity.class; + public Class getBlockEntityClass() { + return ExhaustBlockEntity.class; } @Override - public BlockEntityType getBlockEntityType() { + public BlockEntityType getBlockEntityType() { return TFMGBlockEntities.EXHAUST.get(); } } diff --git a/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustTileEntity.java b/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlockEntity.java similarity index 96% rename from src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustTileEntity.java rename to src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlockEntity.java index d66e2371..f06311e2 100644 --- a/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustTileEntity.java +++ b/src/main/java/com/drmangotea/createindustry/blocks/machines/exhaust/ExhaustBlockEntity.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Optional; @SuppressWarnings("removal") -public class ExhaustTileEntity extends SmartBlockEntity implements IHaveGoggleInformation { +public class ExhaustBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation { @@ -46,7 +46,7 @@ public class ExhaustTileEntity extends SmartBlockEntity implements IHaveGoggleIn - public ExhaustTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { + public ExhaustBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); tankInventory = createInventory(); fluidCapability = LazyOptional.of(() -> tankInventory); @@ -171,7 +171,7 @@ public class ExhaustTileEntity extends SmartBlockEntity implements IHaveGoggleIn int random = Create.RANDOM.nextInt(5); if(random==0) - tankInventory.drain(20, IFluidHandler.FluidAction.EXECUTE); + tankInventory.drain(35, IFluidHandler.FluidAction.EXECUTE); diff --git a/src/main/java/com/drmangotea/createindustry/blocks/machines/metal_processing/coke_oven/CokeOvenCTBehavior.java b/src/main/java/com/drmangotea/createindustry/blocks/machines/metal_processing/coke_oven/CokeOvenCTBehavior.java new file mode 100644 index 00000000..d9c9f316 --- /dev/null +++ b/src/main/java/com/drmangotea/createindustry/blocks/machines/metal_processing/coke_oven/CokeOvenCTBehavior.java @@ -0,0 +1,76 @@ +package com.drmangotea.createindustry.blocks.machines.metal_processing.coke_oven; + +import com.drmangotea.createindustry.base.TFMGSpriteShifts; +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.api.connectivity.ConnectivityHandler; +import com.simibubi.create.content.logistics.vault.ItemVaultBlock; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; + +public class CokeOvenCTBehavior extends ConnectedTextureBehaviour.Base { + + @Override + public CTSpriteShiftEntry getShift(BlockState state, Direction direction, @Nullable TextureAtlasSprite sprite) { + Direction cokeOvenDirection = state.getValue(FACING); + boolean small = !ItemVaultBlock.isLarge(state); + if (cokeOvenDirection == null) + return null; + + if (direction == cokeOvenDirection.getOpposite()) + return TFMGSpriteShifts.COKE_OVEN_BACK; + if (direction == Direction.UP) + return TFMGSpriteShifts.COKE_OVEN_TOP; + if (direction == Direction.DOWN) + return TFMGSpriteShifts.COKE_OVEN_BOTTOM; + + return TFMGSpriteShifts.COKE_OVEN_SIDE; + } + + @Override + protected Direction getUpDirection(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face) { + Direction cokeOvenDirection =state.getValue(FACING); + boolean alongX = cokeOvenDirection.getAxis() == Axis.X; + if (face.getAxis() + .isVertical() && alongX) + return super.getUpDirection(reader, pos, state, face).getClockWise(); + if (face.getAxis() == cokeOvenDirection.getAxis() || face.getAxis() + .isVertical()) + return super.getUpDirection(reader, pos, state, face); + return Direction.fromAxisAndDirection(cokeOvenDirection.getAxis(), alongX ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE); + } + + + + @Override + protected Direction getRightDirection(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face) { + Direction cokeOvenDirection =state.getValue(FACING); + if (face.getAxis() + .isVertical() && cokeOvenDirection.getAxis() == Axis.X) + return super.getRightDirection(reader, pos, state, face).getClockWise(); + if (face.getAxis() == cokeOvenDirection.getAxis() || face.getAxis() + .isVertical()) + return super.getRightDirection(reader, pos, state, face); + return Direction.fromAxisAndDirection(Axis.Y, face.getAxisDirection()); + } + + public boolean buildContextForOccludedDirections() { + return super.buildContextForOccludedDirections(); + } + + @Override + public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, + BlockPos otherPos, Direction face) { + return state == other && ConnectivityHandler.isConnected(reader, pos, otherPos); //ItemVaultConnectivityHandler.isConnected(reader, pos, otherPos); + } + +} diff --git a/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderIndex.java b/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderIndex.java new file mode 100644 index 00000000..2c5b0ce4 --- /dev/null +++ b/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderIndex.java @@ -0,0 +1,81 @@ +package com.drmangotea.createindustry.ponder; + + +import com.drmangotea.createindustry.CreateTFMG; +import com.drmangotea.createindustry.ponder.scenes.MetallurgyScenes; +import com.drmangotea.createindustry.ponder.scenes.OilScenes; +import com.drmangotea.createindustry.registry.TFMGBlocks; +import com.simibubi.create.foundation.ponder.PonderRegistrationHelper; +import com.simibubi.create.foundation.ponder.PonderRegistry; + + +public class TFMGPonderIndex { + static final PonderRegistrationHelper HELPER = new PonderRegistrationHelper(CreateTFMG.MOD_ID); + + public static void register() { + HELPER.forComponents(TFMGBlocks.GASOLINE_ENGINE, TFMGBlocks.GASOLINE_ENGINE_BACK, + TFMGBlocks.LPG_ENGINE, TFMGBlocks.LPG_ENGINE_BACK, + TFMGBlocks.TURBINE_ENGINE, TFMGBlocks.TURBINE_ENGINE_BACK) + + .addStoryBoard("small_engines", OilScenes::small_engines, TFMGPonderTag.OIL); + + + HELPER.forComponents(TFMGBlocks.DIESEL_ENGINE) + + .addStoryBoard("diesel_engine", OilScenes::diesel_engine, TFMGPonderTag.OIL) + .addStoryBoard("diesel_engine_expansion", OilScenes::diesel_engine_expansion, TFMGPonderTag.OIL); + + HELPER.forComponents(TFMGBlocks.SURFACE_SCANNER) + + .addStoryBoard("surface_scanner", OilScenes::surface_scanner, TFMGPonderTag.OIL); + + HELPER.forComponents(TFMGBlocks.PUMPJACK_BASE,TFMGBlocks.PUMPJACK_CRANK,TFMGBlocks.PUMPJACK_HAMMER_HOLDER) + .addStoryBoard("pumpjack", OilScenes::pumpjack, TFMGPonderTag.OIL); + HELPER.forComponents(TFMGBlocks.STEEL_DISTILLATION_CONTROLLER,TFMGBlocks.STEEL_DISTILLATION_OUTPUT) + + .addStoryBoard("distillation_tower", OilScenes::distillation_tower, TFMGPonderTag.OIL); + ///////////////////////////////////////// + + HELPER.forComponents(TFMGBlocks.BLAST_FURNACE_OUTPUT) + + .addStoryBoard("blast_furnace", MetallurgyScenes::blast_furnace, TFMGPonderTag.METALLURGY); + + + HELPER.forComponents(TFMGBlocks.COKE_OVEN) + + .addStoryBoard("coke_oven", MetallurgyScenes::coke_oven, TFMGPonderTag.METALLURGY); + + + HELPER.forComponents(TFMGBlocks.CASTING_BASIN,TFMGBlocks.CASTING_SPOUT) + + .addStoryBoard("casting", MetallurgyScenes::casting, TFMGPonderTag.METALLURGY); + + + } + public static void registerTags() { + PonderRegistry.TAGS.forTag(TFMGPonderTag.OIL) + .add(TFMGBlocks.GASOLINE_ENGINE) + .add(TFMGBlocks.GASOLINE_ENGINE_BACK) + .add(TFMGBlocks.LPG_ENGINE) + .add(TFMGBlocks.LPG_ENGINE_BACK) + .add(TFMGBlocks.TURBINE_ENGINE) + .add(TFMGBlocks.TURBINE_ENGINE_BACK) + .add(TFMGBlocks.STEEL_DISTILLATION_OUTPUT) + .add(TFMGBlocks.STEEL_DISTILLATION_CONTROLLER) + .add(TFMGBlocks.PUMPJACK_BASE) + .add(TFMGBlocks.PUMPJACK_HAMMER_HOLDER) + .add(TFMGBlocks.PUMPJACK_CRANK); + + PonderRegistry.TAGS.forTag(TFMGPonderTag.METALLURGY) + .add(TFMGBlocks.COKE_OVEN) + .add(TFMGBlocks.CASTING_BASIN) + .add(TFMGBlocks.CASTING_SPOUT) + .add(TFMGBlocks.FIREPROOF_BRICKS) + .add(TFMGBlocks.FIREPROOF_BRICK_REINFORCEMENT) + .add(TFMGBlocks.BLAST_FURNACE_OUTPUT); + + + + } + + } diff --git a/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderTag.java b/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderTag.java new file mode 100644 index 00000000..a612d3cf --- /dev/null +++ b/src/main/java/com/drmangotea/createindustry/ponder/TFMGPonderTag.java @@ -0,0 +1,29 @@ +package com.drmangotea.createindustry.ponder; + + + +import com.drmangotea.createindustry.CreateTFMG; +import com.drmangotea.createindustry.registry.TFMGFluids; +import com.drmangotea.createindustry.registry.TFMGItems; +import com.simibubi.create.foundation.ponder.PonderTag; +import net.minecraft.resources.ResourceLocation; + +public class TFMGPonderTag extends PonderTag { + + public static final PonderTag OIL = create("oil") + .defaultLang("Oil Related Machines", "Machines used to get, refine and use oil") + .item(TFMGFluids.CRUDE_OIL.getBucket().get(), true, false).addToIndex(); + + public static final PonderTag METALLURGY = create("metallurgy") + .defaultLang("Metal processing", "Machines related to metal") + .item(TFMGItems.STEEL_INGOT.get(), true, false).addToIndex(); + + public TFMGPonderTag(ResourceLocation id) { + super(id); + } + + private static PonderTag create(String id) { + return new PonderTag(CreateTFMG.asResource(id)); + } + } + diff --git a/src/main/java/com/drmangotea/createindustry/ponder/scenes/MetallurgyScenes.java b/src/main/java/com/drmangotea/createindustry/ponder/scenes/MetallurgyScenes.java new file mode 100644 index 00000000..81361ca4 --- /dev/null +++ b/src/main/java/com/drmangotea/createindustry/ponder/scenes/MetallurgyScenes.java @@ -0,0 +1,261 @@ +package com.drmangotea.createindustry.ponder.scenes; + +import com.drmangotea.createindustry.registry.TFMGItems; +import com.simibubi.create.foundation.ponder.*; +import com.simibubi.create.foundation.ponder.element.EntityElement; +import com.simibubi.create.foundation.ponder.element.InputWindowElement; +import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.Vec3; + +public class MetallurgyScenes { + + public static void blast_furnace(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("blast_furnace", ""); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.7f); + scene.showBasePlate(); + // + Selection output = util.select.fromTo(2, 1, 2, 2, 1, 2); + + Selection furnace1 = util.select.fromTo(1, 1, 3, 3, 1, 3); + Selection furnace2 = util.select.fromTo(2, 1, 4, 2, 1, 4); + + Selection reinforcement1 = util.select.fromTo(3, 1, 2, 3, 2, 2); + Selection reinforcement2 = util.select.fromTo(3, 1, 4, 3, 2, 4); + Selection reinforcement3 = util.select.fromTo(1, 1, 4, 1, 2, 4); + Selection reinforcement4 = util.select.fromTo(1, 1, 2, 1, 2, 2); + + Selection furnace3 = util.select.fromTo(1, 2, 3, 3, 2, 3); + Selection furnace4 = util.select.fromTo(2, 2, 2, 2, 2, 4); + + Selection furnace5 = util.select.fromTo(0, 3, 0, 4, 4, 4); + + + Selection pipez = util.select.fromTo(0, 1, 0, 4, 2, 1); + scene.world.setKineticSpeed(pipez, 80); + + // + + scene.world.showIndependentSection(output, Direction.DOWN); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Main part of a blast furnace is a blast furnace output") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("To make a blast furnace, make a cylinder of fireproof bricks around it"); + + + scene.world.showIndependentSection(furnace1, Direction.DOWN); + scene.world.showIndependentSection(furnace2, Direction.DOWN); + scene.idle(10); + scene.world.showIndependentSection(furnace3, Direction.DOWN); + scene.world.showIndependentSection(furnace4, Direction.DOWN); + scene.idle(10); + scene.world.showIndependentSection(furnace5, Direction.DOWN); + + scene.idle(70); + + scene.world.showIndependentSection(reinforcement1, Direction.DOWN); + scene.world.showIndependentSection(reinforcement2, Direction.DOWN); + scene.world.showIndependentSection(reinforcement3, Direction.DOWN); + scene.world.showIndependentSection(reinforcement4, Direction.DOWN); + + scene.overlay.showText(100) + .attachKeyFrame() + .text("Blast furnaces need reinforcements that are at least half the total height") + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.world.showIndependentSection(pipez, Direction.DOWN); + + scene.idle(20); + scene.overlay.showText(100) + .attachKeyFrame() + .text("Everything is inserted to through a hole at the top"); + + + ItemStack stack1 = new ItemStack(TFMGItems.COAL_COKE_DUST.get()); + ItemStack stack2 = new ItemStack(TFMGItems.BLASTING_MIXTURE.get()); + + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack1); + scene.idle(10); + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack1); + scene.idle(10); + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack1); + scene.idle(10); + + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack2); + scene.idle(10); + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack2); + scene.idle(10); + scene.world.createItemEntity(util.vector.centerOf(2, 6, 3), util.vector.of(0, 0, 0), stack2); + scene.idle(10); + + } + + public static void coke_oven(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("coke_oven", ""); + scene.configureBasePlate(0, 0, 7); + scene.scaleSceneView(.7f); + + scene.showBasePlate(); + + + Selection coke_oven_middle = util.select.fromTo(3, 1, 2, 3, 3, 4); + + Selection coke_oven_right = util.select.fromTo(4, 1, 2, 5, 3, 4); + Selection coke_oven_left = util.select.fromTo(2, 1, 2, 1, 3, 4); + + Selection chutes = util.select.fromTo(1, 4, 4, 5, 4, 4); + Selection exhaust = util.select.fromTo(0, 4, 2, 5, 6, 2); + Selection output = util.select.fromTo(1, 4, 3, 5, 5, 3); + + Selection tank = util.select.fromTo(6, 1, 3, 6, 5, 3); + + ItemStack coal = new ItemStack(Items.COAL, 3); + ItemStack coal_coke = new ItemStack(TFMGItems.COAL_COKE.get(), 10); + + scene.world.setKineticSpeed(output, 80); + scene.world.setKineticSpeed(exhaust, 80); + + + scene.world.showIndependentSection(coke_oven_middle, Direction.DOWN); + scene.overlay.showText(70) + .attachKeyFrame() + .text("Coke Oven is created by placing coke oven block as shown and clicking the front block with a wrench") + .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 2), Direction.WEST)) + .placeNearTarget(); + + scene.idle(90); + + scene.world.showIndependentSection(coke_oven_right, Direction.DOWN); + scene.world.showIndependentSection(coke_oven_left, Direction.DOWN); + scene.overlay.showText(70) + .attachKeyFrame() + .text("Coke Ovens are slow so it is beneficial to have long arrays of them") + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.WEST)) + .placeNearTarget(); + + + scene.idle(30); + + + scene.world.showIndependentSection(chutes, Direction.DOWN); + scene.overlay.showText(70) + .attachKeyFrame() + .text("Coal can be inserted from anywhere"); + scene.idle(10); + ElementLink item = null; + for (int i = 0; i < 3; i++) { + scene.idle(10); + + for (int y = 0; y < 5; y++) { + + item = scene.world.createItemEntity(util.vector.centerOf(1 + y, 6, 4), util.vector.of(0, 0, 0), coal); + } + } + if (item != null) + scene.world.modifyEntity(item, Entity::discard); + scene.idle(40); + + scene.world.showIndependentSection(exhaust, Direction.DOWN); + scene.world.showIndependentSection(tank, Direction.DOWN); + scene.world.showIndependentSection(output, Direction.DOWN); + + scene.overlay.showText(70) + .attachKeyFrame() + .text("Creosote and Carbon Dioxide have to be pumped out of the machine") + .pointAt(util.vector.blockSurface(util.grid.at(3, 4, 2), Direction.WEST)) + .placeNearTarget(); + + + scene.idle(50); + + + scene.overlay.showText(70) + .attachKeyFrame() + .text("After some time, coal coke will fall out of the machine at the front"); + + + for (int y = 0; y < 5; y++) { + scene.world.createItemEntity(util.vector.centerOf(1 + y, 2, 1), util.vector.of(0, 0, 0), coal_coke); + } + + + } + + public static void casting(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("casting", ""); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + + Selection spout = util.select.fromTo(2, 3, 2, 2, 3, 2); + Selection basin_empty = util.select.fromTo(2, 1, 2, 2, 1, 2); + Selection basin_with_mold = util.select.fromTo(2, 1, 4, 2, 1, 4); + + Selection chain_drives = util.select.fromTo(5, 0, 3, 5, 3, 3); + + Selection pipez = util.select.fromTo(3, 1, 2, 4, 3, 3); + + Selection funnel = util.select.fromTo(2, 1, 1, 2, 1, 1); + + ItemStack steel_ingot = new ItemStack(TFMGItems.STEEL_INGOT.get()); + + scene.world.setKineticSpeed(chain_drives, 80); + scene.world.setKineticSpeed(pipez, 80); + + ElementLink emptyBasinElement = scene.world.showIndependentSection(basin_empty,Direction.DOWN); + scene.idle(20); + scene.world.showIndependentSection(spout, Direction.DOWN); + + scene.overlay.showText(70) + .attachKeyFrame() + .text("Casting is done by pouring liquid metal into a casting basin with a casting spout") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(20); + scene.world.showIndependentSection(pipez, Direction.DOWN); + scene.world.showIndependentSection(chain_drives, Direction.DOWN); + + scene.idle(50); + + + ElementLink basinElement = scene.world.showIndependentSection(basin_with_mold,null); + scene.world.hideIndependentSection(emptyBasinElement,null); + + scene.world.moveSection(basinElement,new Vec3(0d,0d,-2d),0); + + + BlockPos basinPos = util.grid.at(2, 1, 2); + Vec3 topOf = util.vector.topOf(basinPos); + scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() + .withItem(new ItemStack(TFMGItems.INGOT_MOLD.get())), 20); + + + scene.idle(10); + + scene.overlay.showText(70) + .attachKeyFrame() + .text("Casting basin needs a mold to function") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + + scene.idle(20); + scene.world.showIndependentSection(funnel,Direction.SOUTH); + scene.idle(20); + + scene.world.createItemEntity(util.vector.centerOf(2, 1, 1), util.vector.of(0, 0, 0), steel_ingot); + + } +} diff --git a/src/main/java/com/drmangotea/createindustry/ponder/scenes/OilScenes.java b/src/main/java/com/drmangotea/createindustry/ponder/scenes/OilScenes.java new file mode 100644 index 00000000..c2f82d59 --- /dev/null +++ b/src/main/java/com/drmangotea/createindustry/ponder/scenes/OilScenes.java @@ -0,0 +1,434 @@ +package com.drmangotea.createindustry.ponder.scenes; + +import com.simibubi.create.foundation.ponder.*; +import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; + +public class OilScenes { + + public static void small_engines(SceneBuilder scene, SceneBuildingUtil util){ + scene.title("small_engines", ""); + scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-2); + scene.idle(10); + + scene.showBasePlate(); + + + Selection gasoline_engine = util.select.fromTo(2, 1, 1, 2, 1, 2); + + Selection lpg_engine = util.select.fromTo(2, 3, 1, 2, 3, 2); + + Selection turbine_engine = util.select.fromTo(2, 5, 1, 2, 5, 2); + + Selection engine_lever = util.select.fromTo(1, 1, 1, 1, 1, 1); + + Selection exhaust = util.select.fromTo(1, 1, 2, 0, 2, 2); + + Selection input_pump = util.select.fromTo(3, 1, 1, 3, 1, 1); + + Selection tank_1 = util.select.fromTo(4, 1, 1, 4, 1, 1); + + Selection tank_2 = util.select.fromTo(4, 3, 1, 4, 3, 1); + + Selection tank_3 = util.select.fromTo(4, 5, 1, 4, 5, 1); + + scene.world.setKineticSpeed(gasoline_engine,0); + //scene.world.showSection(util.select.fromTo(0, 2, 0, 4, 2, 4), Direction.UP); + + + + ElementLink gasolineEngineElement = scene.world.showIndependentSectionImmediately(gasoline_engine); + scene.overlay.showText(50) + .attachKeyFrame() + .text("To create a small engine, place a front part and a back part behind it") + .pointAt(util.vector.blockSurface(util.grid.at(4, 0, 4), Direction.WEST)) + .placeNearTarget(); + scene.idle(100); + + + scene.world.setKineticSpeed(exhaust,80); + scene.world.setKineticSpeed(input_pump,80); + ElementLink exhaustElement = scene.world.showIndependentSection(exhaust,Direction.DOWN); + ElementLink inputPumpElement = scene.world.showIndependentSection(input_pump,Direction.DOWN); + ElementLink tankElement1 = scene.world.showIndependentSection(tank_1,Direction.DOWN); + + scene.overlay.showText(70) + .attachKeyFrame() + .text("Fuel is inputted to the front part and exhaust is removed from the back part using pipes and an exhaust block") + .pointAt(util.vector.blockSurface(util.grid.at(4, 0, 3), Direction.WEST)) + .placeNearTarget(); + scene.idle(80); + + + + ElementLink leverElement = scene.world.showIndependentSection(engine_lever,Direction.DOWN); + scene.world.setKineticSpeed(gasoline_engine,225); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("Engine will start when redstone signal is applied to the front part") + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 1), Direction.WEST)) + .placeNearTarget(); + scene.idle(100); + + + + scene.world.hideIndependentSection(gasolineEngineElement,Direction.SOUTH); + scene.world.hideIndependentSection(tankElement1,Direction.SOUTH); + + scene.idle(50); + + ElementLink lpgEngineElement = scene.world.showIndependentSection(lpg_engine,Direction.DOWN); + ElementLink tankElement2 = scene.world.showIndependentSection(tank_2,Direction.DOWN); + scene.world.moveSection(lpgEngineElement,new Vec3(0d,-2d,0d),0); + scene.world.moveSection(tankElement2,new Vec3(0d,-2d,0d),0); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("There are engines with Gasoline, LPG and Kerosene as a fuel"); + scene.idle(50); + scene.world.hideIndependentSection(lpgEngineElement,Direction.SOUTH); + scene.world.hideIndependentSection(tankElement2,Direction.SOUTH); + scene.idle(30); + ElementLink turbineEngineElement = scene.world.showIndependentSection(turbine_engine,Direction.DOWN); + ElementLink tankElement3 = scene.world.showIndependentSection(tank_3,Direction.DOWN); + scene.world.moveSection(turbineEngineElement,new Vec3(0d,-4d,0d),0); + scene.world.moveSection(tankElement3,new Vec3(0d,-4d,0d),0); + + scene.idle(50); + + } + public static void pumpjack(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("pumpjack", ""); + scene.configureBasePlate(0, 0, 7); + //// + Selection pipez = util.select.fromTo(0, 2, 0, 0, 4, 0); + Selection hammer = util.select.fromTo(3, 1, 2, 3, 3, 2); + Selection base = util.select.fromTo(1, 1, 2, 1, 1, 2); + Selection crank = util.select.fromTo(5, 2, 2, 5, 2, 2); + Selection input = util.select.fromTo(5, 1, 1, 5, 1, 2); + Selection base1 = util.select.fromTo(2, 0, 0, 6, 0, 4); + Selection base2 = util.select.fromTo(0, 0, 0, 1, 0, 4); + Selection deposit = util.select.fromTo(0, 1, 0, 0, 1, 0); + Selection tank = util.select.fromTo(0, 0, 3, 1, 0, 4); + + + //// + // scene.scaleSceneView(.4f); + //scene.removeShadow(); + + + + ElementLink baseElement1 = scene.world.showIndependentSection(base1,Direction.UP); + ElementLink baseElement2 = scene.world.showIndependentSection(base2,Direction.UP); + + scene.idle(20); + scene.world.hideIndependentSection(baseElement2,Direction.UP); + scene.idle(25); + ElementLink depositElement = scene.world.showIndependentSection(deposit,Direction.UP); + scene.world.moveSection(depositElement,new Vec3(0d,-4d,2d),0); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("First step of mining oil is building industrial pipes from deposit to surface"); + + + ElementLink pipeElement = scene.world.showIndependentSection(pipez,Direction.SOUTH); + scene.world.moveSection(pipeElement,new Vec3(0d,-4d,2d),0); + scene.idle(25); + scene.world.hideIndependentSection(pipeElement,Direction.DOWN); + scene.world.hideIndependentSection(depositElement,Direction.DOWN); + scene.idle(25); + scene.world.showIndependentSection(base2,Direction.SOUTH); + scene.idle(25); + ElementLink pumpjackBaseElement = scene.world.showIndependentSection(base,Direction.SOUTH); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Pumpjack base has to be placed on the top of the pipe") + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(40); + ElementLink hammerElement1 = scene.world.showIndependentSection(hammer,Direction.UP); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Pumpjack hammer needs to be placed behind it") + .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(40); + scene.world.setKineticSpeed(input,70); + scene.world.setKineticSpeed(base1,-140); + scene.world.showIndependentSection(input,Direction.SOUTH); + scene.idle(10); + scene.world.showIndependentSection(crank,Direction.SOUTH); + scene.overlay.showText(50) + .attachKeyFrame() + .text("The last step is placing a machine input (which is a power input for the pumpjack) with a pumpjack crank above it") + .pointAt(util.vector.blockSurface(util.grid.at(5, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(40); + + + + } + public static void diesel_engine(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("diesel_engine", ""); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + + Selection engine = util.select.fromTo(2, 1, 0, 2, 1, 2); + Selection exhaust = util.select.fromTo(2, 1, 3, 2, 2, 4); + Selection air = util.select.fromTo(0, 1, 0, 1, 1, 2); + Selection input = util.select.fromTo(3, 1, 0, 4, 1, 2); + + + + scene.idle(30); + + ElementLink engineElement = scene.world.showIndependentSection(engine,Direction.DOWN); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Diesel Engine is assembled by placing a shaft in the front of a diesel engine block"); + + + scene.idle(70); + + + + ElementLink inputElement = scene.world.showIndependentSection(input,Direction.DOWN); + ElementLink exhaustElement = scene.world.showIndependentSection(exhaust,Direction.DOWN); + scene.world.setKineticSpeed(input,80); + scene.world.setKineticSpeed(exhaust,80); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("Carbon Dioxide has to be outputted by pipes and exhaust block") + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 4), Direction.WEST)) + .placeNearTarget(); + scene.idle(40); + + ElementLink airElement = scene.world.showIndependentSection(air,Direction.DOWN); + scene.world.setKineticSpeed(air,80); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Diesel engines need air that can be collected with air intakes") + .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(10); + scene.world.setKineticSpeed(engine,128); + scene.idle(70); + + + + + } + public static void diesel_engine_expansion(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("diesel_engine_expansion", ""); + scene.configureBasePlate(0, 0, 6); + scene.showBasePlate(); + + Selection engine = util.select.fromTo(2, 1, 0, 2, 1, 2); + Selection input = util.select.fromTo(0, 1, 0, 1, 1, 2); + Selection exhaust = util.select.fromTo(3, 1, 0, 4, 2, 2); + + Selection expansion = util.select.fromTo(2, 1, 3, 2, 1, 3); + Selection air = util.select.fromTo(2, 1, 4, 2, 1, 5); + Selection coolant = util.select.fromTo(0, 1, 3, 1, 1, 3); + Selection oil = util.select.fromTo(3, 1, 3, 4, 1, 3); + + scene.world.setKineticSpeed(input,80); + scene.world.setKineticSpeed(exhaust,80); + scene.world.setKineticSpeed(air,80); + scene.world.setKineticSpeed(coolant,80); + scene.world.setKineticSpeed(oil,80); + scene.world.setKineticSpeed(engine,128); + + + + scene.world.showIndependentSection(engine,Direction.DOWN); + scene.world.showIndependentSection(input,Direction.DOWN); + scene.world.showIndependentSection(exhaust,Direction.DOWN); + ElementLink airElement = scene.world.showIndependentSection(air,Direction.DOWN); + + + scene.world.moveSection(airElement,new Vec3(0d,0d,-1d),0); + + scene.idle(30); + + scene.world.moveSection(airElement,new Vec3(0d,0d,1d),10); + + scene.idle(30); + + scene.world.showIndependentSection(expansion,Direction.DOWN); + + scene.idle(20); + + scene.world.showIndependentSection(coolant,Direction.DOWN); + scene.world.showIndependentSection(oil,Direction.DOWN); + + scene.overlay.showText(100) + .attachKeyFrame() + .text("Diesel engine expansions give diesel engines 2 new fluid slots, for cooling and lubrication") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)) + .placeNearTarget(); + + + + scene.idle(50); + + + + + } + + public static void surface_scanner(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("surface_scanner", ""); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + Selection scanner = util.select.fromTo(0, 1, 0, 5, 1, 5); + + scene.world.showSection(util.select.fromTo(0, 1, 0, 5, 1, 5), Direction.UP); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Surface Scanner is used for finding crude oil deposits") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + scene.world.setKineticSpeed(scanner,30); + scene.overlay.showText(50) + .attachKeyFrame() + .text("When rotation is applied, the machine starts to find the nearest oil deposit") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + + scene.overlay.showText(50) + .attachKeyFrame() + .text("When a deposit is found, compass at the top will show the direction") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + + } + + public static void distillation_tower(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("distillation_tower", ""); + scene.configureBasePlate(0, 0, 6); + scene.showBasePlate(); + scene.scaleSceneView(.4f); + Selection burners = util.select.fromTo(3, 1, 2, 4, 1, 3); + Selection tank = util.select.fromTo(3, 2, 2, 4, 14, 3); + Selection controller = util.select.fromTo(2, 1, 3, 2, 2, 3); + Selection output = util.select.fromTo(2, 3, 3, 2, 13, 3); + Selection oil_tank = util.select.fromTo(0, 1, 4, 2, 3, 4); + scene.world.setKineticSpeed(oil_tank,80); + + ElementLink tankElement = scene.world.showIndependentSection(tank,Direction.DOWN); + + scene.overlay.showText(70) + .attachKeyFrame() + .text("Base of a distillation tower are steel tanks") + .pointAt(util.vector.blockSurface(util.grid.at(4, 6, 3), Direction.WEST)) + .placeNearTarget(); + scene.idle(80); + ElementLink controllerElement = scene.world.showIndependentSection(controller,Direction.DOWN); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("Tower is assembled by placing Steel Distillation Controller next to the tanks") + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 3), Direction.WEST)) + .placeNearTarget(); + + scene.idle(70); + ElementLink outputElement = scene.world.showIndependentSection(output,Direction.DOWN); + scene.overlay.showText(60) + .attachKeyFrame() + .text("To finish the multiblock place up to 6 Distillation outputs and Industrial Pipes between them") + .pointAt(util.vector.blockSurface(util.grid.at(2, 7, 3), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + + ElementLink burnerElement = scene.world.showIndependentSection(burners,Direction.DOWN); + scene.overlay.showText(60) + .attachKeyFrame() + .text("Place Blaze Burners under the tanks to power it, dial on the tower shows the power level of the structure ") + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + ElementLink oilTankElement = scene.world.showIndependentSection(oil_tank,Direction.DOWN); + + scene.overlay.showText(60) + .attachKeyFrame() + .text("Oil is inputted into the controller block") + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 3), Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Every output block outputs one of the oil products") + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)) + .placeNearTarget(); + +/// + scene.overlay.showText(120) + .attachKeyFrame() + .text("LPG") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 13, 3), Direction.WEST)) + .placeNearTarget(); + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Gasoline") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 11, 3), Direction.WEST)) + .placeNearTarget(); + + + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Naphtha") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 9, 3), Direction.WEST)) + .placeNearTarget(); + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Kerosene") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 7, 3), Direction.WEST)) + .placeNearTarget(); + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Diesel") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 5, 3), Direction.WEST)) + .placeNearTarget(); + + scene.overlay.showText(120) + .attachKeyFrame() + .text("Heavy Oil") + .colored(PonderPalette.BLUE) + .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 3), Direction.WEST)) + .placeNearTarget(); + + + + scene.idle(150); + + } + + + + + + +} diff --git a/src/main/java/com/drmangotea/createindustry/registry/TFMGBlockEntities.java b/src/main/java/com/drmangotea/createindustry/registry/TFMGBlockEntities.java index ca9e94b5..e32a91af 100644 --- a/src/main/java/com/drmangotea/createindustry/registry/TFMGBlockEntities.java +++ b/src/main/java/com/drmangotea/createindustry/registry/TFMGBlockEntities.java @@ -24,7 +24,7 @@ import com.drmangotea.createindustry.blocks.engines.small.lpg.LPGEngineBackTileE import com.drmangotea.createindustry.blocks.engines.small.lpg.LPGEngineTileEntity; import com.drmangotea.createindustry.blocks.engines.small.turbine.TurbineEngineBackTileEntity; import com.drmangotea.createindustry.blocks.engines.small.turbine.TurbineEngineTileEntity; -import com.drmangotea.createindustry.blocks.machines.exhaust.ExhaustTileEntity; +import com.drmangotea.createindustry.blocks.machines.exhaust.ExhaustBlockEntity; import com.drmangotea.createindustry.blocks.machines.flarestack.FlarestackBlockEntity; import com.drmangotea.createindustry.blocks.machines.metal_processing.blast_furnace.BlastFurnaceOutputBlockEntity; import com.drmangotea.createindustry.blocks.machines.metal_processing.blast_furnace.BlastFurnaceRenderer; @@ -51,7 +51,6 @@ import com.drmangotea.createindustry.blocks.pipes.normal.LockablePipeBlockEntity import com.drmangotea.createindustry.blocks.tanks.SteelFluidTankRenderer; import com.drmangotea.createindustry.blocks.tanks.SteelTankBlockEntity; import com.drmangotea.createindustry.blocks.engines.small.UniversalEngineRenderer; -import com.simibubi.create.Create; import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; import com.simibubi.create.content.fluids.pipes.SmartFluidPipeBlockEntity; import com.simibubi.create.content.fluids.pipes.StraightPipeBlockEntity; @@ -242,8 +241,8 @@ public class TFMGBlockEntities { .validBlocks(TFMGBlocks.TURBINE_ENGINE_BACK) .register(); - public static final BlockEntityEntry EXHAUST = REGISTRATE - .blockEntity("exhaust", ExhaustTileEntity::new) + public static final BlockEntityEntry EXHAUST = REGISTRATE + .blockEntity("exhaust", ExhaustBlockEntity::new) .validBlocks(TFMGBlocks.EXHAUST) .register(); diff --git a/src/main/java/com/drmangotea/createindustry/registry/TFMGBlocks.java b/src/main/java/com/drmangotea/createindustry/registry/TFMGBlocks.java index 5230f60b..62382bd2 100644 --- a/src/main/java/com/drmangotea/createindustry/registry/TFMGBlocks.java +++ b/src/main/java/com/drmangotea/createindustry/registry/TFMGBlocks.java @@ -27,6 +27,7 @@ import com.drmangotea.createindustry.blocks.engines.small.turbine.TurbineEngineB import com.drmangotea.createindustry.blocks.machines.exhaust.ExhaustBlock; import com.drmangotea.createindustry.blocks.machines.flarestack.FlarestackBlock; import com.drmangotea.createindustry.blocks.machines.flarestack.FlarestackGenerator; +import com.drmangotea.createindustry.blocks.machines.metal_processing.coke_oven.CokeOvenCTBehavior; import com.drmangotea.createindustry.blocks.machines.oil_processing.distillation.distillation_tower.IndustrialPipeBlock; import com.drmangotea.createindustry.blocks.pipes.normal.aluminum.AluminumPipeAttachmentModel; import com.drmangotea.createindustry.blocks.pipes.normal.aluminum.AluminumPipeBlock; @@ -83,6 +84,7 @@ import com.simibubi.create.content.decoration.encasing.EncasingRegistry; import com.simibubi.create.content.fluids.pipes.SmartFluidPipeGenerator; import com.simibubi.create.content.fluids.pipes.valve.FluidValveBlock; import com.simibubi.create.content.kinetics.BlockStressDefaults; +import com.simibubi.create.content.logistics.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.processing.AssemblyOperatorBlockItem; import com.simibubi.create.foundation.data.*; import com.simibubi.create.foundation.utility.Couple; @@ -489,7 +491,7 @@ public static final BlockEntry STEEL_DISTILLATION_OUTPU REGISTRATE.block("steel_distillation_output", DistillationOutputBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(p -> p.color(MaterialColor.STONE)) - .blockstate(BlockStateGen.horizontalBlockProvider(true)) + .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) .properties(BlockBehaviour.Properties::noOcclusion) .transform(pickaxeOnly()) .item() @@ -639,6 +641,7 @@ public static final BlockEntry STEEL_DISTILLATION_OUTPU .properties(p -> p.requiresCorrectToolForDrops()) .blockstate(new CokeOvenGenerator()::generate) .transform(pickaxeOnly()) + .onRegister(connectedTextures(CokeOvenCTBehavior::new)) .item() .transform(customItemModel()) .lang("Coke Oven") diff --git a/src/main/resources/assets/createindustry/lang/default/ponders.json b/src/main/resources/assets/createindustry/lang/default/ponders.json new file mode 100644 index 00000000..073eb3a0 --- /dev/null +++ b/src/main/resources/assets/createindustry/lang/default/ponders.json @@ -0,0 +1,71 @@ +{ + + "createindustry.ponder.small_engines.text_1": "To create a small engine, place a front part and a back part behind it", + "createindustry.ponder.small_engines.text_2": "Fuel is inputted to the front part and exhaust is removed from the back part using pipes and an exhaust block", + "createindustry.ponder.small_engines.text_3": "Engine will start when redstone signal is applied to the front part", + "createindustry.ponder.small_engines.text_4": "There are engines with Gasoline, LPG and Kerosene as a fuel", + + "createindustry.ponder.diesel_engine.text_1": "Diesel Engine is assembled by placing a shaft in the front of a diesel engine block", + "createindustry.ponder.diesel_engine.text_2": "Carbon Dioxide has to be outputted by pipes and exhaust block", + "createindustry.ponder.diesel_engine.text_3": "Diesel engines need air that can be collected with air intakes", + + "createindustry.ponder.diesel_engine_expansion.text_1": "Diesel engine expansions give diesel engines 2 new fluid slots, for cooling and lubrication", + + + "createindustry.ponder.surface_scanner.text_1": "Surface Scanner is used for finding crude oil deposits", + "createindustry.ponder.surface_scanner.text_2": "When rotation is applied, the machine starts to find the nearest oil deposit", + "createindustry.ponder.surface_scanner.text_3": "When a deposit is found, compass at the top will show the direction", + + + "createindustry.ponder.pumpjack.text_1": "First step of mining oil is building industrial pipes from deposit to surface", + "createindustry.ponder.pumpjack.text_2": "Pumpjack base has to be placed on the top of the pipe", + "createindustry.ponder.pumpjack.text_3": "Pumpjack hammer needs to be placed behind it", + "createindustry.ponder.pumpjack.text_4": "The last step is placing a machine input (which is a power input for the pumpjack) with a pumpjack crank above it", + + "createindustry.ponder.distillation_tower.text_1": "Base of a distillation tower are steel tanks", + "createindustry.ponder.distillation_tower.text_2": "Tower is assembled by placing Steel Distillation Controller next to the tanks", + "createindustry.ponder.distillation_tower.text_3": "To finish the multiblock place up to 6 Distillation outputs and Industrial Pipes between them", + "createindustry.ponder.distillation_tower.text_4": "Place Blaze Burners under the tanks to power it, dial on the tower shows the power level of the structure", + "createindustry.ponder.distillation_tower.text_5": "Oil is inserted into the controller block", + "createindustry.ponder.distillation_tower.text_6": "Every output block outputs one of the oil products", + "createindustry.ponder.distillation_tower.text_7": "LPG", + "createindustry.ponder.distillation_tower.text_8": "Gasoline", + "createindustry.ponder.distillation_tower.text_9": "Naphtha", + "createindustry.ponder.distillation_tower.text_10": "Kerosene", + "createindustry.ponder.distillation_tower.text_11": "Diesel", + "createindustry.ponder.distillation_tower.text_12": "Heavy Oil", + + + "createindustry.ponder.blast_furnace.text_1": "Main part of a blast furnace is a blast furnace output", + "createindustry.ponder.blast_furnace.text_2": "To make a blast furnace, make a cylinder of fireproof bricks around it", + "createindustry.ponder.blast_furnace.text_3": "Blast furnaces need reinforcements that are at least half the total height", + "createindustry.ponder.blast_furnace.text_4": "Everything is inserted through a hole at the top", + + "createindustry.ponder.coke_oven.text_1": "Coke Oven is created by placing coke oven block as shown and clicking the front block with a wrench", + "createindustry.ponder.coke_oven.text_2": "Coke Ovens are slow so it is beneficial to have long arrays of them", + "createindustry.ponder.coke_oven.text_3": "Coal can be inserted from anywhere", + "createindustry.ponder.coke_oven.text_4": "Creosote and Carbon Dioxide have to be pumped out of the machine", + "createindustry.ponder.coke_oven.text_5": "After some time, coal coke will fall out of the machine at the front", + + "createindustry.ponder.casting.text_1": "Casting is done by pouring liquid metal into a casting basin with a casting spout", + "createindustry.ponder.casting.text_2": "Casting basin needs a mold to function", + + "createindustry.ponder.distillation_tower.header": "Distillation Tower Setup", + "createindustry.ponder.pumpjack.header": "Building Pumpjack", + "createindustry.ponder.surface_scanner.header": "Finding Oil", + "createindustry.ponder.diesel_engine.header": "Building Diesel Engine", + "createindustry.ponder.diesel_engine_expansion.header": "Expanding Diesel Engines", + "createindustry.ponder.small_engines.header": "Building Small Engines", + + "createindustry.ponder.coke_oven.header": "Building Coke Oven", + "createindustry.ponder.blast_furnace": "Building Blast Furnace", + "createindustry.ponder.casting.header": "Casting Metal", + + "createindustry.ponder.tag.oil": "Oil Related Machines", + + "createindustry.ponder.tag.metallurgy": "Metal Processing Related Machines", + + "createindustry.ponder.tag.oil.description": "Machines that mine, process or use crude oil and fluids created from it", + + "createindustry.ponder.tag.metallurgy.description": "Machines that mine, process or use crude oil and fluids created from it" +} \ No newline at end of file diff --git a/src/main/resources/assets/createindustry/ponder/blast_furnace.nbt b/src/main/resources/assets/createindustry/ponder/blast_furnace.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bf0db6e966fffa90f89c21e9ada954cbb8594bdf GIT binary patch literal 1207 zcmV;o1W5ZIiwFP!00000|IJw4Zrnr^9kYK!hATkO3qaz6>s$b(5G5jNBl1(= z#&|cgyQ7R}tns+3^a_wFA@K@42Cu<2kHI6rvB%@OUeDM{+H^Ns?Rw{%?|k!}<1^!g z2u+Zek!RRN2o-O?dIu9U#!M1PaE6N41O+q7=a*Rs7hg`0oAOLgs$VYhGZ{-<&FI27 z4UA*Jj0W(y19-dvJidj;=~$Nu<5*&8%xD0QJAlU)CPNf_%?ZWAMd5?F zBv0`HjwLE*ji0PYCaK!heH5JJX-cn9scd>2XPHJjC^$nqL6VA{PXku?+^3e{`~8YkAMI7?-1=C#hLt$@ijXxWII2=)L-HAM}VKf z=TC6`3>0}MaQ;AL=L(PVgfN~Fd8O0_2be5Zh4j%FjmQPMHy0od?=5IfE+QGT%MeXZ z;o~7^5)Le2<$f{rC{8fC17vtE;)UG9Nh+^^??J+IR$9?@AaGRF+R$ljsE1)Oa24zm zDzQ*vK2l=9j69R#YA@k1#-dDOOru#ozr@l({=*`o19QDK1`ZePDvnypSBmX}7F(9Y zLPlz#DM_(|ytDL_o0@1-_wI&nKjXPv)grp}zkFE+HFVl$u(zsUKJrgej4zatcOSvm zto)%WqlO5daRFbHiucjo1mAKF%dj7A005eT!ur;is7D<$m!?c^{p|Vu__%yT8xH96NwG zk7=%U$D5R?TGbnrpb~Yzm8cno+KLvrVDTJBy!6SCt!5{?W520BG~84)Uf$Y0RUf1q zvhQwvbA7(O&DFCu*H>vMY8iU{J?gw+W6L|UU14FB;Iv$hVaw~-ct$O6?ro_z&tI)K zn-$wpH=Eu}&`ugtEF~`5;X7mGl@D8(4y$|3EZI9SEj;iWop7LC{x_m^-K-DF=ZCdUZXOX^0i%uW}Dww>;evl zz(P3}hSdfDA#7RsqNzV^ck|+~Nd$+ZVCxWP>UtowueX$t%3nRGZ{c#Ru(%!oS6Fpr z+*4l2?2=|(fBjUXm_IQxx1W$&K@5C@j_)_fUiDyk)9iItVU-PCgsmKORH2Ke-^4OL V$08$~!4vW4=zo>4!qx2<0060yRtx|D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/createindustry/ponder/casting.nbt b/src/main/resources/assets/createindustry/ponder/casting.nbt new file mode 100644 index 0000000000000000000000000000000000000000..9677b849477fdf79ae5751f97806ebc20a157a2a GIT binary patch literal 1206 zcmV;n1WEfJiwFP!00000|Ls@HZsbH1Ew>-t?M_IL1`w|`5-S!6jj})_A(;nZ5-B}1 zz{aZBx4TQRtE{T>bi#@)J7CL(AK>?pSi$w9+&vz*F@eA=#!|~^=hV5k&N;qz`-F^% zqu94#6GHNjhaU$&?wE{#Yo-|}k{@H@UBn{1R6c(BU`*^(D6^9wFxDEz z+JG7K;IVt~I2}AzOV3RngRy$>40`a`J$RfBo(HgXz-QV7hcRm@b`bKRS2} zrb}mo>C)L?x^y;}E}fkoIvY%v&IZ$^v%z%fY%tI3>=T<`XqUL>DL_>8LUteFpQ^a< zIE@f#jmUsS!4FFI(`AS*$^p zRkjnxA(TkHN13#UdnhulEo9#+Vf#sb0T+H&EvVX>Wt>B75$AC_6>TZA8cN$$Up|?f zW;)IE0}TnTaL#d-<=8QCi%YeSQm{(uFK;5}JQjMz`F4X7 z`GgJ=10NN(-1cOX~{67SLdP_t)nANfmLM^6__>9~BQK)uehG>xxIy(VW= zDTB6%SIsY*43GF6wJEcK|9Fb6ilsFn?&*?)%-guT{riu<*&m<$^1~-T|N7xi4}G$A zg3^4!aZa7(ZChVq`2#$EjqoEpe?!Rkdt^-{?Dix>4}@a+y6o1w4{W~3TenN8UN_?^ zcP-H9WQU>eHgrWr5fdm45U-j0@NU}^p?L#&w=(Um#h9CPTzX?kAmd{;20X&-wm&-{<}Q`QG0LjT7PfHaj1)Y<(xpz%4E66N+}$ z=>qCfpz+A6hCNh!VD7xNSKbiyO*z0NV%A378<&7hka?w4!oH&{RmbNBj6Gz~8FUWM zdPK&N?I=$jEA4i|rXGD*?Fi4RicPSGR+}#;>x$&fgqRXm9TEyuJj9OMuk>4vc-b(d zqJYBc8?9}gFgp}MPee-PQh{NBBGsC^8XTup&ys@4z8k#@pta3akg++DNgvX4zft zv&4k!x~Ap`1$yYK(eNYUyI+iBI-tD1GFiO~Jk zZnfq(7k+89CID}7YC^uIW9E$^VTA}IGTbGxX6^j_NSnU4+vg-b3OX?jqVh$!VatQ< zn3dTwGl78S)trVGO`CVuYxS8I>(sG{i8mkx4&X+{bDMHy3t!f7eTG-%T<{la++mQJ zo=R>EeM{3np-OW(oY3B?{3uq`X}c;&y$fuCrau|;Tu#LdU;~Y%;;E7bx9c; zL5fPlaI2Gntg2+r5Zz%Q8o2zsBYvq5erL3VH|LBl&8fIVGk%#Qr0E{-c(!X{C2@E= zI+XmU{0$O_t|WS;?|#yIlfB3E+r2E7W+v7{JdrMMyjwfp>t%=QkJ?7xG?<6^%0@cq z8|zZ^GS#A;wzIa1r_o>uEXd7BOYMpAVPBn{jHo02U?%8@u%Gc!-Nyp{7tv^mss6y~ zSK!ldNYiCR({!qqQJr0<3@8vG8UP?mmBsAU)>TU2UgqB*w?d>UB3t834HI=IS;t7l zI4Y@0^$fX~P3u1H1LnXvFA!|2>nm#)uEiO31k|wgcGN3bK7xR{YF;T+^?)*NIoksC zQHW1TUz+AZLPH3+N!q@c zjXbfJ$h$(jij)39|GFcuR&j-_$SKrdB-v-r%$z+ls|a8Kp5njI1%Tq~+v@;A6q;*} z3X0DFg3Cn4*D9ii_XBWKsqCWa1;7=I$KPe&KC2x&JnocQacbHGBuj9D^1Pok5a_RGB0>~Lbq!9!&y3^RgME&M`~9J zoyjD@j4;8GI#aYDgdU&3t2jf#aWTo2&hEAu&&FJ6c8w7XzcF!Ltfi?C!r&mu`Q(Jn z5uVJsz&NA$+c;14oeROvT;@WT3Wj@}V4A`;H>y(;s8<&DP%#mB$do3uw?Mj@65iHI zm}5L+g2yZwr};c>Xu5iQw_|)0@0p3WoyrAfI2o&ABU~8l@eE_lrC8H8PR(9k88w3b z{_TuW@*9Xu5**~1Y_u)IQCzs-oFzGyZrb751{9|L*EPK-bY5UGMlq$eYwBKA+wZ*F zzLL3~5!@FtqnpRVES14mtD&4~e;K)r%QdIx#1{55Xu;)8x)%Iy_}cSu|;7(xpZH{pDV( zvYCSmN>VPUj;&*=@PP#Vc@SA}QCnkH1spnBeD)fH2}``k2~>p~7nAx%CnYNTkI_tEpR z!AZTElOn?OQPKwavX)=YFVWoTuQCw+&orc9vUqhRbUPd fL%e226o>F0)9f5GwR}<7`Urmj%}&7FkqrO<#skGi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/createindustry/ponder/diesel_engine_expansion.nbt b/src/main/resources/assets/createindustry/ponder/diesel_engine_expansion.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2e1085c37a1a1d37f708e4baac9ff8ac9759dd41 GIT binary patch literal 1105 zcmV-X1g`rZiwFP!00000|IJv-Zrer_y%b5AqKvkSK2V@-HbvJ(mtNJe6F8`m8c-f> zHpGY;TLV)w1ZQYj{e%2;+&df&BQey7(jtxkfqI-d_i^rnQVcMHK(ha+4*>c(wAT?t zlq;qfm7pIZ7)~>h-pUx?{4oMQ7t$VT9zKLp5k>10T^Mf-<88qVdhqx?c!C~0p@YZk zh-(|hbJ((&K@T3k2T#z0Cv@-(dgx^_F1;+qrI*FH^s*S2UKZohtI@Rw#-*3Vxb(6Z zmtGd*(#v98dIdf7vKW_M7UR;(VqAJzj7u+zap@KI(92?6dRdH1FN<;MWic+jEM`-$ z7<@ieF$|vymeIn8_%v1Qj$TlrOn}kbIg=_g(=>$Pq|EbdRYeBlD|{OmMcF?8TSm zf^i|4S{aXq7nI%1wR>I!12%&vX@L$Ul zJMtMqILRrU8O%2?@ujRjFbTpu1Qhdt=wM0lYQp%X<;#MmbHZ6lvLr7TdB@^u>*+s& zeg6RaA&gCdT!|$uG%AAFeDZ3Qf2xWp?}Sze64>p_j7_yZ4}YhSf4a4(18=W$kl4CZmL-o zJTGas#|a@h-EB2r;Npj|KOWf=A6n>2R3>$;+{o?-WvYZxJKU$8z z**+OKFy7x>@h0>>CtT{%=#G57l83!JDU_mAbA*Rn6!_whUa}snFT$hR0}rALA}6}M zyt2ao3%u*V^9E zXB<*?P(9X=^gBvx)CfDg#2r*@0gZxjFk^e`X` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/createindustry/ponder/distillation_tower.nbt b/src/main/resources/assets/createindustry/ponder/distillation_tower.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8ae991d057e869be10800b2e8b354496e7c2eb91 GIT binary patch literal 1659 zcmZ{geLNEg7{@JI!m`O#+eA~77}5)pyqvezyq!tE>LG&pm%VpU?AqzR&OXm}Ti|eW``PP)vx*2W*O8 zODKrwsWkZsJxG0k$TW!?;#BT6O+^8W+Vja);`AMID-s%+^E@K3VJJLu-SObyYI#5Nkn;P!#+O^WyU8py=|q z_B*P0=F_7^(MJ!HEo+3)l~4yM9#{qelOk&cWQ39;iZmN^LsrugmZ z&GQ!Q*D@-kNYjYxKQEs1l*eQ#64PfJ*P2L|3nQ^r>SYsna4Y^!^;PE06DY1B2OBDG6Pgl+J6BEXg*xwg zZx7c)RX%DZRv)CAvRcCe$BwPiuVLAOYndxagp4DATx`ZPy7u{y_i*w)Nfg!X8bn_o z+@BG3$p^_r&kTp1d8qPHFZQN(px(+b-nc<$PL(cEW%$D_8=SY~|wMu+Qh zCy!f>9~@kcO)9%@xqMnT+BuS^Rh@XY=FoZ=p(2r=83FchzqUdSMhk;S!zcV5FjE@6 z*ZK*{G}<~g)R#C7KRMr&mWvs_?nX=(yyf$4`%>q&?k~S$ws@_ZiN!SP3NL2g%VwlL z(05y4+^x=D#XfjLKt`@fSRy%p2bhae_`jlq%pWV329$*GCBGX0idxF!Ry6}!OazK&F z_CS?2EgAX3Z{3R44J8j5dr-5BabnuoKzKTttFts3cj(;nxtW$6*Dz&O@wIx7q4`BI zO|>^P$IcSoeJZbic>)be6fTp;xunf#>riGkOlCG>queDvr`wK$az2!L!BWOj474gM!HkDUMi)fqva-w`<4$!mU6`i?RgoO66B>!IW*i2nzBbS0_-Iq zb~YRgn!71$$%)+NvTY62K++|!ha`X@tIJBmbr6mlMa@u35b5*MN)JCJ2k;Kwm1ArE z89D}>ow4~ZMB~0`72{G#Hfx_DM23KU@&?Cgdn$_ifZlB&CW8)XX#qji@clRY%=>{} zp0_D?lF1V3hJ)gN!-qQ-iT^@nUUJ`oR$O}##|RY!AoeDQjKKs(fZ47`6Bk$wW(@zJ zJMjRk+x5WlbMb%+3!A*4v>1l~3k%Iihh&tQa^vB+`PtUA0D79;4;)``Z|7l8?8XlC zk8VuYWwKGZaOXhj0EeOO4fID>Cb}7-XY#VI5&H9@6r`HB@e4MX&3Q$%SDGEuhOf$0 K$TNXjT7Lt>Y$osk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/createindustry/ponder/pumpjack.nbt b/src/main/resources/assets/createindustry/ponder/pumpjack.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ce254e671c30000d567448985642c2d64fa382b6 GIT binary patch literal 688 zcmb2|=3oGW|8uAL_Fpy-Xj6~Ry}WKqjDQf6UWfKA=H+`81=P1VJ$fv)^JGr)tQ*tb z29@RiK3{m-Ld3jquS?ez7yo-RE7R4^$|$slT&(tCNGSI^JM-;1nY0roS4BkM^vS55 zZkwKMYA&8%?7kAiV%iUJfI+;pf0!J9_ zqK`e_oLU2;zW@F3A_7HZIl7W`bOC>+nr%JjolpO;*>YxQWbd4aj|{@|6Bi`+z4l_8 zq0->#Kf_WbXQlCpeOyPf?)z61CD*O`+xvczQHn|PjIa-zrev&JH*u;)$yspf=6|1anZ`XAb8H39#diG(e0Z;?b+za1MLJpcLNwUR3=0pP<24pt z;<&c(`^rr-9Cyv1ln&|^Fd5;;EG#5)$-qxPHug+ zws^buvwi$uc1hn^s^TT8yuM}QnSSxxCo_t?y-tNq$P0WKcVPF~{=(1sjMHNoYd0x( wru2Bn_NRS%|A&9;jQ zrh^3fDNCWIY8=DcR%Hc;j;o<9m-Kc=l*jO%O&}{~m9}n|wzes!iHQ3Ne8YdwC%I#Y z=2j+rG?4@P3TtFiBr z;F!g@j$*y_&Rjb{XWnu#ZW;p#y&eD-5c1QXH8jUyY&2n&q|Cn5EjT$<+x+HihSOOVl`%a|TH`qt! zGS$LQBPLZ+p0hq?UY@4Otn{>ZM5WYdEcMb|oYdZ%3n;6q4L+fhV!9$Pf1S%qmw3l` z>X+Vj4|3F5NTz00^6vwSM}>P%Da0c~2&n*){z(z1zQWj9LU?yY1}ug0(TloG(Uh`% zCb8}qwD5gI@z@xahU<=Noh9H73TX75aKJhu9=@dELU z0=agj3gpcdIKRe_2?-6(FEg%f#I#eIfKpJrp|6L;tF;gbjw3in1I%2Uj+lb}0*0H| zQ6^Hzinn@LU1U6!dabwVS+>4^|oNCNCJ9&6*8uJ#RK5Y?_p^XcnbN%yqYJM$W6@UL)f z&7Ha-OOp$+N#)BCMLmP*yhcLeDzOMkFc3o+A1f?~L&-F#Z4?Hb5tE=y*LfcXf#I2I%+$bl3o$z@g(0@R=Bw z&&0TVCdTD6F)p9m{cz|I$2F+0=?4|Dsd4+~#aW=SssUu5u@Dzvky7Tc=8#YRXpBE692yj*`^8V@G#