From bda20d7afe42a53b467c6c6a2f99734cbe0e19a1 Mon Sep 17 00:00:00 2001 From: DrMangoTea Date: Sat, 23 Sep 2023 16:41:28 +0200 Subject: [PATCH] blast furnace progress --- .../9047e4e94996e73e9dfde3738763637fb609e07e | 4 +- .../ad795fb8576279849034d802e60366ec43bb396a | 8 +- .../resources/assets/tfmg/lang/en_ud.json | 1 + .../resources/assets/tfmg/lang/en_us.json | 32 +- .../tfmg/models/item/coal_coke_dust.json | 6 + .../forge/tags/items/dusts/coal_coke.json | 5 + .../concrete/formwork/FormWorkRenderer.java | 10 - .../tfmg/content/items/ScrewdriverItem.java | 4 +- .../BlastFurnaceOutputBlock.java | 33 ++ .../BlastFurnaceOutputBlockEntity.java | 482 ++++++++++++++++++ .../BlastFurnaceRenderer.java | 64 +++ .../DistillationControllerBlock.java | 18 +- .../DistillationControllerBlockEntity.java | 2 +- .../DistillationTowerData.java | 4 +- .../pipes/normal/LockablePipeBlockEntity.java | 2 +- .../pipes/normal/TFMGPipeBlockEntity.java | 2 +- .../normal/steel/EncasedSteelPipeBlock.java | 2 +- .../normal/steel/GlassSteelPipeBlock.java | 2 +- .../steel/SteelPipeAttachmentModel.java | 2 +- .../pipes/normal/steel/SteelPipeBlock.java | 10 +- .../pipes/pumps/TFMGPumpBlock.java | 2 +- .../smart_pipes/TFMGSmartFluidPipeBlock.java | 2 +- .../pipes/valves/TFMGFluidValveBlock.java | 2 +- .../tanks/SteelFluidTankModel.java | 2 +- .../tanks/SteelFluidTankRenderer.java | 2 +- .../{machines => }/tanks/SteelTankBlock.java | 2 +- .../tanks/SteelTankBlockEntity.java | 13 +- .../tanks/SteelTankGenerator.java | 2 +- .../{machines => }/tanks/SteelTankItem.java | 2 +- .../tfmg/mixins/FluidPipeBlockMixin.java | 3 +- .../tfmg/mixins/FluidPropagatorMixin.java | 3 - .../tfmg/registry/TFMGBlockEntities.java | 14 +- .../drmangotea/tfmg/registry/TFMGBlocks.java | 25 +- .../drmangotea/tfmg/registry/TFMGItems.java | 3 + .../tfmg/registry/TFMGPartialModels.java | 1 + .../assets/tfmg/lang/default/interface.json | 13 +- .../models/block/coal_coke_dust_layer.json | 21 + .../tfmg/textures/item/coal_coke_dust.png | Bin 0 -> 19028 bytes 38 files changed, 698 insertions(+), 107 deletions(-) create mode 100644 src/generated/resources/assets/tfmg/models/item/coal_coke_dust.json create mode 100644 src/generated/resources/data/forge/tags/items/dusts/coal_coke.json create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceOutputBlock.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceOutputBlockEntity.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceRenderer.java rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/LockablePipeBlockEntity.java (95%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/TFMGPipeBlockEntity.java (87%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/steel/EncasedSteelPipeBlock.java (97%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/steel/GlassSteelPipeBlock.java (98%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/steel/SteelPipeAttachmentModel.java (98%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/normal/steel/SteelPipeBlock.java (94%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/pumps/TFMGPumpBlock.java (94%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java (97%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/pipes/valves/TFMGFluidValveBlock.java (97%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelFluidTankModel.java (98%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelFluidTankRenderer.java (98%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelTankBlock.java (99%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelTankBlockEntity.java (97%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelTankGenerator.java (97%) rename src/main/java/com/drmangotea/tfmg/content/{machines => }/tanks/SteelTankItem.java (98%) create mode 100644 src/main/resources/assets/tfmg/models/block/coal_coke_dust_layer.json create mode 100644 src/main/resources/assets/tfmg/textures/item/coal_coke_dust.png diff --git a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e index f3530960..5e494b93 100644 --- a/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e +++ b/src/generated/resources/.cache/9047e4e94996e73e9dfde3738763637fb609e07e @@ -1,2 +1,2 @@ -// 1.19.2 2023-09-19T14:23:32.3677565 Create: The Factory Must Grow's lang merger -279de59a50ebc382a1a701878d0e99bf46265336 assets/tfmg/lang/en_us.json +// 1.19.2 2023-09-22T16:49:10.0101293 Create: The Factory Must Grow's lang merger +7dc07e2f297d06725fb6b2378b917fb81966a70d assets/tfmg/lang/en_us.json diff --git a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a index 8e79db72..c39478ee 100644 --- a/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a +++ b/src/generated/resources/.cache/ad795fb8576279849034d802e60366ec43bb396a @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-19T14:23:32.3567546 Registrate Provider for tfmg [Recipes, Advancements, Loot tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.19.2 2023-09-22T16:49:10.0141303 Registrate Provider for tfmg [Recipes, Advancements, Loot tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] b7f5146505c40c08cdea7ad01fa99048b7ac5451 assets/tfmg/blockstates/aluminum_block.json 933485fa587fccc649b4cbe8f76f15e590cc8bb1 assets/tfmg/blockstates/bauxite.json 2b53ff8e880d35a42388584cb3ca896c55bfaf95 assets/tfmg/blockstates/bauxite_pillar.json @@ -65,8 +65,8 @@ e29906d296994a13fefc2beb22f7693e1027dd1b assets/tfmg/blockstates/steel_fluid_val 71b4c68d8a02062252c4dfde41650b7667d8c0ca assets/tfmg/blockstates/steel_sheetmetal.json 47b56dad1f2715aae7430b5f9acb1d51a26cf562 assets/tfmg/blockstates/steel_smart_fluid_pipe.json 942bb86fa92b3c40fc535dccdd2e9f3b79a36d92 assets/tfmg/blockstates/surface_scanner.json -67b8a6fd76d364c98275a66fb3f4cc9bbb043359 assets/tfmg/lang/en_ud.json -4bb8653cbdb013bc36e507bc2408c5b4279a4864 assets/tfmg/lang/en_us.json +fd454201619789195f2c164c19e2f61ab727bfe5 assets/tfmg/lang/en_ud.json +e80d79d10c0e092c3a2b7b8a97d08fb38a6f7e76 assets/tfmg/lang/en_us.json 9e6a6b62f5e7528c4e4d4f72f3510edcd8f0c078 assets/tfmg/models/block/aluminum_block.json 5a4c785e8d8394ccd125732c0017459648574c4e assets/tfmg/models/block/bauxite_natural_0.json 4ace0da00498fcbb9ddfdf321767b40b095c8778 assets/tfmg/models/block/bauxite_natural_1.json @@ -190,6 +190,7 @@ fc48286f0e70651f3d5a915558c3c91ae3ad0da6 assets/tfmg/models/item/cast_iron_disti da2c28e98d0ddf7166bdf7214c06e81ad8581b90 assets/tfmg/models/item/cast_iron_ingot.json d45fc5511b4c4027889afd3088cd91ba1d8b0501 assets/tfmg/models/item/coal_coke.json 3789a9d72a7ba5daf8c39cccaa665057e63302c6 assets/tfmg/models/item/coal_coke_block.json +cf3c486158a27cbd3a4ef9fdd79dc93f3cc12b45 assets/tfmg/models/item/coal_coke_dust.json 4a843d55647a606fa97bc2daf745a7603406767d assets/tfmg/models/item/concrete.json e8c4e68647a6ced815cfca649c679e709fcc7751 assets/tfmg/models/item/cooling_fluid_bucket.json df4e7fa8f3f60908f58794528a8db60dce7d0135 assets/tfmg/models/item/copper_grenade.json @@ -270,6 +271,7 @@ a779b7e09e7de79b73efb212644edff6739da610 data/forge/tags/items/buckets/napalm.js fdf3b8fdf1975b0eee671f428803caa4e17dc5bd data/forge/tags/items/buckets/naphtha.json 5f98116af6d1d5e0324ff11449e719e7e2593c0c data/forge/tags/items/buckets/plastic.json f0989952061266a02499103c1dcd9f2d7da131f5 data/forge/tags/items/concrete.json +f1cc6d710a5e49ab33dbaceea796f0c0b589c82b data/forge/tags/items/dusts/coal_coke.json 70e609465aa949ff4acc873fb19d4afc07f79aa1 data/forge/tags/items/ingots/aluminum.json 2da28c9441f79389929080f6f31da841bbee19e7 data/forge/tags/items/ingots/cast_iron.json 6746e7b0c2ed4053e7b438c3e99e86889fa9d454 data/forge/tags/items/ingots/lead.json diff --git a/src/generated/resources/assets/tfmg/lang/en_ud.json b/src/generated/resources/assets/tfmg/lang/en_ud.json index 9ab0c9e9..0b7b8d25 100644 --- a/src/generated/resources/assets/tfmg/lang/en_ud.json +++ b/src/generated/resources/assets/tfmg/lang/en_ud.json @@ -93,6 +93,7 @@ "item.tfmg.aluminum_ingot": "ʇobuI ɯnuıɯnןⱯ", "item.tfmg.cast_iron_ingot": "ʇobuI uoɹI ʇsɐƆ", "item.tfmg.coal_coke": "ǝʞoƆ ןɐoƆ", + "item.tfmg.coal_coke_dust": "ʇsnᗡ ǝʞoƆ ןɐoƆ", "item.tfmg.cooling_fluid_bucket": "ʇǝʞɔnᗺ pınןℲ buıןooƆ", "item.tfmg.copper_grenade": "ǝpɐuǝɹ⅁ ɹǝddoƆ", "item.tfmg.creosote_bucket": "ʇǝʞɔnᗺ ǝʇosoǝɹƆ", diff --git a/src/generated/resources/assets/tfmg/lang/en_us.json b/src/generated/resources/assets/tfmg/lang/en_us.json index e3eb5c92..a907ebeb 100644 --- a/src/generated/resources/assets/tfmg/lang/en_us.json +++ b/src/generated/resources/assets/tfmg/lang/en_us.json @@ -99,6 +99,7 @@ "item.tfmg.aluminum_ingot": "Aluminum Ingot", "item.tfmg.cast_iron_ingot": "Cast Iron Ingot", "item.tfmg.coal_coke": "Coal Coke", + "item.tfmg.coal_coke_dust": "Coal Coke Dust", "item.tfmg.cooling_fluid_bucket": "Cooling Fluid Bucket", "item.tfmg.copper_grenade": "Copper Grenade", "item.tfmg.creosote_bucket": "Creosote Bucket", @@ -119,26 +120,6 @@ "item.tfmg.thermite_grenade": "Thermite Grenade", "item.tfmg.zinc_grenade": "Zinc Grenade", - "itemGroup.tfmg.base": "Create: The Factory Must Grow", - "itemGroup.tfmg.building": "Create: TFMG's Building Blocks", - - "create.goggles.misc.number": "%1$s", - "create.goggles.misc.dot_one": ".", - "create.goggles.misc.dot_two": "..", - "create.goggles.misc.dot_three": "...", - "create.goggles.fluid_in_tank": "Fluid In Tank:", - "create.goggles.surface_scanner.no_rotation": "No Rotation Provided", - "create.goggles.surface_scanner.no_deposit": "No Deposit Found", - "create.goggles.surface_scanner.deposit_found": "Found Deposit", - "create.goggles.surface_scanner.distance": "Distance: %1$s Blocks", - "create.goggles.surface_scanner.scanning_surface": "Scanning Surface", - "create.goggles.distillation_tower.status": "Distillation Tower Info:", - "create.goggles.distillation_tower.tank_not_found": "Steel Fluid Tank Not Found", - "create.goggles.distillation_tower.not_tall_enough": "Distillation Tower is Not Tall Enough", - "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", - "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", - "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found", - "_": "->------------------------] UI & Messages [------------------------<-", @@ -161,6 +142,17 @@ "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found", + "create.goggles.blast_furnace.stats": "Blast Furnace Stats:", + "create.goggles.blast_furnace.size_stats": "Size Stats:", + "create.goggles.blast_furnace.fuel_amount": "Fuel Amount: %1$s", + "create.goggles.blast_furnace.item_count": "Item Count: %1$s", + "create.goggles.blast_furnace.height": "Height: %1$s", + "create.goggles.blast_furnace.reinforcement_height": "Reinforcement Height: %1$s", + "create.goggles.blast_furnace.status.off": "Status: Off", + "create.goggles.blast_furnace.status.running": "Status: Running", + "create.goggles.blast_furnace.status.finished": "Status: Process Finished", + "create.goggles.blast_furnace.diameter.one": "Diameter: 1", + "create.goggles.blast_furnace.diameter.two": "Diameter: 2", "_": "Thank you for translating Create: The Factory Must Grow!" diff --git a/src/generated/resources/assets/tfmg/models/item/coal_coke_dust.json b/src/generated/resources/assets/tfmg/models/item/coal_coke_dust.json new file mode 100644 index 00000000..196f269c --- /dev/null +++ b/src/generated/resources/assets/tfmg/models/item/coal_coke_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tfmg:item/coal_coke_dust" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/dusts/coal_coke.json b/src/generated/resources/data/forge/tags/items/dusts/coal_coke.json new file mode 100644 index 00000000..dddd0b09 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/dusts/coal_coke.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tfmg:coal_coke_dust" + ] +} \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/concrete/formwork/FormWorkRenderer.java b/src/main/java/com/drmangotea/tfmg/content/concrete/formwork/FormWorkRenderer.java index e50514b6..973de86e 100644 --- a/src/main/java/com/drmangotea/tfmg/content/concrete/formwork/FormWorkRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/concrete/formwork/FormWorkRenderer.java @@ -92,17 +92,7 @@ public class FormWorkRenderer extends SafeBlockEntityRenderer { + public BlastFurnaceOutputBlock(Properties p_54120_) { + super(p_54120_); + } + public BlockState getStateForPlacement(BlockPlaceContext p_48781_) { + return this.defaultBlockState().setValue(FACING, p_48781_.getHorizontalDirection().getOpposite()); + } + @Override + public Class getBlockEntityClass() { + return BlastFurnaceOutputBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return TFMGBlockEntities.BLAST_FURNACE_OUTPUT.get(); + } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACING)); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceOutputBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceOutputBlockEntity.java new file mode 100644 index 00000000..e01dde62 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceOutputBlockEntity.java @@ -0,0 +1,482 @@ +package com.drmangotea.tfmg.content.machines.metal_processing.blast_furnace.blast_furnace_output; + +import com.drmangotea.tfmg.content.machines.TFMGMachineBlockEntity; +import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.drmangotea.tfmg.registry.TFMGItems; +import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; + +import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; + +public class BlastFurnaceOutputBlockEntity extends TFMGMachineBlockEntity implements IHaveGoggleInformation { + + + + public BlastFurnaceType type; + public Direction outputFacing = getBlockState().getValue(FACING); + public BlockPos mainFloor; + public int height=2; + public int reinforcementHeight = 0; + + + public LerpedFloat coalCokeHeight = LerpedFloat.linear(); + + //item storage + public LazyOptional itemCapability; + + public SmartInventory inputInventory; + + public SmartInventory fuelInventory; + + + + + + public BlastFurnaceOutputBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + inputInventory = new SmartInventory(1, this).forbidInsertion() + .withMaxStackSize(64); + fuelInventory = new SmartInventory(1, this).forbidInsertion() + .withMaxStackSize(64); + + itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory,fuelInventory)); + } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + } + public void tick(){ + super.tick(); + outputFacing = getBlockState().getValue(FACING); + coalCokeHeight.chase(fuelInventory.getStackInSlot(0).getCount(), 0.1f, LerpedFloat.Chaser.EXP); + coalCokeHeight.tickChaser(); + + checkType(); + + if(type == BlastFurnaceType.INVALID) + return; + + List itemsToPick = getItemsToPick(type); + for(ItemEntity itemEntity : itemsToPick){ + ItemStack itemStack = itemEntity.getItem(); + if(itemStack.is(TFMGItems.COAL_COKE_DUST.get())){ + + int freeSpace = fuelInventory.getStackInSlot(0).getMaxStackSize()-fuelInventory.getStackInSlot(0).getCount(); + + int coalCokeCount = itemStack.getCount(); + //if(itemStack == ItemStack.EMPTY) + // continue; + + if(coalCokeCount>freeSpace){ + itemStack.setCount(itemStack.getCount()-freeSpace); + fuelInventory.setItem(0 ,new ItemStack (TFMGItems.COAL_COKE_DUST.get(),fuelInventory.getStackInSlot(0).getCount()+freeSpace)); + }else { + fuelInventory.setItem(0 ,new ItemStack (TFMGItems.COAL_COKE_DUST.get(),fuelInventory.getStackInSlot(0).getCount()+itemStack.getCount())); + itemEntity.discard(); + } + continue; + + } + + itemEntity.discard(); + } + } + + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + + // Lang.translate("goggles.surface_scanner.distance", fuelInventory.getItem(0).getCount()) + // .style(ChatFormatting.GREEN) + // .forGoggles(tooltip,1); + Lang.translate("goggles.surface_scanner.distance", reinforcementHeight) + .style(ChatFormatting.GREEN) + .forGoggles(tooltip,1); + return true; + + } + + @Override + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + + inputInventory.deserializeNBT(compound.getCompound("InputItems")); + fuelInventory.deserializeNBT(compound.getCompound("Fuel")); + } + + @Override + public void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + + compound.put("InputItems", inputInventory.serializeNBT()); + compound.put("Fuel", fuelInventory.serializeNBT()); + + } + @Override + public void invalidate() { + super.invalidate(); + itemCapability.invalidate(); + } + @Nonnull + @Override + @SuppressWarnings("'net.minecraftforge.items.CapabilityItemHandler' is deprecated and marked for removal ") + public LazyOptional getCapability(@Nonnull Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return itemCapability.cast(); + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + return fluidCapability.cast(); + return super.getCapability(cap, side); + } + public void checkType(){ + + mainFloor = this.getBlockPos().relative(outputFacing.getOpposite()); + if(!isValidBlock(mainFloor)) { + type = BlastFurnaceType.INVALID; + return; + } + + if(!isAboveClear(mainFloor)){ + type = BlastFurnaceType.INVALID; + return; + } + + + if(canBeSmall()) + type = BlastFurnaceType.SMALL; + if(canBeBigLeft()) + type = BlastFurnaceType.BIG_LEFT; + if(canBeBigRight()) + type = BlastFurnaceType.BIG_RIGHT; + + + if( + !canBeBigLeft()&& + !canBeBigRight()&& + !canBeSmall() + )type = BlastFurnaceType.INVALID; + + + + + + + + + } + + + + + public boolean isAboveClear(BlockPos pos){ + pos = pos.above(); + return level.getBlockState(pos).is(Blocks.AIR); + } + public boolean isAboveValid(BlockPos pos){ + return isAboveValid(pos,false); + } + public boolean isAboveValid(BlockPos pos,boolean firstCheck){ + pos = pos.above(); + boolean isValid = level.getBlockState(pos).is(TFMGBlocks.FIREPROOF_BRICKS.get()); + + BlockPos pos1 = pos.above(); + int height=2; + for(int i=0; i <8; i++){ + + if(level.getBlockState(pos1).is(TFMGBlocks.FIREPROOF_BRICKS.get())){ + height++; + } else { + break; + } + + pos1 = pos1.above(); + } + if(height<=this.height||firstCheck) + this.height=height; + + + return isValid; + } + // + public void isReinforcement(BlockPos pos){ + this.isReinforcement(pos,false); + } + public void isReinforcement(BlockPos pos,boolean firstCheck){ + + BlockPos pos1 = pos; + int height=0; + for(int i=0; i <8; i++){ + + if(level.getBlockState(pos1).is(TFMGBlocks.FIREPROOF_BRICK_REINFORCEMENT.get())){ + height++; + } else { + break; + } + + pos1 = pos1.above(); + } + if(height<=this.reinforcementHeight||firstCheck) + this.reinforcementHeight=height; + + } + public boolean isValidBlock(BlockPos pos){ + return level.getBlockState(pos).is(TFMGBlocks.FIREPROOF_BRICKS.get()); + } + //its average :/ + public boolean canBeSmall(){ + BlockPos checkedPos=this.getBlockPos().relative(outputFacing.getOpposite()); + BlockPos mainPos = checkedPos; + + if(!isValidBlock(mainPos)) + return false; + if(!isAboveClear(mainPos)) + return false; + checkedPos = mainPos.relative(outputFacing.getClockWise()); + + if(!isValidBlock(checkedPos)) + return false; + if(!isAboveValid(checkedPos,true)) + return false; + + checkedPos = mainPos.relative(outputFacing.getCounterClockWise()); + + if(!isValidBlock(checkedPos)) + return false; + if(!isAboveValid(checkedPos)) + return false; + + checkedPos = mainPos.relative(outputFacing); + + if(!isAboveValid(checkedPos)) + return false; + + isReinforcement(checkedPos.relative(outputFacing.getCounterClockWise()),true); + isReinforcement(checkedPos.relative(outputFacing.getClockWise())); + isReinforcement(mainPos.relative(outputFacing.getOpposite()).relative(outputFacing.getCounterClockWise())); + isReinforcement(mainPos.relative(outputFacing.getOpposite()).relative(outputFacing.getClockWise())); + + + // level.setBlock(checkedPos.above(5), Blocks.GOLD_BLOCK.defaultBlockState(), 3); + return true; + } + + public boolean canBeBigRight(){ + mainFloor = this.getBlockPos().relative(outputFacing.getOpposite()); + + BlockPos checkedPos = this.getBlockPos().relative(outputFacing.getCounterClockWise()); + + for(int i = 0; i<4; i++){ + + + for(int y = 0; y<4; y++){ + + + + + if( + !(i ==0 && y ==0)&& + !(i ==3 && y ==3)&& + !(i ==0 && y ==3)&& + !(i ==3 && y ==0) + + ) { + if( i ==1 && y ==0){ + if(isAboveValid(checkedPos)) { + checkedPos = checkedPos.relative(outputFacing.getOpposite()); + continue; + } else return false; + } + + if(!isValidBlock(checkedPos)) { + return false; + } + if(i==0&&y==1){ + if(!isAboveValid(checkedPos,true)) { + return false; + } + } + + + if( + i ==0 || i ==3 || + y == 0 || y == 3 + + ){ + if(!isAboveValid(checkedPos)) { + return false; + } + } + else + if(!isAboveClear(checkedPos)) { + return false; + + } + + } else{ + //reinforcements + if(i ==0 && y ==0) + isReinforcement(checkedPos,true); + + isReinforcement(checkedPos); + + + + } + + + checkedPos = checkedPos.relative(outputFacing.getOpposite()); + + } + checkedPos= checkedPos.relative(outputFacing,4); + checkedPos= checkedPos.relative(outputFacing.getClockWise()); + } + // level.setBlock(checkedPos.above(5), Blocks.DIAMOND_BLOCK.defaultBlockState(), 3); + return true; + } + public boolean canBeBigLeft(){ + mainFloor = this.getBlockPos().relative(outputFacing.getOpposite()); + + BlockPos checkedPos = this.getBlockPos().relative(outputFacing.getClockWise()); + + for(int i = 0; i<4; i++){ + + + for(int y = 0; y<4; y++){ + + + + + if( + !(i ==0 && y ==0)&& + !(i ==3 && y ==3)&& + !(i ==0 && y ==3)&& + !(i ==3 && y ==0) + + ) { + if( i ==1 && y ==0){ + if(isAboveValid(checkedPos)) { + checkedPos = checkedPos.relative(outputFacing.getOpposite()); + continue; + } else return false; + } + + if(!isValidBlock(checkedPos)) { + return false; + } + + if(i==0&&y==1){ + if(!isAboveValid(checkedPos,true)) { + return false; + } + } + + if( + i ==0 || i ==3 || + y == 0 || y == 3 + + ){ + if(!isAboveValid(checkedPos)) { + return false; + } + } + else + if(!isAboveClear(checkedPos)) { + return false; + + } + + }else{ + //reinforcements + if(i ==0 && y ==0) + isReinforcement(checkedPos,true); + + isReinforcement(checkedPos); + + + + } + + + checkedPos = checkedPos.relative(outputFacing.getOpposite()); + + } + checkedPos= checkedPos.relative(outputFacing,4); + checkedPos= checkedPos.relative(outputFacing.getCounterClockWise()); + } + // level.setBlock(checkedPos.above(5), Blocks.EMERALD_BLOCK.defaultBlockState(), 3); + + return true; + } + + public List getItemsToPick(BlastFurnaceType type) { + AABB searchArea=null; + AABB searchArea1=null; + AABB searchArea2=null; + AABB searchArea3=null; + + if(type == BlastFurnaceType.SMALL) + searchArea = new AABB(this.getBlockPos().relative(outputFacing.getOpposite()).above()); + + if(type == BlastFurnaceType.BIG_RIGHT) { + searchArea = new AABB(this.getBlockPos().relative(outputFacing.getOpposite()).above()); + + searchArea1 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite(), 2).above()); + searchArea2 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite(), 2).above().relative(outputFacing.getClockWise())); + searchArea3 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite()).above().relative(outputFacing.getClockWise())); + + } + if(type == BlastFurnaceType.BIG_LEFT) { + searchArea = new AABB(this.getBlockPos().relative(outputFacing.getOpposite()).above()); + + searchArea1 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite(), 2).above()); + searchArea2 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite(), 2).above().relative(outputFacing.getCounterClockWise())); + searchArea3 = new AABB(this.getBlockPos().relative(outputFacing.getOpposite()).above().relative(outputFacing.getCounterClockWise())); + + + } + + + if(searchArea1!=null){ + List itemList= new ArrayList<>(); + itemList.addAll(level.getEntitiesOfClass(ItemEntity.class, searchArea)); + itemList.addAll(level.getEntitiesOfClass(ItemEntity.class, searchArea1)); + itemList.addAll(level.getEntitiesOfClass(ItemEntity.class, searchArea2)); + itemList.addAll(level.getEntitiesOfClass(ItemEntity.class, searchArea3)); + return itemList; + } + + return level.getEntitiesOfClass(ItemEntity.class, searchArea); + } + + + + public enum BlastFurnaceType{ + SMALL, + BIG_LEFT, + BIG_RIGHT, + INVALID + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceRenderer.java b/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceRenderer.java new file mode 100644 index 00000000..83710ad1 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machines/metal_processing/blast_furnace/blast_furnace_output/BlastFurnaceRenderer.java @@ -0,0 +1,64 @@ +package com.drmangotea.tfmg.content.machines.metal_processing.blast_furnace.blast_furnace_output; + + + +import com.drmangotea.tfmg.registry.TFMGPartialModels; +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; +import com.simibubi.create.foundation.render.CachedBufferer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.level.block.state.BlockState; + +public class BlastFurnaceRenderer extends SafeBlockEntityRenderer { + + public BlastFurnaceRenderer(BlockEntityRendererProvider.Context context) {} + + @Override + protected void renderSafe(BlastFurnaceOutputBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + + ms.pushPose(); + TransformStack msr = TransformStack.cast(ms); + msr.translate(1 / 2f, 0.5, 1 / 2f); + + float coalCokeLevel = be.coalCokeHeight.getValue()/32; + + this.renderNorth(be,partialTicks,ms,buffer,light,overlay,coalCokeLevel); + + + + + ms.popPose(); + + } + + protected void renderNorth(BlastFurnaceOutputBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay,float height) { + BlockState blockState = be.getBlockState(); + VertexConsumer vb = buffer.getBuffer(RenderType.solid()); + //small + if (be.type == BlastFurnaceOutputBlockEntity.BlastFurnaceType.SMALL) { + + + CachedBufferer.partial(TFMGPartialModels.COAL_COKE_DUST_LAYER, blockState) + .centre() + .translateX(-1) + .translateY(height) + .light(light) + .renderInto(ms, vb); + + + + } + } + + @Override + public boolean shouldRenderOffScreen(BlastFurnaceOutputBlockEntity te) { + return true; + } + +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java index 49d60149..0bd3a7a3 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlock.java @@ -1,7 +1,7 @@ package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock; +import com.drmangotea.tfmg.content.tanks.SteelTankBlock; import com.drmangotea.tfmg.registry.TFMGBlockEntities; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; @@ -14,25 +14,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.PathComputationType; -import com.simibubi.create.AllShapes; - -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.foundation.advancement.AdvancementBehaviour; -import com.simibubi.create.foundation.block.IBE; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.state.StateDefinition; public class DistillationControllerBlock extends FaceAttachedHorizontalDirectionalBlock diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java index 172e6ee0..2de6dadd 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationControllerBlockEntity.java @@ -1,7 +1,7 @@ package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity; +import com.drmangotea.tfmg.content.tanks.SteelTankBlockEntity; import com.drmangotea.tfmg.registry.TFMGBlocks; import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.utility.Lang; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java index 9d0725f2..4f824f48 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java +++ b/src/main/java/com/drmangotea/tfmg/content/machines/oil_processing/distillation/distillation_tower/DistillationTowerData.java @@ -1,8 +1,8 @@ package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity; +import com.drmangotea.tfmg.content.tanks.SteelTankBlock; +import com.drmangotea.tfmg.content.tanks.SteelTankBlockEntity; import com.drmangotea.tfmg.registry.TFMGBlocks; import com.drmangotea.tfmg.registry.TFMGFluids; import com.simibubi.create.Create; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/LockablePipeBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/LockablePipeBlockEntity.java similarity index 95% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/LockablePipeBlockEntity.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/LockablePipeBlockEntity.java index 1aafd34b..53f258e8 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/LockablePipeBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/LockablePipeBlockEntity.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal; +package com.drmangotea.tfmg.content.pipes.normal; import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/TFMGPipeBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/TFMGPipeBlockEntity.java similarity index 87% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/TFMGPipeBlockEntity.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/TFMGPipeBlockEntity.java index d5b1b8c7..d32dd051 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/TFMGPipeBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/TFMGPipeBlockEntity.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal; +package com.drmangotea.tfmg.content.pipes.normal; import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/EncasedSteelPipeBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/EncasedSteelPipeBlock.java similarity index 97% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/EncasedSteelPipeBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/EncasedSteelPipeBlock.java index 74a390d0..77bcc3e0 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/EncasedSteelPipeBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/EncasedSteelPipeBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal.steel; +package com.drmangotea.tfmg.content.pipes.normal.steel; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/GlassSteelPipeBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/GlassSteelPipeBlock.java similarity index 98% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/GlassSteelPipeBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/GlassSteelPipeBlock.java index dc137cba..d1b61000 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/GlassSteelPipeBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/GlassSteelPipeBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal.steel; +package com.drmangotea.tfmg.content.pipes.normal.steel; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeAttachmentModel.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeAttachmentModel.java similarity index 98% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeAttachmentModel.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeAttachmentModel.java index d4c9401d..342da3c2 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeAttachmentModel.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeAttachmentModel.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal.steel; +package com.drmangotea.tfmg.content.pipes.normal.steel; import com.drmangotea.tfmg.registry.TFMGPartialModels; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeBlock.java similarity index 94% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeBlock.java index 3b0fb33b..8a37e64f 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/normal/steel/SteelPipeBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/normal/steel/SteelPipeBlock.java @@ -1,8 +1,7 @@ -package com.drmangotea.tfmg.content.machines.pipes.normal.steel; +package com.drmangotea.tfmg.content.pipes.normal.steel; -import com.drmangotea.tfmg.CreateTFMG; -import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity; +import com.drmangotea.tfmg.content.pipes.normal.LockablePipeBlockEntity; import com.drmangotea.tfmg.registry.TFMGBlockEntities; import com.drmangotea.tfmg.registry.TFMGBlocks; import com.simibubi.create.AllBlocks; @@ -28,20 +27,15 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.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.material.Fluid; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; import java.util.Arrays; -import java.util.concurrent.locks.Lock; public class SteelPipeBlock extends FluidPipeBlock { // public static final BooleanProperty LOCKEDDDD = BlockStateProperties.LOCKED; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/pumps/TFMGPumpBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/pumps/TFMGPumpBlock.java similarity index 94% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/pumps/TFMGPumpBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/pumps/TFMGPumpBlock.java index b1db8c90..a58bfad4 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/pumps/TFMGPumpBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/pumps/TFMGPumpBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.pumps; +package com.drmangotea.tfmg.content.pipes.pumps; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java similarity index 97% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java index 903fb6a3..a620f386 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/smart_pipes/TFMGSmartFluidPipeBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.smart_pipes; +package com.drmangotea.tfmg.content.pipes.smart_pipes; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/valves/TFMGFluidValveBlock.java b/src/main/java/com/drmangotea/tfmg/content/pipes/valves/TFMGFluidValveBlock.java similarity index 97% rename from src/main/java/com/drmangotea/tfmg/content/machines/pipes/valves/TFMGFluidValveBlock.java rename to src/main/java/com/drmangotea/tfmg/content/pipes/valves/TFMGFluidValveBlock.java index 2278847a..c784ce87 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/pipes/valves/TFMGFluidValveBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/pipes/valves/TFMGFluidValveBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.pipes.valves; +package com.drmangotea.tfmg.content.pipes.valves; import javax.annotation.Nonnull; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankModel.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankModel.java similarity index 98% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankModel.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankModel.java index 33f1130c..a89f8f2d 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankModel.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankModel.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.drmangotea.tfmg.base.TFMGSpriteShifts; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankRenderer.java similarity index 98% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankRenderer.java index 9aabab1d..3b9353a0 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelFluidTankRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelFluidTankRenderer.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.drmangotea.tfmg.registry.TFMGPartialModels; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlock.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlock.java similarity index 99% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlock.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlock.java index fb0d6c8b..49a59703 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlock.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlock.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlockEntity.java similarity index 97% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlockEntity.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlockEntity.java index d62cb357..1fcfb2dd 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankBlockEntity.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationTowerData; @@ -14,7 +14,6 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock.Shape; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntity; @@ -285,18 +284,18 @@ public class SteelTankBlockEntity extends FluidTankBlockEntity implements IHaveG if (!SteelTankBlock.isTank(blockState)) continue; - Shape shape = Shape.PLAIN; + SteelTankBlock.Shape shape = SteelTankBlock.Shape.PLAIN; if (window) { // SIZE 1: Every tank has a window if (width == 1) - shape = Shape.WINDOW; + shape = SteelTankBlock.Shape.WINDOW; // SIZE 2: Every tank has a corner window if (width == 2) - shape = xOffset == 0 ? zOffset == 0 ? Shape.WINDOW_NW : Shape.WINDOW_SW - : zOffset == 0 ? Shape.WINDOW_NE : Shape.WINDOW_SE; + shape = xOffset == 0 ? zOffset == 0 ? SteelTankBlock.Shape.WINDOW_NW : SteelTankBlock.Shape.WINDOW_SW + : zOffset == 0 ? SteelTankBlock.Shape.WINDOW_NE : SteelTankBlock.Shape.WINDOW_SE; // SIZE 3: Tanks in the center have a window if (width == 3 && abs(abs(xOffset) - abs(zOffset)) == 1) - shape = Shape.WINDOW; + shape = SteelTankBlock.Shape.WINDOW; } level.setBlock(pos, blockState.setValue(SteelTankBlock.SHAPE, shape), 22); diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankGenerator.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankGenerator.java similarity index 97% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankGenerator.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankGenerator.java index 4ce606dd..54e39c70 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankGenerator.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankGenerator.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.simibubi.create.foundation.data.AssetLookup; import com.simibubi.create.foundation.data.SpecialBlockStateGen; diff --git a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankItem.java b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankItem.java similarity index 98% rename from src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankItem.java rename to src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankItem.java index deea226e..ed1dcc07 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machines/tanks/SteelTankItem.java +++ b/src/main/java/com/drmangotea/tfmg/content/tanks/SteelTankItem.java @@ -1,4 +1,4 @@ -package com.drmangotea.tfmg.content.machines.tanks; +package com.drmangotea.tfmg.content.tanks; import com.drmangotea.tfmg.registry.TFMGBlockEntities; diff --git a/src/main/java/com/drmangotea/tfmg/mixins/FluidPipeBlockMixin.java b/src/main/java/com/drmangotea/tfmg/mixins/FluidPipeBlockMixin.java index 2aba00a3..c3a1a129 100644 --- a/src/main/java/com/drmangotea/tfmg/mixins/FluidPipeBlockMixin.java +++ b/src/main/java/com/drmangotea/tfmg/mixins/FluidPipeBlockMixin.java @@ -1,8 +1,7 @@ package com.drmangotea.tfmg.mixins; import com.drmangotea.tfmg.CreateTFMG; -import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity; -import com.drmangotea.tfmg.registry.TFMGBlocks; +import com.drmangotea.tfmg.content.pipes.normal.LockablePipeBlockEntity; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.ITransformableBlock; diff --git a/src/main/java/com/drmangotea/tfmg/mixins/FluidPropagatorMixin.java b/src/main/java/com/drmangotea/tfmg/mixins/FluidPropagatorMixin.java index 9b1ba20f..c73a646a 100644 --- a/src/main/java/com/drmangotea/tfmg/mixins/FluidPropagatorMixin.java +++ b/src/main/java/com/drmangotea/tfmg/mixins/FluidPropagatorMixin.java @@ -1,7 +1,6 @@ package com.drmangotea.tfmg.mixins; -import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeBlock; import com.drmangotea.tfmg.registry.TFMGBlocks; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags; @@ -24,8 +23,6 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java index d392355a..ad2bf64e 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlockEntities.java @@ -7,6 +7,8 @@ import com.drmangotea.tfmg.content.decoration.doors.TFMGSlidingDoorRenderer; import com.drmangotea.tfmg.content.deposits.FluidDepositBlockEntity; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerRenderer; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerTileEntity; +import com.drmangotea.tfmg.content.machines.metal_processing.blast_furnace.blast_furnace_output.BlastFurnaceOutputBlockEntity; +import com.drmangotea.tfmg.content.machines.metal_processing.blast_furnace.blast_furnace_output.BlastFurnaceRenderer; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationOutputBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity; @@ -21,9 +23,9 @@ import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.hammer_holde import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.hammer_holder.PumpjackHammerHolderBlockEntity; import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.machine_input.MachineInputRenderer; import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.machine_input.MachineInputBlockEntity; -import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity; -import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankRenderer; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity; +import com.drmangotea.tfmg.content.pipes.normal.LockablePipeBlockEntity; +import com.drmangotea.tfmg.content.tanks.SteelFluidTankRenderer; +import com.drmangotea.tfmg.content.tanks.SteelTankBlockEntity; import com.simibubi.create.content.fluids.pipes.SmartFluidPipeBlockEntity; import com.simibubi.create.content.fluids.pipes.StraightPipeBlockEntity; import com.simibubi.create.content.fluids.pipes.TransparentStraightPipeRenderer; @@ -162,6 +164,12 @@ public class TFMGBlockEntities { .renderer(() -> PumpjackBaseRenderer::new) .register(); + public static final BlockEntityEntry BLAST_FURNACE_OUTPUT = REGISTRATE + .blockEntity("blast_furnace_output", BlastFurnaceOutputBlockEntity::new) + .renderer(() -> BlastFurnaceRenderer::new) + .validBlocks(TFMGBlocks.BLAST_FURNACE_OUTPUT) + .register(); + public static void register() {} } diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java index 261595b9..581c6477 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java @@ -11,6 +11,7 @@ import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombBlock; import com.drmangotea.tfmg.content.items.CoalCokeBlockItem; import com.drmangotea.tfmg.content.items.FossilstoneItem; import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerBlock; +import com.drmangotea.tfmg.content.machines.metal_processing.blast_furnace.blast_furnace_output.BlastFurnaceOutputBlock; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationControllerBlock; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillation_tower.DistillationOutputBlock; import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlock; @@ -19,17 +20,17 @@ import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.base.Pumpjac import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.crank.PumpjackCrankBlock; import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.hammer_holder.PumpjackHammerHolderBlock; import com.drmangotea.tfmg.content.machines.oil_processing.pumpjack.machine_input.MachineInputBlock; -import com.drmangotea.tfmg.content.machines.pipes.normal.steel.EncasedSteelPipeBlock; -import com.drmangotea.tfmg.content.machines.pipes.normal.steel.GlassSteelPipeBlock; -import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeAttachmentModel; -import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeBlock; -import com.drmangotea.tfmg.content.machines.pipes.pumps.TFMGPumpBlock; -import com.drmangotea.tfmg.content.machines.pipes.smart_pipes.TFMGSmartFluidPipeBlock; -import com.drmangotea.tfmg.content.machines.pipes.valves.TFMGFluidValveBlock; -import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankModel; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankGenerator; -import com.drmangotea.tfmg.content.machines.tanks.SteelTankItem; +import com.drmangotea.tfmg.content.pipes.normal.steel.EncasedSteelPipeBlock; +import com.drmangotea.tfmg.content.pipes.normal.steel.GlassSteelPipeBlock; +import com.drmangotea.tfmg.content.pipes.normal.steel.SteelPipeAttachmentModel; +import com.drmangotea.tfmg.content.pipes.normal.steel.SteelPipeBlock; +import com.drmangotea.tfmg.content.pipes.pumps.TFMGPumpBlock; +import com.drmangotea.tfmg.content.pipes.smart_pipes.TFMGSmartFluidPipeBlock; +import com.drmangotea.tfmg.content.pipes.valves.TFMGFluidValveBlock; +import com.drmangotea.tfmg.content.tanks.SteelFluidTankModel; +import com.drmangotea.tfmg.content.tanks.SteelTankBlock; +import com.drmangotea.tfmg.content.tanks.SteelTankGenerator; +import com.drmangotea.tfmg.content.tanks.SteelTankItem; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.decoration.encasing.CasingBlock; @@ -352,7 +353,7 @@ public static final BlockEntry STEEL_DISTILLATION_OUTPU .build() .lang("Fireproof Brick Reinforcement") .register(); - public static final BlockEntry BLAST_FURNACE_OUTPUT = REGISTRATE.block("blast_furnace_output", Block::new) + public static final BlockEntry BLAST_FURNACE_OUTPUT = REGISTRATE.block("blast_furnace_output", BlastFurnaceOutputBlock::new) .initialProperties(() -> Blocks.BRICKS) .properties(p -> p.color(MaterialColor.COLOR_RED)) .properties(p -> p.requiresCorrectToolForDrops()) diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java index 75d5dcd2..0b3422a5 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java @@ -31,6 +31,9 @@ public class TFMGItems { ALUMINUM_INGOT = taggedIngredient("aluminum_ingot", forgeItemTag("ingots/aluminum"), CREATE_INGOTS.tag), LEAD_INGOT = taggedIngredient("lead_ingot", forgeItemTag("ingots/lead"), CREATE_INGOTS.tag); + public static final ItemEntry + COAL_COKE_DUST = taggedIngredient("coal_coke_dust", forgeItemTag("dusts/coal_coke")); + public static final ItemEntry QUAD_POTATO_CANNON = diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java index 0f8174dc..da7c4b37 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java @@ -18,6 +18,7 @@ import java.util.Map; public class TFMGPartialModels { public static final PartialModel + COAL_COKE_DUST_LAYER = block("coal_coke_dust_layer"), PUMPJACK_HAMMER = block("pumpjack/hammer_holder"), PUMPJACK_FRONT_ROPE = block("pumpjack/pumpjack_front_rope"), PUMPJACK_CONNECTOR = block("pumpjack/pumpjack_connector"), diff --git a/src/main/resources/assets/tfmg/lang/default/interface.json b/src/main/resources/assets/tfmg/lang/default/interface.json index 16e84860..281715a7 100644 --- a/src/main/resources/assets/tfmg/lang/default/interface.json +++ b/src/main/resources/assets/tfmg/lang/default/interface.json @@ -16,5 +16,16 @@ "create.goggles.distillation_tower.not_tall_enough": "Distillation Tower is Not Tall Enough", "create.goggles.distillation_tower.level": "Distillation Tower Level: %1$s", "create.goggles.distillation_tower.found_outputs": "Found Outputs: %1$s", - "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found" + "create.goggles.distillation_tower.no_outputs": "No Output Blocks Found", + "create.goggles.blast_furnace.stats": "Blast Furnace Stats:", + "create.goggles.blast_furnace.size_stats": "Size Stats:", + "create.goggles.blast_furnace.fuel_amount": "Fuel Amount: %1$s", + "create.goggles.blast_furnace.item_count": "Item Count: %1$s", + "create.goggles.blast_furnace.height": "Height: %1$s", + "create.goggles.blast_furnace.reinforcement_height": "Reinforcement Height: %1$s", + "create.goggles.blast_furnace.status.off": "Status: Off", + "create.goggles.blast_furnace.status.running": "Status: Running", + "create.goggles.blast_furnace.status.finished": "Status: Process Finished", + "create.goggles.blast_furnace.diameter.one": "Diameter: 1", + "create.goggles.blast_furnace.diameter.two": "Diameter: 2" } \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/models/block/coal_coke_dust_layer.json b/src/main/resources/assets/tfmg/models/block/coal_coke_dust_layer.json new file mode 100644 index 00000000..9d2d1a3a --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/coal_coke_dust_layer.json @@ -0,0 +1,21 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "tfmg:block/steel_block", + "particle": "tfmg:block/steel_block" + }, + "elements": [ + { + "from": [0, 0.1, 0], + "to": [16, 0.1, 16], + "faces": { + "north": {"uv": [0, 0, 16, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 16, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 16, 0], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/item/coal_coke_dust.png b/src/main/resources/assets/tfmg/textures/item/coal_coke_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf27089cf24561c1ffe9dca4c2150e17457f85 GIT binary patch literal 19028 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 QJPC@y)78&qol`;+03C47`2YX_ literal 0 HcmV?d00001