From 3cd181cb03820f7c09a2d1894aeb8e2c4e3069ad Mon Sep 17 00:00:00 2001 From: DrMangoTea Date: Wed, 30 Aug 2023 14:17:19 +0200 Subject: [PATCH] grenades, casings, connected storage blocks and creative mode tab --- .../ad795fb8576279849034d802e60366ec43bb396a | 38 ++ .../tfmg/blockstates/cast_iron_block.json | 7 + .../blockstates/heavy_machinery_casing.json | 7 + .../assets/tfmg/blockstates/napalm_bomb.json | 7 + .../assets/tfmg/blockstates/steel_block.json | 7 + .../assets/tfmg/blockstates/steel_casing.json | 7 + .../resources/assets/tfmg/lang/en_ud.json | 17 + .../resources/assets/tfmg/lang/en_us.json | 20 + .../tfmg/models/block/cast_iron_block.json | 6 + .../models/block/heavy_machinery_casing.json | 6 + .../assets/tfmg/models/block/napalm_bomb.json | 6 + .../assets/tfmg/models/block/steel_block.json | 6 + .../tfmg/models/block/steel_casing.json | 6 + .../tfmg/models/item/cast_iron_block.json | 3 + .../tfmg/models/item/copper_grenade.json | 6 + .../models/item/heavy_machinery_casing.json | 3 + .../assets/tfmg/models/item/napalm_bomb.json | 3 + .../assets/tfmg/models/item/steel_block.json | 3 + .../assets/tfmg/models/item/steel_casing.json | 3 + .../tfmg/models/item/thermite_grenade.json | 6 + .../assets/tfmg/models/item/zinc_grenade.json | 6 + .../data/create/tags/blocks/casing.json | 6 + .../data/create/tags/items/casing.json | 6 + .../forge/tags/blocks/storage_blocks.json | 6 + .../tags/blocks/storage_blocks/cast_iron.json | 5 + .../tags/blocks/storage_blocks/steel.json | 5 + .../data/forge/tags/items/storage_blocks.json | 6 + .../tags/items/storage_blocks/cast_iron.json | 5 + .../tags/items/storage_blocks/steel.json | 5 + .../tags/blocks/beacon_base_blocks.json | 6 + .../minecraft/tags/blocks/mineable/axe.json | 6 + .../tags/blocks/mineable/pickaxe.json | 9 + .../tags/blocks/needs_iron_tool.json | 6 + .../loot_tables/blocks/cast_iron_block.json | 20 + .../blocks/heavy_machinery_casing.json | 20 + .../tfmg/loot_tables/blocks/napalm_bomb.json | 20 + .../tfmg/loot_tables/blocks/steel_block.json | 20 + .../tfmg/loot_tables/blocks/steel_casing.json | 20 + .../java/com/drmangotea/tfmg/CreateTFMG.java | 26 +- .../com/drmangotea/tfmg/CreateTFMGClient.java | 30 ++ .../tfmg/base/TFMGSpriteShifts.java | 62 +++ .../BaseTFMGCreativeModeTab.java | 18 + .../ConcreteCreativeModeTab.java | 23 + .../TFMGCreativeModeTab.java | 54 +++ .../drmangotea/tfmg/base/spark/BlueSpark.java | 122 +++++ .../tfmg/base/spark/BlueSparkRenderer.java | 58 +++ .../tfmg/base/spark/GreenSpark.java | 122 +++++ .../tfmg/base/spark/GreenSparkRenderer.java | 58 +++ .../com/drmangotea/tfmg/base/spark/Spark.java | 118 +++++ .../tfmg/base/spark/SparkRenderer.java | 57 +++ .../explosives/napalm/NapalmBombBlock.java | 133 ++++++ .../explosives/napalm/NapalmBombEntity.java | 134 ++++++ .../explosives/napalm/NapalmBombRenderer.java | 50 ++ .../thermite_grenades/ChemicalColor.java | 7 + .../thermite_grenades/ThermiteGrenade.java | 118 +++++ .../ThermiteGrenadeItem.java | 48 ++ .../ThermiteGrenadeRenderer.java | 64 +++ .../thermite_grenades/fire/BlueFireBlock.java | 447 +++++++++++++++++ .../fire/GreenFireBlock.java | 451 ++++++++++++++++++ .../fire/TFMGColoredFires.java | 35 ++ .../tfmg/registry/TFMGBlockEntities.java | 4 + .../tfmg/registry/TFMGBlockStateGen.java | 15 + .../drmangotea/tfmg/registry/TFMGBlocks.java | 112 +++++ .../tfmg/registry/TFMGCreativeModeTabs.java | 17 + .../tfmg/registry/TFMGEntityTypes.java | 70 +++ .../drmangotea/tfmg/registry/TFMGItems.java | 31 ++ .../tfmg/registry/TFMGParticles.java | 4 + .../tfmg/registry/TFMGRegistrate.java | 263 ++++++++++ .../drmangotea/tfmg/registry/TFMGSounds.java | 4 + .../assets/tfmg/blockstates/blue_fire.json | 172 +++++++ .../assets/tfmg/blockstates/green_fire.json | 172 +++++++ .../tfmg/models/block/blue_fire_floor0.json | 6 + .../tfmg/models/block/blue_fire_floor1.json | 6 + .../tfmg/models/block/blue_fire_side0.json | 6 + .../tfmg/models/block/blue_fire_side1.json | 6 + .../models/block/blue_fire_side_alt0.json | 6 + .../models/block/blue_fire_side_alt1.json | 6 + .../tfmg/models/block/blue_fire_up0.json | 6 + .../tfmg/models/block/blue_fire_up1.json | 6 + .../tfmg/models/block/blue_fire_up_alt0.json | 6 + .../tfmg/models/block/blue_fire_up_alt1.json | 6 + .../tfmg/models/block/green_fire_floor0.json | 6 + .../tfmg/models/block/green_fire_floor1.json | 6 + .../tfmg/models/block/green_fire_side0.json | 6 + .../tfmg/models/block/green_fire_side1.json | 6 + .../models/block/green_fire_side_alt0.json | 6 + .../models/block/green_fire_side_alt1.json | 6 + .../tfmg/models/block/green_fire_up0.json | 6 + .../tfmg/models/block/green_fire_up1.json | 6 + .../tfmg/models/block/green_fire_up_alt0.json | 6 + .../tfmg/models/block/green_fire_up_alt1.json | 6 + .../tfmg/textures/block/aluminum_block.png | Bin 0 -> 264 bytes .../textures/block/aluminum_door_bottom.png | Bin 0 -> 280 bytes .../tfmg/textures/block/aluminum_door_top.png | Bin 0 -> 254 bytes .../tfmg/textures/block/aluminum_flywheel.png | Bin 0 -> 778 bytes .../tfmg/textures/block/aluminum_frame.png | Bin 0 -> 236 bytes .../tfmg/textures/block/aluminum_plating.png | Bin 0 -> 274 bytes .../tfmg/textures/block/aluminum_post.png | Bin 0 -> 260 bytes .../tfmg/textures/block/aluminum_truss.png | Bin 0 -> 245 bytes .../textures/block/bars/aluminum_bars.png | Bin 0 -> 264 bytes .../block/bars/aluminum_bars_edge.png | Bin 0 -> 211 bytes .../tfmg/textures/block/bars/steel_bars.png | Bin 0 -> 265 bytes .../textures/block/bars/steel_bars_edge.png | Bin 0 -> 206 bytes .../assets/tfmg/textures/block/bauxite.png | Bin 0 -> 281 bytes .../tfmg/textures/block/bauxite_cap.png | Bin 0 -> 257 bytes .../textures/block/black_concrete_stage0.png | Bin 0 -> 378 bytes .../textures/block/black_concrete_stage1.png | Bin 0 -> 657 bytes .../textures/block/black_concrete_stage2.png | Bin 0 -> 609 bytes .../textures/block/blue_concrete_stage0.png | Bin 0 -> 490 bytes .../textures/block/blue_concrete_stage1.png | Bin 0 -> 629 bytes .../textures/block/blue_concrete_stage2.png | Bin 0 -> 594 bytes .../assets/tfmg/textures/block/blue_fire.png | Bin 0 -> 13576 bytes .../tfmg/textures/block/blue_fire_0.png | Bin 0 -> 13576 bytes .../textures/block/blue_fire_0.png.mcmeta | 38 ++ .../tfmg/textures/block/blue_fire_1.png | Bin 0 -> 14166 bytes .../textures/block/blue_fire_1.png.mcmeta | 3 + .../textures/block/brown_concrete_stage0.png | Bin 0 -> 503 bytes .../textures/block/brown_concrete_stage1.png | Bin 0 -> 625 bytes .../textures/block/brown_concrete_stage2.png | Bin 0 -> 580 bytes .../tfmg/textures/block/cast_iron_block.png | Bin 0 -> 282 bytes .../block/cast_iron_block_connected.png | Bin 0 -> 2352 bytes ...cast_iron_distillation_controller_side.png | Bin 0 -> 267 bytes .../cast_iron_distillation_controller_top.png | Bin 0 -> 239 bytes .../textures/block/cast_iron_flywheel.png | Bin 0 -> 776 bytes .../tfmg/textures/block/caution_block.png | Bin 0 -> 259 bytes .../assets/tfmg/textures/block/cement.png | Bin 0 -> 398 bytes .../assets/tfmg/textures/block/chipwood.png | Bin 0 -> 619 bytes .../tfmg/textures/block/coal_coke_block.png | Bin 0 -> 253 bytes .../assets/tfmg/textures/block/concrete.png | Bin 0 -> 421 bytes .../tfmg/textures/block/cut_bauxite.png | Bin 0 -> 545 bytes .../tfmg/textures/block/cut_bauxite_brick.png | Bin 0 -> 251 bytes .../textures/block/cyan_concrete_stage0.png | Bin 0 -> 511 bytes .../textures/block/cyan_concrete_stage1.png | Bin 0 -> 607 bytes .../textures/block/cyan_concrete_stage2.png | Bin 0 -> 581 bytes .../tfmg/textures/block/deposit_scanner.png | Bin 0 -> 996 bytes .../tfmg/textures/block/diesel_engine.png | Bin 0 -> 510 bytes .../block/distillation_controller.png | Bin 0 -> 238 bytes .../block/distillation_controller_front.png | Bin 0 -> 285 bytes .../block/distillation_controller_top.png | Bin 0 -> 251 bytes .../block/distillation_tower_output.png | Bin 0 -> 480 bytes .../tfmg/textures/block/distiller_side.png | Bin 0 -> 212 bytes .../textures/block/encased_steel_pipe.png | Bin 0 -> 673 bytes .../assets/tfmg/textures/block/exhaust.png | Bin 0 -> 773 bytes .../tfmg/textures/block/factory_floor.png | Bin 0 -> 211 bytes .../assets/tfmg/textures/block/flarestack.png | Bin 0 -> 451 bytes .../tfmg/textures/block/fossilstone.png | Bin 0 -> 333 bytes .../tfmg/textures/block/gasoline_engine.png | Bin 0 -> 5089 bytes .../assets/tfmg/textures/block/gauge.png | Bin 0 -> 445 bytes .../tfmg/textures/block/glass_steel_pipe.png | Bin 0 -> 275 bytes .../textures/block/gray_concrete_stage0.png | Bin 0 -> 472 bytes .../textures/block/gray_concrete_stage1.png | Bin 0 -> 616 bytes .../textures/block/gray_concrete_stage2.png | Bin 0 -> 585 bytes .../textures/block/green_concrete_stage0.png | Bin 0 -> 460 bytes .../textures/block/green_concrete_stage1.png | Bin 0 -> 631 bytes .../textures/block/green_concrete_stage2.png | Bin 0 -> 591 bytes .../assets/tfmg/textures/block/green_fire.png | Bin 0 -> 13204 bytes .../tfmg/textures/block/green_fire_0.png | Bin 0 -> 13204 bytes .../textures/block/green_fire_0.png.mcmeta | 38 ++ .../tfmg/textures/block/green_fire_1.png | Bin 0 -> 13720 bytes .../textures/block/green_fire_1.png.mcmeta | 3 + .../tfmg/textures/block/hardened_planks.png | Bin 0 -> 263 bytes .../block/heavy_casing_door_bottom.png | Bin 0 -> 290 bytes .../heavy_casing_encased_cogwheel_side.png | Bin 0 -> 276 bytes ...casing_encased_cogwheel_side_connected.png | Bin 0 -> 377 bytes .../tfmg/textures/block/heavy_casing_side.png | Bin 0 -> 200 bytes .../tfmg/textures/block/heavy_casing_top.png | Bin 0 -> 293 bytes .../tfmg/textures/block/heavy_gearbox.png | Bin 0 -> 304 bytes .../textures/block/heavy_machinery_casing.png | Bin 0 -> 256 bytes .../heavy_machinery_casing_connected.png | Bin 0 -> 1845 bytes .../block/heavy_plated_door_bottom.png | Bin 0 -> 253 bytes .../textures/block/heavy_plated_door_top.png | Bin 0 -> 247 bytes .../textures/block/industrial_barrel_back.png | Bin 0 -> 249 bytes .../block/industrial_barrel_front.png | Bin 0 -> 377 bytes .../block/industrial_barrel_front_open.png | Bin 0 -> 438 bytes .../textures/block/industrial_barrel_side.png | Bin 0 -> 249 bytes .../tfmg/textures/block/industrial_pipe.png | Bin 0 -> 390 bytes .../tfmg/textures/block/ladder_aluminum.png | Bin 0 -> 210 bytes .../textures/block/ladder_aluminum_hoop.png | Bin 0 -> 230 bytes .../tfmg/textures/block/ladder_steel.png | Bin 0 -> 214 bytes .../tfmg/textures/block/ladder_steel_hoop.png | Bin 0 -> 221 bytes .../block/layered_bauxite_connected.png | Bin 0 -> 730 bytes .../block/light_blue_concrete_stage0.png | Bin 0 -> 583 bytes .../block/light_blue_concrete_stage1.png | Bin 0 -> 623 bytes .../block/light_blue_concrete_stage2.png | Bin 0 -> 595 bytes .../block/light_gray_concrete_stage0.png | Bin 0 -> 423 bytes .../block/light_gray_concrete_stage1.png | Bin 0 -> 591 bytes .../block/light_gray_concrete_stage2.png | Bin 0 -> 561 bytes .../assets/tfmg/textures/block/lignite.png | Bin 0 -> 279 bytes .../textures/block/lime_concrete_stage0.png | Bin 0 -> 528 bytes .../textures/block/lime_concrete_stage1.png | Bin 0 -> 637 bytes .../textures/block/lime_concrete_stage2.png | Bin 0 -> 598 bytes .../assets/tfmg/textures/block/limesand.png | Bin 0 -> 563 bytes .../tfmg/textures/block/liquid_concrete.png | Bin 0 -> 325 bytes .../textures/block/liquid_rebar_concrete.png | Bin 0 -> 215 bytes .../block/magenta_concrete_stage0.png | Bin 0 -> 489 bytes .../block/magenta_concrete_stage1.png | Bin 0 -> 603 bytes .../block/magenta_concrete_stage2.png | Bin 0 -> 582 bytes .../tfmg/textures/block/mesh_concrete.png | Bin 0 -> 408 bytes .../tfmg/textures/block/napalm_bomb.png | Bin 0 -> 6931 bytes .../textures/block/napalm_bomb_bottom.png | Bin 0 -> 212 bytes .../tfmg/textures/block/napalm_bomb_side.png | Bin 0 -> 260 bytes .../tfmg/textures/block/napalm_bomb_top.png | Bin 0 -> 215 bytes .../tfmg/textures/block/oil_deposit.png | Bin 0 -> 268 bytes .../textures/block/orange_concrete_stage0.png | Bin 0 -> 504 bytes .../textures/block/orange_concrete_stage1.png | Bin 0 -> 649 bytes .../textures/block/orange_concrete_stage2.png | Bin 0 -> 603 bytes .../textures/block/pink_concrete_stage0.png | Bin 0 -> 536 bytes .../textures/block/pink_concrete_stage1.png | Bin 0 -> 575 bytes .../textures/block/pink_concrete_stage2.png | Bin 0 -> 566 bytes .../tfmg/textures/block/plastic_block.png | Bin 0 -> 247 bytes .../textures/block/polished_cut_bauxite.png | Bin 0 -> 398 bytes .../tfmg/textures/block/pumpjack_base.png | Bin 0 -> 519 bytes .../tfmg/textures/block/pumpjack_crank.png | Bin 0 -> 555 bytes .../tfmg/textures/block/pumpjack_hammer.png | Bin 0 -> 789 bytes .../textures/block/purple_concrete_stage0.png | Bin 0 -> 487 bytes .../textures/block/purple_concrete_stage1.png | Bin 0 -> 607 bytes .../textures/block/purple_concrete_stage2.png | Bin 0 -> 578 bytes .../assets/tfmg/textures/block/rebar_cage.png | Bin 0 -> 210 bytes .../tfmg/textures/block/rebar_concrete.png | Bin 0 -> 404 bytes .../textures/block/red_concrete_stage0.png | Bin 0 -> 509 bytes .../textures/block/red_concrete_stage1.png | Bin 0 -> 636 bytes .../textures/block/red_concrete_stage2.png | Bin 0 -> 588 bytes .../tfmg/textures/block/sawdust_block.png | Bin 0 -> 587 bytes .../block/scaffold/aluminum_scaffold.png | Bin 0 -> 257 bytes .../scaffold/aluminum_scaffold_connected.png | Bin 0 -> 325 bytes .../scaffold/aluminum_scaffold_inside.png | Bin 0 -> 212 bytes .../aluminum_scaffold_inside_connected.png | Bin 0 -> 269 bytes .../block/scaffold/aluminum_scaffold_top.png | Bin 0 -> 297 bytes .../aluminum_scaffold_top_connected.png | Bin 0 -> 1818 bytes .../block/scaffold/steel_scaffold.png | Bin 0 -> 254 bytes .../scaffold/steel_scaffold_connected.png | Bin 0 -> 320 bytes .../block/scaffold/steel_scaffold_inside.png | Bin 0 -> 212 bytes .../steel_scaffold_inside_connected.png | Bin 0 -> 269 bytes .../textures/block/small_bauxite_brick.png | Bin 0 -> 256 bytes .../tfmg/textures/block/steel_block.png | Bin 0 -> 287 bytes .../textures/block/steel_block_connected.png | Bin 0 -> 1672 bytes .../tfmg/textures/block/steel_casing.png | Bin 0 -> 302 bytes .../textures/block/steel_casing_connected.png | Bin 0 -> 3866 bytes .../tfmg/textures/block/steel_door_bottom.png | Bin 0 -> 288 bytes .../tfmg/textures/block/steel_door_side.png | Bin 0 -> 200 bytes .../tfmg/textures/block/steel_door_top.png | Bin 0 -> 323 bytes .../block/steel_encased_cogwheel_side.png | Bin 0 -> 318 bytes .../steel_encased_cogwheel_side_connected.png | Bin 0 -> 435 bytes .../tfmg/textures/block/steel_fluid_tank.png | Bin 0 -> 270 bytes .../block/steel_fluid_tank_connected.png | Bin 0 -> 720 bytes .../textures/block/steel_fluid_tank_inner.png | Bin 0 -> 247 bytes .../steel_fluid_tank_inner_connected.png | Bin 0 -> 665 bytes .../textures/block/steel_fluid_tank_top.png | Bin 0 -> 263 bytes .../block/steel_fluid_tank_top_connected.png | Bin 0 -> 835 bytes .../block/steel_fluid_tank_window.png | Bin 0 -> 240 bytes .../block/steel_fluid_tank_window_single.png | Bin 0 -> 193 bytes .../tfmg/textures/block/steel_flywheel.png | Bin 0 -> 789 bytes .../tfmg/textures/block/steel_frame.png | Bin 0 -> 243 bytes .../tfmg/textures/block/steel_gearbox.png | Bin 0 -> 350 bytes .../tfmg/textures/block/steel_pipes.png | Bin 0 -> 857 bytes .../textures/block/steel_pipes_connected.png | Bin 0 -> 545 bytes .../assets/tfmg/textures/block/steel_pump.png | Bin 0 -> 711 bytes .../tfmg/textures/block/steel_railing.png | Bin 0 -> 388 bytes .../tfmg/textures/block/steel_trapdoor.png | Bin 0 -> 229 bytes .../tfmg/textures/block/steel_truss.png | Bin 0 -> 282 bytes .../assets/tfmg/textures/block/sulfur.png | Bin 0 -> 270 bytes .../tfmg/textures/block/track_ballast.png | Bin 0 -> 536 bytes .../tfmg/textures/block/waterproof_planks.png | Bin 0 -> 263 bytes .../textures/block/white_concrete_stage0.png | Bin 0 -> 524 bytes .../textures/block/white_concrete_stage1.png | Bin 0 -> 553 bytes .../textures/block/white_concrete_stage2.png | Bin 0 -> 555 bytes .../textures/block/yellow_concrete_stage0.png | Bin 0 -> 576 bytes .../textures/block/yellow_concrete_stage1.png | Bin 0 -> 614 bytes .../textures/block/yellow_concrete_stage2.png | Bin 0 -> 591 bytes .../tfmg/textures/entity/blue_spark.png | Bin 0 -> 165 bytes .../tfmg/textures/entity/green_spark.png | Bin 0 -> 164 bytes .../tfmg/textures/item/aluminum_door.png | Bin 0 -> 386 bytes .../tfmg/textures/item/aluminum_dust.png | Bin 0 -> 256 bytes .../tfmg/textures/item/aluminum_ingot.png | Bin 0 -> 266 bytes .../tfmg/textures/item/cast_iron_ingot.png | Bin 0 -> 261 bytes .../tfmg/textures/item/charcoal_dust.png | Bin 0 -> 332 bytes .../assets/tfmg/textures/item/coal_coke.png | Bin 0 -> 277 bytes .../tfmg/textures/item/copper_grenade.png | Bin 0 -> 286 bytes .../textures/item/crude_oil_fluid_bucket.png | Bin 0 -> 300 bytes .../tfmg/textures/item/diesel_bucket.png | Bin 0 -> 233 bytes .../tfmg/textures/item/duraluminium_ingot.png | Bin 0 -> 268 bytes .../tfmg/textures/item/engine_chamber.png | Bin 0 -> 259 bytes .../tfmg/textures/item/fossilstone_chunk.png | Bin 0 -> 254 bytes .../tfmg/textures/item/gasoline_bucket.png | Bin 0 -> 244 bytes .../tfmg/textures/item/heavy_casing_door.png | Bin 0 -> 325 bytes .../tfmg/textures/item/heavy_oil_bucket.png | Bin 0 -> 224 bytes .../assets/tfmg/textures/item/heavy_plate.png | Bin 0 -> 250 bytes .../tfmg/textures/item/heavy_plated_door.png | Bin 0 -> 246 bytes .../tfmg/textures/item/kerosene_bucket.png | Bin 0 -> 247 bytes .../textures/item/liquid_concrete_bucket.png | Bin 0 -> 530 bytes .../textures/item/liquid_plastic_bucket.png | Bin 0 -> 305 bytes .../item/liquid_rebar_concrete_bucket.png | Bin 0 -> 633 bytes .../textures/item/lubrication_oil_bucket.png | Bin 0 -> 424 bytes .../assets/tfmg/textures/item/mesh.png | Bin 0 -> 229 bytes .../tfmg/textures/item/napalm_bucket.png | Bin 0 -> 258 bytes .../tfmg/textures/item/naphtha_bucket.png | Bin 0 -> 353 bytes .../tfmg/textures/item/plastic_sheet.png | Bin 0 -> 198 bytes .../tfmg/textures/item/prospector_tool.png | Bin 0 -> 407 bytes .../tfmg/textures/item/quad_potato_cannon.png | Bin 0 -> 1315 bytes .../assets/tfmg/textures/item/rebar.png | Bin 0 -> 261 bytes .../assets/tfmg/textures/item/saltpeter.png | Bin 0 -> 262 bytes .../assets/tfmg/textures/item/sawdust.png | Bin 0 -> 262 bytes .../assets/tfmg/textures/item/screw.png | Bin 0 -> 486 bytes .../assets/tfmg/textures/item/screwdriver.png | Bin 0 -> 293 bytes .../assets/tfmg/textures/item/spark_plug.png | Bin 0 -> 412 bytes .../assets/tfmg/textures/item/steel_door.png | Bin 0 -> 340 bytes .../assets/tfmg/textures/item/steel_ingot.png | Bin 0 -> 272 bytes .../tfmg/textures/item/steel_mechanism.png | Bin 0 -> 282 bytes .../tfmg/textures/item/sulfur_powder.png | Bin 0 -> 260 bytes .../tfmg/textures/item/thermite_grenade.png | Bin 0 -> 249 bytes .../tfmg/textures/item/thermite_powder.png | Bin 0 -> 187 bytes .../tfmg/textures/item/turbine_blade.png | Bin 0 -> 268 bytes .../textures/item/unprocessed_heavy_plate.png | Bin 0 -> 264 bytes .../item/unprocessed_steel_mechanism.png | Bin 0 -> 225 bytes .../tfmg/textures/item/water_insulation.png | Bin 0 -> 361 bytes .../tfmg/textures/item/zinc_grenade.png | Bin 0 -> 286 bytes 316 files changed, 3644 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a create mode 100644 src/generated/resources/assets/tfmg/blockstates/cast_iron_block.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/heavy_machinery_casing.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/napalm_bomb.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/steel_block.json create mode 100644 src/generated/resources/assets/tfmg/blockstates/steel_casing.json create mode 100644 src/generated/resources/assets/tfmg/lang/en_ud.json create mode 100644 src/generated/resources/assets/tfmg/lang/en_us.json create mode 100644 src/generated/resources/assets/tfmg/models/block/cast_iron_block.json create mode 100644 src/generated/resources/assets/tfmg/models/block/heavy_machinery_casing.json create mode 100644 src/generated/resources/assets/tfmg/models/block/napalm_bomb.json create mode 100644 src/generated/resources/assets/tfmg/models/block/steel_block.json create mode 100644 src/generated/resources/assets/tfmg/models/block/steel_casing.json create mode 100644 src/generated/resources/assets/tfmg/models/item/cast_iron_block.json create mode 100644 src/generated/resources/assets/tfmg/models/item/copper_grenade.json create mode 100644 src/generated/resources/assets/tfmg/models/item/heavy_machinery_casing.json create mode 100644 src/generated/resources/assets/tfmg/models/item/napalm_bomb.json create mode 100644 src/generated/resources/assets/tfmg/models/item/steel_block.json create mode 100644 src/generated/resources/assets/tfmg/models/item/steel_casing.json create mode 100644 src/generated/resources/assets/tfmg/models/item/thermite_grenade.json create mode 100644 src/generated/resources/assets/tfmg/models/item/zinc_grenade.json create mode 100644 src/generated/resources/data/create/tags/blocks/casing.json create mode 100644 src/generated/resources/data/create/tags/items/casing.json create mode 100644 src/generated/resources/data/forge/tags/blocks/storage_blocks.json create mode 100644 src/generated/resources/data/forge/tags/blocks/storage_blocks/cast_iron.json create mode 100644 src/generated/resources/data/forge/tags/blocks/storage_blocks/steel.json create mode 100644 src/generated/resources/data/forge/tags/items/storage_blocks.json create mode 100644 src/generated/resources/data/forge/tags/items/storage_blocks/cast_iron.json create mode 100644 src/generated/resources/data/forge/tags/items/storage_blocks/steel.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_block.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/heavy_machinery_casing.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/napalm_bomb.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/steel_block.json create mode 100644 src/generated/resources/data/tfmg/loot_tables/blocks/steel_casing.json create mode 100644 src/main/java/com/drmangotea/tfmg/CreateTFMGClient.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/TFMGSpriteShifts.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/BaseTFMGCreativeModeTab.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/ConcreteCreativeModeTab.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/TFMGCreativeModeTab.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/BlueSpark.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/BlueSparkRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/GreenSpark.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/GreenSparkRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/Spark.java create mode 100644 src/main/java/com/drmangotea/tfmg/base/spark/SparkRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ChemicalColor.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenade.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeItem.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeRenderer.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/BlueFireBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/GreenFireBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/TFMGColoredFires.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGBlockStateGen.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGCreativeModeTabs.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGEntityTypes.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGParticles.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGRegistrate.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGSounds.java create mode 100644 src/main/resources/assets/tfmg/blockstates/blue_fire.json create mode 100644 src/main/resources/assets/tfmg/blockstates/green_fire.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_floor0.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_floor1.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_side0.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_side1.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_side_alt0.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_side_alt1.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_up0.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_up1.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_up_alt0.json create mode 100644 src/main/resources/assets/tfmg/models/block/blue_fire_up_alt1.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_floor0.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_floor1.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_side0.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_side1.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_side_alt0.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_side_alt1.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_up0.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_up1.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_up_alt0.json create mode 100644 src/main/resources/assets/tfmg/models/block/green_fire_up_alt1.json create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_door_bottom.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_door_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_flywheel.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_frame.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_plating.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_post.png create mode 100644 src/main/resources/assets/tfmg/textures/block/aluminum_truss.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bars/aluminum_bars.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bars/aluminum_bars_edge.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bars/steel_bars.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bars/steel_bars_edge.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bauxite.png create mode 100644 src/main/resources/assets/tfmg/textures/block/bauxite_cap.png create mode 100644 src/main/resources/assets/tfmg/textures/block/black_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/black_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/black_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_fire.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_fire_0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_fire_0.png.mcmeta create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_fire_1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/blue_fire_1.png.mcmeta create mode 100644 src/main/resources/assets/tfmg/textures/block/brown_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/brown_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/brown_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_block_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cast_iron_flywheel.png create mode 100644 src/main/resources/assets/tfmg/textures/block/caution_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cement.png create mode 100644 src/main/resources/assets/tfmg/textures/block/chipwood.png create mode 100644 src/main/resources/assets/tfmg/textures/block/coal_coke_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/concrete.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cut_bauxite.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cut_bauxite_brick.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cyan_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cyan_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/cyan_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/deposit_scanner.png create mode 100644 src/main/resources/assets/tfmg/textures/block/diesel_engine.png create mode 100644 src/main/resources/assets/tfmg/textures/block/distillation_controller.png create mode 100644 src/main/resources/assets/tfmg/textures/block/distillation_controller_front.png create mode 100644 src/main/resources/assets/tfmg/textures/block/distillation_controller_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/distillation_tower_output.png create mode 100644 src/main/resources/assets/tfmg/textures/block/distiller_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/encased_steel_pipe.png create mode 100644 src/main/resources/assets/tfmg/textures/block/exhaust.png create mode 100644 src/main/resources/assets/tfmg/textures/block/factory_floor.png create mode 100644 src/main/resources/assets/tfmg/textures/block/flarestack.png create mode 100644 src/main/resources/assets/tfmg/textures/block/fossilstone.png create mode 100644 src/main/resources/assets/tfmg/textures/block/gasoline_engine.png create mode 100644 src/main/resources/assets/tfmg/textures/block/gauge.png create mode 100644 src/main/resources/assets/tfmg/textures/block/glass_steel_pipe.png create mode 100644 src/main/resources/assets/tfmg/textures/block/gray_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/gray_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/gray_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_fire.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_fire_0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_fire_0.png.mcmeta create mode 100644 src/main/resources/assets/tfmg/textures/block/green_fire_1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/green_fire_1.png.mcmeta create mode 100644 src/main/resources/assets/tfmg/textures/block/hardened_planks.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_casing_door_bottom.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_casing_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_casing_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_gearbox.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_plated_door_bottom.png create mode 100644 src/main/resources/assets/tfmg/textures/block/heavy_plated_door_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/industrial_barrel_back.png create mode 100644 src/main/resources/assets/tfmg/textures/block/industrial_barrel_front.png create mode 100644 src/main/resources/assets/tfmg/textures/block/industrial_barrel_front_open.png create mode 100644 src/main/resources/assets/tfmg/textures/block/industrial_barrel_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/industrial_pipe.png create mode 100644 src/main/resources/assets/tfmg/textures/block/ladder_aluminum.png create mode 100644 src/main/resources/assets/tfmg/textures/block/ladder_aluminum_hoop.png create mode 100644 src/main/resources/assets/tfmg/textures/block/ladder_steel.png create mode 100644 src/main/resources/assets/tfmg/textures/block/ladder_steel_hoop.png create mode 100644 src/main/resources/assets/tfmg/textures/block/layered_bauxite_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/lignite.png create mode 100644 src/main/resources/assets/tfmg/textures/block/lime_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/lime_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/lime_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/limesand.png create mode 100644 src/main/resources/assets/tfmg/textures/block/liquid_concrete.png create mode 100644 src/main/resources/assets/tfmg/textures/block/liquid_rebar_concrete.png create mode 100644 src/main/resources/assets/tfmg/textures/block/magenta_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/magenta_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/magenta_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/mesh_concrete.png create mode 100644 src/main/resources/assets/tfmg/textures/block/napalm_bomb.png create mode 100644 src/main/resources/assets/tfmg/textures/block/napalm_bomb_bottom.png create mode 100644 src/main/resources/assets/tfmg/textures/block/napalm_bomb_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/napalm_bomb_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/oil_deposit.png create mode 100644 src/main/resources/assets/tfmg/textures/block/orange_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/orange_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/orange_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pink_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pink_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pink_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/plastic_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/polished_cut_bauxite.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pumpjack_base.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pumpjack_crank.png create mode 100644 src/main/resources/assets/tfmg/textures/block/pumpjack_hammer.png create mode 100644 src/main/resources/assets/tfmg/textures/block/purple_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/purple_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/purple_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/rebar_cage.png create mode 100644 src/main/resources/assets/tfmg/textures/block/rebar_concrete.png create mode 100644 src/main/resources/assets/tfmg/textures/block/red_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/red_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/red_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/sawdust_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_inside.png create mode 100644 src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_inside_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/small_bauxite_brick.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_block.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_block_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_casing.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_casing_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_door_bottom.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_door_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_door_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_inner.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_inner_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_top.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_top_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window_single.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_flywheel.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_frame.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_gearbox.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_pipes.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_pipes_connected.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_pump.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_railing.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_trapdoor.png create mode 100644 src/main/resources/assets/tfmg/textures/block/steel_truss.png create mode 100644 src/main/resources/assets/tfmg/textures/block/sulfur.png create mode 100644 src/main/resources/assets/tfmg/textures/block/track_ballast.png create mode 100644 src/main/resources/assets/tfmg/textures/block/waterproof_planks.png create mode 100644 src/main/resources/assets/tfmg/textures/block/white_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/white_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/white_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/block/yellow_concrete_stage0.png create mode 100644 src/main/resources/assets/tfmg/textures/block/yellow_concrete_stage1.png create mode 100644 src/main/resources/assets/tfmg/textures/block/yellow_concrete_stage2.png create mode 100644 src/main/resources/assets/tfmg/textures/entity/blue_spark.png create mode 100644 src/main/resources/assets/tfmg/textures/entity/green_spark.png create mode 100644 src/main/resources/assets/tfmg/textures/item/aluminum_door.png create mode 100644 src/main/resources/assets/tfmg/textures/item/aluminum_dust.png create mode 100644 src/main/resources/assets/tfmg/textures/item/aluminum_ingot.png create mode 100644 src/main/resources/assets/tfmg/textures/item/cast_iron_ingot.png create mode 100644 src/main/resources/assets/tfmg/textures/item/charcoal_dust.png create mode 100644 src/main/resources/assets/tfmg/textures/item/coal_coke.png create mode 100644 src/main/resources/assets/tfmg/textures/item/copper_grenade.png create mode 100644 src/main/resources/assets/tfmg/textures/item/crude_oil_fluid_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/diesel_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/duraluminium_ingot.png create mode 100644 src/main/resources/assets/tfmg/textures/item/engine_chamber.png create mode 100644 src/main/resources/assets/tfmg/textures/item/fossilstone_chunk.png create mode 100644 src/main/resources/assets/tfmg/textures/item/gasoline_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/heavy_casing_door.png create mode 100644 src/main/resources/assets/tfmg/textures/item/heavy_oil_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/heavy_plate.png create mode 100644 src/main/resources/assets/tfmg/textures/item/heavy_plated_door.png create mode 100644 src/main/resources/assets/tfmg/textures/item/kerosene_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/liquid_concrete_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/liquid_plastic_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/liquid_rebar_concrete_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/lubrication_oil_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/mesh.png create mode 100644 src/main/resources/assets/tfmg/textures/item/napalm_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/naphtha_bucket.png create mode 100644 src/main/resources/assets/tfmg/textures/item/plastic_sheet.png create mode 100644 src/main/resources/assets/tfmg/textures/item/prospector_tool.png create mode 100644 src/main/resources/assets/tfmg/textures/item/quad_potato_cannon.png create mode 100644 src/main/resources/assets/tfmg/textures/item/rebar.png create mode 100644 src/main/resources/assets/tfmg/textures/item/saltpeter.png create mode 100644 src/main/resources/assets/tfmg/textures/item/sawdust.png create mode 100644 src/main/resources/assets/tfmg/textures/item/screw.png create mode 100644 src/main/resources/assets/tfmg/textures/item/screwdriver.png create mode 100644 src/main/resources/assets/tfmg/textures/item/spark_plug.png create mode 100644 src/main/resources/assets/tfmg/textures/item/steel_door.png create mode 100644 src/main/resources/assets/tfmg/textures/item/steel_ingot.png create mode 100644 src/main/resources/assets/tfmg/textures/item/steel_mechanism.png create mode 100644 src/main/resources/assets/tfmg/textures/item/sulfur_powder.png create mode 100644 src/main/resources/assets/tfmg/textures/item/thermite_grenade.png create mode 100644 src/main/resources/assets/tfmg/textures/item/thermite_powder.png create mode 100644 src/main/resources/assets/tfmg/textures/item/turbine_blade.png create mode 100644 src/main/resources/assets/tfmg/textures/item/unprocessed_heavy_plate.png create mode 100644 src/main/resources/assets/tfmg/textures/item/unprocessed_steel_mechanism.png create mode 100644 src/main/resources/assets/tfmg/textures/item/water_insulation.png create mode 100644 src/main/resources/assets/tfmg/textures/item/zinc_grenade.png diff --git a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a new file mode 100644 index 00000000..447524d1 --- /dev/null +++ b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a @@ -0,0 +1,38 @@ +// 1.19.2 2023-08-30T12:58:15.3014071 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)] +9ca537517fb8baeff3d4e4137c93aebd6b874c81 assets/tfmg/blockstates/cast_iron_block.json +c7aa764cc11ee837deeed68c9c2d8567ea078f5c assets/tfmg/blockstates/heavy_machinery_casing.json +0f33dc6b2a736164b17f416ce7d127c87bfb6441 assets/tfmg/blockstates/napalm_bomb.json +e6983072149d1a9a2f4d39e4e1feac599ff7413e assets/tfmg/blockstates/steel_block.json +df44115876045e6f863de2f8be6a9166b336a2f1 assets/tfmg/blockstates/steel_casing.json +a7cd711917057f78c673c344fa3d5ed9da99538f assets/tfmg/lang/en_ud.json +f3eb466b0b241c6d1bf5f84b37ad3c2f9d486c4c assets/tfmg/lang/en_us.json +37789d06ec6cfc0312be7b1b66ac1ec6403d4516 assets/tfmg/models/block/cast_iron_block.json +717ee09803cb584062c9717f45475fbd15673cde assets/tfmg/models/block/heavy_machinery_casing.json +b541c0cab9298f1d2578639349755b93f1019621 assets/tfmg/models/block/napalm_bomb.json +0ceb30eaff16a495c9a165ca16c925cbff836755 assets/tfmg/models/block/steel_block.json +465b1fed10d06090e5e8d19457f9fa48fe890bb4 assets/tfmg/models/block/steel_casing.json +ec38882fb9010884823d6d6afa604f8a6512d279 assets/tfmg/models/item/cast_iron_block.json +df4e7fa8f3f60908f58794528a8db60dce7d0135 assets/tfmg/models/item/copper_grenade.json +3fdff9e88db39939ee31968358eb51c060006766 assets/tfmg/models/item/heavy_machinery_casing.json +afac1fce0904a0df4e68d731b897ff1be6c68766 assets/tfmg/models/item/napalm_bomb.json +57bf86df814741f846feb8be4a10afe633f51721 assets/tfmg/models/item/steel_block.json +d34ca92f5288cbb5cecee06f046a072763b2926c assets/tfmg/models/item/steel_casing.json +72da5f91f1992b502e90c8fc84d654e075163eb7 assets/tfmg/models/item/thermite_grenade.json +f189171410564631c6074593da126b8d13fe9f8b assets/tfmg/models/item/zinc_grenade.json +2b45163d462fba0e86bb1ac8fc299509fbe1e58d data/create/tags/blocks/casing.json +2b45163d462fba0e86bb1ac8fc299509fbe1e58d data/create/tags/items/casing.json +c98956ac34e02a8c1c801122486771ef89fb640b data/forge/tags/blocks/storage_blocks.json +7c5615c56bb169570a061f052ebb1f5115760c16 data/forge/tags/blocks/storage_blocks/cast_iron.json +37b1c9c3ae722d8110db48015993ede3e194c0a0 data/forge/tags/blocks/storage_blocks/steel.json +c98956ac34e02a8c1c801122486771ef89fb640b data/forge/tags/items/storage_blocks.json +7c5615c56bb169570a061f052ebb1f5115760c16 data/forge/tags/items/storage_blocks/cast_iron.json +37b1c9c3ae722d8110db48015993ede3e194c0a0 data/forge/tags/items/storage_blocks/steel.json +c98956ac34e02a8c1c801122486771ef89fb640b data/minecraft/tags/blocks/beacon_base_blocks.json +2b45163d462fba0e86bb1ac8fc299509fbe1e58d data/minecraft/tags/blocks/mineable/axe.json +cd26fa5d063cde156d1b1b165bccc033f784c23c data/minecraft/tags/blocks/mineable/pickaxe.json +c98956ac34e02a8c1c801122486771ef89fb640b data/minecraft/tags/blocks/needs_iron_tool.json +60857d034446187e758de87644a80a7bc4d6b150 data/tfmg/loot_tables/blocks/cast_iron_block.json +661cc61f9c13ddf8c6bf06470defa93170e8ee7f data/tfmg/loot_tables/blocks/heavy_machinery_casing.json +7da9b20012e584104331da961756d6c1d02682b5 data/tfmg/loot_tables/blocks/napalm_bomb.json +01298989d0fe79936cdfa1e6cc07fd05f143ae09 data/tfmg/loot_tables/blocks/steel_block.json +62cd229b00eb2c95187d1b7b8e968aa26e54c412 data/tfmg/loot_tables/blocks/steel_casing.json diff --git a/src/generated/resources/assets/tfmg/blockstates/cast_iron_block.json b/src/generated/resources/assets/tfmg/blockstates/cast_iron_block.json new file mode 100644 index 00000000..1d0fa4af --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/cast_iron_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/cast_iron_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/heavy_machinery_casing.json b/src/generated/resources/assets/tfmg/blockstates/heavy_machinery_casing.json new file mode 100644 index 00000000..d539ef15 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/heavy_machinery_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/heavy_machinery_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/napalm_bomb.json b/src/generated/resources/assets/tfmg/blockstates/napalm_bomb.json new file mode 100644 index 00000000..f4e6a2fb --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/napalm_bomb.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/napalm_bomb" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/steel_block.json b/src/generated/resources/assets/tfmg/blockstates/steel_block.json new file mode 100644 index 00000000..5894d5d6 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/steel_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/steel_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/blockstates/steel_casing.json b/src/generated/resources/assets/tfmg/blockstates/steel_casing.json new file mode 100644 index 00000000..65f1b899 --- /dev/null +++ b/src/generated/resources/assets/tfmg/blockstates/steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tfmg:block/steel_casing" + } + } +} \ 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 new file mode 100644 index 00000000..3d6cd9ac --- /dev/null +++ b/src/generated/resources/assets/tfmg/lang/en_ud.json @@ -0,0 +1,17 @@ +{ + "block.tfmg.cast_iron_block": "uoɹI ʇsɐƆ ɟo ʞɔoןᗺ", + "block.tfmg.heavy_machinery_casing": "buısɐƆ ʎɹǝuıɥɔɐW ʎʌɐǝH", + "block.tfmg.napalm_bomb": "qɯoᗺ ɯןɐdɐN", + "block.tfmg.steel_block": "ןǝǝʇS ɟo ʞɔoןᗺ", + "block.tfmg.steel_casing": "buısɐƆ ןǝǝʇS", + "entity.tfmg.blue_spark": "ʞɹɐdS ǝnןᗺ", + "entity.tfmg.copper_grenade": "ǝpɐuǝɹ⅁ ɹǝddoƆ", + "entity.tfmg.green_spark": "ʞɹɐdS uǝǝɹ⅁", + "entity.tfmg.napalm_bomb_entity": "ʎʇıʇuƎ qɯoᗺ ɯןɐdɐN", + "entity.tfmg.spark": "ʞɹɐdS", + "entity.tfmg.thermite_grenade": "ǝpɐuǝɹ⅁ ǝʇıɯɹǝɥ⟘", + "entity.tfmg.zin_grenade": "ǝpɐuǝɹ⅁ uıZ", + "item.tfmg.copper_grenade": "ǝpɐuǝɹ⅁ ɹǝddoƆ", + "item.tfmg.thermite_grenade": "ǝpɐuǝɹ⅁ ǝʇıɯɹǝɥ⟘", + "item.tfmg.zinc_grenade": "ǝpɐuǝɹ⅁ ɔuıZ" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/lang/en_us.json b/src/generated/resources/assets/tfmg/lang/en_us.json new file mode 100644 index 00000000..54907648 --- /dev/null +++ b/src/generated/resources/assets/tfmg/lang/en_us.json @@ -0,0 +1,20 @@ +{ + "block.tfmg.cast_iron_block": "Block of Cast Iron", + "block.tfmg.heavy_machinery_casing": "Heavy Machinery Casing", + "block.tfmg.napalm_bomb": "Napalm Bomb", + "block.tfmg.steel_block": "Block of Steel", + "block.tfmg.steel_casing": "Steel Casing", + "entity.tfmg.blue_spark": "Blue Spark", + "entity.tfmg.copper_grenade": "Copper Grenade", + "entity.tfmg.green_spark": "Green Spark", + "entity.tfmg.napalm_bomb_entity": "Napalm Bomb Entity", + "entity.tfmg.spark": "Spark", + "entity.tfmg.thermite_grenade": "Thermite Grenade", + "entity.tfmg.zin_grenade": "Zin Grenade", + "item.tfmg.copper_grenade": "Copper Grenade", + "item.tfmg.thermite_grenade": "Thermite Grenade", + "item.tfmg.zinc_grenade": "Zinc Grenade", + + "itemGroup.tfmg.base": "Create: The Factory Must Grow", + "itemGroup.tfmg.concrete": "Create: TFMG: Concrete" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/cast_iron_block.json b/src/generated/resources/assets/tfmg/models/block/cast_iron_block.json new file mode 100644 index 00000000..b76ef3d9 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/cast_iron_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/cast_iron_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/heavy_machinery_casing.json b/src/generated/resources/assets/tfmg/models/block/heavy_machinery_casing.json new file mode 100644 index 00000000..10f4f1c2 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/heavy_machinery_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/heavy_machinery_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/napalm_bomb.json b/src/generated/resources/assets/tfmg/models/block/napalm_bomb.json new file mode 100644 index 00000000..999816ef --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/napalm_bomb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/napalm_bomb" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/steel_block.json b/src/generated/resources/assets/tfmg/models/block/steel_block.json new file mode 100644 index 00000000..f6c7c1b3 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/steel_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/steel_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/block/steel_casing.json b/src/generated/resources/assets/tfmg/models/block/steel_casing.json new file mode 100644 index 00000000..fd90632b --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/block/steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "tfmg:block/steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/cast_iron_block.json b/src/generated/resources/assets/tfmg/models/item/cast_iron_block.json new file mode 100644 index 00000000..2c0d95b0 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/cast_iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/cast_iron_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/copper_grenade.json b/src/generated/resources/assets/tfmg/models/item/copper_grenade.json new file mode 100644 index 00000000..56a0a703 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/copper_grenade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/copper_grenade" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/heavy_machinery_casing.json b/src/generated/resources/assets/tfmg/models/item/heavy_machinery_casing.json new file mode 100644 index 00000000..73b12767 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/heavy_machinery_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/heavy_machinery_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/napalm_bomb.json b/src/generated/resources/assets/tfmg/models/item/napalm_bomb.json new file mode 100644 index 00000000..5e951828 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/napalm_bomb.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/napalm_bomb" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/steel_block.json b/src/generated/resources/assets/tfmg/models/item/steel_block.json new file mode 100644 index 00000000..66066a02 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/steel_block.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/steel_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/steel_casing.json b/src/generated/resources/assets/tfmg/models/item/steel_casing.json new file mode 100644 index 00000000..2368c472 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "tfmg:block/steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/thermite_grenade.json b/src/generated/resources/assets/tfmg/models/item/thermite_grenade.json new file mode 100644 index 00000000..b1d03422 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/thermite_grenade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/thermite_grenade" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/tfmg/models/item/zinc_grenade.json b/src/generated/resources/assets/tfmg/models/item/zinc_grenade.json new file mode 100644 index 00000000..2b57c349 --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/zinc_grenade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/zinc_grenade" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/casing.json b/src/generated/resources/data/create/tags/blocks/casing.json new file mode 100644 index 00000000..bbe4537f --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/casing.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_casing", + "tfmg:heavy_machinery_casing" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/casing.json b/src/generated/resources/data/create/tags/items/casing.json new file mode 100644 index 00000000..bbe4537f --- /dev/null +++ b/src/generated/resources/data/create/tags/items/casing.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_casing", + "tfmg:heavy_machinery_casing" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json new file mode 100644 index 00000000..45444180 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_block", + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks/cast_iron.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/cast_iron.json new file mode 100644 index 00000000..498da03a --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks/cast_iron.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks/steel.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/steel.json new file mode 100644 index 00000000..72a5c238 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks/steel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tfmg:steel_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks.json b/src/generated/resources/data/forge/tags/items/storage_blocks.json new file mode 100644 index 00000000..45444180 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_block", + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/cast_iron.json b/src/generated/resources/data/forge/tags/items/storage_blocks/cast_iron.json new file mode 100644 index 00000000..498da03a --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/cast_iron.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/steel.json b/src/generated/resources/data/forge/tags/items/storage_blocks/steel.json new file mode 100644 index 00000000..72a5c238 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/steel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tfmg:steel_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json new file mode 100644 index 00000000..45444180 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_block", + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json new file mode 100644 index 00000000..bbe4537f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_casing", + "tfmg:heavy_machinery_casing" + ] +} \ 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 new file mode 100644 index 00000000..4d4a1f18 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,9 @@ +{ + "values": [ + "tfmg:napalm_bomb", + "tfmg:steel_casing", + "tfmg:heavy_machinery_casing", + "tfmg:steel_block", + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json new file mode 100644 index 00000000..45444180 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -0,0 +1,6 @@ +{ + "values": [ + "tfmg:steel_block", + "tfmg:cast_iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_block.json b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_block.json new file mode 100644 index 00000000..e62ba2ab --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/cast_iron_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:cast_iron_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/heavy_machinery_casing.json b/src/generated/resources/data/tfmg/loot_tables/blocks/heavy_machinery_casing.json new file mode 100644 index 00000000..74714f18 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/heavy_machinery_casing.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:heavy_machinery_casing" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/napalm_bomb.json b/src/generated/resources/data/tfmg/loot_tables/blocks/napalm_bomb.json new file mode 100644 index 00000000..dbc085ca --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/napalm_bomb.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:napalm_bomb" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/steel_block.json b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_block.json new file mode 100644 index 00000000..c31e5117 --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:steel_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tfmg/loot_tables/blocks/steel_casing.json b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_casing.json new file mode 100644 index 00000000..36a4dbba --- /dev/null +++ b/src/generated/resources/data/tfmg/loot_tables/blocks/steel_casing.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "tfmg:steel_casing" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/CreateTFMG.java b/src/main/java/com/drmangotea/tfmg/CreateTFMG.java index 46116baf..b921b07d 100644 --- a/src/main/java/com/drmangotea/tfmg/CreateTFMG.java +++ b/src/main/java/com/drmangotea/tfmg/CreateTFMG.java @@ -1,11 +1,20 @@ package com.drmangotea.tfmg; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire.TFMGColoredFires; +import com.drmangotea.tfmg.registry.*; import com.mojang.logging.LogUtils; +import com.simibubi.create.foundation.data.CreateRegistrate; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.event.server.ServerStartingEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; @@ -15,23 +24,38 @@ public class CreateTFMG { public static final String MOD_ID = "tfmg"; + public static final CreateRegistrate REGISTRATE = CreateRegistrate.create(MOD_ID); private static final Logger LOGGER = LogUtils.getLogger(); public CreateTFMG() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + REGISTRATE.registerEventListeners(FMLJavaModLoadingContext.get().getModEventBus()); // + TFMGBlocks.register(); + TFMGItems.register(); + TFMGEntityTypes.register(); + TFMGCreativeModeTabs.init(); + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> CreateTFMGClient::new); + TFMGColoredFires.register(modEventBus); + modEventBus.addListener(this::clientSetup); // MinecraftForge.EVENT_BUS.register(this); } - + private void clientSetup(final FMLClientSetupEvent event) { + ItemBlockRenderTypes.setRenderLayer(TFMGColoredFires.GREEN_FIRE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(TFMGColoredFires.BLUE_FIRE.get(), RenderType.cutout()); + } @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { LOGGER.info("YEEEHAAW"); } + public static ResourceLocation asResource(String path) { + return new ResourceLocation(MOD_ID, path); + } } diff --git a/src/main/java/com/drmangotea/tfmg/CreateTFMGClient.java b/src/main/java/com/drmangotea/tfmg/CreateTFMGClient.java new file mode 100644 index 00000000..9c4935ef --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/CreateTFMGClient.java @@ -0,0 +1,30 @@ +package com.drmangotea.tfmg; + + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +public class CreateTFMGClient { + + public CreateTFMGClient() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + //CIPartialModels.init(); + modEventBus.register(this); + + } + + + @SubscribeEvent + public void setup(final FMLClientSetupEvent event) { + // CIPonderIndex.register(); + //CIPonderIndex.registerTags(); + } + + +} + + + + diff --git a/src/main/java/com/drmangotea/tfmg/base/TFMGSpriteShifts.java b/src/main/java/com/drmangotea/tfmg/base/TFMGSpriteShifts.java new file mode 100644 index 00000000..e00cffb4 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/TFMGSpriteShifts.java @@ -0,0 +1,62 @@ +package com.drmangotea.tfmg.base; + +import com.drmangotea.tfmg.CreateTFMG; +import com.simibubi.create.foundation.block.connected.AllCTTypes; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.CTSpriteShifter; +import com.simibubi.create.foundation.block.connected.CTType; + +public class TFMGSpriteShifts { + + public static final CTSpriteShiftEntry + CAST_IRON_BLOCK = omni("cast_iron_block"), + STEEL_BLOCK = omni("steel_block"); + public static final CTSpriteShiftEntry + STEEL_CASING = omni("steel_casing"); + + public static final CTSpriteShiftEntry + ALUMINUM_SCAFFOLD_TOP = omni("scaffold/aluminum_scaffold_top"); + + public static final CTSpriteShiftEntry + HEAVY_MACHINERY_CASING = omni("heavy_machinery_casing"); + + public static final CTSpriteShiftEntry + STEEL_FLUID_TANK = getCT(AllCTTypes.RECTANGLE, "steel_fluid_tank"), + STEEL_FLUID_TANK_TOP = getCT(AllCTTypes.RECTANGLE, "steel_fluid_tank_top"), + STEEL_FLUID_TANK_INNER = getCT(AllCTTypes.RECTANGLE, "steel_fluid_tank_inner"); + + public static final CTSpriteShiftEntry STEEL_SCAFFOLD_INSIDE = horizontal("scaffold/steel_scaffold_inside"), + ALUMINUM_SCAFFOLD_INSIDE = horizontal("scaffold/aluminum_scaffold_inside"); + + + + public static final CTSpriteShiftEntry STEEL_SCAFFOLD = horizontal("scaffold/steel_scaffold"), + ALUMINUM_SCAFFOLD = horizontal("scaffold/aluminum_scaffold"); + + public static final CTSpriteShiftEntry + STEEL_ENCASED_COGWHEEL_SIDE = vertical("steel_encased_cogwheel_side"), + STEEL_ENCASED_COGWHEEL_OTHERSIDE = horizontal("steel_encased_cogwheel_side"), + HEAVY_CASING_ENCASED_COGWHEEL_SIDE = vertical("heavy_casing_encased_cogwheel_side"), + HEAVY_CASING_ENCASED_COGWHEEL_OTHERSIDE = horizontal("heavy_casing_encased_cogwheel_side"); + + ////////////////////// + public static CTSpriteShiftEntry omni(String name) { + return getCT(AllCTTypes.OMNIDIRECTIONAL, name); + } + public static CTSpriteShiftEntry horizontal(String name) { + return getCT(AllCTTypes.HORIZONTAL_KRYPPERS, name); + } + private static CTSpriteShiftEntry vertical(String name) { + return getCT(AllCTTypes.VERTICAL, name); + } + + ///// + + private static CTSpriteShiftEntry getCT(CTType type, String blockTextureName, String connectedTextureName) { + return CTSpriteShifter.getCT(type, CreateTFMG.asResource("block/" + blockTextureName), CreateTFMG.asResource("block/" + connectedTextureName + "_connected")); + } + + private static CTSpriteShiftEntry getCT(CTType type, String blockTextureName) { + return getCT(type, blockTextureName, blockTextureName); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/BaseTFMGCreativeModeTab.java b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/BaseTFMGCreativeModeTab.java new file mode 100644 index 00000000..da625c80 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/BaseTFMGCreativeModeTab.java @@ -0,0 +1,18 @@ +package com.drmangotea.tfmg.base.creative_mode_tabs; + +import com.drmangotea.tfmg.registry.TFMGCreativeModeTabs; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.infrastructure.item.CreateCreativeModeTab; +import net.minecraft.world.item.ItemStack; + +public class BaseTFMGCreativeModeTab extends TFMGCreativeModeTab { + public BaseTFMGCreativeModeTab() { + super("base"); + } + + @Override + public ItemStack makeIcon() { + return TFMGItems.ZINC_GRENADE.asStack(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/ConcreteCreativeModeTab.java b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/ConcreteCreativeModeTab.java new file mode 100644 index 00000000..52f43e98 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/ConcreteCreativeModeTab.java @@ -0,0 +1,23 @@ +package com.drmangotea.tfmg.base.creative_mode_tabs; + +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; +import com.simibubi.create.infrastructure.item.CreateCreativeModeTab; + +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; + +public class ConcreteCreativeModeTab extends TFMGCreativeModeTab { + public ConcreteCreativeModeTab() { + super("concrete"); + } + + @Override + public void addItems(NonNullList items, boolean specialItems) { + } + + @Override + public ItemStack makeIcon() { + return TFMGItems.COPPER_GRENADE.asStack(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/TFMGCreativeModeTab.java b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/TFMGCreativeModeTab.java new file mode 100644 index 00000000..8ef3a34a --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/creative_mode_tabs/TFMGCreativeModeTab.java @@ -0,0 +1,54 @@ +package com.drmangotea.tfmg.base.creative_mode_tabs; + +import java.util.Collection; + +import com.drmangotea.tfmg.CreateTFMG; +import com.tterrag.registrate.util.entry.RegistryEntry; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; + +public abstract class TFMGCreativeModeTab extends CreativeModeTab { + public TFMGCreativeModeTab(String id) { + super(CreateTFMG.MOD_ID + "." + id); + } + + @Override + public void fillItemList(NonNullList items) { + addItems(items, true); + addBlocks(items); + addItems(items, false); + } + + protected Collection> registeredItems() { + return CreateTFMG.REGISTRATE.getAll(ForgeRegistries.ITEMS.getRegistryKey()); + } + + public void addBlocks(NonNullList items) { + for (RegistryEntry entry : registeredItems()) + if (entry.get() instanceof BlockItem blockItem) + blockItem.fillItemCategory(this, items); + } + + public void addItems(NonNullList items, boolean specialItems) { + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + + for (RegistryEntry entry : registeredItems()) { + Item item = entry.get(); + if (item instanceof BlockItem) + continue; + ItemStack stack = new ItemStack(item); + BakedModel model = itemRenderer.getModel(stack, null, null, 0); + if (model.isGui3d() == specialItems) + item.fillItemCategory(this, items); + } + } +} diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/BlueSpark.java b/src/main/java/com/drmangotea/tfmg/base/spark/BlueSpark.java new file mode 100644 index 00000000..6c6eb7f8 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/BlueSpark.java @@ -0,0 +1,122 @@ +package com.drmangotea.tfmg.base.spark; + + +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire.BlueFireBlock; +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.content.trains.CubeParticleData; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; + +public class BlueSpark extends ThrowableProjectile { + public BlueSpark(EntityType p_37391_, Level p_37392_) { + super(p_37391_, p_37392_); + + } + public BlueSpark(Level p_37399_, LivingEntity p_37400_) { + super(TFMGEntityTypes.SPARK.get(), p_37400_, p_37399_); + } + + public BlueSpark(Level p_37394_, double p_37395_, double p_37396_, double p_37397_) { + super(TFMGEntityTypes.BLUE_SPARK.get(), p_37395_, p_37396_, p_37397_, p_37394_); + } + + + @Override + protected float getGravity(){ + return 0.02f; + } + @Override + protected void defineSynchedData() { + + } + + public void tick(){ + super.tick(); + if (this.isInWaterOrRain()) { + this.discard(); + } + if(this.level.isClientSide) { + + CubeParticleData data = + new CubeParticleData(4.1f, 60.2f, 100.3f, .0125f + .0625f * random.nextFloat(), 30, false); + level.addParticle(data, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, -this.getDeltaMovement().y * 0.5D, this.random.nextGaussian() * 0.05D); + + } + } + + protected Item getDefaultItem() { + return TFMGItems.THERMITE_GRENADE.get(); + } + + private ParticleOptions getParticle() { + + return ParticleTypes.FLAME; + } + + public void handleEntityEvent(byte p_37402_) { + if (p_37402_ == 3) { + ParticleOptions particleoptions = this.getParticle(); + + for(int i = 0; i < 8; ++i) { + this.level.addParticle(particleoptions, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } + + } + protected void onHitBlock(BlockHitResult p_37384_) { + super.onHitBlock(p_37384_); + if (!this.level.isClientSide) { + Entity entity = this.getOwner(); + if (!(entity instanceof Mob) || net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.level, this)) { + BlockPos blockpos = p_37384_.getBlockPos().relative(p_37384_.getDirection()); + if (this.level.isEmptyBlock(blockpos)) { + this.level.setBlockAndUpdate(blockpos, BlueFireBlock.getState(this.level, blockpos)); + } + } + + } + } + + protected void onHitEntity(EntityHitResult p_37386_) { + super.onHitEntity(p_37386_); + if (!this.level.isClientSide) { + Entity entity = p_37386_.getEntity(); + Entity entity1 = this.getOwner(); + int i = entity.getRemainingFireTicks(); + entity.setSecondsOnFire(10); + + + } + } + + protected void onHit(HitResult p_37406_) { + super.onHit(p_37406_); + + if (!this.level.isClientSide) { + this.level.broadcastEntityEvent(this, (byte)3); + + + //this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 2.0F, Explosion.BlockInteraction.NONE); + this.discard(); + } + + } + + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.sized(.25f, .25f); + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/BlueSparkRenderer.java b/src/main/java/com/drmangotea/tfmg/base/spark/BlueSparkRenderer.java new file mode 100644 index 00000000..f3b50402 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/BlueSparkRenderer.java @@ -0,0 +1,58 @@ +package com.drmangotea.tfmg.base.spark; + +import com.drmangotea.tfmg.CreateTFMG; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class BlueSparkRenderer extends EntityRenderer { + private static final ResourceLocation TEXTURE_LOCATION = CreateTFMG.asResource("textures/entity/blue_spark.png"); + private static final RenderType RENDER_TYPE = RenderType.entityCutoutNoCull(TEXTURE_LOCATION); + + public BlueSparkRenderer(EntityRendererProvider.Context p_173962_) { + super(p_173962_); + } + + + + protected int getBlockLightLevel(BlueSpark p_114087_, BlockPos p_114088_) { + return 15; + } + + public void render(BlueSpark p_114080_, float p_114081_, float p_114082_, PoseStack p_114083_, MultiBufferSource p_114084_, int p_114085_) { + p_114083_.pushPose(); + p_114083_.scale(0.5F, 0.5F, 0.5F); + p_114083_.mulPose(this.entityRenderDispatcher.cameraOrientation()); + p_114083_.mulPose(Vector3f.YP.rotationDegrees(180.0F)); + PoseStack.Pose posestack$pose = p_114083_.last(); + Matrix4f matrix4f = posestack$pose.pose(); + Matrix3f matrix3f = posestack$pose.normal(); + VertexConsumer vertexconsumer = p_114084_.getBuffer(RENDER_TYPE); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 0, 0, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 0, 1, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 1, 1, 0); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 1, 0, 0); + p_114083_.popPose(); + super.render(p_114080_, p_114081_, p_114082_, p_114083_, p_114084_, p_114085_); + } + + private static void vertex(VertexConsumer p_114090_, Matrix4f p_114091_, Matrix3f p_114092_, int p_114093_, float p_114094_, int p_114095_, int p_114096_, int p_114097_) { + p_114090_.vertex(p_114091_, p_114094_ - 0.5F, (float)p_114095_ - 0.25F, 0.0F).color(255, 255, 255, 255).uv((float)p_114096_, (float)p_114097_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_114093_).normal(p_114092_, 0.0F, 1.0F, 0.0F).endVertex(); + } + + public ResourceLocation getTextureLocation(BlueSpark p_114078_) { + return TEXTURE_LOCATION; + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/GreenSpark.java b/src/main/java/com/drmangotea/tfmg/base/spark/GreenSpark.java new file mode 100644 index 00000000..871f1838 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/GreenSpark.java @@ -0,0 +1,122 @@ +package com.drmangotea.tfmg.base.spark; + + +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire.GreenFireBlock; +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.content.trains.CubeParticleData; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; + +public class GreenSpark extends ThrowableProjectile { + public GreenSpark(EntityType p_37391_, Level p_37392_) { + super(p_37391_, p_37392_); + + } + public GreenSpark(Level p_37399_, LivingEntity p_37400_) { + super(TFMGEntityTypes.SPARK.get(), p_37400_, p_37399_); + } + + public GreenSpark(Level level, double p_37395_, double p_37396_, double p_37397_) { + super(TFMGEntityTypes.SPARK.get(), p_37395_, p_37396_, p_37397_, level); + } + + + @Override + protected float getGravity(){ + return 0.02f; + } + @Override + protected void defineSynchedData() { + + } + + public void tick(){ + super.tick(); + if (this.isInWaterOrRain()) { + this.discard(); + } + if(this.level.isClientSide) { + + CubeParticleData data = + new CubeParticleData(0.01f, 100.25f, 20.1f, .0125f + .0625f * random.nextFloat(), 30, true); + level.addParticle(data, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, -this.getDeltaMovement().y * 0.5D, this.random.nextGaussian() * 0.05D); + + } +} + + protected Item getDefaultItem() { + return TFMGItems.THERMITE_GRENADE.get(); + } + + private ParticleOptions getParticle() { + + return ParticleTypes.FLAME; + } + + public void handleEntityEvent(byte p_37402_) { + if (p_37402_ == 3) { + ParticleOptions particleoptions = this.getParticle(); + + for(int i = 0; i < 8; ++i) { + this.level.addParticle(particleoptions, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } + + } + protected void onHitBlock(BlockHitResult p_37384_) { + super.onHitBlock(p_37384_); + if (!this.level.isClientSide) { + Entity entity = this.getOwner(); + if (!(entity instanceof Mob) || net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.level, this)) { + BlockPos blockpos = p_37384_.getBlockPos().relative(p_37384_.getDirection()); + if (this.level.isEmptyBlock(blockpos)) { + this.level.setBlockAndUpdate(blockpos, GreenFireBlock.getState(this.level, blockpos)); + } + } + + } + } + + protected void onHitEntity(EntityHitResult p_37386_) { + super.onHitEntity(p_37386_); + if (!this.level.isClientSide) { + Entity entity = p_37386_.getEntity(); + Entity entity1 = this.getOwner(); + int i = entity.getRemainingFireTicks(); + entity.setSecondsOnFire(10); + + + } + } + + protected void onHit(HitResult p_37406_) { + super.onHit(p_37406_); + + if (!this.level.isClientSide) { + this.level.broadcastEntityEvent(this, (byte)3); + + + //this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 2.0F, Explosion.BlockInteraction.NONE); + this.discard(); + } + + } + + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.sized(.25f, .25f); + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/GreenSparkRenderer.java b/src/main/java/com/drmangotea/tfmg/base/spark/GreenSparkRenderer.java new file mode 100644 index 00000000..d51a3988 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/GreenSparkRenderer.java @@ -0,0 +1,58 @@ +package com.drmangotea.tfmg.base.spark; + +import com.drmangotea.tfmg.CreateTFMG; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class GreenSparkRenderer extends EntityRenderer { + private static final ResourceLocation TEXTURE_LOCATION = CreateTFMG.asResource("textures/entity/green_spark.png"); + private static final RenderType RENDER_TYPE = RenderType.entityCutoutNoCull(TEXTURE_LOCATION); + + public GreenSparkRenderer(EntityRendererProvider.Context p_173962_) { + super(p_173962_); + } + + + + protected int getBlockLightLevel(GreenSpark p_114087_, BlockPos p_114088_) { + return 15; + } + + public void render(GreenSpark p_114080_, float p_114081_, float p_114082_, PoseStack p_114083_, MultiBufferSource p_114084_, int p_114085_) { + p_114083_.pushPose(); + p_114083_.scale(0.5F, 0.5F, 0.5F); + p_114083_.mulPose(this.entityRenderDispatcher.cameraOrientation()); + p_114083_.mulPose(Vector3f.YP.rotationDegrees(180.0F)); + PoseStack.Pose posestack$pose = p_114083_.last(); + Matrix4f matrix4f = posestack$pose.pose(); + Matrix3f matrix3f = posestack$pose.normal(); + VertexConsumer vertexconsumer = p_114084_.getBuffer(RENDER_TYPE); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 0, 0, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 0, 1, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 1, 1, 0); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 1, 0, 0); + p_114083_.popPose(); + super.render(p_114080_, p_114081_, p_114082_, p_114083_, p_114084_, p_114085_); + } + + private static void vertex(VertexConsumer p_114090_, Matrix4f p_114091_, Matrix3f p_114092_, int p_114093_, float p_114094_, int p_114095_, int p_114096_, int p_114097_) { + p_114090_.vertex(p_114091_, p_114094_ - 0.5F, (float)p_114095_ - 0.25F, 0.0F).color(255, 255, 255, 255).uv((float)p_114096_, (float)p_114097_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_114093_).normal(p_114092_, 0.0F, 1.0F, 0.0F).endVertex(); + } + + public ResourceLocation getTextureLocation(GreenSpark p_114078_) { + return TEXTURE_LOCATION; + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/Spark.java b/src/main/java/com/drmangotea/tfmg/base/spark/Spark.java new file mode 100644 index 00000000..0d137512 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/Spark.java @@ -0,0 +1,118 @@ +package com.drmangotea.tfmg.base.spark; + + +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import com.drmangotea.tfmg.registry.TFMGItems; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseFireBlock; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; + +public class Spark extends ThrowableProjectile { + public Spark(EntityType p_37391_, Level p_37392_) { + super(p_37391_, p_37392_); + + } + public Spark(Level p_37399_, LivingEntity p_37400_) { + super(TFMGEntityTypes.SPARK.get(), p_37400_, p_37399_); + } + + public Spark(Level p_37394_, double p_37395_, double p_37396_, double p_37397_) { + super(TFMGEntityTypes.SPARK.get(), p_37395_, p_37396_, p_37397_, p_37394_); + } + + + @Override + protected float getGravity(){ + return 0.02f; + } + @Override + protected void defineSynchedData() { + + } + + public void tick(){ + super.tick(); + if (this.isInWaterOrRain()) { + this.discard(); + } + if(this.level.isClientSide) { + + this.level.addParticle(ParticleTypes.FLAME, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, -this.getDeltaMovement().y * 0.5D, this.random.nextGaussian() * 0.05D); + } +} + + protected Item getDefaultItem() { + return TFMGItems.THERMITE_GRENADE.get(); + } + + private ParticleOptions getParticle() { + + return ParticleTypes.FLAME; + } + + public void handleEntityEvent(byte p_37402_) { + if (p_37402_ == 3) { + ParticleOptions particleoptions = this.getParticle(); + + for(int i = 0; i < 8; ++i) { + this.level.addParticle(particleoptions, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } + + } + protected void onHitBlock(BlockHitResult p_37384_) { + super.onHitBlock(p_37384_); + if (!this.level.isClientSide) { + Entity entity = this.getOwner(); + if (!(entity instanceof Mob) || net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.level, this)) { + BlockPos blockpos = p_37384_.getBlockPos().relative(p_37384_.getDirection()); + if (this.level.isEmptyBlock(blockpos)) { + this.level.setBlockAndUpdate(blockpos, BaseFireBlock.getState(this.level, blockpos)); + } + } + + } + } + + protected void onHitEntity(EntityHitResult p_37386_) { + super.onHitEntity(p_37386_); + if (!this.level.isClientSide) { + Entity entity = p_37386_.getEntity(); + Entity entity1 = this.getOwner(); + int i = entity.getRemainingFireTicks(); + entity.setSecondsOnFire(10); + + + } + } + + protected void onHit(HitResult p_37406_) { + super.onHit(p_37406_); + + if (!this.level.isClientSide) { + this.level.broadcastEntityEvent(this, (byte)3); + + + //this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 2.0F, Explosion.BlockInteraction.NONE); + this.discard(); + } + + } + + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.sized(.25f, .25f); + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/base/spark/SparkRenderer.java b/src/main/java/com/drmangotea/tfmg/base/spark/SparkRenderer.java new file mode 100644 index 00000000..9e488255 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/spark/SparkRenderer.java @@ -0,0 +1,57 @@ +package com.drmangotea.tfmg.base.spark; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class SparkRenderer extends EntityRenderer { + private static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation("textures/particle/lava.png"); + private static final RenderType RENDER_TYPE = RenderType.entityCutoutNoCull(TEXTURE_LOCATION); + + public SparkRenderer(EntityRendererProvider.Context p_173962_) { + super(p_173962_); + } + + + + protected int getBlockLightLevel(Spark p_114087_, BlockPos p_114088_) { + return 15; + } + + public void render(Spark p_114080_, float p_114081_, float p_114082_, PoseStack p_114083_, MultiBufferSource p_114084_, int p_114085_) { + p_114083_.pushPose(); + p_114083_.scale(0.5F, 0.5F, 0.5F); + p_114083_.mulPose(this.entityRenderDispatcher.cameraOrientation()); + p_114083_.mulPose(Vector3f.YP.rotationDegrees(180.0F)); + PoseStack.Pose posestack$pose = p_114083_.last(); + Matrix4f matrix4f = posestack$pose.pose(); + Matrix3f matrix3f = posestack$pose.normal(); + VertexConsumer vertexconsumer = p_114084_.getBuffer(RENDER_TYPE); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 0, 0, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 0, 1, 1); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 1, 1, 0); + vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 1, 0, 0); + p_114083_.popPose(); + super.render(p_114080_, p_114081_, p_114082_, p_114083_, p_114084_, p_114085_); + } + + private static void vertex(VertexConsumer p_114090_, Matrix4f p_114091_, Matrix3f p_114092_, int p_114093_, float p_114094_, int p_114095_, int p_114096_, int p_114097_) { + p_114090_.vertex(p_114091_, p_114094_ - 0.5F, (float)p_114095_ - 0.25F, 0.0F).color(255, 255, 255, 255).uv((float)p_114096_, (float)p_114097_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_114093_).normal(p_114092_, 0.0F, 1.0F, 0.0F).endVertex(); + } + + public ResourceLocation getTextureLocation(Spark p_114078_) { + return TEXTURE_LOCATION; + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombBlock.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombBlock.java new file mode 100644 index 00000000..1b94aa76 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombBlock.java @@ -0,0 +1,133 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.napalm; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; + +import javax.annotation.Nullable; + +public class NapalmBombBlock extends Block { + public static final BooleanProperty UNSTABLE = BlockStateProperties.UNSTABLE; + + public NapalmBombBlock(Properties p_57422_) { + super(p_57422_); + this.registerDefaultState(this.defaultBlockState().setValue(UNSTABLE, Boolean.valueOf(false))); + } + + public void onCaughtFire(BlockState state, Level world, BlockPos pos, @Nullable net.minecraft.core.Direction face, @Nullable LivingEntity igniter) { + explode(world, pos, igniter); + } + + public void onPlace(BlockState p_57466_, Level p_57467_, BlockPos p_57468_, BlockState p_57469_, boolean p_57470_) { + if (!p_57469_.is(p_57466_.getBlock())) { + if (p_57467_.hasNeighborSignal(p_57468_)) { + onCaughtFire(p_57466_, p_57467_, p_57468_, null, null); + p_57467_.removeBlock(p_57468_, false); + } + + } + } + + public void neighborChanged(BlockState p_57457_, Level p_57458_, BlockPos p_57459_, Block p_57460_, BlockPos p_57461_, boolean p_57462_) { + if (p_57458_.hasNeighborSignal(p_57459_)) { + onCaughtFire(p_57457_, p_57458_, p_57459_, null, null); + p_57458_.removeBlock(p_57459_, false); + } + + } + + public void playerWillDestroy(Level p_57445_, BlockPos p_57446_, BlockState p_57447_, Player p_57448_) { + if (!p_57445_.isClientSide() && !p_57448_.isCreative() && p_57447_.getValue(UNSTABLE)) { + onCaughtFire(p_57447_, p_57445_, p_57446_, null, null); + } + + super.playerWillDestroy(p_57445_, p_57446_, p_57447_, p_57448_); + } + + public void wasExploded(Level p_57441_, BlockPos p_57442_, Explosion p_57443_) { + if (!p_57441_.isClientSide) { + NapalmBombEntity napalmBomb = new NapalmBombEntity(p_57441_, (double)p_57442_.getX() + 0.5D, (double)p_57442_.getY(), (double)p_57442_.getZ() + 0.5D, p_57443_.getSourceMob()); + int i = napalmBomb.getFuse(); + napalmBomb.setFuse((short)(p_57441_.random.nextInt(i / 4) + i / 8)); + p_57441_.addFreshEntity(napalmBomb); + } + } + + @Deprecated //Forge: Prefer using IForgeBlock#catchFire + public static void explode(Level p_57434_, BlockPos p_57435_) { + explode(p_57434_, p_57435_, (LivingEntity)null); + } + + @Deprecated //Forge: Prefer using IForgeBlock#catchFire + private static void explode(Level p_57437_, BlockPos p_57438_, @Nullable LivingEntity p_57439_) { + if (!p_57437_.isClientSide) { + NapalmBombEntity napalmBomb = new NapalmBombEntity(p_57437_, (double)p_57438_.getX() + 0.5D, (double)p_57438_.getY(), (double)p_57438_.getZ() + 0.5D, p_57439_); + p_57437_.addFreshEntity(napalmBomb); + p_57437_.playSound((Player)null, napalmBomb.getX(), napalmBomb.getY(), napalmBomb.getZ(), SoundEvents.TNT_PRIMED, SoundSource.BLOCKS, 1.0F, 1.0F); + p_57437_.gameEvent(p_57439_, GameEvent.PRIME_FUSE, p_57438_); + } + } + + public InteractionResult use(BlockState p_57450_, Level p_57451_, BlockPos p_57452_, Player p_57453_, InteractionHand p_57454_, BlockHitResult p_57455_) { + ItemStack itemstack = p_57453_.getItemInHand(p_57454_); + if (!itemstack.is(Items.FLINT_AND_STEEL) && !itemstack.is(Items.FIRE_CHARGE)) { + return super.use(p_57450_, p_57451_, p_57452_, p_57453_, p_57454_, p_57455_); + } else { + onCaughtFire(p_57450_, p_57451_, p_57452_, p_57455_.getDirection(), p_57453_); + p_57451_.setBlock(p_57452_, Blocks.AIR.defaultBlockState(), 11); + Item item = itemstack.getItem(); + if (!p_57453_.isCreative()) { + if (itemstack.is(Items.FLINT_AND_STEEL)) { + itemstack.hurtAndBreak(1, p_57453_, (p_57425_) -> { + p_57425_.broadcastBreakEvent(p_57454_); + }); + } else { + itemstack.shrink(1); + } + } + + p_57453_.awardStat(Stats.ITEM_USED.get(item)); + return InteractionResult.sidedSuccess(p_57451_.isClientSide); + } + } + + public void onProjectileHit(Level p_57429_, BlockState p_57430_, BlockHitResult p_57431_, Projectile p_57432_) { + if (!p_57429_.isClientSide) { + BlockPos blockpos = p_57431_.getBlockPos(); + Entity entity = p_57432_.getOwner(); + if (p_57432_.isOnFire() && p_57432_.mayInteract(p_57429_, blockpos)) { + onCaughtFire(p_57430_, p_57429_, blockpos, null, entity instanceof LivingEntity ? (LivingEntity)entity : null); + p_57429_.removeBlock(blockpos, false); + } + } + + } + + public boolean dropFromExplosion(Explosion p_57427_) { + return false; + } + + protected void createBlockStateDefinition(StateDefinition.Builder p_57464_) { + p_57464_.add(UNSTABLE); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombEntity.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombEntity.java new file mode 100644 index 00000000..61df6c7c --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombEntity.java @@ -0,0 +1,134 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.napalm; + + +import com.drmangotea.tfmg.base.spark.Spark; +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import com.simibubi.create.Create; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; + +public class NapalmBombEntity extends Entity { + private static final EntityDataAccessor DATA_FUSE_ID = SynchedEntityData.defineId(PrimedTnt.class, EntityDataSerializers.INT); + private static final int DEFAULT_FUSE_TIME = 80; + @Nullable + private LivingEntity owner; + + public NapalmBombEntity(EntityType p_32076_, Level p_32077_) { + super(p_32076_, p_32077_); + this.blocksBuilding = true; + } + + public NapalmBombEntity(Level p_32079_, double p_32080_, double p_32081_, double p_32082_, @Nullable LivingEntity p_32083_) { + this(TFMGEntityTypes.NAPALM_BOMB.get(), p_32079_); + this.setPos(p_32080_, p_32081_, p_32082_); + double d0 = p_32079_.random.nextDouble() * (double)((float)Math.PI * 2F); + this.setDeltaMovement(-Math.sin(d0) * 0.02D, (double)0.2F, -Math.cos(d0) * 0.02D); + this.setFuse(80); + this.xo = p_32080_; + this.yo = p_32081_; + this.zo = p_32082_; + this.owner = p_32083_; + } + + + + protected void defineSynchedData() { + this.entityData.define(DATA_FUSE_ID, 80); + } + + protected MovementEmission getMovementEmission() { + return MovementEmission.NONE; + } + + public boolean isPickable() { + return !this.isRemoved(); + } + + public void tick() { + if (!this.isNoGravity()) { + this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.04D, 0.0D)); + } + + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(0.98D)); + if (this.onGround) { + this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, -0.5D, 0.7D)); + } + + int i = this.getFuse() - 1; + this.setFuse(i); + if (i <= 0) { + this.discard(); + if (!this.level.isClientSide) { + this.explode(); + } + } else { + this.updateInWaterStateAndDoFluidPushing(); + if (this.level.isClientSide) { + this.level.addParticle(ParticleTypes.FLAME, this.getX(), this.getY() + 0.5D, this.getZ(), 0.0D, 0.0D, 0.0D); + } + } + + } + + protected void explode() { + + float f = 4.0F; + for (int i=0; i<40;i++){ + float x= Create.RANDOM.nextFloat(360); + float y= Create.RANDOM.nextFloat(360); + float z= Create.RANDOM.nextFloat(360); + Spark spark = TFMGEntityTypes.SPARK.create(level); + spark.moveTo(this.getX(), this.getY()+1, this.getZ()); + spark.shootFromRotation( this,x,y,z,0.3f,1); + this.level.addFreshEntity(spark); + } + this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 2.5F, Explosion.BlockInteraction.BREAK); + + } + + protected void addAdditionalSaveData(CompoundTag p_32097_) { + p_32097_.putShort("Fuse", (short)this.getFuse()); + } + + protected void readAdditionalSaveData(CompoundTag p_32091_) { + this.setFuse(p_32091_.getShort("Fuse")); + } + + @Nullable + public LivingEntity getOwner() { + return this.owner; + } + + protected float getEyeHeight(Pose p_32088_, EntityDimensions p_32089_) { + return 0.15F; + } + + public void setFuse(int p_32086_) { + this.entityData.set(DATA_FUSE_ID, p_32086_); + } + + public int getFuse() { + return this.entityData.get(DATA_FUSE_ID); + } + + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.sized(.25f, .25f); + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombRenderer.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombRenderer.java new file mode 100644 index 00000000..c667628e --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/napalm/NapalmBombRenderer.java @@ -0,0 +1,50 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.napalm; + +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.TntMinecartRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class NapalmBombRenderer extends EntityRenderer { + private final BlockRenderDispatcher blockRenderer; + public NapalmBombRenderer(EntityRendererProvider.Context p_174426_) { + super(p_174426_); + this.shadowRadius = 0.5F; + this.blockRenderer = p_174426_.getBlockRenderDispatcher(); + } + + public void render(NapalmBombEntity p_116177_, float p_116178_, float p_116179_, PoseStack p_116180_, MultiBufferSource p_116181_, int p_116182_) { + p_116180_.pushPose(); + p_116180_.translate(0.0D, 0.5D, 0.0D); + int i = p_116177_.getFuse(); + if ((float)i - p_116179_ + 1.0F < 10.0F) { + float f = 1.0F - ((float)i - p_116179_ + 1.0F) / 10.0F; + f = Mth.clamp(f, 0.0F, 1.0F); + f *= f; + f *= f; + float f1 = 1.0F + f * 0.3F; + p_116180_.scale(f1, f1, f1); + } + + p_116180_.mulPose(Vector3f.YP.rotationDegrees(-90.0F)); + p_116180_.translate(-0.5D, -0.5D, 0.5D); + p_116180_.mulPose(Vector3f.YP.rotationDegrees(90.0F)); + TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, TFMGBlocks.NAPALM_BOMB.get().defaultBlockState(), p_116180_, p_116181_, p_116182_, i / 5 % 2 == 0); + p_116180_.popPose(); + super.render(p_116177_, p_116178_, p_116179_, p_116180_, p_116181_, p_116182_); + } + + public ResourceLocation getTextureLocation(NapalmBombEntity p_116175_) { + return TextureAtlas.LOCATION_BLOCKS; + } + } \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ChemicalColor.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ChemicalColor.java new file mode 100644 index 00000000..8a7e0f30 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ChemicalColor.java @@ -0,0 +1,7 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades; + +public enum ChemicalColor { + BASE, + GREEN, + BLUE +} diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenade.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenade.java new file mode 100644 index 00000000..24068d89 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenade.java @@ -0,0 +1,118 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades; + + +import com.drmangotea.tfmg.base.spark.BlueSpark; +import com.drmangotea.tfmg.base.spark.GreenSpark; +import com.drmangotea.tfmg.base.spark.Spark; +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.Create; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; + +public class ThermiteGrenade extends ThrowableItemProjectile { + public final ChemicalColor flameColor; + + public ThermiteGrenade(EntityType p_37391_, Level p_37392_) { + super(p_37391_, p_37392_); + this.flameColor =ChemicalColor.BLUE; + } + + + + + + public ThermiteGrenade(Level p_37399_, LivingEntity p_37400_, ChemicalColor color,EntityType grenade) { + super(grenade, p_37400_, p_37399_); + this.flameColor = color; + } + + public ThermiteGrenade(Level p_37394_, double p_37395_, double p_37396_, double p_37397_) { + super(TFMGEntityTypes.THERMITE_GRENADE.get(), p_37395_, p_37396_, p_37397_, p_37394_); + this.flameColor =ChemicalColor.BLUE; + } + + protected Item getDefaultItem() { + return TFMGItems.THERMITE_GRENADE.get(); + } + + private ParticleOptions getParticle() { + + return ParticleTypes.FLAME; + } + + public void handleEntityEvent(byte p_37402_) { + if (p_37402_ == 3) { + ParticleOptions particleoptions = this.getParticle(); + + for(int i = 0; i < 8; ++i) { + this.level.addParticle(particleoptions, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } + + } + + protected void onHitEntity(EntityHitResult p_37404_) { + super.onHitEntity(p_37404_); + Entity entity = p_37404_.getEntity(); + entity.hurt(DamageSource.thrown(this, this.getOwner()), 1); + } + + protected void onHit(HitResult p_37406_) { + super.onHit(p_37406_); + + if (!this.level.isClientSide) { + this.level.broadcastEntityEvent(this, (byte) 3); + + for (int i=0; i<20;i++){ + float x= Create.RANDOM.nextFloat(360); + float y= Create.RANDOM.nextFloat(360); + float z= Create.RANDOM.nextFloat(360); + + if(flameColor==ChemicalColor.GREEN){ + GreenSpark spark = TFMGEntityTypes.GREEN_SPARK.create(level); + spark.moveTo(this.getX(), this.getY()+1, this.getZ()); + spark.shootFromRotation( this,x,y,z,0.2f,1); + this.level.addFreshEntity(spark); + }else + if(flameColor==ChemicalColor.BLUE){ + BlueSpark spark = TFMGEntityTypes.BLUE_SPARK.create(level); + spark.moveTo(this.getX(), this.getY()+1, this.getZ()); + spark.shootFromRotation( this,x,y,z,0.2f,1); + this.level.addFreshEntity(spark); + } else { Spark spark = TFMGEntityTypes.SPARK.create(level); + spark.moveTo(this.getX(), this.getY()+1, this.getZ()); + spark.shootFromRotation( this,x,y,z,0.2f,1); + this.level.addFreshEntity(spark);} + + + + + + + + } + + + this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 2.0F, Explosion.BlockInteraction.NONE); + this.discard(); + } + + } + + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.sized(.25f, .25f); + } +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeItem.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeItem.java new file mode 100644 index 00000000..3d5dcdb1 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeItem.java @@ -0,0 +1,48 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades; + +import com.drmangotea.tfmg.registry.TFMGEntityTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class ThermiteGrenadeItem extends Item { + + public final ChemicalColor flameColor; + + public ThermiteGrenadeItem(Properties p_41383_, ChemicalColor color) { + super(p_41383_); + this.flameColor = color; + } + + public InteractionResultHolder use(Level p_43142_, Player p_43143_, InteractionHand p_43144_) { + ItemStack itemstack = p_43143_.getItemInHand(p_43144_); + p_43143_.getCooldowns().addCooldown(this, 60); + p_43142_.playSound((Player)null, p_43143_.getX(), p_43143_.getY(), p_43143_.getZ(), SoundEvents.EGG_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (p_43142_.getRandom().nextFloat() * 0.4F + 0.8F)); + if (!p_43142_.isClientSide) { + ThermiteGrenade grenade; + if(flameColor==ChemicalColor.GREEN) { + grenade = new ThermiteGrenade(p_43142_, p_43143_, flameColor, TFMGEntityTypes.ZINC_GRENADE.get()); + }else if(flameColor==ChemicalColor.BLUE) { + grenade = new ThermiteGrenade(p_43142_, p_43143_, flameColor, TFMGEntityTypes.COPPER_GRENADE.get()); + }else { + grenade = new ThermiteGrenade(p_43142_, p_43143_, flameColor, TFMGEntityTypes.THERMITE_GRENADE.get()); + } + grenade.setItem(itemstack); + grenade.shootFromRotation(p_43143_, p_43143_.getXRot(), p_43143_.getYRot(), 0.0F, 0.5F, 1.0F); + p_43142_.addFreshEntity(grenade); + } + + p_43143_.awardStat(Stats.ITEM_USED.get(this)); + if (!p_43143_.getAbilities().instabuild) { + itemstack.shrink(1); + } + + return InteractionResultHolder.sidedSuccess(itemstack, p_43142_.isClientSide()); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeRenderer.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeRenderer.java new file mode 100644 index 00000000..cbe84b48 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/ThermiteGrenadeRenderer.java @@ -0,0 +1,64 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades; + + +import com.drmangotea.tfmg.registry.TFMGItems; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; +import com.simibubi.create.content.fluids.tank.FluidTankBlock; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class ThermiteGrenadeRenderer extends EntityRenderer { + private final ItemRenderer itemRenderer; + private ChemicalColor chemicalColor; + public static ThermiteGrenadeRenderer regular(EntityRendererProvider.Context p_i48440_1_) { + return new ThermiteGrenadeRenderer(p_i48440_1_, ChemicalColor.BASE); + } + public static ThermiteGrenadeRenderer green(EntityRendererProvider.Context p_i48440_1_) { + return new ThermiteGrenadeRenderer(p_i48440_1_, ChemicalColor.GREEN); + } + public static ThermiteGrenadeRenderer blue(EntityRendererProvider.Context p_i48440_1_) { + return new ThermiteGrenadeRenderer(p_i48440_1_, ChemicalColor.BLUE); + } + public ThermiteGrenadeRenderer(EntityRendererProvider.Context p_174114_,ChemicalColor color) { + super(p_174114_); + this.chemicalColor = color; + this.itemRenderer = p_174114_.getItemRenderer(); + } + + + public void render(ThermiteGrenade grenade, float p_114657_, float p_114658_, PoseStack p_114659_, MultiBufferSource p_114660_, int p_114661_) { + p_114659_.pushPose(); + p_114659_.mulPose(this.entityRenderDispatcher.cameraOrientation()); + p_114659_.mulPose(Vector3f.YP.rotationDegrees(180.0F)); + + + + if (chemicalColor == ChemicalColor.GREEN) { + this.itemRenderer.renderStatic(TFMGItems.ZINC_GRENADE.get().getDefaultInstance(), ItemTransforms.TransformType.GROUND, p_114661_, OverlayTexture.NO_OVERLAY, p_114659_, p_114660_, grenade.getId()); + } else if (chemicalColor == ChemicalColor.BLUE) { + this.itemRenderer.renderStatic(TFMGItems.COPPER_GRENADE.get().getDefaultInstance(), ItemTransforms.TransformType.GROUND, p_114661_, OverlayTexture.NO_OVERLAY, p_114659_, p_114660_, grenade.getId()); + } else { + this.itemRenderer.renderStatic(TFMGItems.THERMITE_GRENADE.get().getDefaultInstance(), ItemTransforms.TransformType.GROUND, p_114661_, OverlayTexture.NO_OVERLAY, p_114659_, p_114660_, grenade.getId()); + } + + p_114659_.popPose(); + super.render(grenade, p_114657_, p_114658_, p_114659_, p_114660_, p_114661_); + } + + public ResourceLocation getTextureLocation(ThermiteGrenade p_114654_) { + return TextureAtlas.LOCATION_BLOCKS; + } + +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/BlueFireBlock.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/BlueFireBlock.java new file mode 100644 index 00000000..36da1fdf --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/BlueFireBlock.java @@ -0,0 +1,447 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire; + +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.google.common.collect.ImmutableMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class BlueFireBlock extends BaseFireBlock { + public static final int MAX_AGE = 15; + public static final IntegerProperty AGE = BlockStateProperties.AGE_15; + public static final BooleanProperty NORTH = PipeBlock.NORTH; + public static final BooleanProperty EAST = PipeBlock.EAST; + public static final BooleanProperty SOUTH = PipeBlock.SOUTH; + public static final BooleanProperty WEST = PipeBlock.WEST; + public static final BooleanProperty UP = PipeBlock.UP; + private static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter((p_53467_) -> { + return p_53467_.getKey() != Direction.DOWN; + }).collect(Util.toMap()); + private static final VoxelShape UP_AABB = Block.box(0.0D, 15.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape WEST_AABB = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 16.0D, 16.0D); + private static final VoxelShape EAST_AABB = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape NORTH_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 1.0D); + private static final VoxelShape SOUTH_AABB = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D); + private final Map shapesCache; + private static final int IGNITE_INSTANT = 60; + private static final int IGNITE_EASY = 30; + private static final int IGNITE_MEDIUM = 15; + private static final int IGNITE_HARD = 5; + private static final int BURN_INSTANT = 100; + private static final int BURN_EASY = 60; + private static final int BURN_MEDIUM = 20; + private static final int BURN_HARD = 5; + private final Object2IntMap igniteOdds = new Object2IntOpenHashMap<>(); + private final Object2IntMap burnOdds = new Object2IntOpenHashMap<>(); + + public BlueFireBlock(Properties p_53425_) { + super(p_53425_, 1.0F); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, Integer.valueOf(0)).setValue(NORTH, Boolean.valueOf(false)).setValue(EAST, Boolean.valueOf(false)).setValue(SOUTH, Boolean.valueOf(false)).setValue(WEST, Boolean.valueOf(false)).setValue(UP, Boolean.valueOf(false))); + this.shapesCache = ImmutableMap.copyOf(this.stateDefinition.getPossibleStates().stream().filter((p_53497_) -> { + return p_53497_.getValue(AGE) == 0; + }).collect(Collectors.toMap(Function.identity(), BlueFireBlock::calculateShape))); + } + + private static VoxelShape calculateShape(BlockState p_53491_) { + VoxelShape voxelshape = Shapes.empty(); + if (p_53491_.getValue(UP)) { + voxelshape = UP_AABB; + } + + if (p_53491_.getValue(NORTH)) { + voxelshape = Shapes.or(voxelshape, NORTH_AABB); + } + + if (p_53491_.getValue(SOUTH)) { + voxelshape = Shapes.or(voxelshape, SOUTH_AABB); + } + + if (p_53491_.getValue(EAST)) { + voxelshape = Shapes.or(voxelshape, EAST_AABB); + } + + if (p_53491_.getValue(WEST)) { + voxelshape = Shapes.or(voxelshape, WEST_AABB); + } + + return voxelshape.isEmpty() ? DOWN_AABB : voxelshape; + } + + public BlockState updateShape(BlockState p_53458_, Direction p_53459_, BlockState p_53460_, LevelAccessor p_53461_, BlockPos p_53462_, BlockPos p_53463_) { + return this.canSurvive(p_53458_, p_53461_, p_53462_) ? this.getStateWithAge(p_53461_, p_53462_, p_53458_.getValue(AGE)) : Blocks.AIR.defaultBlockState(); + } + + public VoxelShape getShape(BlockState p_53474_, BlockGetter p_53475_, BlockPos p_53476_, CollisionContext p_53477_) { + return this.shapesCache.get(p_53474_.setValue(AGE, Integer.valueOf(0))); + } + + public BlockState getStateForPlacement(BlockPlaceContext p_53427_) { + return this.getStateForPlacement(p_53427_.getLevel(), p_53427_.getClickedPos()); + } + + protected BlockState getStateForPlacement(BlockGetter p_53471_, BlockPos p_53472_) { + BlockPos blockpos = p_53472_.below(); + BlockState blockstate = p_53471_.getBlockState(blockpos); + if (!this.canCatchFire(p_53471_, p_53472_, Direction.UP) && !blockstate.isFaceSturdy(p_53471_, blockpos, Direction.UP)) { + BlockState blockstate1 = this.defaultBlockState(); + + for(Direction direction : Direction.values()) { + BooleanProperty booleanproperty = PROPERTY_BY_DIRECTION.get(direction); + if (booleanproperty != null) { + blockstate1 = blockstate1.setValue(booleanproperty, Boolean.valueOf(this.canCatchFire(p_53471_, p_53472_.relative(direction), direction.getOpposite()))); + } + } + + return blockstate1; + } else { + return this.defaultBlockState(); + } + } + + public boolean canSurvive(BlockState p_53454_, LevelReader p_53455_, BlockPos p_53456_) { + BlockPos blockpos = p_53456_.below(); + return p_53455_.getBlockState(blockpos).isFaceSturdy(p_53455_, blockpos, Direction.UP) || this.isValidFireLocation(p_53455_, p_53456_); + } + + public void tick(BlockState p_221160_, ServerLevel p_221161_, BlockPos p_221162_, RandomSource p_221163_) { + p_221161_.scheduleTick(p_221162_, this, getFireTickDelay(p_221161_.random)); + if (p_221161_.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { + if (!p_221160_.canSurvive(p_221161_, p_221162_)) { + p_221161_.removeBlock(p_221162_, false); + } + + BlockState blockstate = p_221161_.getBlockState(p_221162_.below()); + boolean flag = blockstate.isFireSource(p_221161_, p_221162_, Direction.UP); + int i = p_221160_.getValue(AGE); + if (!flag && p_221161_.isRaining() && this.isNearRain(p_221161_, p_221162_) && p_221163_.nextFloat() < 0.2F + (float)i * 0.03F) { + p_221161_.removeBlock(p_221162_, false); + } else { + int j = Math.min(15, i + p_221163_.nextInt(3) / 2); + if (i != j) { + p_221160_ = p_221160_.setValue(AGE, Integer.valueOf(j)); + p_221161_.setBlock(p_221162_, p_221160_, 4); + } + + if (!flag) { + if (!this.isValidFireLocation(p_221161_, p_221162_)) { + BlockPos blockpos = p_221162_.below(); + if (!p_221161_.getBlockState(blockpos).isFaceSturdy(p_221161_, blockpos, Direction.UP) || i > 3) { + p_221161_.removeBlock(p_221162_, false); + } + + return; + } + + if (i == 15 && p_221163_.nextInt(4) == 0 && !this.canCatchFire(p_221161_, p_221162_.below(), Direction.UP)) { + p_221161_.removeBlock(p_221162_, false); + return; + } + } + + boolean flag1 = p_221161_.isHumidAt(p_221162_); + int k = flag1 ? -50 : 0; + this.tryCatchFire(p_221161_, p_221162_.east(), 300 + k, p_221163_, i, Direction.WEST); + this.tryCatchFire(p_221161_, p_221162_.west(), 300 + k, p_221163_, i, Direction.EAST); + this.tryCatchFire(p_221161_, p_221162_.below(), 250 + k, p_221163_, i, Direction.UP); + this.tryCatchFire(p_221161_, p_221162_.above(), 250 + k, p_221163_, i, Direction.DOWN); + this.tryCatchFire(p_221161_, p_221162_.north(), 300 + k, p_221163_, i, Direction.SOUTH); + this.tryCatchFire(p_221161_, p_221162_.south(), 300 + k, p_221163_, i, Direction.NORTH); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(int l = -1; l <= 1; ++l) { + for(int i1 = -1; i1 <= 1; ++i1) { + for(int j1 = -1; j1 <= 4; ++j1) { + if (l != 0 || j1 != 0 || i1 != 0) { + int k1 = 100; + if (j1 > 1) { + k1 += (j1 - 1) * 100; + } + + blockpos$mutableblockpos.setWithOffset(p_221162_, l, j1, i1); + int l1 = this.getIgniteOdds(p_221161_, blockpos$mutableblockpos); + if (l1 > 0) { + int i2 = (l1 + 40 + p_221161_.getDifficulty().getId() * 7) / (i + 30); + if (flag1) { + i2 /= 2; + } + + if (i2 > 0 && p_221163_.nextInt(k1) <= i2 && (!p_221161_.isRaining() || !this.isNearRain(p_221161_, blockpos$mutableblockpos))) { + int j2 = Math.min(15, i + p_221163_.nextInt(5) / 4); + p_221161_.setBlock(blockpos$mutableblockpos, this.getStateWithAge(p_221161_, blockpos$mutableblockpos, j2), 3); + } + } + } + } + } + } + + } + } + } + + protected boolean isNearRain(Level p_53429_, BlockPos p_53430_) { + return p_53429_.isRainingAt(p_53430_) || p_53429_.isRainingAt(p_53430_.west()) || p_53429_.isRainingAt(p_53430_.east()) || p_53429_.isRainingAt(p_53430_.north()) || p_53429_.isRainingAt(p_53430_.south()); + } + + @Deprecated //Forge: Use IForgeBlockState.getFlammability, Public for default implementation only. + public int getBurnOdds(BlockState p_221165_) { + return p_221165_.hasProperty(BlockStateProperties.WATERLOGGED) && p_221165_.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.burnOdds.getInt(p_221165_.getBlock()); + } + + @Deprecated //Forge: Use IForgeBlockState.getFireSpreadSpeed + public int getIgniteOdds(BlockState p_221167_) { + return p_221167_.hasProperty(BlockStateProperties.WATERLOGGED) && p_221167_.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.igniteOdds.getInt(p_221167_.getBlock()); + } + public static BlockState getState(BlockGetter p_49246_, BlockPos p_49247_) { + return ((BlueFireBlock)TFMGColoredFires.BLUE_FIRE.get()).getStateForPlacement(p_49246_, p_49247_); + } + private void tryCatchFire(Level p_53432_, BlockPos p_53433_, int p_53434_, RandomSource p_53435_, int p_53436_, Direction face) { + int i = p_53432_.getBlockState(p_53433_).getFlammability(p_53432_, p_53433_, face); + if (p_53435_.nextInt(p_53434_) < i) { + BlockState blockstate = p_53432_.getBlockState(p_53433_); + if (p_53435_.nextInt(p_53434_ + 10) < 5 && !p_53432_.isRainingAt(p_53433_)) { + int j = Math.min(p_53434_ + p_53435_.nextInt(5) / 4, 15); + p_53432_.setBlock(p_53433_, this.getStateWithAge(p_53432_, p_53433_, j), 3); + } else { + p_53432_.removeBlock(p_53433_, false); + } + + blockstate.onCaughtFire(p_53432_, p_53433_, face, null); + } + + } + + private BlockState getStateWithAge(LevelAccessor p_53438_, BlockPos p_53439_, int p_53440_) { + BlockState blockstate = getState(p_53438_, p_53439_); + return blockstate.is(TFMGColoredFires.BLUE_FIRE.get()) ? blockstate.setValue(AGE, Integer.valueOf(p_53440_)) : blockstate; + } + + private boolean isValidFireLocation(BlockGetter p_53486_, BlockPos p_53487_) { + for(Direction direction : Direction.values()) { + if (this.canCatchFire(p_53486_, p_53487_.relative(direction), direction.getOpposite())) { + return true; + } + } + + return false; + } + + private int getIgniteOdds(LevelReader p_221157_, BlockPos p_221158_) { + if (!p_221157_.isEmptyBlock(p_221158_)) { + return 0; + } else { + int i = 0; + + for(Direction direction : Direction.values()) { + BlockState blockstate = p_221157_.getBlockState(p_221158_.relative(direction)); + i = Math.max(blockstate.getFireSpreadSpeed(p_221157_, p_221158_.relative(direction), direction.getOpposite()), i); + } + + return i; + } + } + + @Deprecated //Forge: Use canCatchFire with more context + protected boolean canBurn(BlockState p_53489_) { + return this.getIgniteOdds(p_53489_) > 0; + } + + public void onPlace(BlockState p_53479_, Level p_53480_, BlockPos p_53481_, BlockState p_53482_, boolean p_53483_) { + super.onPlace(p_53479_, p_53480_, p_53481_, p_53482_, p_53483_); + p_53480_.scheduleTick(p_53481_, this, getFireTickDelay(p_53480_.random)); + } + + private static int getFireTickDelay(RandomSource p_221149_) { + return 30 + p_221149_.nextInt(10); + } + + protected void createBlockStateDefinition(StateDefinition.Builder p_53465_) { + p_53465_.add(AGE, NORTH, EAST, SOUTH, WEST, UP); + } + + private void setFlammable(Block p_53445_, int p_53446_, int p_53447_) { + if (p_53445_ == Blocks.AIR) throw new IllegalArgumentException("Tried to set air on fire... This is bad."); + this.igniteOdds.put(p_53445_, p_53446_); + this.burnOdds.put(p_53445_, p_53447_); + } + + + public boolean canCatchFire(BlockGetter world, BlockPos pos, Direction face) { + return world.getBlockState(pos).isFlammable(world, pos, face); + } + + public static void bootStrap() { + BlueFireBlock fireblock = (BlueFireBlock) TFMGColoredFires.BLUE_FIRE.get(); + fireblock.setFlammable(Blocks.OAK_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.OAK_SLAB, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_SLAB, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_SLAB, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_SLAB, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.OAK_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.OAK_FENCE, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_FENCE, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_FENCE, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_FENCE, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.OAK_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.SPRUCE_LOG, 5, 5); + fireblock.setFlammable(Blocks.BIRCH_LOG, 5, 5); + fireblock.setFlammable(Blocks.JUNGLE_LOG, 5, 5); + fireblock.setFlammable(Blocks.ACACIA_LOG, 5, 5); + fireblock.setFlammable(Blocks.DARK_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_SPRUCE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_BIRCH_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_JUNGLE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_ACACIA_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_DARK_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_MANGROVE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_SPRUCE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_BIRCH_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_JUNGLE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_ACACIA_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_DARK_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_MANGROVE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.SPRUCE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.BIRCH_WOOD, 5, 5); + fireblock.setFlammable(Blocks.JUNGLE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.ACACIA_WOOD, 5, 5); + fireblock.setFlammable(Blocks.DARK_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_ROOTS, 5, 20); + fireblock.setFlammable(Blocks.OAK_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.SPRUCE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.BIRCH_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.JUNGLE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.ACACIA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.DARK_OAK_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.MANGROVE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.BOOKSHELF, 30, 20); + fireblock.setFlammable(Blocks.TNT, 15, 100); + fireblock.setFlammable(Blocks.GRASS, 60, 100); + fireblock.setFlammable(Blocks.FERN, 60, 100); + fireblock.setFlammable(Blocks.DEAD_BUSH, 60, 100); + fireblock.setFlammable(Blocks.SUNFLOWER, 60, 100); + fireblock.setFlammable(Blocks.LILAC, 60, 100); + fireblock.setFlammable(Blocks.ROSE_BUSH, 60, 100); + fireblock.setFlammable(Blocks.PEONY, 60, 100); + fireblock.setFlammable(Blocks.TALL_GRASS, 60, 100); + fireblock.setFlammable(Blocks.LARGE_FERN, 60, 100); + fireblock.setFlammable(Blocks.DANDELION, 60, 100); + fireblock.setFlammable(Blocks.POPPY, 60, 100); + fireblock.setFlammable(Blocks.BLUE_ORCHID, 60, 100); + fireblock.setFlammable(Blocks.ALLIUM, 60, 100); + fireblock.setFlammable(Blocks.AZURE_BLUET, 60, 100); + fireblock.setFlammable(Blocks.RED_TULIP, 60, 100); + fireblock.setFlammable(Blocks.ORANGE_TULIP, 60, 100); + fireblock.setFlammable(Blocks.WHITE_TULIP, 60, 100); + fireblock.setFlammable(Blocks.PINK_TULIP, 60, 100); + fireblock.setFlammable(Blocks.OXEYE_DAISY, 60, 100); + fireblock.setFlammable(Blocks.CORNFLOWER, 60, 100); + fireblock.setFlammable(Blocks.LILY_OF_THE_VALLEY, 60, 100); + fireblock.setFlammable(Blocks.WITHER_ROSE, 60, 100); + fireblock.setFlammable(Blocks.WHITE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.ORANGE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.MAGENTA_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIGHT_BLUE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.YELLOW_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIME_WOOL, 30, 60); + fireblock.setFlammable(Blocks.PINK_WOOL, 30, 60); + fireblock.setFlammable(Blocks.GRAY_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIGHT_GRAY_WOOL, 30, 60); + fireblock.setFlammable(Blocks.CYAN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.PURPLE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BLUE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BROWN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.GREEN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.RED_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BLACK_WOOL, 30, 60); + fireblock.setFlammable(Blocks.VINE, 15, 100); + fireblock.setFlammable(Blocks.COAL_BLOCK, 5, 5); + fireblock.setFlammable(Blocks.HAY_BLOCK, 60, 20); + fireblock.setFlammable(Blocks.TARGET, 15, 20); + fireblock.setFlammable(Blocks.WHITE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.ORANGE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.MAGENTA_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIGHT_BLUE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.YELLOW_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIME_CARPET, 60, 20); + fireblock.setFlammable(Blocks.PINK_CARPET, 60, 20); + fireblock.setFlammable(Blocks.GRAY_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIGHT_GRAY_CARPET, 60, 20); + fireblock.setFlammable(Blocks.CYAN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.PURPLE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.GREEN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BROWN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BLUE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.RED_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BLACK_CARPET, 60, 20); + fireblock.setFlammable(Blocks.DRIED_KELP_BLOCK, 30, 60); + fireblock.setFlammable(Blocks.BAMBOO, 60, 60); + fireblock.setFlammable(Blocks.SCAFFOLDING, 60, 60); + fireblock.setFlammable(Blocks.LECTERN, 30, 20); + fireblock.setFlammable(Blocks.COMPOSTER, 5, 20); + fireblock.setFlammable(Blocks.SWEET_BERRY_BUSH, 60, 100); + fireblock.setFlammable(Blocks.BEEHIVE, 5, 20); + fireblock.setFlammable(Blocks.BEE_NEST, 30, 20); + fireblock.setFlammable(Blocks.AZALEA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.FLOWERING_AZALEA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.CAVE_VINES, 15, 60); + fireblock.setFlammable(Blocks.CAVE_VINES_PLANT, 15, 60); + fireblock.setFlammable(Blocks.SPORE_BLOSSOM, 60, 100); + fireblock.setFlammable(Blocks.AZALEA, 30, 60); + fireblock.setFlammable(Blocks.FLOWERING_AZALEA, 30, 60); + fireblock.setFlammable(Blocks.BIG_DRIPLEAF, 60, 100); + fireblock.setFlammable(Blocks.BIG_DRIPLEAF_STEM, 60, 100); + fireblock.setFlammable(Blocks.SMALL_DRIPLEAF, 60, 100); + fireblock.setFlammable(Blocks.HANGING_ROOTS, 30, 60); + fireblock.setFlammable(Blocks.GLOW_LICHEN, 15, 100); + } +} + diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/GreenFireBlock.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/GreenFireBlock.java new file mode 100644 index 00000000..90f32faa --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/GreenFireBlock.java @@ -0,0 +1,451 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire; + +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.google.common.collect.ImmutableMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; + +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class GreenFireBlock extends BaseFireBlock { + public static final int MAX_AGE = 15; + public static final IntegerProperty AGE = BlockStateProperties.AGE_15; + public static final BooleanProperty NORTH = PipeBlock.NORTH; + public static final BooleanProperty EAST = PipeBlock.EAST; + public static final BooleanProperty SOUTH = PipeBlock.SOUTH; + public static final BooleanProperty WEST = PipeBlock.WEST; + public static final BooleanProperty UP = PipeBlock.UP; + private static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter((p_53467_) -> { + return p_53467_.getKey() != Direction.DOWN; + }).collect(Util.toMap()); + private static final VoxelShape UP_AABB = Block.box(0.0D, 15.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape WEST_AABB = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 16.0D, 16.0D); + private static final VoxelShape EAST_AABB = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape NORTH_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 1.0D); + private static final VoxelShape SOUTH_AABB = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D); + private final Map shapesCache; + private static final int IGNITE_INSTANT = 60; + private static final int IGNITE_EASY = 30; + private static final int IGNITE_MEDIUM = 15; + private static final int IGNITE_HARD = 5; + private static final int BURN_INSTANT = 100; + private static final int BURN_EASY = 60; + private static final int BURN_MEDIUM = 20; + private static final int BURN_HARD = 5; + private final Object2IntMap igniteOdds = new Object2IntOpenHashMap<>(); + private final Object2IntMap burnOdds = new Object2IntOpenHashMap<>(); + + public GreenFireBlock(BlockBehaviour.Properties p_53425_) { + super(p_53425_, 1.0F); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, Integer.valueOf(0)).setValue(NORTH, Boolean.valueOf(false)).setValue(EAST, Boolean.valueOf(false)).setValue(SOUTH, Boolean.valueOf(false)).setValue(WEST, Boolean.valueOf(false)).setValue(UP, Boolean.valueOf(false))); + this.shapesCache = ImmutableMap.copyOf(this.stateDefinition.getPossibleStates().stream().filter((p_53497_) -> { + return p_53497_.getValue(AGE) == 0; + }).collect(Collectors.toMap(Function.identity(), GreenFireBlock::calculateShape))); + } + + private static VoxelShape calculateShape(BlockState p_53491_) { + VoxelShape voxelshape = Shapes.empty(); + if (p_53491_.getValue(UP)) { + voxelshape = UP_AABB; + } + + if (p_53491_.getValue(NORTH)) { + voxelshape = Shapes.or(voxelshape, NORTH_AABB); + } + + if (p_53491_.getValue(SOUTH)) { + voxelshape = Shapes.or(voxelshape, SOUTH_AABB); + } + + if (p_53491_.getValue(EAST)) { + voxelshape = Shapes.or(voxelshape, EAST_AABB); + } + + if (p_53491_.getValue(WEST)) { + voxelshape = Shapes.or(voxelshape, WEST_AABB); + } + + return voxelshape.isEmpty() ? DOWN_AABB : voxelshape; + } + + public BlockState updateShape(BlockState p_53458_, Direction p_53459_, BlockState p_53460_, LevelAccessor p_53461_, BlockPos p_53462_, BlockPos p_53463_) { + return this.canSurvive(p_53458_, p_53461_, p_53462_) ? this.getStateWithAge(p_53461_, p_53462_, p_53458_.getValue(AGE)) : Blocks.AIR.defaultBlockState(); + } + + public VoxelShape getShape(BlockState p_53474_, BlockGetter p_53475_, BlockPos p_53476_, CollisionContext p_53477_) { + return this.shapesCache.get(p_53474_.setValue(AGE, Integer.valueOf(0))); + } + + public BlockState getStateForPlacement(BlockPlaceContext p_53427_) { + return this.getStateForPlacement(p_53427_.getLevel(), p_53427_.getClickedPos()); + } + + protected BlockState getStateForPlacement(BlockGetter p_53471_, BlockPos p_53472_) { + BlockPos blockpos = p_53472_.below(); + BlockState blockstate = p_53471_.getBlockState(blockpos); + if (!this.canCatchFire(p_53471_, p_53472_, Direction.UP) && !blockstate.isFaceSturdy(p_53471_, blockpos, Direction.UP)) { + BlockState blockstate1 = this.defaultBlockState(); + + for(Direction direction : Direction.values()) { + BooleanProperty booleanproperty = PROPERTY_BY_DIRECTION.get(direction); + if (booleanproperty != null) { + blockstate1 = blockstate1.setValue(booleanproperty, Boolean.valueOf(this.canCatchFire(p_53471_, p_53472_.relative(direction), direction.getOpposite()))); + } + } + + return blockstate1; + } else { + return this.defaultBlockState(); + } + } + + public boolean canSurvive(BlockState p_53454_, LevelReader p_53455_, BlockPos p_53456_) { + BlockPos blockpos = p_53456_.below(); + return p_53455_.getBlockState(blockpos).isFaceSturdy(p_53455_, blockpos, Direction.UP) || this.isValidFireLocation(p_53455_, p_53456_); + } + + public void tick(BlockState p_221160_, ServerLevel p_221161_, BlockPos p_221162_, RandomSource p_221163_) { + p_221161_.scheduleTick(p_221162_, this, getFireTickDelay(p_221161_.random)); + if (p_221161_.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { + if (!p_221160_.canSurvive(p_221161_, p_221162_)) { + p_221161_.removeBlock(p_221162_, false); + } + + BlockState blockstate = p_221161_.getBlockState(p_221162_.below()); + boolean flag = blockstate.isFireSource(p_221161_, p_221162_, Direction.UP); + int i = p_221160_.getValue(AGE); + if (!flag && p_221161_.isRaining() && this.isNearRain(p_221161_, p_221162_) && p_221163_.nextFloat() < 0.2F + (float)i * 0.03F) { + p_221161_.removeBlock(p_221162_, false); + } else { + int j = Math.min(15, i + p_221163_.nextInt(3) / 2); + if (i != j) { + p_221160_ = p_221160_.setValue(AGE, Integer.valueOf(j)); + p_221161_.setBlock(p_221162_, p_221160_, 4); + } + + if (!flag) { + if (!this.isValidFireLocation(p_221161_, p_221162_)) { + BlockPos blockpos = p_221162_.below(); + if (!p_221161_.getBlockState(blockpos).isFaceSturdy(p_221161_, blockpos, Direction.UP) || i > 3) { + p_221161_.removeBlock(p_221162_, false); + } + + return; + } + + if (i == 15 && p_221163_.nextInt(4) == 0 && !this.canCatchFire(p_221161_, p_221162_.below(), Direction.UP)) { + p_221161_.removeBlock(p_221162_, false); + return; + } + } + + boolean flag1 = p_221161_.isHumidAt(p_221162_); + int k = flag1 ? -50 : 0; + this.tryCatchFire(p_221161_, p_221162_.east(), 300 + k, p_221163_, i, Direction.WEST); + this.tryCatchFire(p_221161_, p_221162_.west(), 300 + k, p_221163_, i, Direction.EAST); + this.tryCatchFire(p_221161_, p_221162_.below(), 250 + k, p_221163_, i, Direction.UP); + this.tryCatchFire(p_221161_, p_221162_.above(), 250 + k, p_221163_, i, Direction.DOWN); + this.tryCatchFire(p_221161_, p_221162_.north(), 300 + k, p_221163_, i, Direction.SOUTH); + this.tryCatchFire(p_221161_, p_221162_.south(), 300 + k, p_221163_, i, Direction.NORTH); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(int l = -1; l <= 1; ++l) { + for(int i1 = -1; i1 <= 1; ++i1) { + for(int j1 = -1; j1 <= 4; ++j1) { + if (l != 0 || j1 != 0 || i1 != 0) { + int k1 = 100; + if (j1 > 1) { + k1 += (j1 - 1) * 100; + } + + blockpos$mutableblockpos.setWithOffset(p_221162_, l, j1, i1); + int l1 = this.getIgniteOdds(p_221161_, blockpos$mutableblockpos); + if (l1 > 0) { + int i2 = (l1 + 40 + p_221161_.getDifficulty().getId() * 7) / (i + 30); + if (flag1) { + i2 /= 2; + } + + if (i2 > 0 && p_221163_.nextInt(k1) <= i2 && (!p_221161_.isRaining() || !this.isNearRain(p_221161_, blockpos$mutableblockpos))) { + int j2 = Math.min(15, i + p_221163_.nextInt(5) / 4); + p_221161_.setBlock(blockpos$mutableblockpos, this.getStateWithAge(p_221161_, blockpos$mutableblockpos, j2), 3); + } + } + } + } + } + } + + } + } + } + + protected boolean isNearRain(Level p_53429_, BlockPos p_53430_) { + return p_53429_.isRainingAt(p_53430_) || p_53429_.isRainingAt(p_53430_.west()) || p_53429_.isRainingAt(p_53430_.east()) || p_53429_.isRainingAt(p_53430_.north()) || p_53429_.isRainingAt(p_53430_.south()); + } + + @Deprecated //Forge: Use IForgeBlockState.getFlammability, Public for default implementation only. + public int getBurnOdds(BlockState p_221165_) { + return p_221165_.hasProperty(BlockStateProperties.WATERLOGGED) && p_221165_.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.burnOdds.getInt(p_221165_.getBlock()); + } + + @Deprecated //Forge: Use IForgeBlockState.getFireSpreadSpeed + public int getIgniteOdds(BlockState p_221167_) { + return p_221167_.hasProperty(BlockStateProperties.WATERLOGGED) && p_221167_.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.igniteOdds.getInt(p_221167_.getBlock()); + } + + private void tryCatchFire(Level p_53432_, BlockPos p_53433_, int p_53434_, RandomSource p_53435_, int p_53436_, Direction face) { + int i = p_53432_.getBlockState(p_53433_).getFlammability(p_53432_, p_53433_, face); + if (p_53435_.nextInt(p_53434_) < i) { + BlockState blockstate = p_53432_.getBlockState(p_53433_); + if (p_53435_.nextInt(p_53434_ + 10) < 5 && !p_53432_.isRainingAt(p_53433_)) { + int j = Math.min(p_53434_ + p_53435_.nextInt(5) / 4, 15); + p_53432_.setBlock(p_53433_, this.getStateWithAge(p_53432_, p_53433_, j), 3); + } else { + p_53432_.removeBlock(p_53433_, false); + } + + blockstate.onCaughtFire(p_53432_, p_53433_, face, null); + } + + } + private BlockState getStateWithAge(LevelAccessor p_53438_, BlockPos p_53439_, int p_53440_) { + BlockState blockstate = getState(p_53438_, p_53439_); + return blockstate.is(TFMGColoredFires.GREEN_FIRE.get()) ? blockstate.setValue(AGE, Integer.valueOf(p_53440_)) : blockstate; + } + + private boolean isValidFireLocation(BlockGetter p_53486_, BlockPos p_53487_) { + for(Direction direction : Direction.values()) { + if (this.canCatchFire(p_53486_, p_53487_.relative(direction), direction.getOpposite())) { + return true; + } + } + + return false; + } + + private int getIgniteOdds(LevelReader p_221157_, BlockPos p_221158_) { + if (!p_221157_.isEmptyBlock(p_221158_)) { + return 0; + } else { + int i = 0; + + for(Direction direction : Direction.values()) { + BlockState blockstate = p_221157_.getBlockState(p_221158_.relative(direction)); + i = Math.max(blockstate.getFireSpreadSpeed(p_221157_, p_221158_.relative(direction), direction.getOpposite()), i); + } + + return i; + } + } + + @Deprecated //Forge: Use canCatchFire with more context + protected boolean canBurn(BlockState p_53489_) { + return this.getIgniteOdds(p_53489_) > 0; + } + + public void onPlace(BlockState p_53479_, Level p_53480_, BlockPos p_53481_, BlockState p_53482_, boolean p_53483_) { + super.onPlace(p_53479_, p_53480_, p_53481_, p_53482_, p_53483_); + p_53480_.scheduleTick(p_53481_, this, getFireTickDelay(p_53480_.random)); + } + + private static int getFireTickDelay(RandomSource p_221149_) { + return 30 + p_221149_.nextInt(10); + } + + protected void createBlockStateDefinition(StateDefinition.Builder p_53465_) { + p_53465_.add(AGE, NORTH, EAST, SOUTH, WEST, UP); + } + public static BlockState getState(BlockGetter p_49246_, BlockPos p_49247_) { + return ((GreenFireBlock)TFMGColoredFires.GREEN_FIRE.get()).getStateForPlacement(p_49246_, p_49247_); + } + private void setFlammable(Block p_53445_, int p_53446_, int p_53447_) { + if (p_53445_ == Blocks.AIR) throw new IllegalArgumentException("Tried to set air on fire... This is bad."); + this.igniteOdds.put(p_53445_, p_53446_); + this.burnOdds.put(p_53445_, p_53447_); + } + + + public boolean canCatchFire(BlockGetter world, BlockPos pos, Direction face) { + return world.getBlockState(pos).isFlammable(world, pos, face); + } + + public static void bootStrap() { + GreenFireBlock fireblock = (GreenFireBlock) TFMGColoredFires.GREEN_FIRE.get(); + fireblock.setFlammable(Blocks.OAK_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_PLANKS, 5, 20); + fireblock.setFlammable(Blocks.OAK_SLAB, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_SLAB, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_SLAB, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_SLAB, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_SLAB, 5, 20); + fireblock.setFlammable(Blocks.OAK_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_FENCE_GATE, 5, 20); + fireblock.setFlammable(Blocks.OAK_FENCE, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_FENCE, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_FENCE, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_FENCE, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_FENCE, 5, 20); + fireblock.setFlammable(Blocks.OAK_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.BIRCH_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.SPRUCE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.JUNGLE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.ACACIA_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.DARK_OAK_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.MANGROVE_STAIRS, 5, 20); + fireblock.setFlammable(Blocks.OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.SPRUCE_LOG, 5, 5); + fireblock.setFlammable(Blocks.BIRCH_LOG, 5, 5); + fireblock.setFlammable(Blocks.JUNGLE_LOG, 5, 5); + fireblock.setFlammable(Blocks.ACACIA_LOG, 5, 5); + fireblock.setFlammable(Blocks.DARK_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_SPRUCE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_BIRCH_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_JUNGLE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_ACACIA_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_DARK_OAK_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_MANGROVE_LOG, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_SPRUCE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_BIRCH_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_JUNGLE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_ACACIA_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_DARK_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.STRIPPED_MANGROVE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.SPRUCE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.BIRCH_WOOD, 5, 5); + fireblock.setFlammable(Blocks.JUNGLE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.ACACIA_WOOD, 5, 5); + fireblock.setFlammable(Blocks.DARK_OAK_WOOD, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_WOOD, 5, 5); + fireblock.setFlammable(Blocks.MANGROVE_ROOTS, 5, 20); + fireblock.setFlammable(Blocks.OAK_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.SPRUCE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.BIRCH_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.JUNGLE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.ACACIA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.DARK_OAK_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.MANGROVE_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.BOOKSHELF, 30, 20); + fireblock.setFlammable(Blocks.TNT, 15, 100); + fireblock.setFlammable(Blocks.GRASS, 60, 100); + fireblock.setFlammable(Blocks.FERN, 60, 100); + fireblock.setFlammable(Blocks.DEAD_BUSH, 60, 100); + fireblock.setFlammable(Blocks.SUNFLOWER, 60, 100); + fireblock.setFlammable(Blocks.LILAC, 60, 100); + fireblock.setFlammable(Blocks.ROSE_BUSH, 60, 100); + fireblock.setFlammable(Blocks.PEONY, 60, 100); + fireblock.setFlammable(Blocks.TALL_GRASS, 60, 100); + fireblock.setFlammable(Blocks.LARGE_FERN, 60, 100); + fireblock.setFlammable(Blocks.DANDELION, 60, 100); + fireblock.setFlammable(Blocks.POPPY, 60, 100); + fireblock.setFlammable(Blocks.BLUE_ORCHID, 60, 100); + fireblock.setFlammable(Blocks.ALLIUM, 60, 100); + fireblock.setFlammable(Blocks.AZURE_BLUET, 60, 100); + fireblock.setFlammable(Blocks.RED_TULIP, 60, 100); + fireblock.setFlammable(Blocks.ORANGE_TULIP, 60, 100); + fireblock.setFlammable(Blocks.WHITE_TULIP, 60, 100); + fireblock.setFlammable(Blocks.PINK_TULIP, 60, 100); + fireblock.setFlammable(Blocks.OXEYE_DAISY, 60, 100); + fireblock.setFlammable(Blocks.CORNFLOWER, 60, 100); + fireblock.setFlammable(Blocks.LILY_OF_THE_VALLEY, 60, 100); + fireblock.setFlammable(Blocks.WITHER_ROSE, 60, 100); + fireblock.setFlammable(Blocks.WHITE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.ORANGE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.MAGENTA_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIGHT_BLUE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.YELLOW_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIME_WOOL, 30, 60); + fireblock.setFlammable(Blocks.PINK_WOOL, 30, 60); + fireblock.setFlammable(Blocks.GRAY_WOOL, 30, 60); + fireblock.setFlammable(Blocks.LIGHT_GRAY_WOOL, 30, 60); + fireblock.setFlammable(Blocks.CYAN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.PURPLE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.GREEN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BROWN_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BLUE_WOOL, 30, 60); + fireblock.setFlammable(Blocks.RED_WOOL, 30, 60); + fireblock.setFlammable(Blocks.BLACK_WOOL, 30, 60); + fireblock.setFlammable(Blocks.VINE, 15, 100); + fireblock.setFlammable(Blocks.COAL_BLOCK, 5, 5); + fireblock.setFlammable(Blocks.HAY_BLOCK, 60, 20); + fireblock.setFlammable(Blocks.TARGET, 15, 20); + fireblock.setFlammable(Blocks.WHITE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.ORANGE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.MAGENTA_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIGHT_BLUE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.YELLOW_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIME_CARPET, 60, 20); + fireblock.setFlammable(Blocks.PINK_CARPET, 60, 20); + fireblock.setFlammable(Blocks.GRAY_CARPET, 60, 20); + fireblock.setFlammable(Blocks.LIGHT_GRAY_CARPET, 60, 20); + fireblock.setFlammable(Blocks.CYAN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.PURPLE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BLUE_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BROWN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.GREEN_CARPET, 60, 20); + fireblock.setFlammable(Blocks.RED_CARPET, 60, 20); + fireblock.setFlammable(Blocks.BLACK_CARPET, 60, 20); + fireblock.setFlammable(Blocks.DRIED_KELP_BLOCK, 30, 60); + fireblock.setFlammable(Blocks.BAMBOO, 60, 60); + fireblock.setFlammable(Blocks.SCAFFOLDING, 60, 60); + fireblock.setFlammable(Blocks.LECTERN, 30, 20); + fireblock.setFlammable(Blocks.COMPOSTER, 5, 20); + fireblock.setFlammable(Blocks.SWEET_BERRY_BUSH, 60, 100); + fireblock.setFlammable(Blocks.BEEHIVE, 5, 20); + fireblock.setFlammable(Blocks.BEE_NEST, 30, 20); + fireblock.setFlammable(Blocks.AZALEA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.FLOWERING_AZALEA_LEAVES, 30, 60); + fireblock.setFlammable(Blocks.CAVE_VINES, 15, 60); + fireblock.setFlammable(Blocks.CAVE_VINES_PLANT, 15, 60); + fireblock.setFlammable(Blocks.SPORE_BLOSSOM, 60, 100); + fireblock.setFlammable(Blocks.AZALEA, 30, 60); + fireblock.setFlammable(Blocks.FLOWERING_AZALEA, 30, 60); + fireblock.setFlammable(Blocks.BIG_DRIPLEAF, 60, 100); + fireblock.setFlammable(Blocks.BIG_DRIPLEAF_STEM, 60, 100); + fireblock.setFlammable(Blocks.SMALL_DRIPLEAF, 60, 100); + fireblock.setFlammable(Blocks.HANGING_ROOTS, 30, 60); + fireblock.setFlammable(Blocks.GLOW_LICHEN, 15, 100); + } +} + diff --git a/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/TFMGColoredFires.java b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/TFMGColoredFires.java new file mode 100644 index 00000000..0b6ff770 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/gadgets/explosives/thermite_grenades/fire/TFMGColoredFires.java @@ -0,0 +1,35 @@ +package com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire; + +import com.drmangotea.tfmg.CreateTFMG; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.Material; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class TFMGColoredFires { + + public static final DeferredRegister BLOCKS = + DeferredRegister.create(ForgeRegistries.BLOCKS, CreateTFMG.MOD_ID); + + + public static final RegistryObject GREEN_FIRE = BLOCKS.register("green_fire", + () -> new GreenFireBlock(BlockBehaviour.Properties.of(Material.FIRE) + .requiresCorrectToolForDrops() + .noOcclusion() + .lightLevel(s -> 15) + )); + public static final RegistryObject BLUE_FIRE = BLOCKS.register("blue_fire", + () -> new BlueFireBlock(BlockBehaviour.Properties.of(Material.FIRE) + .requiresCorrectToolForDrops() + .noOcclusion() + .lightLevel(s -> 15) + )); + + + public static void register (IEventBus eventBus){ + BLOCKS.register(eventBus); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java new file mode 100644 index 00000000..5130f44f --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java @@ -0,0 +1,4 @@ +package com.drmangotea.tfmg.registry; + +public class TFMGBlockEntities { +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockStateGen.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockStateGen.java new file mode 100644 index 00000000..bd5bf54b --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockStateGen.java @@ -0,0 +1,15 @@ +package com.drmangotea.tfmg.registry; + +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; +import net.minecraft.world.level.block.Block; + +public class TFMGBlockStateGen { + + + public static NonNullBiConsumer, RegistrateBlockstateProvider> nothingLol( + String path) { + return null; + } +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java new file mode 100644 index 00000000..732e5998 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java @@ -0,0 +1,112 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.base.TFMGSpriteShifts; +import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombBlock; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire.BlueFireBlock; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.fire.GreenFireBlock; +import com.simibubi.create.AllCreativeModeTabs; +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.Create; +import com.simibubi.create.content.decoration.encasing.CasingBlock; +import com.simibubi.create.content.decoration.encasing.EncasedCTBehaviour; +import com.simibubi.create.foundation.data.BuilderTransformers; +import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraftforge.common.Tags; + + +import static com.drmangotea.tfmg.CreateTFMG.REGISTRATE; +import static com.simibubi.create.foundation.data.BlockStateGen.simpleCubeAll; +import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; +import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; +import static com.simibubi.create.foundation.data.TagGen.pickaxeOnly; +import static com.simibubi.create.foundation.data.TagGen.tagBlockAndItem; + + +public class TFMGBlocks { + + + static { + REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_BASE); + } + //-----------------------MISC---------------------------// + public static final BlockEntry NAPALM_BOMB = REGISTRATE.block("napalm_bomb", NapalmBombBlock::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.color(MaterialColor.TERRACOTTA_GREEN)) + .properties(p -> p.requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .blockstate(simpleCubeAll("napalm_bomb")) + .item() + .build() + .lang("Napalm Bomb") + .register(); + public static final BlockEntry STEEL_CASING = REGISTRATE.block("steel_casing", CasingBlock::new) + .properties(p -> p.color(MaterialColor.TERRACOTTA_LIGHT_GRAY)) + .transform(BuilderTransformers.casing(() -> TFMGSpriteShifts.STEEL_CASING)) + .register(); + public static final BlockEntry HEAVY_MACHINERY_CASING = REGISTRATE.block("heavy_machinery_casing", CasingBlock::new) + .properties(p -> p.color(MaterialColor.TERRACOTTA_LIGHT_GRAY)) + .transform(BuilderTransformers.casing(() -> TFMGSpriteShifts.HEAVY_MACHINERY_CASING)) + .properties(p -> p.sound(SoundType.COPPER)) + .register(); + + + + + + + //-----------------------MACHINES---------------------------// + + + + + + //-----------------------BUILDING BLOCKS---------------------------// + public static final BlockEntry STEEL_BLOCK = REGISTRATE.block("steel_block", Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.color(MaterialColor.COLOR_LIGHT_GRAY)) + .properties(p -> p.requiresCorrectToolForDrops()) + .onRegister(connectedTextures(() -> new EncasedCTBehaviour(TFMGSpriteShifts.STEEL_BLOCK))) + .onRegister(casingConnectivity((block, cc) -> cc.makeCasing(block, TFMGSpriteShifts.STEEL_BLOCK))) + .transform(pickaxeOnly()) + .blockstate(simpleCubeAll("steel_block")) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .transform(tagBlockAndItem("storage_blocks/steel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + .lang("Block of Steel") + .register(); + public static final BlockEntry CAST_IRON_BLOCK = REGISTRATE.block("cast_iron_block", Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.color(MaterialColor.COLOR_LIGHT_GRAY)) + .properties(p -> p.requiresCorrectToolForDrops()) + .onRegister(connectedTextures(() -> new EncasedCTBehaviour(TFMGSpriteShifts.CAST_IRON_BLOCK))) + .onRegister(casingConnectivity((block, cc) -> cc.makeCasing(block, TFMGSpriteShifts.CAST_IRON_BLOCK))) + .transform(pickaxeOnly()) + .blockstate(simpleCubeAll("cast_iron_block")) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .transform(tagBlockAndItem("storage_blocks/cast_iron")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + .lang("Block of Cast Iron") + .register(); + + + + + + //-----------------------CONCRETE---------------------------// + static { + REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_CONCRETE); + } + + public static void register() {} +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGCreativeModeTabs.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGCreativeModeTabs.java new file mode 100644 index 00000000..991d3096 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGCreativeModeTabs.java @@ -0,0 +1,17 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.base.creative_mode_tabs.BaseTFMGCreativeModeTab; +import com.drmangotea.tfmg.base.creative_mode_tabs.ConcreteCreativeModeTab; +import com.simibubi.create.content.decoration.palettes.PalettesCreativeModeTab; +import com.simibubi.create.infrastructure.item.BaseCreativeModeTab; +import net.minecraft.world.item.CreativeModeTab; + +public class TFMGCreativeModeTabs { + + public static final CreativeModeTab TFMG_BASE = new BaseTFMGCreativeModeTab(); + public static final CreativeModeTab TFMG_CONCRETE = new ConcreteCreativeModeTab(); + + public static void init() { + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGEntityTypes.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGEntityTypes.java new file mode 100644 index 00000000..e9605108 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGEntityTypes.java @@ -0,0 +1,70 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.CreateTFMG; +import com.drmangotea.tfmg.base.spark.*; +import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombEntity; +import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombRenderer; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ThermiteGrenade; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ThermiteGrenadeRenderer; +import com.simibubi.create.foundation.data.CreateEntityBuilder; +import com.simibubi.create.foundation.utility.Lang; +import com.tterrag.registrate.util.entry.EntityEntry; +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; + +public class TFMGEntityTypes { + + public static final EntityEntry THERMITE_GRENADE = + register("thermite_grenade", ThermiteGrenade::new, () -> ThermiteGrenadeRenderer::regular, + MobCategory.MISC, 4, 20, true, true, ThermiteGrenade::build).register(); + public static final EntityEntry ZINC_GRENADE = + register("zin_grenade", ThermiteGrenade::new, () -> ThermiteGrenadeRenderer::green, + MobCategory.MISC, 4, 20, true, true, ThermiteGrenade::build).register(); + public static final EntityEntry COPPER_GRENADE = + register("copper_grenade", ThermiteGrenade::new, () -> ThermiteGrenadeRenderer::blue, + MobCategory.MISC, 4, 20, true, true, ThermiteGrenade::build).register(); + public static final EntityEntry NAPALM_BOMB = + register("napalm_bomb_entity", NapalmBombEntity::new, () -> NapalmBombRenderer::new, + MobCategory.MISC, 4, 20, true, true, NapalmBombEntity::build).register(); + + + public static final EntityEntry SPARK = + register("spark", Spark::new, () -> SparkRenderer::new, + MobCategory.MISC, 4, 20, true, true, Spark::build).register(); + public static final EntityEntry GREEN_SPARK = + register("green_spark", GreenSpark::new, () -> GreenSparkRenderer::new, + MobCategory.MISC, 4, 20, true, true, GreenSpark::build).register(); + public static final EntityEntry BLUE_SPARK = + register("blue_spark", BlueSpark::new, () -> BlueSparkRenderer::new, + MobCategory.MISC, 4, 20, true, true, BlueSpark::build).register(); + // + + + + private static CreateEntityBuilder register(String name, EntityType.EntityFactory factory, + NonNullSupplier>> renderer, + MobCategory group, int range, int updateFrequency, boolean sendVelocity, boolean immuneToFire, + NonNullConsumer> propertyBuilder) { + String id = Lang.asId(name); + return (CreateEntityBuilder) CreateTFMG.REGISTRATE + .entity(id, factory, group) + .properties(b -> b.setTrackingRange(range) + .setUpdateInterval(updateFrequency) + .setShouldReceiveVelocityUpdates(sendVelocity)) + .properties(propertyBuilder) + .properties(b -> { + if (immuneToFire) + b.fireImmune(); + }) + .renderer(renderer); + } + + public static void register() {} +} + diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java new file mode 100644 index 00000000..8dd14e4d --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java @@ -0,0 +1,31 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ChemicalColor; +import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ThermiteGrenadeItem; +import com.tterrag.registrate.util.entry.ItemEntry; + +import static com.drmangotea.tfmg.CreateTFMG.REGISTRATE; +import static com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ChemicalColor.*; + +public class TFMGItems { + + static { + REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_BASE); + } + + public static final ItemEntry + THERMITE_GRENADE = thermiteGrenade("thermite_grenade",BASE); + public static final ItemEntry + ZINC_GRENADE = thermiteGrenade("zinc_grenade",GREEN); + public static final ItemEntry + COPPER_GRENADE = thermiteGrenade("copper_grenade",BLUE); + +////////////////////////// + private static ItemEntry thermiteGrenade(String name, ChemicalColor color) { + return REGISTRATE.item(name, p -> new ThermiteGrenadeItem(p, color)) + .register(); + } + + + public static void register() {} +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGParticles.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGParticles.java new file mode 100644 index 00000000..d4323d39 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGParticles.java @@ -0,0 +1,4 @@ +package com.drmangotea.tfmg.registry; + +public class TFMGParticles { +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGRegistrate.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGRegistrate.java new file mode 100644 index 00000000..58072cba --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGRegistrate.java @@ -0,0 +1,263 @@ +package com.drmangotea.tfmg.registry; + + +import static com.simibubi.create.foundation.data.TagGen.pickaxeOnly; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.drmangotea.tfmg.CreateTFMG; +import com.simibubi.create.foundation.data.BlockStateGen; +import com.simibubi.create.foundation.data.CreateBlockEntityBuilder; +import com.simibubi.create.foundation.data.CreateEntityBuilder; +import com.simibubi.create.foundation.data.VirtualFluidBuilder; +import org.jetbrains.annotations.Nullable; + + +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.decoration.encasing.CasingConnectivity; +import com.simibubi.create.content.fluids.VirtualFluid; +import com.simibubi.create.foundation.block.connected.CTModel; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import com.simibubi.create.foundation.item.TooltipModifier; +import com.simibubi.create.foundation.utility.RegisteredObjects; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.BlockBuilder; +import com.tterrag.registrate.builders.BlockEntityBuilder.BlockEntityFactory; +import com.tterrag.registrate.builders.Builder; +import com.tterrag.registrate.builders.FluidBuilder; +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.registries.RegistryObject; + +public class TFMGRegistrate extends AbstractRegistrate { + @Nullable + protected Function currentTooltipModifierFactory; + + protected TFMGRegistrate(String modid) { + super(modid); + } + + public static TFMGRegistrate create(String modid) { + return new TFMGRegistrate(modid); + } + + public TFMGRegistrate setTooltipModifierFactory(@Nullable Function factory) { + currentTooltipModifierFactory = factory; + return self(); + } + + @Nullable + public Function getTooltipModifierFactory() { + return currentTooltipModifierFactory; + } + + @Override + public TFMGRegistrate registerEventListeners(IEventBus bus) { + return super.registerEventListeners(bus); + } + + @Override + protected RegistryEntry accept(String name, ResourceKey> type, + Builder builder, NonNullSupplier creator, + NonNullFunction, ? extends RegistryEntry> entryFactory) { + RegistryEntry entry = super.accept(name, type, builder, creator, entryFactory); + if (type.equals(Registry.ITEM_REGISTRY)) { + if (currentTooltipModifierFactory != null) { + TooltipModifier.REGISTRY.registerDeferred(entry.getId(), currentTooltipModifierFactory); + } + } + return entry; + } + + @Override + public CreateBlockEntityBuilder blockEntity(String name, + BlockEntityFactory factory) { + return blockEntity(self(), name, factory); + } + + @Override + public CreateBlockEntityBuilder blockEntity(P parent, String name, + BlockEntityFactory factory) { + return (CreateBlockEntityBuilder) entry(name, + (callback) -> CreateBlockEntityBuilder.create(this, parent, name, callback, factory)); + } + + @Override + public CreateEntityBuilder entity(String name, + EntityType.EntityFactory factory, MobCategory classification) { + return this.entity(self(), name, factory, classification); + } + + @Override + public CreateEntityBuilder entity(P parent, String name, + EntityType.EntityFactory factory, MobCategory classification) { + return (CreateEntityBuilder) this.entry(name, (callback) -> { + return CreateEntityBuilder.create(this, parent, name, callback, factory, classification); + }); + } + + /* Palettes */ + + public BlockBuilder paletteStoneBlock(String name, + NonNullFunction factory, NonNullSupplier propertiesFrom, boolean worldGenStone, + boolean hasNaturalVariants) { + BlockBuilder builder = super.block(name, factory).initialProperties(propertiesFrom) + .transform(pickaxeOnly()) + .blockstate(hasNaturalVariants ? BlockStateGen.naturalStoneTypeBlock(name) : (c, p) -> { + final String location = "block/palettes/stone_types/" + c.getName(); + p.simpleBlock(c.get(), p.models() + .cubeAll(c.getName(), p.modLoc(location))); + }) + .tag(BlockTags.DRIPSTONE_REPLACEABLE) + .tag(BlockTags.AZALEA_ROOT_REPLACEABLE) + .tag(BlockTags.MOSS_REPLACEABLE) + .tag(BlockTags.LUSH_GROUND_REPLACEABLE) + .item() + .model((c, p) -> p.cubeAll(c.getName(), + p.modLoc(hasNaturalVariants ? "block/palettes/stone_types/natural/" + name + "_1" + : "block/palettes/stone_types/" + c.getName()))) + .build(); + return builder; + } + + public BlockBuilder paletteStoneBlock(String name, NonNullSupplier propertiesFrom, + boolean worldGenStone, boolean hasNaturalVariants) { + return paletteStoneBlock(name, Block::new, propertiesFrom, worldGenStone, hasNaturalVariants); + } + + /* Fluids */ + + public FluidBuilder virtualFluid(String name, + FluidBuilder.FluidTypeFactory typeFactory, NonNullFunction factory) { + return entry(name, + c -> new VirtualFluidBuilder<>(self(), self(), name, c, CreateTFMG.asResource("fluid/" + name + "_still"), + CreateTFMG.asResource("fluid/" + name + "_flow"), typeFactory, factory)); + } + + public FluidBuilder virtualFluid(String name, + ResourceLocation still, ResourceLocation flow, FluidBuilder.FluidTypeFactory typeFactory, + NonNullFunction factory) { + return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, typeFactory, factory)); + } + + public FluidBuilder virtualFluid(String name) { + return entry(name, + c -> new VirtualFluidBuilder(self(), self(), name, c, + CreateTFMG.asResource("fluid/" + name + "_still"), CreateTFMG.asResource("fluid/" + name + "_flow"), + TFMGRegistrate::defaultFluidType, VirtualFluid::new)); + } + + public FluidBuilder virtualFluid(String name, ResourceLocation still, + ResourceLocation flow) { + return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, + TFMGRegistrate::defaultFluidType, VirtualFluid::new)); + } + + public FluidBuilder standardFluid(String name) { + return fluid(name, CreateTFMG.asResource("fluid/" + name + "_still"), CreateTFMG.asResource("fluid/" + name + "_flow")); + } + + public FluidBuilder standardFluid(String name, + FluidBuilder.FluidTypeFactory typeFactory) { + return fluid(name, CreateTFMG.asResource("fluid/" + name + "_still"), CreateTFMG.asResource("fluid/" + name + "_flow"), + typeFactory); + } + + public static FluidType defaultFluidType(FluidType.Properties properties, ResourceLocation stillTexture, + ResourceLocation flowingTexture) { + return new FluidType(properties) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return stillTexture; + } + + @Override + public ResourceLocation getFlowingTexture() { + return flowingTexture; + } + }); + } + }; + } + + /* Util */ + + public static NonNullConsumer casingConnectivity( + BiConsumer consumer) { + return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer)); + } + + public static NonNullConsumer blockModel( + Supplier> func) { + return entry -> onClient(() -> () -> registerBlockModel(entry, func)); + } + + public static NonNullConsumer itemModel( + Supplier> func) { + return entry -> onClient(() -> () -> registerItemModel(entry, func)); + } + + public static NonNullConsumer connectedTextures( + Supplier behavior) { + return entry -> onClient(() -> () -> registerCTBehviour(entry, behavior)); + } + + protected static void onClient(Supplier toRun) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, toRun); + } + + @OnlyIn(Dist.CLIENT) + private static void registerCasingConnectivity(T entry, + BiConsumer consumer) { + consumer.accept(entry, CreateClient.CASING_CONNECTIVITY); + } + + @OnlyIn(Dist.CLIENT) + private static void registerBlockModel(Block entry, + Supplier> func) { + CreateClient.MODEL_SWAPPER.getCustomBlockModels() + .register(RegisteredObjects.getKeyOrThrow(entry), func.get()); + } + + @OnlyIn(Dist.CLIENT) + private static void registerItemModel(Item entry, + Supplier> func) { + CreateClient.MODEL_SWAPPER.getCustomItemModels() + .register(RegisteredObjects.getKeyOrThrow(entry), func.get()); + } + + @OnlyIn(Dist.CLIENT) + private static void registerCTBehviour(Block entry, Supplier behaviorSupplier) { + ConnectedTextureBehaviour behavior = behaviorSupplier.get(); + CreateClient.MODEL_SWAPPER.getCustomBlockModels() + .register(RegisteredObjects.getKeyOrThrow(entry), model -> new CTModel(model, behavior)); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGSounds.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGSounds.java new file mode 100644 index 00000000..530ab40c --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGSounds.java @@ -0,0 +1,4 @@ +package com.drmangotea.tfmg.registry; + +public class TFMGSounds { +} diff --git a/src/main/resources/assets/tfmg/blockstates/blue_fire.json b/src/main/resources/assets/tfmg/blockstates/blue_fire.json new file mode 100644 index 00000000..d1bfe7d8 --- /dev/null +++ b/src/main/resources/assets/tfmg/blockstates/blue_fire.json @@ -0,0 +1,172 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "tfmg:block/blue_fire_floor0" + }, + { + "model": "tfmg:block/blue_fire_floor1" + } + ], + "when": { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": [ + { + "model": "tfmg:block/blue_fire_side0" + }, + { + "model": "tfmg:block/blue_fire_side1" + }, + { + "model": "tfmg:block/blue_fire_side_alt0" + }, + { + "model": "tfmg:block/blue_fire_side_alt1" + } + ], + "when": { + "OR": [ + { + "north": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/blue_fire_side0", + "y": 90 + }, + { + "model": "tfmg:block/blue_fire_side1", + "y": 90 + }, + { + "model": "tfmg:block/blue_fire_side_alt0", + "y": 90 + }, + { + "model": "tfmg:block/blue_fire_side_alt1", + "y": 90 + } + ], + "when": { + "OR": [ + { + "east": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/blue_fire_side0", + "y": 180 + }, + { + "model": "tfmg:block/blue_fire_side1", + "y": 180 + }, + { + "model": "tfmg:block/blue_fire_side_alt0", + "y": 180 + }, + { + "model": "tfmg:block/blue_fire_side_alt1", + "y": 180 + } + ], + "when": { + "OR": [ + { + "south": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/blue_fire_side0", + "y": 270 + }, + { + "model": "tfmg:block/blue_fire_side1", + "y": 270 + }, + { + "model": "tfmg:block/blue_fire_side_alt0", + "y": 270 + }, + { + "model": "tfmg:block/blue_fire_side_alt1", + "y": 270 + } + ], + "when": { + "OR": [ + { + "west": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/blue_fire_up0" + }, + { + "model": "tfmg:block/blue_fire_up1" + }, + { + "model": "tfmg:block/blue_fire_up_alt0" + }, + { + "model": "tfmg:block/blue_fire_up_alt1" + } + ], + "when": { + "up": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/blockstates/green_fire.json b/src/main/resources/assets/tfmg/blockstates/green_fire.json new file mode 100644 index 00000000..59812148 --- /dev/null +++ b/src/main/resources/assets/tfmg/blockstates/green_fire.json @@ -0,0 +1,172 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "tfmg:block/green_fire_floor0" + }, + { + "model": "tfmg:block/green_fire_floor1" + } + ], + "when": { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": [ + { + "model": "tfmg:block/green_fire_side0" + }, + { + "model": "tfmg:block/green_fire_side1" + }, + { + "model": "tfmg:block/green_fire_side_alt0" + }, + { + "model": "tfmg:block/green_fire_side_alt1" + } + ], + "when": { + "OR": [ + { + "north": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/green_fire_side0", + "y": 90 + }, + { + "model": "tfmg:block/green_fire_side1", + "y": 90 + }, + { + "model": "tfmg:block/green_fire_side_alt0", + "y": 90 + }, + { + "model": "tfmg:block/green_fire_side_alt1", + "y": 90 + } + ], + "when": { + "OR": [ + { + "east": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/green_fire_side0", + "y": 180 + }, + { + "model": "tfmg:block/green_fire_side1", + "y": 180 + }, + { + "model": "tfmg:block/green_fire_side_alt0", + "y": 180 + }, + { + "model": "tfmg:block/green_fire_side_alt1", + "y": 180 + } + ], + "when": { + "OR": [ + { + "south": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/green_fire_side0", + "y": 270 + }, + { + "model": "tfmg:block/green_fire_side1", + "y": 270 + }, + { + "model": "tfmg:block/green_fire_side_alt0", + "y": 270 + }, + { + "model": "tfmg:block/green_fire_side_alt1", + "y": 270 + } + ], + "when": { + "OR": [ + { + "west": "true" + }, + { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + ] + } + }, + { + "apply": [ + { + "model": "tfmg:block/green_fire_up0" + }, + { + "model": "tfmg:block/green_fire_up1" + }, + { + "model": "tfmg:block/green_fire_up_alt0" + }, + { + "model": "tfmg:block/green_fire_up_alt1" + } + ], + "when": { + "up": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_floor0.json b/src/main/resources/assets/tfmg/models/block/blue_fire_floor0.json new file mode 100644 index 00000000..1e8295f5 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_floor0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_floor", + "textures": { + "fire": "tfmg:block/blue_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_floor1.json b/src/main/resources/assets/tfmg/models/block/blue_fire_floor1.json new file mode 100644 index 00000000..6285f8da --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_floor1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_floor", + "textures": { + "fire": "tfmg:block/blue_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_side0.json b/src/main/resources/assets/tfmg/models/block/blue_fire_side0.json new file mode 100644 index 00000000..1ca09c5f --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_side0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side", + "textures": { + "fire": "tfmg:block/blue_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_side1.json b/src/main/resources/assets/tfmg/models/block/blue_fire_side1.json new file mode 100644 index 00000000..24a287e6 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_side1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side", + "textures": { + "fire": "tfmg:block/blue_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt0.json b/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt0.json new file mode 100644 index 00000000..a4f0b1a8 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side_alt", + "textures": { + "fire": "tfmg:block/blue_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt1.json b/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt1.json new file mode 100644 index 00000000..5f3ceb62 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_side_alt1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side_alt", + "textures": { + "fire": "tfmg:block/blue_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_up0.json b/src/main/resources/assets/tfmg/models/block/blue_fire_up0.json new file mode 100644 index 00000000..9beeea9a --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_up0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up", + "textures": { + "fire": "tfmg:block/blue_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_up1.json b/src/main/resources/assets/tfmg/models/block/blue_fire_up1.json new file mode 100644 index 00000000..c270199e --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_up1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up", + "textures": { + "fire": "tfmg:block/blue_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt0.json b/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt0.json new file mode 100644 index 00000000..c59c3133 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up_alt", + "textures": { + "fire": "tfmg:block/blue_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt1.json b/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt1.json new file mode 100644 index 00000000..64eb8ba0 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/blue_fire_up_alt1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up_alt", + "textures": { + "fire": "tfmg:block/blue_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_floor0.json b/src/main/resources/assets/tfmg/models/block/green_fire_floor0.json new file mode 100644 index 00000000..a3497cbe --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_floor0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_floor", + "textures": { + "fire": "tfmg:block/green_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_floor1.json b/src/main/resources/assets/tfmg/models/block/green_fire_floor1.json new file mode 100644 index 00000000..0044d15d --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_floor1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_floor", + "textures": { + "fire": "tfmg:block/green_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_side0.json b/src/main/resources/assets/tfmg/models/block/green_fire_side0.json new file mode 100644 index 00000000..dc539a0b --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_side0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side", + "textures": { + "fire": "tfmg:block/green_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_side1.json b/src/main/resources/assets/tfmg/models/block/green_fire_side1.json new file mode 100644 index 00000000..abb94e87 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_side1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side", + "textures": { + "fire": "tfmg:block/green_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_side_alt0.json b/src/main/resources/assets/tfmg/models/block/green_fire_side_alt0.json new file mode 100644 index 00000000..167c7919 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_side_alt0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side_alt", + "textures": { + "fire": "tfmg:block/green_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_side_alt1.json b/src/main/resources/assets/tfmg/models/block/green_fire_side_alt1.json new file mode 100644 index 00000000..aa0910bf --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_side_alt1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_side_alt", + "textures": { + "fire": "tfmg:block/green_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_up0.json b/src/main/resources/assets/tfmg/models/block/green_fire_up0.json new file mode 100644 index 00000000..890311cc --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_up0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up", + "textures": { + "fire": "tfmg:block/green_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_up1.json b/src/main/resources/assets/tfmg/models/block/green_fire_up1.json new file mode 100644 index 00000000..758881f2 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_up1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up", + "textures": { + "fire": "tfmg:block/green_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_up_alt0.json b/src/main/resources/assets/tfmg/models/block/green_fire_up_alt0.json new file mode 100644 index 00000000..52b7f998 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_up_alt0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up_alt", + "textures": { + "fire": "tfmg:block/green_fire_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/green_fire_up_alt1.json b/src/main/resources/assets/tfmg/models/block/green_fire_up_alt1.json new file mode 100644 index 00000000..2677bee3 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/green_fire_up_alt1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fire_up_alt", + "textures": { + "fire": "tfmg:block/green_fire_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/block/aluminum_block.png b/src/main/resources/assets/tfmg/textures/block/aluminum_block.png new file mode 100644 index 0000000000000000000000000000000000000000..4d494363778c1138609790a8bc193e4b8e8ef283 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)*@eX&e*QTXwSE8p|7YEKEfc7Qv%n*=n1O-s zFbFdq&tH)O6s+`gaSV~TEPBFFs98aP^}_oe<+bs?D-KsN9%1gt;Y&EkYjmyPzuJwx zl?)a;Kb)0#_j|egK7%b>yUo7rvee_gXB&CS$bQ38ufsmU8cn5}mi0~Akaujusm{Bz z&s~~-qlQ~f(5_5b{)mO;#m9%1YE~?0j0yeRIw!b5<$vi>k&EkDd`=KkO*&VWMqDvmFnoYI96I>#={=d6rj&x_D>()U5xj{JhHD-&ddhA{ia5)_7Q}OB_tu_XaV{={g2vp4tqctO@!Fd4 T9!nPiUBTe#>gTe~DWM4f5LaB> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/aluminum_door_top.png b/src/main/resources/assets/tfmg/textures/block/aluminum_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7512126f4d448c4353880c9fafb4654e50419c8e GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFm-7`LY`o!twr3qBSS>O>_%)r2R z7=#&*=dVZs3g&ydIEF}Ec0Fay*J8lKa^YZ2)|{y;-g4yf7V$NhT?lsIk7;_H-_W#j zUK*R^{gsY!XXl7dD7`#s_JN0ehXNz6Yj9po{B~D_w>7hKQ}aBx08{aAyie9`KGj{G u^le^bz?X+MkJCLoCaX<}weH(r^N-m-K~$<=gi{P?HG`+CpUXO@geCw%abDp7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/aluminum_flywheel.png b/src/main/resources/assets/tfmg/textures/block/aluminum_flywheel.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb10f391deac448dd35c73f7fe5db43ea4acfdd GIT binary patch literal 778 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik<2Ka=yZrHHl$&)Al{{8#^|Np5|r#d@3j~_ptpP%2|-JO&eRg#nF=;#<8 z9=?3}^5&Z2^@|tG?(djCfBu363$oMWYD%&qA|h^|IT;w@rKF^^Xwjm%bLZZ@d-u?x zLqgsB0YRbvUX=rGut*w=llS@oY1iG~0Qtu-mWnL2G7YuYK8Gu0`a&9-!2+jhJ z$YKTtzC$3)D5~Mr01Twno-U3d7XGD^x}z2w2(&WiaF}aeEmdus)g;pG6uwLM{r`+= zHQ%G39yXqA{keapbA#dW!r0?qZLS}FV#PP_PtqL2ch)z4`mlV~?pZWJ$opi(ESW~og#F57@?CpO~nY2oP?Sy%u(u!7(N4|E9uUuK#ZYWF_a5$W{@Q{)M zx1>nX&Q`-n4OTb(Stg6tFZz0o!7Vk?F*S30vSPOaN1XbCd#3rmn^(UrW1I53Hgs!1 z=u90G<_XT6A{oA6d5HyVS5&=1o-S?O#dxZ0fByaQ>0-NC7p$^>^=$FNn%idL4&q`T z_Pmb1!xS&7_Mlx%{}tDtgiRB|A3QTvR}fh9nt!fZsmkU{lRfvQw(p<+*Ffg?FVdQ&MBb@09!|Cvj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/aluminum_frame.png b/src/main/resources/assets/tfmg/textures/block/aluminum_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..2998f9dd24cac44ee120260826750f67cd83cca6 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|-o=;+w=%$%y)hS~ELZ{4x?;YP) z?GA!43`O_;55Qkdm`*;n2|_R!eKt?6q6sosnq{o#-nGT}&uU^k*qq=%T>Hyo9NG1g z@MS^PC|#GQ1P!XR2to*}v~x}YtPNN0kfJAVy)n>)ugWF{xciLWy_VicNzgTks$8P8 zEMx!n0E(b%&Rb|H2|*jfZ5W1bofbhWrT4r*4@#3;qA9^p37Sw>2&S|)`ZMmJBVmAs z8Ph}b^^^u>pL^@LMZhZD(dLrYSfZr|Yc1Y;Yt!C@bjY8c=!Cb@Z^3q2!~CUjntSWv Y3AF74Pm==hQUCw|07*qoM6N<$f_=w$-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/aluminum_post.png b/src/main/resources/assets/tfmg/textures/block/aluminum_post.png new file mode 100644 index 0000000000000000000000000000000000000000..13c073040863a8b01bccab7af90c03a2cbd78010 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij?1AIbUr%ju-bjjkit5(jRKYz#8&HHxk0?L@JS(O5$*h_-^g8zd7gOoS3 z8&HU|z$3Dlfr0NZ2s0kfUjb5=>gnPbV&VUG;z7O!1s>x zYhjjjm@njcX5h&R?Gq^+60R(SS%Qp?Ej7iQn4Sd@WGbb4M7P(!IL9ShPct&QS vHcNS%G}f0G|-o=MP_AJ%4@O@{ON9eVQ|8&e5Ysfigcn+JSVlmjw9*{|5sGDQ{*s zpb%$)M`SSr1K(i~W;~w1A_XXz>FMGaq7j_hAINvWfWwK={C)is$K6{aU$r|v7Irni zksq*bmB#{y4I11#r)jvi^jvW=5bzIEYzP+U_jmXtBz5wgWMlGf>6LZ8$x6KX@$Hev yRiFFJzkHPI`dj{Ep>?NE?az7gJ5@2{JM%_EX0z8@CqD;T%HZkh=d#Wzp$Pyc^NS%G|^0G|-o)oWH4RpuQ%dUVd5IT;xlK;f0&6B~dOTS<^#@P80s*t~zqexL|v zfk$L90|Vb-5N14{zaj-FXyNJN7@`rJoY2a^<|e`HWt_-yVCtca645g+n0j;q*zWK& vZA*~wx*?WU5^b>NsK9{>hZqDCQdt>tlvrkF8C9PFn!(`d>gTe~DWM4f11dnh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/bars/steel_bars.png b/src/main/resources/assets/tfmg/textures/block/bars/steel_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..536643a5edeac2c10d6cf7fddd67a415c39f6974 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|-o-pNxUNS%G~10G|-o$hi1`;E3MIQwmBdfMRV-T`fS0wIs+d_&*RZ{NBa~GKjOlBeIx* zf$uN~Gak=hkpdJn_jGX#(FjgXXk=h>lVJ8TPUJW+)hSbn<-*wnH}L}-#GDzNxs78q pryScdP4d)%l}v|uR_N;JFnkncUY)$~n>o-322WQ%mvv4FO#nqXIoALH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/bauxite.png b/src/main/resources/assets/tfmg/textures/block/bauxite.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc16a25d816a53afeaf59c9c865f8e20ba68f0b GIT binary patch literal 281 zcmV+!0p|XRP)3b%o;eTgUx_6jWmXhIf)FpLmJ7EXb{@cLhN8QH`EUH zNS%LhJ0G|+7c||pOMRj=vH3cPg1x0m5B@G2dHCZ`TIR#Z2ITaZ>RatpeIeDP0 zhP14*oPwH+tct9hij<6!w2YFBtg@7hvb2n{yn?!%JW!>YqOyj(g6iy)s&zo~ISV`@ ziy0WWfv(~fU|g%bw-hM2-qXb~L?c+%|90771CGVZG_M^wP_|3$?!W)`?x%#^nPOe? zd|lt~TKP(iUocSAc=gh&U-UNU?>cyA<$dvYavz)?%#2Pt5%c@=@#OgCnu`iA57=}V zSaD3RVN#hk@#G!`c}vUW@+-W-57alS#%s%1-@g>?Uf2=(r$_O-`NTZVJAY1u%v_on zw`ty6kMM(@H#$NmT0W}b&@GfdENj3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/black_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/black_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..643cb8a1fb318a65ff545a61719a2bfb1def0aa8 GIT binary patch literal 657 zcmV;C0&e|@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0wzgBK~y+T9g^8@ z+b|GCB~hYwi&~7hHXNWyfja4{ABw!C|Njlm52Uay+uWC4g?u5Unc+QmCVv0(Ue~qJ z=5#u(x~^yJdcFSr_>fWz!^pZ7=lsq&V%F1CRTX*q{?s&09LLW4>vhIHU(QNNLP$zT z2%dAHwDvw^6gwlYzh1{-AZZ%KQ3%0#7lo)Si=iLZ>vf*zQmL{i7-J~mLm)q%pAm{0 z*4Ua#?C0mdgru2PMhFQ>byY&^s_mL~h1Y$Ej4=`9 zMsbo5oaf7h99~{f3Tm`cQ4|M=#l`zHCAa$xCFl8Ktieb8F-DX9<6~Vnf{WYjrnFj$ zktGd5);dsm=kZ9>v><_avfXW=*g6Y?lu}ui6=kWUI-SliWf~`NBcIX~2@srMdGFy2 z782n4JkRh~2%f}oSry=h{Q$v2=>$!nC{pBgRl~}097#fuo)<;iuDTT~@*M6#Hmt`} z2-a(-dStOe!tJs3?$$N7R13GE;uF%JU%!y7@oqYfD0rYkH>-a0MbUI-`W_&E#oEx zI^~_y#v&A$K&3PzZ*RZBw@g)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0rp8mK~y+TC6ZZo zn=llHHKG9w_BPt)HQiIQ^*lJW4H809KT-~dL3jFxD?dK|48xG~{&+r>lzdw*WAeVY zUX@ZuIZD~B9YXL#R4E79IcJibbG6o#w=Hk2wcbQMYVSg8TWhPW2_g0S?{_yit#ycg z9496aQ&Jc^_z;XXQmJ{Kr)gq{)>8G>*6qb~V#Znm^L&YM^v){Tfkd&@dK@Eoj#^cq zvkPwU&iQGK-uugCzRZjBUI>+QI%;Ex)L0YTZb}GY%=mI6T zEp^eokH#2IyJ*8HL)33?Z|I!Ue$)fWTkWNkZQc0Akq}RzU`_!vC{(9Y=WYD}>1iCt zZ;t}!F;4SkAsc_ZJ6$6Y(j9{V&FDCe*JZiguFjo?1HH8a?SYSLcnZi$4|CrALJY@_8AOV9^$c6N~kOC&Jb$vV^9H6+dnkLAsmU&+0<+~-i zmDg+CQetZu#rBZBt_cu>bzo))y(87^Crj431WHua0gS8)=yTpcRog*OX{9)oQd1g& vLqN=zT~5<@z1?^k7S#??_MEa3(irm(;-gr#nUvNY00000NkvXXu0mjfOwSVU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..7feed647907f6f8ac0fd4221a2cefebc7a063a50 GIT binary patch literal 490 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0e?wEK~y+THIfZh z12G7M1IhNOSMzx%Ppxf3z;95~?ry@*zznhXk53zxdFJ%0GP8aUZN?Z?>?)s`$%)lL zZgZ_nwgU$rUgspA!-^9TvT)3Fl78Jlx_jochM?UsV41Azdeh!)62Tdt%xlpBmQjIa z4E~%t&+NKheJrDlPKIskq z6sG}&^1u_42LLIv&u1YQgzl zBoNT^K$S%W^$q?XN53&GD2+NCsn%mqopT-t(>@fQ%!@TO=3?+5R8K~eK*WeUVVZ+M zMHfWV1W7**6j9Gy#HfVd7cNm(3%Ws5*#F9ts@w9{p=X8ek<6%DOiC@`AhNM#?~9P? gE$*7Cup7?o2b*&|?^iJmzW@LL07*qoM6N<$f@J5>>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..f62ca1e0623494b7e30e53bb73b9942fb4d123dd GIT binary patch literal 629 zcmV-*0*d{KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0t!h)K~y+T6;cV7 zn=lO3V%Zo-$YeV6=5Reh57N7~eeEnEV7#dc?_sbJ`kV0kkDt*?DLGd+1U<#DrSj*a zwT|ONW5CuhSM{!ro<)F2VF)yikr~%}|Mf4uf7RN$_GXWL&+C>`O53J;s@q+phYHpfw zz0(67-1W=`9s_qf!nVvzT@M8HffWtO?wX5Qds}zo$7pt2g)ll+w!Bo=HPJ9gBT?dU2yZXb%Tt&FKb^-ITnurZjD-0hA^|x72U_pN zgnr&~t=5ctR4OXUTA7aPSidn P00000NkvXXu0mjf-Z>w} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/blue_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..7adcf1a1896cbef0c6c74ace39781fa53b9f42be GIT binary patch literal 594 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/blue_fire_1.png.mcmeta b/src/main/resources/assets/tfmg/textures/block/blue_fire_1.png.mcmeta new file mode 100644 index 00000000..4f0718ac --- /dev/null +++ b/src/main/resources/assets/tfmg/textures/block/blue_fire_1.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/block/brown_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/brown_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1a5c873dfb26b5f0cd1ea783cd542cb38ce9ed GIT binary patch literal 503 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0gOpRK~y+TC6bGI z!!QVhdB{#WR2S$7-G7JHwm|()wZ9|;amR7OzrQ}syjQ=Dv23Ns;xRi%nkjVW)Vj;e zs!hkFGE!xWR2S%8KiAX5RoDISEM+Dc0OAQZVD16UtU8B(@NtJNV`PqNuJahdlbLi+ zf^i7@Q1{d)EET zSshgjVDvGa@ zj6M?Y0xsh1_!#4$Elcpmd(7Yqbd_!q!BWI0v?(%Un@uHj%3~obxG`K0FJ9G4yW^4}8^KE+ldz$Ww5SfG tI&iReNkTUP^fHmZ61JKfxMpcUw?B56P2`|6=p6t6002ovPDHLkV1ms(+Ts8J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/brown_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/brown_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c73a73d135e5da0ba6e74ca3eb0a8b88f543a99 GIT binary patch literal 625 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 GKlg9(v;W@! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_side.png b/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_side.png new file mode 100644 index 0000000000000000000000000000000000000000..829f2cb8659e07e77cfc331f5856516a2390d4d7 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFl+jm6_=cx+T7IQ=;&rOT^vIsE~}n3pZv~`^d`>E@stBPg2B_(&t;uc GLK6UAU0gl@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_top.png b/src/main/resources/assets/tfmg/textures/block/cast_iron_distillation_controller_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7a01162749c396f27a0921452c128a54702fc1 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFoP@z$3Dlfr0N32s4Um zcr^e8lRaG=LnJOICnSilFfl6VE_oxBv_#{;0hVW+S_T}Pn!9&MXlfa87#nIx8)`@Z z8O9u%MiLT69UC;3E#%sinXcpml{+g*BY#I-j{f9_yW;4r3Mx Z1_N=v|4-)qXa-ux;OXk;vd$@?2>|U1JU{>d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cast_iron_flywheel.png b/src/main/resources/assets/tfmg/textures/block/cast_iron_flywheel.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae31fe8740fbee99ec797bf096e8ae353b46b82 GIT binary patch literal 776 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik<2Ka=y8W|ZmI5@bwyZih5TUuJGtE*dBSjfxECnZLeg($_ z*A%Z`ykK^Jhpw(}c6wY*N!IN%Cj&#gxVX6V^z?LebnNWx%+1aD`1o90T%@F=L_|c? zwG9l+ECmDvT)ch!!@{EC2etS#bQD@2+*fJw zk$WKYKH*3X=PvHxu8qePDwb?;n6)g>#jx*&pLi2%1iV~i)ub8 z?kjcC>il*#1FbG0Ew0_NMpGY3>xVD6b#;B|-qml)*hGHUMw$gg&eAbqp5V+WlHn7U zn^?dW!s<2U=nbd)46d8+o9FM|cr=euWA*n{b?Y_nn|$SXGLzLN-|DFDhtP-T?{ofG zcy#l;26>;fET+7^O4c0-x#b!COQxlS9bbL2<}}}byIuS2OP2??FWC4x@Zi4)ea+W) z|KxY=%YFHFBI{ko3sR;bb#|MTx9*6^VUCLF+mV&>lE2ulo@pI>Mt7a(Q$b)%GI+ZB KxvXB(AV%|79DX{S2P2elF{r5}E*@0a*$F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cement.png b/src/main/resources/assets/tfmg/textures/block/cement.png new file mode 100644 index 0000000000000000000000000000000000000000..de5f315892b97254d405d9e3af05705fd7f622a9 GIT binary patch literal 398 zcmV;90df9`P)!2u1z-?Kr;BvHjgW7i`jGViDm!psBU|JZ9F$s5aXBy$Ja3`$cl^IcJ~NiCepQ zO+>X^M73Vjm2xRlm7$KJ(JKKp0hB(U&Ci@8PUMQ(?FX$yY{B1qg9hJ0Y%=8 z>58P$YKALP@loX4$YE*tKmj7D#fcYHz9xwl_90QHY*hXY8ohOAz_IVa_oZj{O?7M| zm{ElR5YwGsn#s3RejbZ|3h~|=7gtR3iQ$ag_W-JNAAen=bTPr>noBHB_cMN{axu)& s_u%8AEoPMh!~FamJaw_-$b@^&f5(-u>Y7-CM*si-07*qoM6N<$f`(waCjbBd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/chipwood.png b/src/main/resources/assets/tfmg/textures/block/chipwood.png new file mode 100644 index 0000000000000000000000000000000000000000..fb796f26466867bfab38ad8a0c25831d71adcf12 GIT binary patch literal 619 zcmV-x0+juUP)3@v38L4e@!*((fv zyncn?J+|NnXhT{FC-Z-VxfnFlNf%A((0uchd`+8;evPg7-5t!NwuG@FOUd<1Xk;+P zjH69Sx1W|w>b53i$#VGgeUOWRNGJG?EZ`Ct>2iSF7>uY;2Nqmn2zU#x3tVV9lXF)- zE{2V$tcw4oRJg;`r6-q?dONAN_t<~p$f=9%3SiT1WMT1zuV44GdZV@Bf2$;QRT#kR zem@S6E2Z1dz-S^153b@?=AbvJ^kl?8cS%N$1Zj2!wt8Q}3cNO*7M1?FZz?aZ-{33(H~{qlrkZ`8cM`e&|au*L9w!{=>fCTcl6v z*w9+ROQioh!z|%a61Cjs9C<=1WzeOyIUg7$a2#v#fWf)QmJBr6~SI1ji0RP`P6`+mPD&J4b97=|$_FQ5#A z-h_2sidTS>G>LQ`Y^XJPPp|FSG5#?FRAI=h)ZjMg*laqNm~=ry^mOeoC)s{;`0yK{ z>+6*}O-DCkK3Q!P@su;tiZ*Q#Zi`)zD&LU_FKfy_);sdCKL>u<0 z7~Htc4D>#9XUu`|){_+2K&^D6eVr3eA=ogsWqg}Z9LaO)YORhuy-3+e83m0}U|)^? z5@O5wng%2ck;qVbKUJKUkhL<6@~#kODDuY0eH0{Y6SjeLx!yA`#Q`HnXJYQy-&#o& z-vvMG5yc0=o*aSzF*YA`{XzFEJ#);&YhVmxMF6nZEJbwETl*|0CoZalfsH!&x1kK( zjAKDUcs`<0*rn-&bk_FHVxkpGBO4B@&>3tl26`LYVQk;a#n19V5Ib{G8Q2FYZy1Xd jXQO(XVF_@&1!}~9O##aTQzwjq00000NkvXXu0mjfwY&4i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cut_bauxite_brick.png b/src/main/resources/assets/tfmg/textures/block/cut_bauxite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..4337a55bcde3b3787eb2b9a18684779054127ec8 GIT binary patch literal 251 zcmVdESEssn1cFI!)i3QZt0!Ai|LWM6iV z3HX5XDEU|AgPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0hCEZK~y+TEs{}k z95Dz)1xS-@mCu&T?`cO<~C$5Cx*B@j(_5BBHpzwj895wp9@;@QpJ+eUY<2s83$ zSN9n1!-9%+)gV2pl1Ei_&SAIKVc&OVTXkkRCB>;ysB;dL0YuoBJB>h_bCCu274DP& z|IwK47i)3z8kAWWS<#!MVa^E-`)pW@uFL~A%b>Ig-(>Y*L+Km{RZ+XvT-Tfct%X95 zV4oka7v1R()1^GY7&N1C4%7%6qUagM2^~6s8eDbj$E4vSG0_u`j8_GIxb))`hH$2i z0F_Y2Uq9!@Io)!Tk{D`*DT~Fr=`SU?$Kr(u<*Cn8H-7JfM)XR%x@s4phtJsuzYvLO z{u{+}w%J{MtqVIzTPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0rW{kK~y+T6_Qzw z+%OD8MN*sF)01V8Bjy+Za^L~7P1}~ZDAj^LESoGAA4%VT{A@X!sU@yLdu`{`Ut@Zr ztwN& zQj9ZB&4s6jg-;zoF=Gw0m6oAagww*Q;IbB8o5+?kySXiz_@B}+1w=wX0a36uk)^gVsA@pRp!c$7mIS3I#ZGw6v(+nw{Lm^L@QbCnx zOcH|A^?00&2AAX|v^B7MdE2)wmru97m$J3(zTY!4ODVN+sfgxt&dcoMLc^#i5Qbw~ zfeEU|IW9~~MDW*PjEJ!WMUYv-{o_0b`~ezN)P5h2_kRag!!ROy_7G-_m8#);$*_2u ze#|&@De+Wv7RS`TV;+hXB9w(RzqWd-jofcA#C)n^SWIxiFtCKLNCVshU8e#|3*=V7 tQWYs!UM7&qDS!we_B;~^6`a8{t^Z|DYBBx*T=@V1002ovPDHLkV1n_66%hac literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/cyan_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/cyan_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd00bedd08988adcefca2c527e5467252458dedc GIT binary patch literal 581 zcmV-L0=oT)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0oqAKK~y+T9a7tJ zy8nyxb`T5qU~( zRv1V6tup1(+=HA{ZQANnpFY&Ik8$_$+>e@}IHvN3tys%i&hN7|VO$p}YR+dawUk!d z=XIUAwvvxhxYa5mwN#*Sx{h|$eQsGw2BH-a;6AU{b-YNJePQ|?;HYzs0hXBIsuM(h zzPnCv{JHNjJ4k{R*LHrs-mlu2b2|^on0?lIfC=Z45}{t&5mH^4V2Qb#Lr`Dg8fmWO z5n~PuPmDLU40n?5dcuiu(4c#m0d2Y>EniNAf^a?|iv-LmTw)!WxzESe;*$FukqBtr zGtm^P=vr7#*h;=ACAbHHvDE^u*6({wbyGZhODRBm<9y)*`u=&i;yGGto(JhpgS`z_7Au5?oEhUJFp@X+*f)hIv5RJKo=sFt= z>AjDoI~rpk1>eulzwhT616$d41XL*lz2*d0TjmMZkOd_XII$-z>xhvX#-e~GzBd2b z`-B^qz3+kd1;tH;MX(O+4hu{~_=zn4My+JpYuTP>=x}2MI|zX_+lhd8=o8`p8Jlp; T6x}0x00000NkvXXu0mjfV;u#k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/deposit_scanner.png b/src/main/resources/assets/tfmg/textures/block/deposit_scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..c996b71183053c4c7cb93123b04385d0814dd87c GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1=1o(uws%V-TnmXCq`A5dZ2LwkHlvMOio?>ilYGdzYW?}8>;t~)L5EvM! zuBIj>Dap*t?BnAD)T*be>*wdUA;hc4!C{`4>yhN3FWV~bHYeODj(WK`x5CW&VPDGs zQ>~{mLLPJ{?~U`H;pPm~WtKU=4oIn#1o;L3Ckz-Oba;7z>NyKMB8wRq_zr_G4ZLn7SYPJK9SmVrR4Fvp@tt8yo@22Q{Bz5e()pS%f-N_pSE+`sqO(y;M8 z-^`f}hR1HPY?`)g<>|0RXOMLn zmj2N4=SIR-%Xjq?zOkMK8phc2e&Q4vk8|g{n5AXJcx?W^XM51ta6ISv_JW!;fgcG6 zB1?CkaT2OOHu;3$L1w{uMN+3K{)E2iyJ*BG7s+FH*CWWSr9|ZO<+VL-kAD2QP;y(~ zqVT*)KllsGB(`o!bL%%wH?Z@Wb&->CvC6s*jpLE(7vJ~0Onzd@JVlVlywzT9qTQ@K zN8_O6%*iVbKB-+W!+r7*-e2x@d-xeDnKd_kF%?*Q;&+2$+MeC{6K60oAG$oZ<;8+k zDh^u?B?`sygalj_aoAEY!{)r9dwb@MX%1VCD16BI@Wg=eB3HBkNIsR_g**DgpDPZz z939u5)F#~2@TgB~$nd?#Zg%?GrI|miq-%lPvo*H_rrdFxFR2h^-0s=r<#9i(wiT$V z-&nf9L&>d{)8+J(h^j6}nhz z-{f4Ae50YQPB2D4j(g|4Kk1>@w;kHMc~-TSU`6oOc+(a6+-#y#H{`CrZXBkNb5zg% zplgti=MgTJc|7a5+2mux@8^|XPh@qnR*zxTIeY5P?)&vFs{Zo5Z2wrBJ2o(%p4+iB yQdcTL>S~gtVehN|l6zL=H|H~76X$*ReSess`>N^9r>+1~JcFmJpUXO@geCwaLAIFy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/diesel_engine.png b/src/main/resources/assets/tfmg/textures/block/diesel_engine.png new file mode 100644 index 0000000000000000000000000000000000000000..2a45184be1a0e9dbf1f752d251f31b60dcab8b75 GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilg0(?ST1H!}e%gQS1>pMC+Tz!0!GBd56oMKZ_(sFZ+EG;$k_5H)b;!;z? zVq;snyKQZ4vkD7=TJMw@t^iU(B|(0{|Iq=%qy77ZfU=wg9+AZi419+{nDKc2iWH!O zj6Gc(LoED{PV$`AY{27^s%X=4@Y`Sg+o~s31SU;Sz24UTdbbI~SNWg@rq3pZ?8{TP znLnF(q)|iD__@l(hDfi@08OUrjHl)p^EPltx-2uY{&0X*Fs4$%K-5izshE>*%8oUa zcc)D>IO_R#iiKQ*j&=!yjQZ!#k~cOnr7~nl)bTxM(f-JC#y>p4n(^ngB{~ya*q=46 zv~0OPBY(EaniHah3(}oDT$bfsi+i466*gDrfYKyEaYliQGYzFW-D6l7?sG*SesTQx zju$f%Y-@ZjNPde=UlF<>s{QFAxi37E95lDKc^xhaOkc=0(O~JZJMSEFuOx7(pPux3 z&6V%B3IyNXb6LEE_jGE*zl97Fmio(0^Y&Ir(q8EBn`J@uU7_t=?03Bqe8L?jullYQ j-~G$z8UJ7V3%}(vob{fvt~~Pr7^V!Ku6{1-oD!MAmTwGRN-`w2W-u}5hqJ5Vs#)5S4F;&O6=fRS0DVVFolLP!}WZ>gtHf<|`l9LwUY zXsg4k?smOuy|g>bP$${P%Pc%)MN$NB;v1!2#_N3M0!gkBR?Lf~P6VklPB4y%>0y;* Y$mP-SJD&Xh6wr7EPgg&ebxsLQ0Ipw0#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/distillation_controller_front.png b/src/main/resources/assets/tfmg/textures/block/distillation_controller_front.png new file mode 100644 index 0000000000000000000000000000000000000000..71513c0fc9bb3c07cae4124063c6a18d58811826 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAmTwGRN-`w2W-YTX8os#o7DMEl(=q6Xv zn>M3O<<3j4WxQ|Gh+8~GNb1$HlCH$7vy2@IvP7?RZ75-LGo7&1k4YhY#|{Z@BL;?5 X->mO>_}iKT-NE4L>gTe~DWM4fWr1A0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/distillation_controller_top.png b/src/main/resources/assets/tfmg/textures/block/distillation_controller_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0416d319fa60757d7234ad338cf7e4c4cc31c7df GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAmTwGRN-`w2W-V;j@imgU{do5Rpj`}}u6{1-oD!MJx=`L)32Mw?^?4d%&_b`UzObDUWW_q zD>uaVe7tFS@vu#(+{dWwMS=Mz_av7l>gc6D;flMgeJrHNG3bfr`vJS`)@Ets2pnI75>8RvfBT; zkaa`Y3_q~~>+OoIOI3sdKdgV@_B^}iUypMAlKpk5Mdk5=y74pbt~h(dt@D`EqZDS# z%*eU_I5cAIJ*K@m7JvKZ%~LM7f9?qoI(wGk1MB;f%Uq}Ta)M%vFEzq5&DWPf3&`dG UVi33#JQ+lJy85}Sb4q9e0GxKoSO5S3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/distiller_side.png b/src/main/resources/assets/tfmg/textures/block/distiller_side.png new file mode 100644 index 0000000000000000000000000000000000000000..429f216623c4608198b62c375937e04c518df48d GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFl>7uoZ8&fqOWhHtgIdt73b*aW@ct7D=n*iWp7& zuw!v^W20h#rr}jLad`?(7U7@|0$}DI4VgO=IwM^>bP0l+XkK#G*Pd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/encased_steel_pipe.png b/src/main/resources/assets/tfmg/textures/block/encased_steel_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..2ce6f97c0134623e221ea53840ef3834316dd751 GIT binary patch literal 673 zcmV;S0$%-zP)4Tx04UFukv&MmP!xqv(`rRp9PA+CkfC<6AS&W0Q7nRm(pG5I!Q`cX(8Q3W zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oic;WFr&U@!@-+h44s4~q8j02i( zo9Tok=JG3I@D;uAA&eLTGP8_iW+98N^>t5osqW%D3;(OITCf=46NzV;VcNv&#M7I$ z!FiuJ!pgErd`>)OQiH^gTvt4P<6LrC;F%FKo1P<%5R0V_RyvrKO^tYpII3zo&skX=9cAN-!JRh*pgl0p*D^Wr!kqd;&MXx1I)``B@sCxHJMxYFDHjRr9DNqW7l zMUQ}iZQ$a%ttorJeptFJsfKukgu|U4d2M33H zdHKo8%1TN~hKEPT#U%v>hWhvf8XFt?`1pi|MumsRgoH#WD=Yi@`Z_u~#>OU^nwole zczAnzo0*x}*w|QES;fS}sH>}+o14ePB>4CQ*x5O|xOlj^d0AQ6`TK{sx_UY~x|*6= z+S)q$`UWN@rh0q(%gD&s+dB&j3+w3U*x9*wc?CE-dpbC{xw-i`IJo%x2ix1bdV2ah zIeGZ_1i8EWy0`#Mb8vO__Vo1h^77KwHdIm33JHmFcXxMiaBy;R0_u#4N&tG@a?_rP zKq{yt$S?RmwE@FgU7kXq>6`@~k;M!Qe1}1p@p%4<6kvo{dAc};SorUq6dulGDAKYx z!ok&%Wy*_N0!QwhjuPNrm@@I_|N3K*lbO>}D?k0%`{ry)k+FGt>j4%uMwMmD(trGH zJ)kqmgR%HCcjju#4%f1Xq=_f>p7%Ua+Ti3ary&yVE`2SaDP>}${;`r1#>quKZ9--b zHg=rf(7Cpt>juwloBfBC><;Uldgv{>x%HytH;dGnuFEE^kUHu5;otl1_twkGM4ffK zq2H&qGdbFdW6qqg^AU66W3Kf)adLi@_2j8oslwv6g8i2b+YU@_=}I!= aJ_czYWi7ertuuf@%i!ti=d#Wzp$Pyno=6k` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/factory_floor.png b/src/main/resources/assets/tfmg/textures/block/factory_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..6bac99eb3d52ace821ff6e89f60b7d0f35345139 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFdnq{Hz6(^qS>O>_%)r2R0E8K{ zu61$(1>HSe977~7Cnto6iLfZLDY82nBn9}2uqd-JC%Os{FexfH8@LL#NU%(0 ym4?%4T1^E>;YMZuf*CF=Oe&3EwTR!-a09m^YI$l2kQyH?C- z-`$%54w-*gjx4%2WGCak%tHfe`0 zu<2cSb?8B|Q@!18^@Q3fPSOk7*)ALwsC#yad2)k`t>aON?GKht{IH$5<(2J&8IKj@ zg?3ETGM#rQ=Fc>TS4}}2>W@Mf9`@;2{*?2KQeEfF1Fl@hvOckF6ghZ;RezU=cxe*% z=h!(nqL&=XGD?&;_U>4|+ORTRT}7Zg*SGo}b2j@d?jLFge`TD{QQX^}A6=9C>3{O9 azf4)zjRghXrtks7fx*+&&t;ucLK6VPwXGWf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/fossilstone.png b/src/main/resources/assets/tfmg/textures/block/fossilstone.png new file mode 100644 index 0000000000000000000000000000000000000000..1e59e2310b69940c9a819fb2ebb5e10498ccce88 GIT binary patch literal 333 zcmV-T0kZyyP)%*eQFFK|Gc~5*lzH1V%PZ6}oO6qUZb^4NAVq zJ_t}@#${|_EwU;zD^aRG;YU^+CdR714`lZnAnOB;2gz~y1woj&zxOy0S%n^OmW1va z?)FOFsVXF3yu4Cz;YqzdszIPk=L>@U`X@4hShsV3NXNyVH!!63xwCv?Y=K}tihmK{ f6Xb#EcolyD`sZ7y7`_6500000NkvXXu0mjfVWWvk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/gasoline_engine.png b/src/main/resources/assets/tfmg/textures/block/gasoline_engine.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4506a8f65bef1250b9066f5578fa4cb698218e GIT binary patch literal 5089 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 KS*7my`u_k*6Y*C7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/gauge.png b/src/main/resources/assets/tfmg/textures/block/gauge.png new file mode 100644 index 0000000000000000000000000000000000000000..a7aec9ac7be61c61623842d0671eb928bf516265 GIT binary patch literal 445 zcmV;u0Yd(XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0a8gsK~y+T?UJ!h z!cY{3|28#&6ieyCLSl@AEWUvc-~+IA^Z}d=FTexTS8(dU;9wILgNYjsh6F|;3~flg zw2)}7_1b%iq)J100KcR?r{~=MIXVATT-OzbVc>@-iYUrj7=~bsVLTqgah#fM+i&yv z9G>UZIOj~B(IAa@^c8bcUHDyPye#5cDBMNS%G}50G|-oh=^D(FaLmm(2|m>3$I?TxNtK)J*WHN+3I!MU27b9PT z0uS?UUKxdd|96YIDht^L-I$tK{V{ybzopr0JL~x ANB{r; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/gray_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/gray_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..136b7891692b3f9688b9c0f80fc8214a52df98b6 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh?0X`wFK7RgzL7@SG!9l^Hfx#g`!C^qYe?Xw0e}FGYD#XXvF91aPd;9o$ z`}lbQSph)-fgypxp+Nb7fFM7=0Du30kg)K;z+j-9m$y$)5YU_uFK=IOU%%jxu;9?} zfWRPM|3F_~KOc|@AS1)VBZGs(LPEns!XkWuMg#=<`vWZv3J413ndK`9bRK7cM`SSr z12@o9+yabimG_nc1L^#Xj4=qxyAu6n8Hdih@iC;s2+_Z4Oo9$6C1Sp99D_fs9o^b6w8?(LB8 z&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0sTotK~y+TB~n>( z(?ArQeU{NkN;6;~-j%4P9NDgO1_cjv7Tvb7pR3Nh{>*4oGk6!G+ZeXq@AsGzl;WQdLMe&n+G+@U$$5;C6GW91)3ybsq+Zvj#d|UzBIkrg45yXC zB*02BH_TTn#2ceoF8Hnmcdaqzl+qaUv7=#7LMR3#4=`(tcaFgTJULfrOF2B;AbpJc zc4w4duTPirMH>SY)GwD4o1oMLJ1OMLW(h3>mUEP zl4{IRa>4Yl3kDnuyqqJ1`@fB8r8~BaVU)goety2)&ZjeUm`5%MUW$*XkQFY<_OOQ# z;YMvus)HR?a4s05xs(`oF1VBukiEA_2!DC`qP2nv^B9Xt$)OJz2@ZsaHHzSeWmq66 z{`T_?sz8aP;3nE|bTBvU2IOIFZ?H&7q)8!;L9uflN^op&qPBhCVxz5NF`T4Ct)yBj(H0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0p3YOK~y+T9g+!> zqc99bvAhFG`n)}-o=F1UJr5|LjE(dcef9h2S48KW=3M47oDHHDW6hki_bwtVM(<-z z@0@5Yt+i#D##j#2qH8U=)O66kEzC{9A9O z7K*i%F-Ixs_`ac3O8$O6h=kdBCh;ylpRYA;BE~yQ3-5xnz&oWh>udNJ#t2yC{CU6s{e7Pak(UhwqLwPwIkal6kqP-)+HI)nSK{zDF)Z|3t1k@V zxNjSiq9f^4N;=qcxdiw?7hK_6t_ccZzVr}PvS*!P(j4;-8pt31;3P6YgdY}CuZ{i> XV9s+t*ojC600000NkvXXu0mjfySoYy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/green_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/green_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..c550e82c6c4233605e76ad7aa0c10f9324967495 GIT binary patch literal 460 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 CpjcM` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_casing_door_bottom.png b/src/main/resources/assets/tfmg/textures/block/heavy_casing_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5fef25c424f6f3f95b2b78503378e65713322c83 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}50G|+7TRZ>W$y3ZMtRv&%1A-&E51w6d;pT-`FAGX4jEzkVO`UA)om4bU zfy&qH_mTusd?i7C!T*r~gX@7iCx9}X1s;*bKm~_Dm{C;2s{tsO?&;zfq7m$S){*ak z0*6bWh!)S$-|^dB)>?5-{w_RqMaZ<}-|vO&5WBVT>#R^{F*aeB!T` zr+;6(e?9%B@U(OTgJp^aO6EH0jg~w2ILI=`6>^DfHcC^I5qUUIzjvp5&COlRS8k{K RJqB9I;OXk;vd$@?2>>cJYYzYb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side.png b/src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..abffeabde7d5d11eca12a1654fb438b79af2dc7c GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}T0G|+76-`q^Qzu(H|H!!bfZ&LNl8WBRQ*7*=jEzmrEUba5T>Ji70V(d1 zAiv=MaKPZ@&-e)_%vsE{-7@!E^f^g$^5VFtc(fegDs| zx6ICDa`d;B9(N&zGk+4U2^~BmWhA-xx$0WST^SpuJW^PCFj#St#u&k_BVBE z^Vgq?e>_X{DNnO5p6&O>zuWqo$n9#sjqYEM7k>ZTsQ=J{HP<1a_C3%-22WQ%mvv4F FO#o79Vf+99 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side_connected.png b/src/main/resources/assets/tfmg/textures/block/heavy_casing_encased_cogwheel_side_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..68946fb508d16250cc6e95617d21a7704d1408f6 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbURWwZvO`UA*{3GMy1A-$8N-BCMPqDFgGB!3fv#w$Nb(4j0FR6aM{Y zzwVl2kU9IM_xa23I*encbnL;q4WDg+u0sRe1HB=kzXNuLH6XyPo~@KQGU*N?>YPB^_4sJEmnB< zsqw$a5*v%`{g(XAUt_1)G+eIM-x2-wWrXQdMg@WU=X}4gEanvRk281p2J{t!r>mdK II;Vst0PW$J`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_casing_side.png b/src/main/resources/assets/tfmg/textures/block/heavy_casing_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3ead5dd5ed561bd5520a75d969ae7fd62c59e383 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enFxJz>F~q_@Ipm_r-}4MCdu;Y7bTzgMJ3VHK z-&fCedH#Nfj17#-mPPU0-~TTqARvT+`_!q^4Vfh$emoR5`1{}=Gn-#tS=;61>m7L* pI48Yk>N=Pq(bLAr0mRJA3@w&LlF@>y7l9Trc)I$ztaD0e0syBEKXw2B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_casing_top.png b/src/main/resources/assets/tfmg/textures/block/heavy_casing_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad4b063ec4ec52dbfa1572ebe397d5c57f914b1 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}r0G|+76-`q^Qzu(H|H!!bfZ&LNl8WBRQ*7*=jEzmrEUc^7ZSOvKcEyF8 z7hZu($T5vQ2&DK+g8YL2qX330cV;XEN^ur=L>4nJ@ErnSMo|r~2B2V?r;B5VM)1_r zk$f!%Jj@q#{0ce0{5!6yV8$DtywdB>qOOira|73E^>vh~FvXSoq}V(81zc44%Oj~J zR>D-UV4A_kYuWd!_ukW+VZ8Ym@8^hP5%M3_{9{Y`%JiS{|AFVHNS%G|;0G|+76-`q^Qzu(H|H!!bfZ&LNl8WBRQ*7*=jEzmrEUaB!Tmk|D0s{lp z)zqXUC7GF-eSCa?TJ>~w{rvnsUj7^hvL>4nJ@ErtU#vK#0-vR||JzX3_G=fX} zFY+B$;Ba+3pcJw7_W%E{1E#BaZ~lBN^Z^4y$4l;{DGoZ5#FczLo@>vFTp`!fu;`R< zQkZCqO5p6>;mSdt6N(b8qu;+Z(W+!$9P9Ym`h#8byFdC1c10iio6KK(lP^j4W<|BE rqEPm7iNFX}?>7toS-ksR)4)IVFx!dbwB>t&4q@bP0l+XkK*NJ6F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing.png b/src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8b407c0a26513c548999fdd4a027051d2f177d GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFSSx@9~l=P5FAlZQqenkijBRKv9YO{g>~iWU?ZSP&H|6f zVg?4jgCNYfV`BDOpkTJAi(`ny<>Ul`5GE!^Hnz0u8@6n@BEZZxvFqGS-2tsGeBz@JYD@<);T3K0RTZ@O6mXr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing_connected.png b/src/main/resources/assets/tfmg/textures/block/heavy_machinery_casing_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..d451133dfcd947251e87b58d75f8e306c14d1531 GIT binary patch literal 1845 zcmb7FdsGrw8b=9iRHT=y5{YdyIb}z2m2{Fo9g}oO7<5Ff1hX2;OdOpg21%^Y))IU8 z$Oq=?7+Oi$*rF*uFm=*=h2d@`D5IvV`5;qNWUpuU?Eibux%a#GcYpW$?(h5VIrkbh zh=edlnL{8DM8IJ`8nCJBeIpc%pVT+?z?dY`NWPHj9`qzwZ1~aVhz|tvL};-Z1q17y zRC36nFZbYFalQu$6jl=3%?%eG$)E;@-MD=RPxRgI=>=G1J68%Y7D=?AVB`N9B#>e< z58y9Yhr<&g5G(n5H|dBMpM*f*f&f3C5O!p30YA6Q!SYb;+2?LXV@qN4t}PA@?uorc z#j=3T?*`Kb-am^|F_@|V`-ug(@}i}tiBS`$T=69EHEhP)&zmo6Q+R>|MfmBrDr1k% zktH$?uQ2$}%NHt#gHg&C0%J)J4ocoW+q@dm~VI*2&V<{!rHTbWe z{UwDbWr~vx*(2rt#i#nbA0}_dE5%RA=O7EizcYQydj3+%4{@>Uj!}f~E>5HVX9mCT z@Mi1fFK!&@Y7<61OqS`RL(eV`eMKx_?*&--wXff3u2m@du^+H*e?tA7TX}!9T~WCD z5q=)*Dl(5m&js*KhMiG_S45uo>T)^0H3x)7A%vRCR3|AC$ z0OeLvc~n2^T3Inl( zdZxH!B@s>7{e#KEYVUVB&Ay&QW3soxrJ#*sPBSemL7Oe*js%f?E_=3XV%2ke_);G9e-`Tk%DK zK!tcDdJC#^{#z3Y0&_dboW}clU20megZ@cs8AyYSxJm4u(p|%;wFiFurjgj3ELbUu zla0jO=2XRz8)?X3$v`8w-c}t=bKXC8;-^XjWFH}Laeh*_5m4%;_cg^^<<;j=B!FO} zUfl4(u(^y~F-h8S$*M~8eaWrWi=uB7I^vGe?~hHkmT0bCdhad$sU|aH7%S*=;dG4% zi=_isi5)o=ST3xVnB6&FcxUcdy7GGIh?9D9s5^cB^{h1wO6hRS#c^To%yB3Y!PvQ< zIYC0>xL5nU9f?4Y6ARkNZT~?|zXz|^Uy%qT*)vGLwJ z{hx_EJ{!M#G@p=hC{KxbVPW)#Cfz)Y|H$D#3)M?I{cP6I^n%t|>!nRE&{?;A*sp9O z#xDO?1{3Gk&}3w2pI{V^Mx4swC-CQLgJPC#@NZ_V`yityW~n4l_*v@{&^;nc(Nx(H5q!*|<9wmO{L@XzVDstC+QBSJZ0~#($~4 z77i$smK}~zQAFbL_MD2!3!!ql`19i6@{#)MPDe6dJrqb-5*Yc(yBcRrV8_^nKsnuZ z#+Y{?wr_%`-UUxc>BS8`_-)YuiQgMgMF-2?*3W5lA- zqBv}D*7`A>J0Wxr11bhi*Zv_)I(b}9Z$7%b$K*@X$z-|!-+UO{m zX;2H;y}azlST7Yjd8G$4>0;2r*?;?8N2(Wlfb@JYTnY?D1t;3m7cDG6HHMA%c{%N) z<)eB-Ynnhpot|-el^JK(o2#-$FnlD+JH^O*Hrqlq@-4`3dM22z_Oi4{2}$d9#(GhT zq0aR$2hm;}{Aji*XO3Jgk8RIztFw~WeJiJD!|k)uBS6;w@3-ZR6b5UWfNFNd)Y$Xb zC3E?Vh3Q? z4OY;P&7K~QQG|M4TDzwQxP`%3W%3&N4lpthL%f^h=%VeV{49op(slyw(Wi^P188D? zHKr8TUgw%ZOiegXRw0>1+qvc+mmB`Mtyg!72!hm>FbKVQ9Z=1?KCPETrZ5fZQq}QQ aDx=2o-d{1~{@vi4f&?52@~ie`ru`ey8Ie^0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_plated_door_bottom.png b/src/main/resources/assets/tfmg/textures/block/heavy_plated_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e138b125ee1fa221ac5aef6247d175e3ce756a GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFCUSzhVuSo(ruK}iz>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/heavy_plated_door_top.png b/src/main/resources/assets/tfmg/textures/block/heavy_plated_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdf663d41144ba406d7271b89ce36092df2b4c1 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFx=91$58UrlBSEK+1Q#@T9LnJOICkO zoI0{#(n854Rx8hT9^8Jq^74NGmE@T4Q$KdJe=d#Wzp$Py6J5J01 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/industrial_barrel_front.png b/src/main/resources/assets/tfmg/textures/block/industrial_barrel_front.png new file mode 100644 index 0000000000000000000000000000000000000000..8782eeca9714e605f6473d71e08964825b71ba96 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChA`db&72U@#V`I+htDEGf zeHEF+6mfMfbBlndqGm(vTvjI;CG)9=92|CQ71xw@30O1ll)CGFX|7R&g1FLVxBf_m z>oO(Nob%^8@)_2-^ravC;$Qjcyvf`0vUi+vw+>(IwYA#-3?#nP2+uTMUj{88n*)eJ S;8O5p5asFW=d#Wzp$P!D>6vK& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/industrial_barrel_front_open.png b/src/main/resources/assets/tfmg/textures/block/industrial_barrel_front_open.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf2311070a04aeb62b7fc4280ddbabbba33c43a GIT binary patch literal 438 zcmV;n0ZIOeP)Px#1ZP1_K>z@;j|==^1poj6MoC0LR5(wilR-MUVBUIZQ^EiL zKP*MPiGoFtrqOhZG2f&cOw2{{V94ano5@UeHkeIkg_IZ`#bWIUSE4A=XB&B*>oZNa zvir)^uM2ok$e7^p)`W9Ko#+uH$#nsFHNREDS}WtRRlkkRCN007s{gRM*N+8@#a;2f ze$xUKIh5@6Nz8GhF>#-P#OIe~2fJE(IysY&U^TzhWCVl3-x1)5p{ca7@*zKrnQ5CZ zOZqJPeIe!~k$7^Wh7U&!4O()@)ebypJ22ncD#Go{N(~>5SbMZa0S{x0woC$s57&jx z0{=m00q2~~T)0pTAFd0H0vr_ye&*4|T+ROzVrYINWIfq1mIR^Lsm|;^9wl2Z)$sLb z%NQE8|>l+jm6(=h#8#GtH9;kq`z$3Dlfr0NZ2s0kf zUy%Y7%=L6}43W6(+Ov_j*+GDX-H~y>#N^_})l9;~A{;uCKN5>C*rDLny7V&vEMa6NTO9id)1wCC`b> oe)jSG9L-}_|1?c+-T0c@@`X^E*P+(`K#LhXUHx3vIVCg!05Qu~8vpcYZeyuAaRojolq>|$b)+}(Zc?Ohuh+FV_|gM%Ye zQnDf=<2^k5939mf8x4Y z7Yb#n8q4Za65Qn&4qN!VGg!=~`#|iJyuWeQ1*Q#ivg4Y?vL=3B%F3=A`XXBUf&TT| ze?QhFeh}5;sB9}Ox?+_x@kW^*he}WOOx-6{J#z!LY1>CM@x0`HXuL%6!YmW#e+Q+4 z-aQuHxcmrfW9z#^T%3Da8M)*A&aOWhzv53z!wNS%G}f0G|-oqeqXfT)Fc9|NpOFzb-B=o-}C^P-eE&nKM9&y(Gvl7$^k<3{u|A zZa^W<0*}aI1_r)EAj~ML;ne^XH1>3H4ABU_+jEeY!GME_b;@7&byCYU)}LnOuzqkl ufSXH6lxeHe#8$th%kmfJZTxb+{V#*E77K5xuEHCjb_P#ZKbLh*2~7a5-$Fb9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/ladder_aluminum_hoop.png b/src/main/resources/assets/tfmg/textures/block/ladder_aluminum_hoop.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa1c9e2600b86ef1da47a0334031da1028185b3 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|-ot5>hKx3~ZQ|9|DmmEPXo`T6;e9z8NOHPzD60xFsN_<#(M;wlO9 z3kIrz0ESIxbj|}sISV`@iy0XB4uLSEsD@VqP|(`b#W6%9xb>W)5Q72-lY{S>AOG8} z4==QN$CD7CcPZhj^o3~U=A7;+(~D{qW&ZGIY0k2;RNS%G|s0G|-ofZzxld#B#XQwmBdBIDwXjZMugtbvkQPwz|vQXC~ge!>4CfZ<;A z-bkPrXMsm#F#`kN0T5=)y4J}F6g2j9aSYK2zT0z6UHx3vIVCg!01IYBI{*Lx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/ladder_steel_hoop.png b/src/main/resources/assets/tfmg/textures/block/ladder_steel_hoop.png new file mode 100644 index 0000000000000000000000000000000000000000..16aaa18c8af16c492ce8a81b28181a74d51842de GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|-of|3dwd#7tRZUzKL7#o|KSy=Z@o&uD7ZoK6Okm4u_@(cbC0Sxz= z_eKK6I14-?iy0XB4uCLY*0oMfprDnfi(`mJaP2v7J_Z90CrA5;clD3g)%w0F5<2i< zmxsewd6Nzg%MKIo*cN9FrvCPx#1ZP1_K>z@;j|==^1poj5z)(z7MUIY&l$4Q?k&cj%jggR!mX?!?i-?t#l9G~- zl97*&j*I{Q|BZ}^jg5(njERtsjhB~|l9G^-k&ls(jgym*0001wkByCuijR(rla!H< zj*IRbCG>fEkB^LsiHD4fh>nho0!E)>gS_)&XZNqKl#`K=kdBg*k&}~=3r?bmqRs6G z5S5gXm#x(GkCOV+)cok_0y&zFjfw_Nqun7a?-m{cPNW1soC!~)2~DB?`}~WFh?SL- zm6eezb2!>19qSwK@Bjb+32;bRa{vGi!vFvd!vV){sAK>D0i#JoK~y+TWs=#F(=ZT4 zj zFQMV84%G$Xk|*2-1%+#Bfy>Z!+a*spFQ_BZ+ylSs@+0m)5PitlvV?6{@;IS?)c5mO z!%->P2H8s`SMr#K!{JH)^jUv6<4PVhFmijO=P$Z&9plUXRo}-m?nt7qrLBA|wx-|2 z_~z}q_x~04bext{5Z@q3j2~`KkdN0203LQha9e_9pW^2)^H;-xkk%C1ZSaHzR;SbH zYmDFQHREJJCBVxt2tu=|d*l0$@j2sem=vkthJLnuJXTAdaC?z?NyS328kRiaND!G| zD1T9aqQNCkI4rtiyn=8g0-pSmC*1E9Yd^BW?1v^lvclwtYVsp1m>-iNXFsxn`B5sP zp8d!Q<_BxALl!@>g830_0_);ORxm$;j(+IuM^;FF=;++ue^ z2D_!n53|txaDP_Zu-ea<{Ls;lY=Zg0VTVw5vmaSu?MJrcZ9mBW1;+(z9q}hEGXMYp M07*qoM6N<$f|mMS^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..9544445d34fec488ff083ba5b1750b294cb01ae2 GIT binary patch literal 583 zcmV-N0=WH&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0o+MMK~y+TC6Wnp zLFan5C#2k!4rtmR|OW!C#O#&D9g)|_V3#LVv3>w11y?=9}eR%y6Trd>dj zrd&#C!b-kUPLfMjmE+?pj<1oKHksp3EA)# zHsd$%K#53Sj1!H3J);N5QlH!Y=}XDhX} zL-!fA+F%(xumcNdg`)SuXo2iOAR5D%Wo@l*nwRwpb!EQe`VQ;x0GX%(00{8e-x2`w z9QOc#CL!~>M}PJ4>ab?}F$doW7R=LvM$HJ`?6sm4CgMM(?baPFhZ&3{c0@6jn$YAR zXW7gLm8EA+1<>mGnc7FH2eQCL1f~^PILdKQs+i%_s@4Kqz`|NEqyRb>csi}gOh5Vz VbIi_#cPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0t87!K~y+T9g@** z6fq1%ZO2YBv%4*AMd9Q46`uK4gaowg&P)==#@jrM64@Fb-+S@f_aBv6b#&mG>>_0w z`m4$?4MD8^Tbs>an_n%w)(^RMV)G_Ba`nC1_IJWM4)4eODlmq}x z7f!Wgj63+s_+0aA<#U$8`CRHrQesMoBrJdliF4+soL8Z-s z%d$$|9B9t*ci(m$L;DULaJ4baEfxaLA9wdEDMvFk?CWh_%?JCNjCd*95Ky2e&5{Y>|n;h>M>4ZT5L%1w$Zi6(ni`# zOziy_oe>2=LI6TWPv~*3w}WaHW$~2OQomeIpVu6cKdtK`vXn;4^#O5$#wJ`49m!M`2=J$O+rgpQ|@2daawqO5_TN`nv z-n+vdIx|(%OQwL_RNp#W2ZRHmt15<8Z%uEbQv$LXUG!M^lqKmr2@uh3MBtn}aziup zNOYUHyBwAbAcsos0p%rgL5dwBzL_zjGKBCjBKP_cj1Q&(@E>MnYa+={jRyb#002ov JPDHLkV1ilH9aR7T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/light_blue_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..aec034dbdeb3f723c71840c627d6006f1ac2dc87 GIT binary patch literal 595 zcmV-Z0<8UsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q99YK~y+TB~n># z+%OCk7cKTok{-85=tmD*Ac-xBl-M_|VZ&MozK!(r*Kc8&HbZj6Dx5iO6%J)>Ph((u64ONKsW! z)ta@H`tdkV%_ZxRm0Kw+T5@^5s`;&zXVG`8m8(k2H4C3ve>~b-Yb4C*-TRfcFB@}o zB2o~yY2*6-{_JMc?d!U52a+#JrM8draRP_69tW$IdXxg-N?KA%uml%Ns*5HmY&$%> z&)Xwr@LYRELO&0fktC(2P?gNrj`;6V^vz#mTTplNAm3{d4`0H16cG|-h7%foC~=<` zoTaRN4mgHtVE%iP*;wugPz!E4(2xgXYjX?;G9T9!b8aZMiJlNIoWLiL5xx}H_stcK zw%Tfbw&UaZc+^~&emoy7m!qD~$2;0mF0ev#t>+1ZB_L>q5Wp4dtO6~l^Sy@+D1cOC ziFl!ffm=8sHBHg+tOdFE=zY%5`}*_M5rMzLfO#N~9MFCYVY1g$ZQEpNS%Lig0G|-ol$3;&l*HuZ_|(*-goK#H#JGfn*u=!xw6vu3^yJi(g!uTFg!q`G zr1+$yxa4FYH##mZDlIKJDKRcCE;>CuB{nuPCMF^-HZnCeF)<-FBO^5-F(xiPIx#6O zJ|QM0B|bJbDj^{{IyxdbDc)4PR0L=>XMsm#F#`iP(81gSjBAzmmI4J2db&7z4h^9JgsE&8acR2Kid2MdF+?@LzUrzB~uzo(}lBT}rhBF_Y*uU>=wB-LfW8q%a zsjFXQ>wIN-yFz+>cu4Pu0ETVu!HQ0<^}M_*rY?N{IQNfE#~=Rr4%|-v`V?(}o?-BG L^>bP0l+XkKyzQMe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a059949a32df9d8162a616659119e90e5f97c64 GIT binary patch literal 591 zcmV-V0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0pv+UK~y+T9g+!h zqc9LfrPc-nJCplNJm=-aAzrU?DLk(jkc+ZJ3_PleNmSqV(aMe7`j4ou$=6koT5P5J#j7Z9)4H3Y|IT`%u6i+p~qvvR~ErM&Gs3LK7z4&Eu;(;6I5!XF}$ zO8~e9CGdhHo7cAGg1TCALe=B`xZUo|1#O+tz-UbZBV`1G2Sz3)hoT8&wPpY^M%%WN zO%qzFQ_{M8%wg6;F*N{T%>Hs#n56)Rn0i?5|5NEi4ItciZ dS&`6s{}17$YgzWyc`^V1002ovPDHLkV1gGJ2Lu2B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/light_gray_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..58bef081e21f4d00cc6718520fdbb42ead43ec39 GIT binary patch literal 561 zcmV-10?z%3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0mey0K~y+TC6Wnp z!ypVr*}*vOncFiriCIM-DIUuVM*54Szkj}sajg}t&05R*pw+U@Dy2oH(poDeYss9> zIm4QBYQ3BfoN}r6*7~TWmAmxbYbp0#?)Sa-pG8$AqGU=4;XKa(g63@b;A2QT#&}&{ zDIHv3nGmD3CU}45BY2ndairt%$T7tK9GIk?bLD()N-_tqqUIRAwgzYN=a{wK@7J@| z2Fcg!)i$}ZDaA;=>qr^tDS_rfOaa^wjde;bW2_Hh;elG(STj)l0U?et5r>}I3g;LE zg%BJY{w-NXe_R?G2Dn@T=eN!5XA&5IeI>k2Z-c=&W zRG}HjTVMi&tb*R&?^0&p6d`8JZke?^lEF*n`}syR@=^>wr+lG4XXpIabzyl*`Fvc8 zG>$$^$VW1=gj#bqZgXYtorM$k7zf<6jx)w&fs76VqH~sh;Q%)GvALB}T5HeO^Y{13 zesqLQC^0v9O}$QOq~g%Ty(#}QhE}|ycVps;-Qq+H)T577Tna?JZ!JaR_SmqjMKB-i zfh3EMEX`Cqtq{NkgT;6PSDsA`ui;MH#X%jV%u00000NkvXXu0mjf#pC?^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/lignite.png b/src/main/resources/assets/tfmg/textures/block/lignite.png new file mode 100644 index 0000000000000000000000000000000000000000..775b1eb7520f28a1c5cc38fe8131b8a5cf0057c3 GIT binary patch literal 279 zcmV+y0qFjTP); zwO45#E(#OK6}mlCLJw%FMnG1jSy;wt=on(?NQD-1~ZFh4(tAbA@;y|u5%=`LP zlC&p*!x0X7U908zPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0i{VqK~y+TC6Wu0 z+%O140sXwQmCEIEkUdFGo2uQBgvi5|$0LjcbT{bN-#;pLj+a^@;w+1E)YQ!QWGPEz zyYn9+=~a_b>v67&yIT__Rxy3Az1Es@opXrE(+D{yu*e#2wJQ$Mph6qPiq+b#&yL-% z!s5FYvs#LtQo3*hI9wDJu#At^1`f?@gbuU$y}$p>`Q!Uua<8<2vfiO!0oZa7f$6wi zuikpk+G@QwN|A^+t6PPrsUt3SIEDch-{)`mI;4e|DfxTDWNkm|oq}?oOxU!EXRpbb&-Xl<>`@tn zfPL`npF3;@4YBc2Tjy8C)q5YQXj3dm;~o8~UB;`8SL!f&V<-+;$Ztha1)D}>g=f`G z2cJ4jKuVV5B7&Uk?kk5PB2jG*V=&ksjK~yP;1B@;LUZO2!K~E81vOZr7!(nVD(8;D zphIP?jXTw(w(9k(wTn=>XCx;#wIyHVv}PQH5~gs2W7?GQz5zjn#B(dAzT`hyElkz5 SP2Wxc0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0uo6?K~y+T6;fA{ zTrmg)grpZ{HaL|}V&B1M@Q-ifv+g?W&I<|%%pw(4P!iDH;E$i*GcO{ohCW+f()H}e zZ~Y}WF0{-zD~@hG3Qu89kO+XLkmkGw2shoI%hSK{SB99M(Mvn`wx6Z!R!*shoD_)J z5(&;>TGEUFXgJgSF24H^Kdo_1oY(2H(#jNq->=`kM2Z^JqY2iPFB7B`;w4-ze3#ir zQcpg_M?*MtBb9M0FGbGYyS5RLBgQbe)pi_P>(w9Bv-H-AlwEe>93STQUJMB-g9YQ9 zV#;%#CCIK@!76z;>c|{9QPoqldL^f#KrLF-hKdYF4Fdq8MHq&P3GzYN&XMdxGkyD075v{zpb@*2KDd=hX%IG8fIPai zCQUn4NEou3*e14xku5@{rA7`GYX<65M7c|5W zbEJ$;JnemRptttgaWEyuFog^X2-rp|edjl|*asRq90#dsf|xmj*j8TaDBYUdDd)fX z=jnLf+acX|MGZ_vou^BZ=^C!6aE$%MUT?Pd(Asd^eben#UUs>Wb2mc5Ojo{Jctr`m zE#CYb$8M)GxjB7Ew$pKPDbzfS5D9%I7*k9UCtoTEkSR`**!eW{g|+IU);_9>H$eUa X76NlOVJeti00000NkvXXu0mjfUhEaF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/lime_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/lime_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..31a193808831630a9e9cfaf8a0b693abb8e8d420 GIT binary patch literal 598 zcmV-c0;&CpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0qaRbK~y+T9gi7k-?Nn~Xb4;qY!^6m1k-#(xftcu(+nUCXtJowb|>aSFL^Y+Us4f`@Wx~A*w9*g$g!{<`*s(#zR^;q+O2` zQcnB(_G8x*nG!cCxrlN~>C8vweCG2_-(KleWJ{V$+M~uTZ13C0nO`C-s9o=yrq7P9 zU5FLQ?!DHpuYc8U8|~}*Z2i94{fv}Ke(fK7JVZl2k_JtsL=2L$L?t31(JjohW*ih* zY}r`7wtGt%Nn7u%gha|pRhj0qX7-#=_pSQ36@*$H1X4M}nL@c+gQuR>a28XFTZU~JV)Bs5st!@a$-!zl(ZWhZ$_!bt13XL$ km0;ds^V_7h8q`qH|Dr&0>1QHd_W%F@07*qoM6N<$g7pOuMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/limesand.png b/src/main/resources/assets/tfmg/textures/block/limesand.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7e7003319bc1ccd4105434cff9ffb70feaabb4 GIT binary patch literal 563 zcmV-30?hr1P)l^Ua%=Zx_KQ}Rn&vF>Ew`R+q9pp{D@}gGiNmk9jkC))k*-b4VyCJALK1z~ z@<=Z4-`}3Uq08PoIFaug9dWhVrrf*T6gVXh>`i^TB%4a?MShruB8fj` zd9qD>zpG2Kh2Tmm#bI95&}U>S#m~z_(6$L5aO&zv)3K~_=|Lr>p_6B2O4ORAApkY&(kRBzsbv78XfEUJWdrN+|HBmmRT4bVL(>? zdX-2~54rJ{=X;LUxbn!06FTITVS3S_N&%qI=ht|a8_4sA! zW}JkQL2JVIy56)k=PcbpgTs8VJM@WZLQIE*Xnfx$MfPJ}wYC1k^me#`P$6bJgl)$28UVL%i+FYrI`^nxbbp|D)l`=tE*G-gAyVr-Jnb$EZG83wcm~d%lU@ zD`}$l4{=k44W;bOddoyXnDwloU|XbNs_EV-)1iRI7u)Bd4uuQS0zqqPVgb=68PUTD zK)Aionhu<8FQxP(qBx_w=jmMd5vKgn?NH6HB+Z~-1|ktAi}`B>XgU>Z1`jtwX2&At zICIO=xiGPvt`U#`v?PI?MCkoFuY3?XKHA)Yltj#lfILa?x8kE$vg5& zBl|+XMI!T`mb2d}m}=%ShqL0}s;h6+w=yzhZYYv3+f3B@sAy*o-(|Pt1 zch-dW3`Q=dwO8-__B37i^Y)RLThm(V{FWLm6yjTVel`DZLyI>ngdwD0&R@1%JS P=u!qxS3j3^P6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0e(qDK~y+TEs|?O z!ypiZcY#_@=c)YTh1G<8_zjgd2^p4oEb*_8PdB%0pYHAMqnn2@G3)9AGV`i5-mOR8 zG0exD*4}MZ#RhJf$^5$S>$-k^zW0uO@6H}=#tUmAAFv)Gv*8|@Ai!%q;P&BCm~#S7 zo~K$B2oB#BP-w8loifc>LOvpJfd_^JNW=h*Er+LoNm5b?^Ljqt4-e7{1rYv6aw_k^ zQILy+Pf})uIrof=otsxykfL07V$nJ>xI(L!QqBT?E#e6Lu^!T;zyEs*r2!>tKv62v zoZ*fZwy9@8e}Obi@m2-kH9-czu`n^tuWyB-u+jWK*>ybS#BqR_?rY fDx+wc!nyqcuW3xYp<~`h00000NkvXXu0mjfzcSD+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/magenta_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/magenta_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..c23acea8b5c90780f703e5bf91d04d6adc9e3f27 GIT binary patch literal 603 zcmV-h0;K(kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~y+T6;fG_ z-7pN(;w8yjrs(vNJwyL`-xet5Ew*e~Weg)Q5Q!ow@~@x2bIoHIyGo&YRC|y1Z_uK= zC#{0VoGWCNO(n4~Q>wZjJD&FP$KQARGRIjyr}t*<)!Vzz=GMk&Lr8>`oIF?Ewn{i0 zC&WkHzm>XUeA$l;(?s>WwPZ9UPN}4FOSjKsL+Q2DOUC!|vFoAxz1)8s+g@f5nLeLi zFYDtx(?nS_FY!Lw`}H&%zGiD}nDsXLdq~Ok`f;h3!lYRXrq#5SQn$UvQg3S+X#gXq zlxog04eA{I;rJKRJR-&%4rhWKO__;;A*@J(QQ;nwy{~YxK4~#YaKNz%jmN#zqrig+ z+sNxRi7i{SQchz{UJPg-Yt8Tx(}x2_fxlMFb53S~tL`>W4n7Hd7wWnhyv9{*N|}X7 zD2QHtt4vMja`{(ue4$bLyKk8Os!JIrOoBon$UGBMX=~>}1}pBM4vro{v8-AkJ|TMg+iG@~)ITA1NqMG@s}T znu<0WaR%{$6%HgV*a0nwK-mf`OS_0lZ*%mOSWy8;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ozGLK~y+T9g^9y z<1h$B5n3HP`Q>?>n%|wewzaU_cJ$z=h-l~o;qRY+%xTRLLpIlxGm*y>0!1^U;DOl9 z#pDTcU{m8jB{efA3Tuiion87paPNKet6%s11Q8gE%>te-UAe?dS_^Y#q;tZXNF_Wh3Y(a!z?-Yt z3cB#)kWzJ!a;8)RE-DIZUrIPD%u8GdSR8THU@TK&Ops=VM>aBNO_dqiDwa6)F@ry^ zRov7~Xs#imMyM@LN=z2~I~0N2Ip+fL1>lD348V)OBPfugOILTl&znmv83tQ^ZQB9& zdx6dOdq;e0ujBY20VE1or1EMTqX2VQA{bmu41X!Jh!EzdK1b&#_%s5ucnNOKiMG8^ z^t*SAL#ARQ(B%1Zp8qkAflHq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/mesh_concrete.png b/src/main/resources/assets/tfmg/textures/block/mesh_concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..9114490fd1494ee35667e0fdd79301e02e84ee03 GIT binary patch literal 408 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 Z{vY^e+p^;%o4f!3002ovPDHLkV1m3Sc&q>b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/napalm_bomb_bottom.png b/src/main/resources/assets/tfmg/textures/block/napalm_bomb_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..138d7814fc474594460c166017a3ad9e6b293df7 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7y5tVK1pGscx$ztSlz>Rb&fLinG8YvY3H^?=T269?xHq0u=P~ zba4!kxSX6IAkvbcrl^{ntm?|jrpn>m>DbA6Bp@Iuz%bCv%&e#^DZwnwfK7>cL5Gk) zgUbvD9#&=@o))PVy%m-PlV>KBInGf$!NAbJN+5FI7y5tVK1pGscx&Z@aX)Lj}Hqgi%Cn_=o*Dd3TgjjS5^S3A}tAOimJ)Us;;bTs)=mL$!yN5Y^u`&#HR+ri literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/napalm_bomb_top.png b/src/main/resources/assets/tfmg/textures/block/napalm_bomb_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ceeb4ddf4098d83eb5e5c3eb2774fefa66641eb9 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7y5tVK1yKCaEi_ZmYz`&dOvGX!7kz?_7b#GI+ZBxvX1&mK|5xW&{_>SGKackw zDZwi#ncp-I6eiynuDo->eE&Sw%#7Qgy4W6lSv*VFZA+9`QN*TI(*hdXCVyfp?>ZzX zp||UOg3a#G?fSkPF;kCMv2?!ER<~zz?Bgt&b8c(IxB9?5am#GRPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0gXvSK~y+TEs_hi z+b{@30ZB>Q{d7IuSNHkOOKbtXqXx^eWMCLR{`b#sH?PhSqpjVdyWQ>A(!q@7T)(ce zBVk89Vix+g>cZ_AotfRmp1F}{RF+nNfN52M6CMH)u!V3vBF303lo393=g|d)tU1dw zFxKKXS7abD^#}Gl?@#o~6~=n+!(-n>MzHw0rG<$i&as5)@$)ei5e_k1VFxjRzg?`v zMKs!G)aZPUQx5SrK>6~1Z+o5coQg>T0+h0fS{-w}><&p{KBg`AHH_jx9*ZCW{GbKu zbP{NGhl$~{0YWI}^a6*QXr4-EXWjcIKRmrN0%Gz+@EP7ehD9c6jK>0W4b&wV&<@;{mgaYU27#I`bwX$2sFgRPV0OCJlwTRQ=Hl9PW~(=3 zpuKjPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v<_3K~y+T9g0?E9(ZI>T~gX9leD#>-vx%lJzHxm{S@t7*j zb~(0qrS+H5qP$nTpjMSsAYiyt;|YvG4%2P{WGv@;`U%@hZ?$ynRr0pgc#)h?*WR`+ zD}gZc;D zJ@Vl*xC6}}`S{G!V#n z8n^SiW!@i#P`3ZsFwCYJn?Z5*fC3_|#Sibeygx@EEF^ zuBRrO4)|$MU*+;rF28HOmQvnV2CTJ_PRB$$4EKFxN*9(troOozwF`l0KI!(iZ6{Qy zz-nir>7M;QfmL@vGVfLGx8Y~pQJd+_l(UD`!uGCZw6(R-x9VH~H;)X=2Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~y+T9g+*O z+b{@4`RHf6N#?z7v}@=Ry3uy}8p}umN}};F#t2{CBk6^>7__~%gCox&wl0-^^}eP^@6yk!UuH6wtkDU~)NxFsvgQ2)(&2yr znsTLj&$X6qulMg*ADk+eood?>V|f*Bp7y-msXVxSKt3>UxgErX%Td35=KaA$G?t!c zU*5Z#&6Ub)dM zD21JTh07t=i6*4ttAoxdCund1qYSAz(3&Gy0WyIr>*?|pyEPPTxQ^gvvvbbj61X5I zLtaoI?{r<4+p1(i5>Z19big~l)-rRP76lCGibM`!cgh^P`q@R4L_x-QmjVg{Vt_Y) zt?N7~=UPh5xz+t1?y234+HwC(Woz4U-0tDKB&a3T5>zs2NMe%Zad9yt80XD-t_2Y8 zUheq?A0shc@kR#hT+4n_EImeGo;G?wn-QOX#`E`(bH)#1titOMvef#D>&m(&*kT{? zWb~Mr7?5}WQ>TRRQjZo&?U8bOv$9aOz(HR2o$`)I34v_ogp7c$4v~69FC_ypQW%J1 prlA;pG23g-ImW!Y%`1vP{2wxQZq~R~AQb=r002ovPDHLkV1j?P5@P@W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/pink_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/pink_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..17509d2793bdba98a767684842dffdb752a7f054 GIT binary patch literal 536 zcmV+z0_XjSP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0j)_yK~y+TC6WQI z+%O140o%!@t$NK~qIc;bEB(#J2KsOJMNzkZ9TO19P_v#DjKW*P^{P$4*D zMTG3NuT5I(5hQRO;(XHGNs75LLWvWLXu$&kCp}zM%}hPJ+Aup>Kdhf^Ty}ix=a2FF z*{>Hdn2-pmS06*j8!OXAW(M1J9|S(i*(L2WKRMSBU2EPxC&^lTmM>P(O3w*PNEAo= zKCa$7k;lW3*kIP+R&^04LbUacNW%3+!YX}eC=XCv^4!Y|yxZS{C$QDVwk8H9wf2MH zFM?dLRYx1I-Y*%_6lXtCgzanIB*Ka^hxYOZBK`=v?#t zJnvQ8X-KAQR&eHrCelAU#<<1_0GyzTG8`OL3Bz%Ec(oNYg?m}SYl`9{)_})#HjIE# ztp#aPOWrm>N^V^ONfBOFcn=Typ5o#?rHA%Zv}vFLTh{{R3_GozjDz+6U2iD^#LV(X z;_vgmW748p^b|a%-~+J4Vj?8&Snrr$UIRGyuu;6G6-w39@~xUeH9GhB`#m&6$W0000J%=P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0n|xEK~y+T9g=I3 z+%O1)0U>11?51+t{Lck))>LX|EP-I#@uMtDpr${>e}4T|>#?IHm5PqOSI}#5kqpI* zlu+hoqQ=!&SctpW7{pRD{NI)Dm59I_iR75e=PLId9@7!d$?UnMw?2%B3b(fQFnJCc zT`_+cb!Z93(z_`mxZz7f`{$|8Ll5Ko>HRU-x}0V|9?eXmWbb%?z0w1kP(`75ocEm9 z`~8ZDow4S0U)w!rK%pO>&o+iIAKI0hb%U%Oqa$^tY%)<}Rqd=z%Ck0-CuQ+2NL5lo z3co}kS4|Qjc@G#KFy>9^coQ`V-L!-RGjQ2XV^gvAKV_o^@x6<(sbY7=Hj%U;K@4*M znVXoR3XnnX?gNBjXZZr-+m|HJueE?1OVS|5$hlb;&96&thpg7r&SU)ikjIhQj*k-% zZ5-$GSv&WX}3^L%9F| N002ovPDHLkV1mnC1ZV&N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/pink_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/pink_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..f41532c578d459f9a092a1c5d4cb5949a8f4b123 GIT binary patch literal 566 zcmV-60?GY}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0n155K~y+T9g@kC z+b|47v5=Hx`L}b(Egw5$ac3TFxl|&ErMuDk@6TWN&|8h>b1e^nx4OF7;!Bo^iAWz^ zOqZ(3nx>NCF{aEVt#LI*?d7SX^;&AlB|p#Tz40rRHag~Ny?OL_9TIHG6j>n#i!sEQ zj&$6&#^}N08I5x=Pcfx$c07-8Bq}vJf5H~rQ#kG`U6-jD2tN5URNC$&X zhqn6@mBCsV^rf3?X-|GiYn3fhth?OU5gJdbCg=S7Y+1L|XF6Zk^?v)Art0f`2Z*27 z>wZ%ZImEDrBR&a-zQmr@$f=aYY) znhOYV3<%kYO_QegISB)8gJOFc&EWmO^g8)^2Tex^sa+w@oWU#%AdHAG;%InsCht8UO$Q07*qoM6N<$ Eg08vzIRF3v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/plastic_block.png b/src/main/resources/assets/tfmg/textures/block/plastic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..3c42bd25a85174e07d8d51308f663f12ad05220b GIT binary patch literal 247 zcmV2$s?kLfl`OQ4w|WRU&@qQHtzLZ=l#t7|~QfL5?oPEaKa7nXPfsMG@3 zqV5aO+yNq>FNG@r^&&v}2$VaEL-srExV$KF(-RzYIqkcl37cK3TFbE%IQ9wX^}g?>vtbQfO5YZ(wj7 z+?7I-wQYmV&;k3<1GT~T3u$S{h!{}wy1}Vo1~|9w=qJPHG+_*i{sRLlgcF+5hGCW- zA|D{YYkxo}ZU4f1h%J81RWT)S{l# zsMP_n9)-+1=aSe%J9{=j1I~F@kgU!yOOJ6_B@u?O5Y|e;QL=S-ApPA#Ggf4nn*yH2 zUjt^EtB1eunwfs3VLc#aTe-Re^$?|`fl&~md54P)*hlQ#N=Q~o=;501jahTO8W`(p sV56H`UB~Z@0*9q(EG@GI(z0iPZyYAP;Qe`#;{X5v07*qoM6N<$f}}sIA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/pumpjack_base.png b/src/main/resources/assets/tfmg/textures/block/pumpjack_base.png new file mode 100644 index 0000000000000000000000000000000000000000..913d1eaf12415834eee375f596094b7ff61514ea GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?STBje%=N-BCMPnp-$q@!nOVr~;@ZJy|8+uGG*WAEhT=51_jYUku0 z5FFv*7bvf)!NA0BW?^k)W*ZU}8=sbLW$WbP>8qfiz|YSQG}0)_14uGRl?3?(|HlOw zM3fkA0abApctjR6Fz_7!VaBX$ot!`i%XqpthFJI?opdqpkO7bD+W_Y|dW}31XaE0y zu`YUgX{>hKgtC??Nqui#i)2X)2(}+qG?3fY>i49=O4fCktRqv$#K>)|(-dZfw6v~# zpDXY%XKsy;(}e|+9N7!zJ-*TZTW#r%2~MY;dtaNu6uM6H`I4Aut@-|rpP$Zo$QpDi zL(n+W`})piw~c}`Ot|KJG<^7sY17FWMhZ(N&1!h;u8{aF>1Jr^#CFtS)7IcFMbg5^ij4tf^yQY-Vk3=j`m^84;6ER8iU7*`=bUsjY8f zVr8qKq7Bp-b?EguAf;3iEak- z;lFg^?XngH9@m51i89X?`M5eBd-%V8lfa8jN?(`$c8p9}KSPF7aY`7c7iVGV->$5yzChWv#JEuVX&nUj1a8LT@`?AGB z!i%m*&Exj~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/pumpjack_hammer.png b/src/main/resources/assets/tfmg/textures/block/pumpjack_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bf141e8bf68ab8186850d8416f2e967d6e0ce0 GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{S3GfMVb#Za=_xF#Ch)7RNw6}B8(KBqUt1~sRP*PI&^zf*wt_CW+vBkRr zNb!^e`33(+00yD^=gtAeISV`@iy0XB4uUY_j)~cC85o$7JY5_^D&pRTJ*=8zz~kK@ zo4V)!Z@*1*Cunbfd#k4L-voXU>kBRt(W*;rd_UVf-SR%u^K_GN#NGJc35VqpCKN|~ zvt53i%ZW3s!64ot;jAQQgd>BE-R&=e-+7H~(&jllXbd+{6g56q7V&sr;<4}pcP9y3 zND3KWi()cfE%>saU{Aw=KxX4jeP@invmE}&a!ab?RQ8)$;SK4zw>B7VdH6%=kBZA5 z)(C@ryvcjczOg+2>-9R;=3<76wy)p2>$ZOkoe($m-z}3PFYG+tlxqcA>n!vP_Xu1y z>$^&Q=;UMR54Qe^{mGTI_}GT$t*$?!{@rN%D1Emrbuj~X+v)gZdw)*tJ?5!5CU2Z9 z6jqVHYPVl}>A~=|tAm|8R@jI3YRT{&f3C^oysMTa=KTW4ZR@fFXC68(Wd6{6GXE4^ zxw6KN6~@fl_cu)zsJ&X%Jz;N&$yLVl7w<3o)%veV6FdWXS)Zp*Lmqv%HNr z%6TLY2&L*)2+F-s*7cCdhz~B<#W7>WwaaWBbAB?&30_>${dLmMo@ahcsod{;^bbs! zJ@cneh1q%gFFW*^eHN--ef!~%>alCjyY0SQZTN4T#F}7Ol^R+ud&XYr^NXkpk<8ns zZ4J)VDWBE(KXE>vjnK4%Ru@F{IF1C~Dc=y>kvIL3M82`003!vcaW?0h-}3K`>O>@a Roj^&D!PC{xWt~$(699k)NLT;> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/purple_concrete_stage0.png b/src/main/resources/assets/tfmg/textures/block/purple_concrete_stage0.png new file mode 100644 index 0000000000000000000000000000000000000000..e723684f98f4effcf181de8a7480ee30d8fc0d47 GIT binary patch literal 487 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0eneBK~y+TO_B?8 z!ypVqB>_%)wqB&S=(&UV^es+i>hWM%TBO|t|M~tk^SxFnvGxv+@Zw>$)O{XzH}}kR zvu#E>TCLahFe~Aej1b$$m}{*u=NRLIrk(SaMdwY+!cIE{b2_P7f_B&Q@l|UpQG*1y zt6mgJEuh&WU<5I1YgZ}Cvl5dDn&(JTnms4M9j_%eu$lx@^jHB$Wms(@5ant$XvM5@ zrk~!Ltp`fyf&DghJ510mK6|fYiBUCE%m9sMKQ$Cm0C%TuE45;$zRIvJkU)FBh#-Lk zrBywyp+v5}|LzY`#B|K@%8t0qK9Z!0pHT)y2%QaUQT23U(cOj4g9kRM9Ir_fc dn@Qf>{{TrlWA8B21YH0C002ovPDHLkV1jN$&{zNf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/purple_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/purple_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf799ac77a72e227ea78807a04b5864b6fdd6d9 GIT binary patch literal 607 zcmV-l0-*hgP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0rW{kK~y+T9g zaw|l+KjQr*rW``>+m>QdK~v`7JvkQA;C0*m>-%kgN!uRsE!_6-c;u8l25&!ZF@;_o zkI_FrPqSvd^=^W#N{*&kInSrHHfAqS)68lsS7Y_@<@J`gz>XEv#2`gWInF8d8r>W% zT~k%P2IU6AHmX%%Hd}blwK}Hyn#suTd)GY z!v%(}bv_Ft=H-+~a*A*7`{V7)^7~^8NmI)EzT*bq1|LPdN`O}Dbsk4W38)tw3^KPS z5kVU=#to_hZ0LkIo)bP`k)LZE&&wbU>#WvdpZ|`JKS#kF1j893gvK!m%Sc(lhq5cj zs22$3%hxV<Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0oO@HK~y+TC6ejR z+#n1^vDrdq(pRq3Uwz(cCJA7mC;CtnvHEV7KfnK~53MyXVXhHla&G#d;&jgG7$R%B zF)erzFFNK@kr*-)4*N4kyY0Ga?{?REU-xxg)~&W)@20$_(ioOf*k4S)@rQ+ z_W)z&*ZKWac=Y!Do~_mU;ny^!?Ks}KfD_8Lc^`5rZ04K*Mzd;QDJ!n!Ric_9U?6Q^ zgo$+&J@v;}PMoNV2~=k`7WSw>X<2vNpTl7ge_pO7tyxf12K8VIHsEN=s&M57yLWAm z-@{l^e%iuG3cK~V=)^!;5VpL(--kG!5lD_9m9i=AfOs>4BM<5d*@1&UP{C+6<)=HwPzG}!grvl~ z$7k-g@mOBl_j7*!UC$m(V&;~EH;pHVQxC{^95pwGs05_L9It9cmW81BF~`zEN-^D6 zBW$1_dCMURhP)$3-s39)k_+vLOOpwWg<}wWObm!R;IQRjf591OpC5G@G!4t w6ig7D;Ix6mLoq_!Lt+j0I<_Mbd#k=?F>H)iJ18&Q0&+2fr>mdKI;Vst0H4f2WB>pF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/rebar_concrete.png b/src/main/resources/assets/tfmg/textures/block/rebar_concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..e07fbb6e70fe31ea256da4deb703ad05426a0af5 GIT binary patch literal 404 zcmV;F0c-w=P)eC}Qg)NNS8x#jC2&Df;tu@jB>vOknIX zKIeP@9vkeZKlj!gA)UdyH`j1hRI8y>Jqu2jEDzOi z=pJ@D2@mF4tnJ3R>u#kKTu-e;10blDj^*Bc->9aoX&wH&-*5a?kL$hxFG7rKUURhp z?!UWFX>J<(TQr%S_n!^?eO;0>-_jZSOSHDJZjDl3g~Q~FfTo4DMTo#}XmCEBa6Y{; y!mZ^qAqaT$y%I&~(+{>%fgGkO&Rm6I0R9HCr%_;~1n0B>0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0g_2XK~y+TEs_hC z>>vn4LDZg}rM+3wEWAwweHSx!Cx?_k6(9Zm`6r@lFDtfXwbxtr7L`)UK1WsKz9T|K zwn(Btc&|m2@LoV`y9XwI;XdaC%>i1;HhJ z@?Bev6&ajK|I)&9ea1Zo+OyLl_jQ$dUDtgLo;g3)p#4O0Qcsd(I7Lq$MlwCyYL$Yr z*4BFLJw2#0`wY-JA#^6)%vz%#q!A(QQ*mAwy(dvj3@yQo4$WWPCAWy7e81@;SoV?u z8JmJG=XV62D%gpfgBBly9FJmnG^cy$d&lSOfieiD2E|zqVmt`X&ZaEIpBH97TZ98( z`+7m1H6Wa#XDmEOhGg`x>fEG3|JOo5(yROjWQ00ISUe&!00000NkvXXu0mjf`HR+9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/red_concrete_stage1.png b/src/main/resources/assets/tfmg/textures/block/red_concrete_stage1.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbd96c2e4aa0697dd756a86eee9c8d3bd929c0a GIT binary patch literal 636 zcmV-?0)zdDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0uf0>K~y+T9a3A8 z)F2e)@(y&mr$-%Kg#KE7`sXGr_u_V^v~;FJ!s~*kB?*;+1NWW>{rvIWgwR@(y$b97 zd2MO0zkd;T<%3)nF$UK(>Uft7^jnR6ytWn34yknL6_T{rShQ`oX2+_nSl+_sFWG`p) zza<@`d$^LAyd}xZ>E#8rYHPJK86&M3Mx%p$+gho;b3Xp}lXFc8yCy!qvFllqboj<} z)>!9#Sg3X0ZlV@5Suq<7XC>#%wbWW>Zv*5?o;-SMqp@I~L_+I1@CY(iEde)<`%O3i zX^$Nskfu4?c2maK%Y$84XaLwCGMBSN-}gUl8c)%CFHo@Jo#4cM2olB&rFe`Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0pUqRK~y+T9g=Hy z-5?BvK@#BCZM@u`E}^?klbE;E;p*@MVT5Ns$^ZTHn^<}+;+?8VO6EKVCUZK5`4u+j zP~#wunRHHa7A5G!P3o=9)_N`_XY32&c}gyGAX_=PX}CG&lr5##i_>P_5E5fJ&JbhT z_v60hI3=dA?G*PUguG~4Lv>z-XpyuP=t``##-p)BsXKl{fnuBEF zZdO`(zQ3TMxB7g2x0-9ttz=4ZLv=hZA~{kJVn~A!1bc=$X4zs8n4Ux6Qb)(C<#D4~ z>)I+X^ip(8;4u-3(K$bRGgVKZH;2{Me;(_7)Z&ni0g%`)^;;qlAH+Nv6Yq(@4ZP8W zS}Gbbd)KvAS?g^KRXlH|&N*WBs9SbB>@IV#Xx3Fh+!Fx+B!GfWlqp!3p9c!x7GvCx z>-xCEdHE2p`wl5>`*FU0IWzPfosGgriZo3Dw*kUiF7^^-i~$Ld+Dm4%$*-{i4E&ZH zk%zbIbRzHrucOvA7q#ZEf6wPOll3k(PV000065XJXXwvAB`K@@z{Car&%-U`S=QLk2Ga#MLMD6}85zm3U8+1Z(M&YT(1Toy$# ztahX3G^@75-0Rf`mut0m>U1PSqdK@*WO6M6?Rj*B^z||_i^$Bq?mZl2UM~;y=6xpD zz0A|v>o88x7O|CbxDG=zlf_^(9XDTD`RaeZ>XT2t_X1o^+|Y?^iSvna$CK z?e+RlaTA9`d%NS%G|s0G|-ob;~zCfB5p#r%zYUUr&fh@^Zm9L@IhpSf7UEQ!A#RAXjaU=PWW&WTuTt-?VYGREz)S(2nQMI_xLYiC3SHe;t#_<$+P#pMp#@I=ei-E0 n&$xQ)E&J7_*}oU6%Vj&WGah8AJK1{{WD|p@tDnm{r-UW|qjOrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_connected.png b/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..ea81f4212669733e4ddc21304e0daa92c22d0b87 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCiji0(?ST*Dc@p{Nc+_pFUkZe?1{4$=lVZzM=sr+5YQyGmzpa3Gxg64*?AK zn)gNm#W)K*B8wRq_zrhQ~LzcCOrc1->!$8+Ec)I$z JtaD0e0syJ&f8GE9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside.png b/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8b8c2d1e208f83f160075576752af768f166f2 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|+77Z;bnz`)ehRG>h2M6fDIT}hB%@c;k+8631$egX113p^r=85sBu zgD~Uq{1qucK}Sy)#}JL+-kv}%1_KVK;=BLP1&cS|I4;ChJ4G-fDbBaTQNj4&QqMHT x-_EQNt91?;=aVPn!`lHZe<@)l?qgQu&X%Q~loCIDkJJ=g#M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside_connected.png b/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_inside_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..5410e0b168833b696d2d049a2255ce89c55cb053 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikh0(?STU0hrO0|Qf2Q-K2A5y7e;btOT5!TJ3`31=5EbxddW?iF;f{M}4J4^Fkm=+D(|W`)6gb;V~7xq9#4ys#vE*HiJP6O763oU2bO>gfYr!QkoY=d#Wz Gp$PzDB3v8* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top.png b/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f67b659ba397eefbb13038552395d0b4e3f21a47 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>h^|O zCK^iK_Z?OOb#WGWL>4nJ@ErnSMo|r~2B2Vvr;B5V#O34!fe^DoGoh4(ghF5DCINP~ ziJ#6%zI{5kk7rS6^|?7Swi-`xTwC;P?OWq~6~h^!Tc%H+zFpmTN9cS;FFF6jg4J_w zTNghoRapG(+nU|w)0rhjpE@vW1xcJ~(DHj{Ig{s--REO#=6dohvaNovw|}?N1ji-G m&wBbkak;lF6-ehWVqh@jwvv#@t4RjBiNVv=&t;ucLK6TWE@v|U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top_connected.png b/src/main/resources/assets/tfmg/textures/block/scaffold/aluminum_scaffold_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..3f433d1fea143c18fab2210ef724d918a22c1d42 GIT binary patch literal 1818 zcmY*a2~<<(6237+kS!nxRgeHJP(Y4|BEg1L6!5e`h!&8t7E3KDtJtuGxD*t{V0|J5 z1T3`y(FC<1vLq~p^dTYUiKHzd1Y&{)2_>N^tYZd+vYdpZUL;`DW%n=UzIB z4>d8|VF*ExNqAUD6p$3%GC+dwvgq0>5QyBU&|ru@X8Rf_dTBwQ1VPXPs*yGs1$2+2 zA0Imu7Z;y)idaxgsjY8n@9c$P*wNZ@--nJ^_YVU0xZylp_Bdg96Z~Bcw!q^*jL2ai z(5IvD1c3aX2O1Yt-v&opvch6>A;@%4w-D^i=2QsU92XuEbc~d+a3cLtlbhK-7oIw7 z1%?Ha=WlI6I;L5+%FCV~?`}!3tDr1niTu3Bliam+l3+35vCWqOICgf8G}(6U4xh>$0@$fTMXga3`EXI^tGTyB7#mMj6vav?go0JV6VRk)$?(AAOn`DXz= zb!)bz#(`4BrTqB%R?6i^4TF^kT!Yff|7`ZQtn8KC_q-@=KPv8;EZU1^LD*Ca`ur2o zq7%`}IxV2ApMSKZBkcA{xukHWfl7M zh{i`+V8>3br{zJVAk(iL=e?Lt)8)gRn0l-jM9=Bwys;)YNXuN=yjopyn{zRfQ>4Bs zD%N~OMxb51`e>&;L8yAjmY6Sf+&*Z9BHoA)lZ$1RykgTEZF3@((zx}qmiZ}@z`FT% z+;tP-!-M(*g=<~0LYJOTGe~f-4qAbY%(~ai@_G5t@WuJN*I!(JZ9>p5$>g*ULR7yf zhSr5OAd}p6%x<+X9e>Nw6S7yRCh86xy5MIvVZ^wq-mo6<%RSi={Ku@FaEHN2KHzFJ6gJy-sGQGUg<|!%8`g**U-dQ7Rn=VME)@hFD0Sjz#(Ea z$J(7;^8vHhfB;clyu22WIfM*< zG9#{@pyAD(^(-0>(p!2y5w+(G(p>LH+;aR*+xM_~u>=>>Uex5DVx= z&(G2g?`NZ2NxS>ajl(|n@nLaMpH-+Cg*%i2BB`bNsZ*3I>{SRCIUJct6;^;zIQle= z7KyxG?N)1g`oEcnQ_w|kl;V!OdP_0&mgU(bSbT7%dnqs~16#ktCGfM1e7TA9 zk0%@oW9$%d2IPkKJ*d8Bb4Euq^2z&LR?nW?Gp+IZ^T?B%glIr5*^nU_KmMDRGR~^r zFwCdKkF>OcszhJmq{wZ(R(h0l)7jzrc;@Um%HWY4lCo+V*2u zhf%h|ZtXcz;7YS`WJg#%%w0q}3LWh{$-UR$X$i@5H;6ur)U3jFWv;4hncLWubr_5X z7hzxa0ID`$h^wxEizhow<{O#v#$cf_d>RzW_SX9hhr3NBL|>DrDoW1NB&CDXI_xf1 zrq%}M;bSX*1zL8|e)Fa90fXq02nD>IeWK>=9yVdNg8H;|3DRo|J$dnAxYN*9<*6h2 zN>XDD96|a=a2C@6HI55K6H19V)0)qw5ht5k;o@uCnK_CZUPlbQCLcd zo?-4*?|K~xiqNFC~ zs<(cs)UwuuDlnZ?NO1Q(_lc352a`W*AGK3KJGZjvs~Xf&pln*RP7cCRPWBtH$i?qQ zI$)Xbw53(uy&JsXN)Y+2V1y+q6u9hP>4v=yt5B4gS4PDt32{Tn6c@V-_phw`uggJy z#utsYGBZwnZ;q=Sttb;?np>OQo$D5A`g`?=eB<9?OmlWe`sQzNeP=kLtNOpuw+oh_ zN$>L?*(G&21w$-%z|3O|Gop$8|O`x|_Ip>hBK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold.png b/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold.png new file mode 100644 index 0000000000000000000000000000000000000000..ece0f36e895281dc72cb2f20906ef698e1c73c92 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|-o$hi34$y2V~xLHtAVPo%PW?>x=908Pco4@cjkm4u_@(cbC0Sxz= z_eKK6I14-?iy0XB4uLSEsD@VqP%zrl#W6%9xVP7v>wp7~)76vD|Cz57Zga{MuT3ye z)Nlw~6nUCS$v1^3^y9x3Z{FE%$}v(X$uD&dYt%URuJ>tk^4h~U&R>{)NAfuTlm6yw mADf?CdCb0jpWVEzk>Y>USu!2;&-@2k!{F)a=d#Wzp$Pz<-CEB8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_connected.png b/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..1bef366bed1c58d4fb6c9ee9696019e01844eee7 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCiji0(?STBje(GCr`O{<7Pogg^j(FnT2&ga0F1&ZT`aBK#HRz$S?Rm1Tfrd z-Wv%N<1FxqEM{QfI}E~%$MaXD00rlIx;Tbd_&=TWkngYpM+<*Q#eZ`>1=C9@#opiY z7>FRcVE42YQokkp#gJ0H}l>JV!dj4Ep^obtLHHfE6)B3@T*+$?X8VP zKUcP#miFee&WTIERo;l)`Fr{PhgVXTu6{1-oD!M< DwPbmR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_inside.png b/src/main/resources/assets/tfmg/textures/block/scaffold/steel_scaffold_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..323b590dc3e84a426c2937407610ef4389d8249d GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|+7b#-+U6B7>)51_yT3&nVlx{@Hj;Q#;sGdO6i`~u{27I;J!GcfQS z24TkI`72U@f{vapjv*Ssy*+_k3rhnr;!p5Y>B)=yyPmwAg8%>j&)}f7@(Ym9S>O>_%)r2R z7=#&*=dVZs3RZc#IEGmGKb>@uuR(#s)$!l|`Ma5d9-L~A(Vwf!UgdI2;gO4{Wa@Ea`oQ7d0|QTuBYNnCm566Iai-n)YAvLg2B_(&t;uc GLK6U(>01;4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/small_bauxite_brick.png b/src/main/resources/assets/tfmg/textures/block/small_bauxite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..6d59a7314a0df3cc91ab7c29c4e7139a2a397f6e GIT binary patch literal 256 zcmV+b0ssDqP)^2!qe`%h z)Sb)3I|8}~^-H{~>Ve;X-R_xrOL^YeJrF2$_plcYo`f&IgUUNgT%z^>0000?qdDz%HMa3p0re+kER~3|0+|@f$ z3{=lq;1LO=`3{3HHfE$w=a?|@=2FvSMGuwaho|(`iYX|2WgS~2 z8r;xxU}|j8T;1D}GxntE#27Lk`M|t6CKdtVviC`KY|Syz5Bq$T^1H@ekQ>avO+D7oc; zIsjmMRGPEFW$U(uihpj$JhId8AP<`!DN5bHVK%xXq$6PgBDLkQsY%Qma;5$El6;cY z8v1;>omx2S(<}RC=#5}ORNk3fFT--N(FN+*!S=A4iS}Vn~jZXItmFMyzXU71Io7%?>hXz&HzK@kuPrSC2V7Oa2 zq>iti=EOTs@ie7`XXm>j3gw-N*mrvehkvW*D|CV`(Vg2u*0kv~6}=PJ2q2-KnHtYC zybnRMgFiDJ7QF%~16t}^jptpFnCG5$_e^=Hb}2VwEZ(Duf~+XAAp9T)sJ|^J>~PupH~BdP`PrU21J5({7>85S*_u9hJkEf-=b2 zZL8tQkYIKm#a=Ms`a{+wx%njtqrNY(4hOorzScNFVoAK{K2v2YVyzErg*tXlgl9d) z>mDyCS|8S(&OEi-?~c#4lQ+}$yh ztX9*uN2EU`#f{?OsufXGG*KZv!l=LNoX(~x{gbF(YS@Nd0VKZH*1Dwu7ptP>4W(sO zQ#qq>SWZ0mt)mgyVUvq&S3DjBlF7bu}B3{$l&nb0h|Vo5F#@^7p=Z3`q%_L?_O zSxIx;$hN`Fumii|x}1Zq5MxkY=;jI9hN35VZ9R7M-Zv@9k0Kwww_sNsKDkOT&d60m z$r+Rr2Syw}Exu{Z8t?aP5Lo*y%S#<`yy<%*y-m!B(_wQ@j=L`UJO-NAS`&6*7V>gg zM(8R*wZDm<#4R$P+h6K18FNteoa!a2dKvCiEa{c!*Ttqqo6wK5n~yqY5{W z23VUEhF4YWwdmV_+UuN(2hvi$q*g{>B!ti9IFp~(z9=n2h|PZ|6Y)_Sm7IoWNN@?S z@!M2Zr_1?*@jE98;f42!L}q!0)XmMZ*3DT6%(p_DYhO0Bld@dWu_FWgFr^sop0*bD z?9i?H^4~lvwrskBR^1I!E5S_fIcW@%Ax-4gs5G-z>RCLi@hjjOhp0KyQ_4V~PIZNj=t;JiL&J3pjJld6&~Pbj z?~*N=qAUSVjQ$|LMkFbNk5Q0vNGXqluf?Ow;_5G$3UO!c|8S c`ovs#w}R#rb0+5q_~SzX8}YssJ~4;?23BidHUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_casing.png b/src/main/resources/assets/tfmg/textures/block/steel_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1a498934d5ef2116565a1503ec879cc954cb6f GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>V+kqN63p^r=85sBufiR<}hF1enu*=iMF+}2Wa)LmJS)rLwNYzGvt4|*xjcWJo#=@L*S5a;+8L@pS>lX!dPzyi8I81p_dB_#>}=tvN0SCvR|{}suc^+RScf4elF{r5}E+8_Gmu< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_casing_connected.png b/src/main/resources/assets/tfmg/textures/block/steel_casing_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..757a85104afb1da665884588592e762ca23e2b83 GIT binary patch literal 3866 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 J%_%7He*uj1i@g8< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_door_bottom.png b/src/main/resources/assets/tfmg/textures/block/steel_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..3625b2abed581ecfe435edc94f97c314d1f52199 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|+7TRZ>W$y0O`W$X>LY;@H_!_t++MJ%*cW-Xa(s48!wp;S;(VQA{) z=^GUg9HF9V8W|U#&;P;H2?+6JY5_^G=g={2l5?J;BXCG zBEr7#(%<#lK1tN&6$u##@$P%_sIYv+f@cgt3r?+i{Ep#SzL)|-vbF<*PD}%X%Myl{ zQ?F`^9*A1a@N@kGHl`WZ&WG{sm^Jg)&Ok-3KN|F28`~LB2+mC(s29p00i_>zopr07Vd7m;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_door_side.png b/src/main/resources/assets/tfmg/textures/block/steel_door_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3ead5dd5ed561bd5520a75d969ae7fd62c59e383 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enFxJz>F~q_@Ipm_r-}4MCdu;Y7bTzgMJ3VHK z-&fCedH#Nfj17#-mPPU0-~TTqARvT+`_!q^4Vfh$emoR5`1{}=Gn-#tS=;61>m7L* pI48Yk>N=Pq(bLAr0mRJA3@w&LlF@>y7l9Trc)I$ztaD0e0syBEKXw2B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_door_top.png b/src/main/resources/assets/tfmg/textures/block/steel_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcd06882cc014272a1a41c061cb236b3126c0d1 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}B0G|+7V`Eb@3u_yDCwDLZfZ&M8xcGvSir&dnl4maU^o{C1cs4XFeZ_^F z7hb*8QIxSa)Uwf42WqYDns)$536%u-1^-6}43GBj7Xr$17I;J!GcfQS0%1l`4X*~E zV1=iPV~9rZ+Rg$4IY7}!MaL&4y`dO5B(l? z_Qv*qa@ImjD{b9+%5p*+GizCn`iQLfp77Lo;fDOg{~h!FEvH@e+Gz2OS1i4&*id5e u@tOV{ZtcBW-M;TU__X15-MiDz**-89>Tx<1N$7!sh{4m<&t;ucLK6TZ{CTwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side.png b/src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8c74257f97b699217075868ced6f1f161b4e1c GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|m0G|+7V`Eb@3u_yDCwDLZfZ&M8xcGvSir&dnl*C1J6lDxm61tRzs5v%n*=n1O-sFbFdq&tH)O6s-1iaSYK2 zp4)$rk42Hg*>M$<)w}=y--bOmn!GnxI5)saUTIO(8HUY^P6ajG`W3jE;r~OqnS%Rd zwW4azba%-ZulCBEH#6JkR#(`OUGu-K{gBu6uX4rX`RsgqlP8xKy^!6lY|fs%^_c1P ssKb>_30(@77x}F()=#Tmum6cP?lFgVwB(sypfeaeUHx3vIVCg!0QewsOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side_connected.png b/src/main/resources/assets/tfmg/textures/block/steel_encased_cogwheel_side_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..0533c465c67d26d5a83cfdb9c2328e98fa1df338 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijK0(?STjg3vsEUazpo!q_r1A-$Wx|W*PP%=J!MT5fHg3`5j7~l-P$W9>;;v~2Ew?Ou&fgaC>d&0c?9Lo3 zi4}ijw6=&xx9;2MSYNbNwQ9Ohb$(y@>}!+0&OIz4{6B*IXt;dxmQ~{FTP~}=UU5@x z^Q?5ISe-k6ZmyZVS9*Tge`Wssuanp(W?njI$8V)Fojr9vdv*OY$BWMsc@KQ-jx4WD zZa#hZ>d~i;H=jGo@3ztSZS$q}-Gg+wHSd>p^8d@ZcKF`+Jmx=4yMtA3rq5CD1p1x9 M)78&qol`;+0KEaP#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank.png b/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed09bf4d5c516daa20cd13eecefc463ad449b83 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFWPYOmDx~k}roH zfa*C5JR*x382Ao>Fr%o3R|8P6*we)^MB;LCf{0NeZ(*27LVy{!zP`S%SyDg{v*DyE z5>{zOTwGjd-XzS}dSZ)>O+>aT^LM?}$F5$h%?%9PvRCRwZ4GT`oLD{e)uW@*4Lx_G zR&|HJWiy^4uFGb)s4+;vbn{M!U1D!sBsjJ+|$d08LYKuZ-~)Vp!E!%u6{1- HoD!M<0x$iEP)Px#1ZP1_K>z@;j|==^1poj5Bv4FLMLj-GLPSz%YjJaSdw+w2jgO9ae1E2_tX*Ge zBq=p9H9|{HT}PwCUH||932;bRa{vGi!To(V^&D1K)c zA{FWCH5PS+8d~?gm~F?Hd^#m)Uu|=8Q2(0;N`3?EtcqCUtmLc!0000Eak7aXC3b#Hf(BFia#tz=+e^+q*O@ML^GpleaX?JS8A-!iyIf zDMd*JreQ{GixSw(*&P)UJQEAJSqxo*B@QWBH7qcls>q`>>C^)@LB>^uK;a;PTMyX| ht!;?rDr{Q>bnziYrsR9~Ie`{3c)I$ztaD0e0syogM!Wz3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_inner_connected.png b/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_inner_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..b95f471b67303278d6018171e89bdec2e39e19d0 GIT binary patch literal 665 zcmV;K0%rY*P)Px#1ZP1_K>z@;j|==^1poj5Ay7Q^ zF*QN}001e!L4p7P01I?dPE-H?|NsC0|NsC007_2*@&Et;32;bRa{vGi!TB3Ru~XE z2;^aj?!xS0k*6(sq1bPujQK>c@(iHQdq4o#`GKBTR~CR%oM49HX>9&<`AEtZ9dEb8kEak7aXC3b#Hf(BFia#tz=+e^+q*O@ML^GpleaX?JS8A-!iyIf zDMd*JreQ{GixSw(*;ySO)uxHCZFe~8RH%4Sq-_I7cVFMLYawkL99$h86)%RcZRhCj z`t~erft35vK0d{XA}wV*8Vj@^OmmvEP=kTts-gU+{oQwUfev8sboFyt=akR{0E8D( AbpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_top_connected.png b/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc4430f0ffb714a7719c64b7d3c24ff21ee99f2 GIT binary patch literal 835 zcmV-J1HAl+P)Px#1ZP1_K>z@;j|==^1poj5Ay7Q^ zF*QN}001e!L4p7P01I?dPE-H?|NsC0|NsC007_2*@&Et;32;bRa{vGi!T6S z1h~Yn2+~mr0&u<%u-8;Tz^o^(1a=5`mrAY{BD~VSj9rXtO^L6*8hq?K186~SOxk<^d@kf2j(*s zSWBeSs#wd!vwNWy%&I^wRBIxjLjYHFviEAN6s}VNHbAsJRBqcHjnbYt5;%Jz`<}JJ z+6#FgP>S}vC%!hoS3@l|Xid9vGo9TVWz%^mpo8VA6B=XOc(CYb>!&liz#BzwIvd;R zjLtHc&Le>`-Yr`zE~fM3e9+)xIu8YS#95rqlQUA6f5YiK7O1DRC%ESgRk-0X@2hj- z;GlW?sJnXDE~jner#)8z*|N;@2#SwJ0atw?6+xNKGK7y?u#pnRFGJAzDZvP_HQ{>! zzj?6~ar|NYG9*MU3RXt1F&MuLVP8ZHTvE>;#xDcUM5l#<>TvM~0S;3u)xcqC{4ywj zS1TC7_X79?yc+#3X#~Hl!G>4!3-IrkMZCR@w-f1hD&H=qd*%Fi`~xn~ZbM)rguVa( N002ovPDHLkV1hPFU`PM} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window.png b/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window.png new file mode 100644 index 0000000000000000000000000000000000000000..c496c8c19eeb44c548c3f75bc96195b6071a9763 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|-o=;*klq-;k=r|yGiFT8r`<>j;D!p-V++xsU>1S&}~=jR7fTqQw% z!T(`^Vbd9%^FUF~0*}aI1_r*vAk26?e?sfCu21Op`3rl)$?fl<* z{2+hRt~qNCDQ{umHDLO8g~LNFHFB20Y0-#%lTNbPIOv!EczU|dkipZ{&t;ucLK6U215-)> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window_single.png b/src/main/resources/assets/tfmg/textures/block/steel_fluid_tank_window_single.png new file mode 100644 index 0000000000000000000000000000000000000000..f90b7e0421db9786b59af8aa8985349cc0903d04 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!7xu3#}EtubP0l+XkKLL5Dp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_flywheel.png b/src/main/resources/assets/tfmg/textures/block/steel_flywheel.png new file mode 100644 index 0000000000000000000000000000000000000000..1011b231990d02f5538ac64d1897ddcd212fa4fc GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik92l#}z#>dAuHa1S0G->hT#RUZgZf%p;;O2u zk&%(jHO1=}FPPom5fTy-8XB6N9#>P6rKYBK`^?F}5HDtC=CH7^;NakznwsqFY+hd8 z&dyFvO-*TOX?1M_12anj0Rb0pAOEnhsQ9?FtV~mDJ1YlgQyV*<;NUrP=1iSBH7zZz ztgI|HHnyv)tEs6eCnu+&p`o_67U&Di7nE>E*Wt|5D;fj6_-nKSXn z>{?eA=(GG+RD3s?ea8{o48!22b57Hf-dy}HugNoES*AqL9QT~#%|;CqCiR_ZThTV9 z$$g^dq#Fh;P14d4Er%c2+3uV&NlRGD<9edXiq?)prB#eqHh(hN;HIb4(Dv1*HPRvN z(&;BP+_^@ajZ{*4OWm-)(gLONT) zoR7Ne8sBr}zgPa?-JNdAw138#Cmb<*pRs;m$=>a{TYam_-dpiL&!o5g`0?h~zYDT_ zvQ5XNS%G}%0G|+7V`Eb@3u_yDCwDLZfZ&M8xcGvSir&dnfbyF^_1_0loFzei!T+Iv zA=tk{2qakG5n0T@z;_6Q8AUa`8i0a6o-U3d8o_h>9r+G8a4uOE8RRMUQO{xU;n(BNS%G}-0G|+7V`Eb@3u_yDCwDLZfZ&M8xcGvSir&dnl*C1J6lDxmFMhF`T0dZzLEswa29w(7BevL9RguS zQ4OyKpx_)&7sn8d;MD$$e1{b{Tpa@$*Irw7``>?W_uFq1B|8me9zSJZ=r~uc^j>z+ zRtJ%!U0Q5P)#_=1q7Of-vGB|}ou)dgn~g<0a_hEh-&VygVxAxI%J7+tyQrU>Mq%XR zMAKWxI{g;p&P&+#kMS?}C-xI{^^rPkIwtoQp5L{y^*-2BNvcQSao`njxgN@xNAqvCXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_pipes.png b/src/main/resources/assets/tfmg/textures/block/steel_pipes.png new file mode 100644 index 0000000000000000000000000000000000000000..a17166d5bf2f24fecfe2dfd430ebb2acdf9ce571 GIT binary patch literal 857 zcmV-f1E&0mP)4Tx04UFukv&MmP!xqv(`rRp9PA+CkfC<6AS&W0Q7nRm(pG5I!Q`cX(8Q3W zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oic;WFr&U@!@-+h44s4~q8j02i( zo9Tok=JG3I@D;uAA&eLTGP8_iW+98N^>t5osqW%D3;(OITCf=46NzV;VcNv&#M7I$ z!FiuJ!pgErd`>)OQiH^gTvt4P<6LrC;F%FKo1P<%5R0V_RyvrKO^tYpII3zo&skX=9cAN-!JRh*pgl0p*D^Wr!kqd;&MXx1I)``B@sCxHJMxYFDHjRr9DNqW7l zMUQ}iZQ$a%ttorJUDV93U_-GynhqjbsKJ0000HbW%=J|NsC0|NsC0 z|NsC0|NsC0041%NVgLXD32;bRa{vGf6951U69E94oEQKA0Uk+2K~y+Tg_6;hgD?mM zAqfzJ+xGvzb}!;uPix%!CYcikA`us^P4qPhH3QI>IY2i40XTr078`KwVD5tg@O!`l zxO6Zd9zgMlWNRXlV@_@`BcnE#baMbVl1|=s;Cc^e(6%vWi%Q7^?#A3+a{}Zhr_Y^$ zP_4bIl5s)UC{I-?BNdB64G#D$V-%DUSXb_FZXcLHE0 z-aCFLTEqxb;E?>mPqpXd@m8iWdUbb3T>&LPte7Ceq@y7YRMltXfTNsr<1rspvQ jmsZ>yo75xUi{knVa8f22eC5lB00000NkvXXu0mjf@sW6? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_pipes_connected.png b/src/main/resources/assets/tfmg/textures/block/steel_pipes_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..ab68012e09797ec3a07d7d33e4d7164c6eb6eb23 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil=1AIbUZEPHTd;)@l!;_NI5))G+BV&Vt!o0oxv$FD82vE{RmJ&+PD3Gxg6j|DJj->iKFRKQu_5n0T@ zz;_6Q8AUa`8i0=T@^o2i6+$-n1s#hT3DcKIdaF5~m*?cPW3F_4cPm-{MSXR$ z$lT1ByW$JCHx|g-G6k`30-8P@4ow@B<&1GpX9wx3Q_Uk^FWpvDWCNj~& z;LF$617&7sCf*YGps-}8^!=G1*bj!O3At#C7Ff({k-EY1;=;`z%7`D zPH!3SO*an4#O4G=2Sh7H@eZzNk-HUudxO|i0YSf^m~YkqZxW|_1_ePaJ#_OQYg z^A61Bh`rZosB`D&uAgcvyq9kAS#hdxalJs;=jnd23mVksbWU){6g*I|k5fS5a5+=f zjk%wXGO#rTELAwd^FhjK(hK?5-2%?DGFKLIdG6RF%GtT{M*fcfjrEQ@?%OjyJEi)Y UWra^GFsKI2<6->VG-QHA?1m!$EZ#!5y z-{R1zOvuR%KZ|<+kh( zJr_M^YgX^pUr+RTM87=cxt`gp(CDf%v5AA#G$f$4*W#^}rr4ztz0!~TyZ?#o6e$Wl zaKf;kH)BGq{SWy+^VWvWne$*j82;q2`0;o)m%=cJ^hE+HWs8=F*AR2~@_H+AYP3j-aX0gI=u z`30mzN`m}?|6>9MfB)x#KzYsrkH}&M25w;xW@MN(M*=9=;OXKRq7fY17sz+mfWz5$ z&V{rsFU{W7Ul+U*diS1t%Dg8G44NVnl^oV?Wn5y^!S0={-EwI%$2tlM%qt6uF} zbMZy-z3)Lc+NZ6kVU6rl|IgCD;)W^*Q`PS&>jgHReHPX|A*n3n_y!#x#*H)DkG}l5 o^8Sgf>3*L!7{@>O+x(mTkvnI_*;VG5K({b>y85}Sb4q9e0B1@(egFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_railing.png b/src/main/resources/assets/tfmg/textures/block/steel_railing.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2c3cc20c9ca7e7fc47876aa2c5f96033be9c83 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`)CKs2xW*@^ z#wDdDrlu#QW+bGf1%-ykCL|@NWu|53BqXN=hebrh#KkA4rDx@)W@N`ErbNcXC8lOX zM8_tiq=$q@M#m=xhJ=Mh#l$D3B&MXrB_sn`@kuFRk)W%2d<_Z$ zE`g61X=eyjOHX9k`=9mdxnoT|oM(MD-mSmgVHmsKs$*-O$jozxOf6fIeLcTRY(M&Y zn?yz5eDBTT26ye#`5Bmw{AYN~#FWR(D4or`srkSHg#|0kF05C$Aghqzlzopr04i~z#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_trapdoor.png b/src/main/resources/assets/tfmg/textures/block/steel_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..02fcdb706f0a73fec73d001ae411beb816b9df64 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFx=91$58UrZza zeECwtsbJ=a!w$Q8ge4?y^sox>v;|BEVVKYyz;lT&h{sqUk@ZXvM?wMvgZw(dPo>MA Rd<0s;;OXk;vd$@?2>?faL;(N* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/steel_truss.png b/src/main/resources/assets/tfmg/textures/block/steel_truss.png new file mode 100644 index 0000000000000000000000000000000000000000..14ee9b376b0d39349eeea9d3bf46c803505fa737 GIT binary patch literal 282 zcmV+#0p4#yG_Wz$YZEdyQ4Enaa z{a}p{7hOsY$5WGuIO3+F2>bJ8(gd-%#6~h@Qi|c*^>)veR5L*=u41;V+#b)@*Xe`# zV(A1-sT3=VBd&63-N2oG=(?E;G_F5l{WS+qnyP`IDwrUqGWcr{m(5Db#*P|9F`6m#1Y$Ht1AniwY_#%>FoPCR0`=^{~CaqKqGSZU%bkI9%AL=%c;kEuMW8aU$g gm}rzg%|=Ac8>(@2Z1&eM)Bpeg07*qoM6N<$g3&>DuK)l5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/sulfur.png b/src/main/resources/assets/tfmg/textures/block/sulfur.png new file mode 100644 index 0000000000000000000000000000000000000000..4559c44d4352e3b55f1113cf5a712c67f064a0dd GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFNUz**oCSrQw`&7qvTsw&5UVUD~oSu&sivO|G!|$?`6dd zmkv!-YuM^@XT#OVW$P1<*l|2fV&8w`u>Nb|Q_C(-xz3!mYuS%??o&Q)nfY4Q=96x> zRkM0gTm-MAp00pY-3m`0x!>uJ`@&nDer9wxHTD$jzPZsfV&zNzRRI#Z!r{LQfUaTi MboFyt=akR{0Q?4MRsaA1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/track_ballast.png b/src/main/resources/assets/tfmg/textures/block/track_ballast.png new file mode 100644 index 0000000000000000000000000000000000000000..cacfb8e482197223fae90e7dab721c5372324902 GIT binary patch literal 536 zcmV+z0_XjSP)%K!J+I);;deO_#B%xrpd%|jNt$8y}Bm~Ov4fcNd5lQ@z zLCx`eW*R?wJMq(-g}L(;B+6({CxD;FV_nx^@Q{R`w@Io?Q%TOyiL8!uPXEL;Jn1)) z$2F34vse#dK()Z%>%L&HBFeyAzbL|st1&Za@p?KD0vTnLTU2ql*OMwHLs#{{$%;)s z&8sB5At{}&#D~vv4}(>ZWdV8Dl(Tz#(#Z$1YqCJf4;OGyV5cqQ3zD(>j)KS+Fvc} a*Yh9tQm!s1>NlML0000f`6kn8+sh9KP0#E^Gfk$L90|Vb-5N14{ zzaj-FSncWJ7$R|5wbxRp#ej$9c)N_Y;6}?QGgy*@a&xMGGKBvAZ>}Q}$$t5ALGhbY zCk_0TtKa19&Y#C8D^UIUWx&CR^L-le<@b9(Cm(fK(>9|%ILYck z!PTTr!$qYLRi&nro=ff)IViL)pknvy&o8Hj|7K3_6;5qjxVjJM3Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0ij7mK~y+TEs_g% z>o5pJ1^OoGd;8x*Pq$Y)HbT9qRdQs3U>HWo=hv5rOrNzBU#^muyQrut2VYA?l8Bi} zN-HH@1gX?g=OjMO_$;>Tx^2$;zB#<#Z=ZgXWCl+9GvaVnPk(0DJ?RsDAW;X^E zg2q}&HIK15)J{tr@KXx^^Yt9#xfwOJ+vpoaG@u}vEKDTA11okjx+fr3v>U{x!w+Iy zBN9@EpmdrE;3kpjZX6WR$Uzbm3jX=vxwL!6aij{ zfi~slJ@xT;pmb~H_4@eu_rHyia~)&s7W)_v5_tQuzTcIBkn`bArPF O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~y+TJ(3HK zBQXd>ZHzzN9p(PV812a-?ewJE-+g4HB~fBypo#+j_2+Aj>D=13{jPVbT{S$PPmOxt zIPMq|XAbY5ck4~oTx(75g-cF(KSFo%sIn^G~$d&t#7ld)&?>zUflAz6cDVki079$0DEuuW$gKf zEe6g6WzDD&V)~)6f`sGPfdVn$jd9x#^Q3Y-j{SJxv(mgF(U?7GNGWsm9<(9!8^Rc9 zG6Z!O7sl}j6$C|s;d42Dy)>ZU?t}|00000NkvXXu0mjf6tDRn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/white_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/white_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb5c7fbf5722d1b0efa817f1251637be3a31297 GIT binary patch literal 555 zcmV+`0@VG9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0l-N_K~y+TC6eoQ z<1h$>5xUr}-F^RGJ$=V+W9tU{DXZip7KUMFAbfv+Nl+2r_rq+8hcSi(&pC_8oHNCw zQCn-H_i3gQLQb)ijl4;~ENBQq*}72BN3XTIId`sLhdw3%glt;tZS|o-f=$<;G3FrJ z#|R5LDXsa-DaZIG<1)dX1~45|BkjzcdJQ}W?XBL=Jw|(;%E#U5aNn=ze${%rtUzyV z8XSjuX9`HC}q!uv#Bb4&hxykKi7F-41oX!9TL*FePw7sDsdiqhZw*> zJF?KpYu#2}Lab4IgkaVwHhqN z-=ClNe0({(=rMq@+@VRLTulr!Fp7w}33O}iE^F;pZAxPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5C8xR5CN?ty>$Qp0o6%FK~y+T9a0I7 z6fq36opWYb7K!)qF`mM!K+DW_;)@DtsoQb;D3^{oC!vc@qH)U@4_Bk<}shFEk$qMQcKtsidj^51_cgaJv3} zn$g@bI4YpVmNOoa5ML~c&cdAGhr$fJTVXCb>T0|&PY7TeeoE?UL}PSdM1jmeFUG&h zmT49^K%apdogHMPDu~`lxULJlTap4-ZGeZ8rwWn~p1Ce;0jGD6Chc7wZ{BAl%`uB5 z_$ZIJ(|Fz+^0}7&^{{O*U%O%krc<#*b2l1iR;;%4JNa2?wz~IAPB)_7Dw;wDm>~;r zshexQz@E~@_5oc~*IUETL_1#8JVkq05AP9^khPjA#0MiXux+%(R5CLrYHwWrGmGAQ z6af*y#PYx-WP}|-7Z@CBg)9NDoKOq^Sqni32V0V1L1CZPG`iF6x#Aye7G8HrOmr&% O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0sBcrK~y+T6;fGl z961c-CaJ30?KrD1mkZ4a=8nl=0z2JZk|>g400H6$m$%`+|9ofJb!jWQym7mRJ|zAl zToH%CL1bWaY6aN>3jrchYwZXpio5q8V87hfTHvm0K1^?O4&u{exSfQ^3+h}5yo+oA z5P*(5$S0Rqs!!6kx;+J52$-l)DYcN-f+FJl!tGn&XP{@tXDBbceF=E_TeMfMhrok$ zSwG)=oolW!Em7v1CcV$|e$zRY+Bm!FwAFpxsn*ht&m>o3+#3qTw%6KP-S$E%aT6MQ zv#qQm!X-)D>A89igh|mM&M-4g$_v9iz@y}6p2X^3CP>bx5QAd5c1D9hW(U7<5#Wy? zSCrk|R|-SV)Vn(nvy1^m>N+qcn4+ilrUnj0jo0!BT+ql-hT60|JNx7bd)JsbjS?UL zB@1^Bpn%YEry^SutEp@|%JCZf)$!OaFC=?Aj^lcbNUB_`Y!!}bltw038}AtbqzdVd zZ0czs#+o)CoOZDwM7SXaL8KCu%eE{ry@&O%sePKAdj7x0&!zXJ=~lKyG9jbOsSWt* zo+}>$?}E3&GeRjt<2SH3*WU=RjDs4Xd?2}WWycF<{Or!u>z*0Qqy#hiTBG~ygn_aC0FSL};ql!>^Z)<=07*qoM6N<$g8c{* APyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/yellow_concrete_stage2.png b/src/main/resources/assets/tfmg/textures/block/yellow_concrete_stage2.png new file mode 100644 index 0000000000000000000000000000000000000000..a48c9e58543458ecdcae8decffec97fb84d97312 GIT binary patch literal 591 zcmV-V0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0pv+UK~y+T9gdu2uA28|4yxjA%Upzs z+{Sbkbqd(tL9Ar8?d~$?G#h)i-rHIebMNogs?(Tjtks0^V)K~Bp=kVcF7Cu^8WM*q zYD(oy=NHK%gcS4;Y^ZWdDdx*0YkaVLh<=(J9J1zw9hMefKtq z7|FKbt+x95yGGr!xA(s}>bTcUGVJ&YiiqJlV~kRcg1wY83P-^b^gOjB%eqoz0RW8N zE7KHOltFn$8|kE*eNH_N8NfI37Hw(jNzb;=KrS>&|`vad}~mgGeaH* z%`mD%(7S8PV{6TKL-M^fsB5(EQNKa#u4QdJS#yX{d^ZCJl*_lS7DiOsW=P&0F6!Px zB+O+9iUdAXOKTnCL})Y2l*%C?qw5NiY*7WG#p0GH0KgNZ1nDA0bQ;zNBH;WM?;OC3 dI9*U7>kk*rY^4?cJ8u90002ovPDHLkV1hAO2=o8| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/entity/blue_spark.png b/src/main/resources/assets/tfmg/textures/entity/blue_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0d810fbe6bb2fae9cf8891016e8eba7d5f5c64 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK`T!e#}JL+Yv&lp7&qiPyOfm6&lRK zQ_>P{tUgQu4P=x&I8HDGZ*jelF{r G5}E+ORWY9c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/entity/green_spark.png b/src/main/resources/assets/tfmg/textures/entity/green_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6a1bef25c2167963f62481fc6503bae355ac0b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK}$~;#}JL+zopr E0K|1HQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/aluminum_door.png b/src/main/resources/assets/tfmg/textures/item/aluminum_door.png new file mode 100644 index 0000000000000000000000000000000000000000..97eff285c6b18fba80a56ed437593ea1a73c1508 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!M~m^jv*HQ$r1$zIF=q%P*i(qKjoxB<}DTt zZl-mgH1k+^&UIT`t^E2$`F5J6SR;!6YCqRnF zVcB7Z6J{w2`pU--=$_zws>smAc!J@sSqXC@!(r|d3@OTH(GwZtm^&CH*nDOh@SZxv zGVx$wfEd#Pm&MyxpRZqPd;4Gxvzv%!8~1-j!NS%G}%0G|-o{QUgDz`zs7k4>1+fA8MCpFe*nD=XL6*8=5hZnks+DbA80zu^B+ zz!2$)Fz<`4#z<6=zcl*M>txnsg zI?Pem`nOVE;kDW4MrB^6trMHhgbTIITv)1}AehG1ut|DBhb4#E8|T(zQvS{FWiMCk m44hE%$l+Pzk}iFpo%WOFu;ub6pS1&8!rNS%G}%0G|-oirT&n+jhNv|E{pO^xA@-x@bhBN0Fz3#-UI6U*w8~^(&s~GI>u)b4|Y}5i;$KdJe=d#Wzp$PyA+hX$o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/cast_iron_ingot.png b/src/main/resources/assets/tfmg/textures/item/cast_iron_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..995820938b3c2a4d814f1232a30177a0752a7f69 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|+7Wo31JeIqk7OGigHU*Djps5n_^S)k+|*?YV|ilZdRFZe$MFx+e2 z8wnKSEbxddW?+W7eCKXbhsx$d*}TRAm} zuVMLX9?x*ij=?~_K6%aw16D4F6t+&QjFdT(^&c*jJoH9&LFvh}IgLR^Gjk8`ToAo} tRpru{hQfM>smF!Izm&X}{4o0+_x%P|$6`sj-$2_KJYD@<);T3K0RV?+RyhCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/charcoal_dust.png b/src/main/resources/assets/tfmg/textures/item/charcoal_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9254673347a61ac2f9fcac25c7e75d53f237e2 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|y0G|+7Z8cdfRT(8YaU&gNL4NM^7%w3K9w~7_11&{ASF_su2oWJZXBz_t zOWn9&M;&!JRYfULVSYJjQDu1vSt$`=L0&NtkhO{7mCZm(q9n*K_&;{Qa8_9F6;KUl zfk$L90|Vb75M~tB@M-`GW_r3fhG+yYJ#&$-L4kuc;8f5hkIg;*|6gVa&)vtyf3Mn% z@!d1_1JbvQd(yI2I=(m) v2~RrYc+CzQ&U4+w^f}f0!oLINvIh4fV}uz#nFQ|uTFT(*>gTe~DWM4faO!LA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/coal_coke.png b/src/main/resources/assets/tfmg/textures/item/coal_coke.png new file mode 100644 index 0000000000000000000000000000000000000000..b06c9365607a99097af9ca4f67fb30c99b5d3a35 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|+77gxvd@X*BM_^hlne}A8{@}fzTdo8U^4UF`GN~Y>M=m06Mk|4j} z|1iL?>5R^KpeSd7M`SSr1K%MKW)#)%Y5)pmdAc};Xatw`MROf-;9%LBEBySQc;EUr z$DO3uR&HvY_<4H1;>>xzmZEJpOIcDbD)JZPMqFe5P+t@4JR#!$&R#^>KR^g_!(5@@x)!+8nlso;ZVWpsfs^u6{1- HoD!MNS%G|&0G|+7M@Kh(eIsRMby;ayi8*_%uKZ_=$YrXX%jE7*z5RdeivK``Qm3jw zhVhgH`33(+00yD^=gtAeISV`@iy0XB4ude`@%$AjK*4NJ7sn8d;M%j^LQIAnECKs? zmA~&_KcOe>RO^}-?5rX7U->&CzBEXNe`G9vH|+`Y2LZKTOoyC9e;r|)F`Iee_ueh1 z7x9`e*{d_bLsaU-ywY=X*^|z9tMe=56m_0y-r0C>M%~q4lhpMqLas{3b8;AeyZ)*i PXf1=MtDnm{r-UW|Wrk;3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/crude_oil_fluid_bucket.png b/src/main/resources/assets/tfmg/textures/item/crude_oil_fluid_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8717dee755068bf2b96e16e622f3c270880c3b GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|m0G|+7Q&ZE5ii#OCW=M!h%1Ft{%P5MAN=k}LE6JVg`EITQ3LLBf(R#+YfB)YtF$zUSPbyWt#fbK8kOjjL=F9-r#uowcC)XgQOOddI<<#?x{hKkD9v aX5anoz{Qa<^W0pZr3{{~elF{r5}E+jp>GBN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/diesel_bucket.png b/src/main/resources/assets/tfmg/textures/item/diesel_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..28f8f323fac768accb565c399b0aad8b6b82ebca GIT binary patch literal 233 zcmVG(Dz>eF24d0umHjy&|Cre|KI`LGO}w3Kxs7q jS;$Aztq3mJ=YFCmS(0u=P8NS%G}%0G|-otdx{x3l<(Za3~=<`sw4Rdv@%M2nlX$Yy!&XzIt#SNO6_~`33)n z0)}A!3L%hSfk$L90|Vbd5N6ylG5al0FxAt=F+?M{_FN?20R;}03ywG6)j#43n0%~X z$alu`u05~V4c;<3TzmJ-#dN9=lY}p4Sks-Wda-G9;ts?#yDLe#glM~*V9Zndu&VKa z*gB^pd*c`Cq=n=xh}cu8F!ySwsr}z8tTXx5AF}?Ds(dU0w2;Bm)z4*}Q$iB}j2K~F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/engine_chamber.png b/src/main/resources/assets/tfmg/textures/item/engine_chamber.png new file mode 100644 index 0000000000000000000000000000000000000000..31f452eda181a956e59dc0a266a8f3623e12b6d9 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-on1lomFR%aq|6jj;eZz(g?d|PZIXR}Lra*a{bC=nH6lY10UocPs z7%&9;R|tUw3p^r=85sBugD~Uq{1quc!5B{$#}JL+(sSN?2NXD10_vLY{6DgEh2ZQd ztp}$IF8OhVUqI0K{5C$pz|E6b3);;tbeS|rJ_uKGUvOT)@NyyZ6O|vV(NS%G|s0G|+7H6=Au15*nV3j-;V~9rZ+#XM+0}33>oQ^;K_j_Ncda?1Ng0W86 z{6C`CBwwvCu=ug+->kzA-90N@EKE(4itUqD#;)Xjn;?6zc(LVkw@C~fr=JOKyHUG! l`-(HAl`U6#w4?8Y*gl=c>hb;PQ8u7844$rjF6*2UngFHPQ|tf$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/gasoline_bucket.png b/src/main/resources/assets/tfmg/textures/item/gasoline_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..6f52794aa2e4e728eea1c0a51cb9d2d635730fc7 GIT binary patch literal 244 zcmVeuvdnzI7R5g#grFhE zxt=(vl=3#lbesiovDq)_epu0MxA4By^Ue&JK?sJ|`dK(_%GOglt|u>tkR*WJv?0L! z3#u8Nx21P>9~e64$XeT59$QLDTI)O@G+;1FD31m}DFDAP?t1_ZzXBle4v_o;6z?Gh uWXn+a4F;ez8UTfmk8Tfz;E?0oPxJu4;bjjsBtoVD0000NS%G}Z0G|-o$oTkzl8WBRQ-Z^zZ0w!PEUbe>0; z!mF2srIjl#+-&Xc?VmagsQX>;ifSMwToU9L{2v1_Y^uG(0hHz}@Q5sCVBk9h!i=IC zUJXFOGEW!B5RKs6bGP{pEATL1VDc-B(#!q#Kbc))_O8r{pB^Z?pGvd;EWS zWh{aWnwD=)gcv24TR7Nqi?%xp*q+r=wJ^DON!_HKTW58lwBF5N zcx+a&9PA>`-{TO X$3(g3`tA|~I+?-K)z4*}Q$iB}F}hRI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/heavy_plate.png b/src/main/resources/assets/tfmg/textures/item/heavy_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..ad048493900808ccf9fb952c8dbc1edd6f37a182 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|+78+)gK;E2e$cry#@f|82f$y1DtO|RX!36#Gn=r0MRI7@>3g8xGS zL$H5^5J<4VBeIx*f$tCqGm2_>H2?*JJzX3_G=jJGc=8=E;9%x8JpDgDW{yVC)oNY7 zGZ78{p5!;~jb}VilezN<$Eh9$mS=feWEwLqgk77DBwbu=w#;wZibFv=>X)?hcJ;k@ fsVDc*>pSzNezqxrj?Sq-;~6|%{an^LB{Ts5KrK?B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/heavy_plated_door.png b/src/main/resources/assets/tfmg/textures/item/heavy_plated_door.png new file mode 100644 index 0000000000000000000000000000000000000000..baf435bba8e26a14c3df9e405f44b7d7f0bcf670 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|+7GYjj0;E2e$_=1uOV`J0a$y03Xoq&?XSJ$xtDUOmLzu^B6z;Lg5 zZzNERv%n*=n1O-s5C}7hYIrpO1%o|Z978mMbNd0ink zBK~img~iqCr`yL(<5hTHIJb3!=fn$bP0l+XkK8h&0B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/liquid_concrete_bucket.png b/src/main/resources/assets/tfmg/textures/item/liquid_concrete_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..b6babbda85b54bde233033f2f52602478e88abab GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lf&0X`wFc6N5Qwzduq4sLF4j*gDu;o)9hUNJE-uCA_5PEN_m$-%+F&d$zp zad80w0UjP6E-o(a?(Ttsfk8n*Ha0fa*4Ck+q4xIn7cN{_ym+ydm6fHX<%9_nu3Wit z{rdH*SFbKxwrt9jDVHx_zIpTJpFe+Au3Wid#fqs@rxq3#E?>TU>C&Y)Zrms+D7ba& z*6-iHOG-+Li;E{snsn{jwbIhkY15`no;NS%G}x0G|+7Q&ZEE7ylnS`TxZE|EJIWzjEXMsq_C&UHE_c!vB*O{-3}4|Hh3Q zMMXs`R;-vdZQB3;|AG2K`@XybQi3Hxe!)Ny6u_Xmc4iV#lC!`gvY3H^?=T269?xHq z0u;>hba4#P2#!79&DWs7!5XmPL+gzH|FJQ@9GBwO>gHfwz0 j_oPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0uD(;K~y+TrIOE! z5@8s}zd8=%I^b%<7RHVvBnX~8Ne4H`Sct%b$1Xu2f!FX@C;tI&9z2Vu4qb!|)D8<) zE*iwPL{bKtqxf@k7Im8U^_{7Ky+j`vp68kOdB4x|KJSZv;qjvf`jdx8ItwW-W+~5~ zJ*A7MAJ3udwmcm8Zs6$n9^Srw#s2JYGHY=w7=*GfKv5Kg!(jxCSoR7yzJC|rdjni@ zBFo(2U>3<_QulfGa65Dda_A7JCvPxWX>{%IrUb>ehx2cJ@cskz`+ZcaRl3*eV6|G| z%Fw&G_<|4b-a`omAv!j2I-SsrwX?53@bmHti^YQGnpgtl%&MwlGEt!pRh)hL41Qn2 zX0yR)@yif*LDMu01_RrCECEufP$(di$zVR8W4TLk)Mj=Vk z^&ODS?RJ|*Kt7*m-VU$V%e-B#i6ua)HJeSUP7-pt99!8z-UaDmI2=-I@~0Prcs#C` zN+s%(>32FEDmEI8(Cv1qNV!}_qtUST*=9h_-D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/lubrication_oil_bucket.png b/src/main/resources/assets/tfmg/textures/item/lubrication_oil_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe2e41a18dc0ff161387cca9170d924b85a61c6 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4a%M_jv*HQODAviYc&vQ`+q5^N4a~p(S!|~ z42(XC&ccDM|W|zUX_kH_rx+UK73Zk{QUjG=k{M1c8DxnOt&I7-Pk*u6`C`fMZnGC8Y33zyI677PiS1tZWShoG6*W7eckhlcI9w>RBc{Q) zartxct&hJ;s7Jd-PJ6M7FLK(-9?wZC98C-S0RzY1;#T+e>CN*7EFL+?(id z?h9A0a20cXsd`WAvpMr$IyK0DKA&;^sn2OsU>NeHMtG+A`Z8z%*&IL&0+)g(gD6i| KKbLh*2~7Z82C8cS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/mesh.png b/src/main/resources/assets/tfmg/textures/item/mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..f9edecbf4d9a3797cf1bdf16a3bfca1e48759c3c GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!75J|#}Etuxf3q(9#G(5y}KgV#WPWd*?Fl#OE{Zjjn>?ey%_)h9Ae2!;r(@&WDdBia=)ZJt(_zMd`fNT0~m z0@&lMMe}oy*2Rz(*NC>an5M^$e;*i@Wl2h@%JSG@7*diXet>DfV3bg941nqY{D*d5 z1Mu-H00Qp-wNHTTJ=g$m88V;20F)X7AQSS@?WPcP+0Ok$59{S^vCAw2fdBvi07*qo IM6N<$f*vw!Pyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/naphtha_bucket.png b/src/main/resources/assets/tfmg/textures/item/naphtha_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7f0bb49d229ce800d0811be1c3446ca5955c14 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}-0G|+7Q&ZDO4Vh?7nJ7(}7%kao4VhRi*?3*~Xid3TZMhgtxkyd91ReQU zAkvZxSC_eQ<3_xmVo_1iv}w~4^p#euSn>b=|2SO*pm~N>j4OeZWJ!=;Fi;RHU|=-i z+7492S>O>_%)r2R7=#&*=dVZs3RZc#IEH8h$DU{8JFLLL8W3Q1E%)sTvFCsNtuEX$ z{d>?QuEk}=^pb{Yb-B7qY)9P66plGO6nke_m45WkjCt!{p54QI#)VsV{l(U_qJ7Da}*VN4UQ^E$qJjWq4yT(q}zM{ z|M)*`-OC@m4U$ZU6?{)ftY>uho5!9!;p}Vkcdf}2+$Pw>F*^vIU~3RLY|@;uh{vIi wHOK7n6&_{-=LAN#Ep90cmmM}8V`OCbc}A~j+0I{&fDU8uboFyt=akR{01Bu_V*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/prospector_tool.png b/src/main/resources/assets/tfmg/textures/item/prospector_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..53becd09788c7188d022b939b7219d2f359b1125 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChBpd%8G=SokL^u&s&S_tAcerxioyzi)4E*Kgukxjy5^|344CH!zAw7JdCw zx`9#Q@ChRoMK#Vff+-v)3??iL&}2)~=oRq)kwZjs4dzxBtAQyb^!*{FQumZuZ#?rQgMPOcfZ6 zC0vD;%$z%S?!&jY%Xy@{R#})TGplLvUO#j8?CArC51%b~dCPSLPaVTH#>mgR%kw4f z?X5if;m6D5rftm(i#KihRiBusxZ#<5znsyZUmtrj&MGi`J9K`&{mDx_?3*ra`tK-l yN|n*TfPo>#bm{8dx7I`fgOD#Z!ZXd+mq822<^W<4xD-4YM0vXUxvXs z`i(pdtveRzAGGqHf@)JnwKQvO0V`MtLHL$cfOft#T5|{2$BW5L3|C$}CoZ#Id&=9U z^Lpo#Crv9Y;XM?yy$*KFu{)E0>!`NHttX0KJ9vz?u{uD5!|rK?>Yt z77*3ds@#FTOpE?22@H)W7v8H>8(NJqIQGLnLqRFCH3`t2GIJ(%4xkQU>7BlwS1oVD zRO#552+v#bfmwaDIvL^?*B-N2)sE*Vz2xl)$*P599D6DxDkNR+!D9;pY7i*??fvr^ z8cEP?eyC^ygB?n^mQJ(4M7!`DHnmk$*&xID{W)<%_RI=ou-}@#-q3gRvy2TbDH}_3 zpNkjRIFpGcgWS2Jss%k;k&!@U^Z+09?gi!{U*vkQ2x z8K-!}B^5`3**sk+pIx@tbD|L~&{(7MqwBuN4d2VQ2{U?x@T;5l>Bc;AtLow%X zMuc?6lwtLvW(Q~I+MgcbFO&Zqe2%?~ug_jwR>u~}l(x{6KIu3SA9pP-s?U8hI)k+{ zHQ)&h`{uQhVmd)%KJi3SV-a^pt@e5Jv^(z?V?p8F-euAY631Rt?C^?(?-U;uG3c*B zX#H*awmW%d=2jhO*3fB_7fKPL-)-fRdgN8}&?8`KFR~Jtf_vZ=Zqm;wfj3g(+OuTI zl3`Dx-&wi7=z|ld4-(2TUYBlMKn`mUe7*LqX!@H2UEr4XQ}-OFvy+T^8M0AY7hO0u zht|_d*k5Ia3YQm#=g2wVulW=jFU@;9mOK_8F*?6xBZwSJ$Z+?UQ`8+GQ*{#!%12#& z`0<~iCXo2jI|}f{d-1_8BZh7UoLf(0qIBvg2ld1Ee!w)8Kp~JM{bAT}p*3pZ{_8Sn zr!y3WjB+3{FOo1{;;u0U6V1)K_i*3@V;np1y1}G( zguzi8f$?!MsMMNY+)tJ0NMSV}2t_X`;AkpYA}5H2>~6TqgR=HqPExB1j(O#K<8%2H zE|}8IS(NwLRKTM@GHqM=MvByn9%rghH4ij?io%&n;D6}ycE!|`)h2Z}v&%TE RL-TYXA8&uJ>z=%y{sAjdI&lC1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/rebar.png b/src/main/resources/assets/tfmg/textures/item/rebar.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6308f90bd80a9f67bc072e10ef1390d7cf69fc GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|&0G|-otel*fgoNwYubY~h{{R2q!`iIaUcp3Dtvy0ZS6jAC{S_y~Mo6DJAm{>PhpQzF=P=3$7X2)*^=Dqu5Brftf pFBb18`oi+?%X@{L-!DpR<`?NS%G}%0G|-o2@@t%R#slQd}-y%6;GZ#`T6rlSXkJcIkSNBs^9h20V&RsAiv=M zP{0uEUm*k%EbxddW?8eR=R!FW#>#}JL+rDp@h90WO7E}Rj0TYofP$i6PV z-P!!;r%w5V$8qNvX-P%OAJpLFZ+pvMqbpn`V#nzy|0zcf#tWFFwiOnPgg&ebxsLQ0LWWh1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/sawdust.png b/src/main/resources/assets/tfmg/textures/item/sawdust.png new file mode 100644 index 0000000000000000000000000000000000000000..6f60cd8de89f3768ceae5c70ea6af43acc052b28 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-o@-)Xu)!rLsB<^3DcXDH0vY*kVeQmxLDj@X+nIS-mvn0qb_&*dd z1p8MAfdmUYB8wRq_zr#}F!5}|L4h1o=o94<%&TE*b$>gTe~DWM4f*D+YS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/screw.png b/src/main/resources/assets/tfmg/textures/item/screw.png new file mode 100644 index 0000000000000000000000000000000000000000..25220f10fe824673622dcc1748992148a9e234b2 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChBVdAc};SokL|;L^}o`9oen=A-;6RZauP%(iXU+}MhE5?d}MoZZG}#?#I( zlUVWjndss5^X(=5=2~z~-@dW@7rziQV@lx;ZnHJ92Y1w+wPIs+Wn~i-G;G_yzuqxb zVOHwXRLM0tIe|wU8S)r-_SAfx^YG^7<2>o-=ds;pDw^53QnI;orDg=5>;egfqDOb5 z%OCi)RBG$0PJH7{x#Bxl5;gXJ?+R1`vUozX0-T9I;*eZF&o+dCm)Un@u^70ke zma9A`>Uj7Jo_uIvoZuGV)3`{ACE|dJfX$Bo4T-WX){CD=Y+NcbH4vQoxbD0 zW7`QWjpoZ7*QRhVDRds^f7fK%WMIS~$uh~=zf**Xjg8^qx>L{Wjc=s_V}vg?!ZXd+ amq822<^W<4xD-4YM0vXUxvXGb4 z9-FzOt(z~sx98E@Q^RBbUB2nm1NI&TrpV9h{?|)>tNC|i!_&*^8)O_Aiu6w0yq@yp zpx^cf&lFGIPtd>f^Xue=Z!TB2nb-d}ob%&XtHtbzj3>f^a@!c#*ccXH$;w@uB$xp7 h0AFf^XPU1sgBFm@0mLA1DR?r7@^tlcS?83{1OPy(a18(e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/spark_plug.png b/src/main/resources/assets/tfmg/textures/item/spark_plug.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ba84ebe0a886b7cd9fa5c4f35912d67f37950b GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChCUc)B=-SokNW9AMfLTl=s1g}VN{hM)KM)uryJeQy@F)h9rTxudJwP~w%e z;R%lu4z3%R=djJ$U%}^de^<4z&ts+t-W$8Bxo_;;)O9JrPVad$Lm0DA(xiXv73>Bs zE-nTU(KinrW|2;4yHvn%Dd+XG!w=pi9#>FQJh&i##qk5$TE{O@S z!^9&bRvTwzW*TyEayIfZek^1Z+25GMeo;aEfXQ5o>d6m3tkX^S_ImpI2M?P?8+dk9 zeSP(Rd;a}@?TiA_Esl?F9BNv??ZEJ)tF-%h|Z) z9+8y#$9y(yYzz|8oi*z=*-r+BBVTHSXPU1sgBFm@0mLA1DHtTf;OXk;vd$@?2>?*? BpNs$i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/steel_door.png b/src/main/resources/assets/tfmg/textures/item/steel_door.png new file mode 100644 index 0000000000000000000000000000000000000000..34cb68998a18577fe2cedc565e666cbc2bc6097a GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}}0G|-o$oTkzl8WBRQ-Z^zl*C1J6lH=!qYPE$Ewoj#@`|e0ZSOvK_QI=| zg{74%F5GPG?zPcX@1Hu&L_^8mPzz{=Us;I@kPNS%G}%0G|+78+)gK;E2e$_=1v(-pNzUEUd5HxM^%`3NquO)iEH&SrX(I{2vM! zg8eImK!ODxk;M!Qe1|}oQB=dL0VtU1>Ealo5nS8n$j5BR!Q9L1`S1TDsZCeCY)hs% zr>U@5*#F_4@!y<*W80mq;AOkMG*9wbtigWchAWrfg;O!wtxaX@QIZ;;S=O#@eG$O7 z$IIt~Th+eO@3-Dc_C-GLlkGa5XR&^!<=>}s_@5N9W}3)Wt_E7l;OXk;vd$@?2>=Ol BT^axY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/steel_mechanism.png b/src/main/resources/assets/tfmg/textures/item/steel_mechanism.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8f39d8dfc22fd19e7896686ac0507df885a0e2 GIT binary patch literal 282 zcmV+#0pvd*y?$1wV!a6pw)>;e`EoU?gvdM?j&jZB3#V1Qabgan)$Uk`Z}tu7_P9GG zY3f9-1Q9^z^t;Q1c88P8Q5%L$3xMkHK*sF#bka`9RRYuNS%G|s0G|-oeXH%4Pjk6@+vUoB>z7ZxzI}_GSz!T`d@FCc8%S}K1o;L3hX96q z&3hw(Vw?pYk;M!QdcTE3$io0X85kr6Rq2hy6%1?J3Snyn za5SRp4%W7NYwE_*nngXT+6X}9*sn4Gw7w58-IZt06ux$*^JW|1Te%CxGEsaq00xu+ z;}Sq$?+>iewUU!5aP|$xvU)-HOIQKC875hS2wzVT1|Y9h*We8%1`&RD@~|Qc%Ru8U zb*4tYFoThbWs<^3Kj68Eyh#eLmcMg)_A@;JQ+Bl9LJf~J00000NkvXXu0mjf3$$ZE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/thermite_powder.png b/src/main/resources/assets/tfmg/textures/item/thermite_powder.png new file mode 100644 index 0000000000000000000000000000000000000000..5444441035dd0bdad205034c78ae8d8f081cafa7 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*1S2@bJD;kDB%!~QyHTV jPpobn!)2FEZa_y_-AT&~c2o}sx`x5i)z4*}Q$iB}Nn<_? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/turbine_blade.png b/src/main/resources/assets/tfmg/textures/item/turbine_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..acb95cb0529e35c690f5d929f582ef7c0d5b8a82 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-on1qB48#es^|351y$HU9(`t|Fkrl#%f?Lc`Zp(7iC6lY10UocPs z7%&9;R|tUw3p^r=85sBugD~Uq{1quc!BkHd#}JL++;iM~4GKKW7v2Tm`RkvgTe~DWM4freR*c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/unprocessed_heavy_plate.png b/src/main/resources/assets/tfmg/textures/item/unprocessed_heavy_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..689c0eca2d3da31638372aa782dd9e5290baa11d GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|+78+)g)sF>vRtdfeV`HL1`yK&Rl*wop@&DGNzsN~u1Z&5&st0c%T z_&*FVY&xTJ9w^FL;1OBOz`%D1gc(IOyc&Rlv7RoDAsWF;&v*(o7;v}*E|7fkPkftT z>BBHB?tk7|m*)RuJaqG^p6QQwllhqapRi75T)HBdix@mz{an^LB{Ts5MzveB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/unprocessed_steel_mechanism.png b/src/main/resources/assets/tfmg/textures/item/unprocessed_steel_mechanism.png new file mode 100644 index 0000000000000000000000000000000000000000..a8163fb21d9370846ca71c145cf83176ca0820a9 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn`8u6C_Fw9J}|@-mYhz z9BYHfn!8(MS>tyX3bQ^oVOb`5*R6!d=*XEvQdb3%Oo1Xd878pU@dRh*gMA%sa24j{dsse6i3`+#pr%5nqx*dO!wStY|%qF{r Uy*aGYfo^8-boFyt=akR{06LCD;Q#;t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/item/water_insulation.png b/src/main/resources/assets/tfmg/textures/item/water_insulation.png new file mode 100644 index 0000000000000000000000000000000000000000..b3dc05b9688b4e1f597f69c80b09541a86e6844b GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikndb&7m*qo@JwLzes-39^ZB?PM>g!Woa`7ogZ&Kq zO%A3LQi%*Y4eKhO@7tU3ZU5rz114s@1`Os7-tPQ58|p5H8SpZdpO-njQjqNc*A(A1 z4_0NS%G|&0G|+7M@Kh(eIsRMby;ayiM>%)|9cp7b(rQlGP!eB|Gyji{|ZoH$dk>w zK#Hd%$S?Rm0x$^OKX(o&&RO6QSZ!zxQrA zy@=O*$zGia9->kw=9QkC%bs+;Tb*Aar>OHx^UlV5GwQDXnxw8@5pq>Jo|D7)+x1uF QKx-L1UHx3vIVCg!00xj|>Hq)$ literal 0 HcmV?d00001