From ef257e7f80add24c98b80d7bdc71775f27c0df73 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 26 Jan 2020 02:20:08 +0100 Subject: [PATCH] blast furnace booster, part 1 --- .../blocks/BlockBlastFurnaceBooster.java | 11 ++++ .../blocks/tiles/ModTileEntities.java | 1 + .../tiles/TileEntityBlastFurnaceBooster.java | 55 +++++++++++++++++++ .../blocks/tiles/TileEntityFurnaceHeater.java | 20 ++++--- .../ellpeck/naturesaura/reg/ModRegistry.java | 3 +- 5 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/BlockBlastFurnaceBooster.java create mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockBlastFurnaceBooster.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockBlastFurnaceBooster.java new file mode 100644 index 00000000..eff03bce --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockBlastFurnaceBooster.java @@ -0,0 +1,11 @@ +package de.ellpeck.naturesaura.blocks; + +import de.ellpeck.naturesaura.blocks.tiles.TileEntityBlastFurnaceBooster; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; + +public class BlockBlastFurnaceBooster extends BlockContainerImpl { + public BlockBlastFurnaceBooster() { + super("blast_furnace_booster", TileEntityBlastFurnaceBooster::new, Block.Properties.from(Blocks.BLAST_FURNACE)); + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ModTileEntities.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ModTileEntities.java index 66957e4a..35ad6e2e 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ModTileEntities.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ModTileEntities.java @@ -34,4 +34,5 @@ public final class ModTileEntities { public static TileEntityType SPAWN_LAMP; public static TileEntityType TIME_CHANGER; public static TileEntityType WOOD_STAND; + public static TileEntityType BLAST_FURNACE_BOOSTER; } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java new file mode 100644 index 00000000..6b05d5c6 --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java @@ -0,0 +1,55 @@ +package de.ellpeck.naturesaura.blocks.tiles; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.tileentity.BlastFurnaceTileEntity; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIntArray; + +public class TileEntityBlastFurnaceBooster extends TileEntityImpl implements ITickableTileEntity { + + private int waitTime; + + public TileEntityBlastFurnaceBooster() { + super(ModTileEntities.BLAST_FURNACE_BOOSTER); + } + + @Override + public void tick() { + if (this.world.isRemote) + return; + if (this.waitTime > 0) { + this.waitTime--; + return; + } + + TileEntity below = this.world.getTileEntity(this.pos.down()); + if (!(below instanceof BlastFurnaceTileEntity)) + return; + BlastFurnaceTileEntity tile = (BlastFurnaceTileEntity) below; + IRecipe recipe = this.world.getRecipeManager().getRecipe(TileEntityFurnaceHeater.getRecipeType(tile), tile, this.world).orElse(null); + if (recipe == null) + return; + + IIntArray data = TileEntityFurnaceHeater.getFurnaceData(tile); + int doneDiff = data.get(3) - data.get(2); + if (doneDiff > 1) { + this.waitTime = doneDiff - 2; + return; + } + + if (this.world.rand.nextFloat() > 0.35F) + return; + + ItemStack output = tile.getStackInSlot(2); + if (output.getCount() >= output.getMaxStackSize()) + return; + if (output.isEmpty()) { + ItemStack result = recipe.getRecipeOutput(); + tile.setInventorySlotContents(2, result.copy()); + } else { + output.grow(1); + } + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java index fc63cb1f..0b029050 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java @@ -41,14 +41,7 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable if (tile instanceof AbstractFurnaceTileEntity) { AbstractFurnaceTileEntity furnace = (AbstractFurnaceTileEntity) tile; if (this.isReady(furnace)) { - IIntArray data; - try { - data = (IIntArray) FURNACE_DATA_FIELD.get(furnace); - } catch (IllegalAccessException e) { - NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e); - return; - } - + IIntArray data = getFurnaceData(furnace); int burnTime = data.get(0); if (burnTime <= 0) this.world.setBlockState(tilePos, this.world.getBlockState(tilePos).with(AbstractFurnaceBlock.LIT, true)); @@ -84,6 +77,15 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable } } + public static IIntArray getFurnaceData(AbstractFurnaceTileEntity tile) { + try { + return (IIntArray) FURNACE_DATA_FIELD.get(tile); + } catch (IllegalAccessException e) { + NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e); + return null; + } + } + private boolean isReady(AbstractFurnaceTileEntity furnace) { if (!furnace.getStackInSlot(1).isEmpty()) return false; @@ -100,7 +102,7 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable return false; } - private static IRecipeType getRecipeType(AbstractFurnaceTileEntity furnace) { + public static IRecipeType getRecipeType(AbstractFurnaceTileEntity furnace) { if (furnace instanceof BlastFurnaceTileEntity) { return IRecipeType.BLASTING; } else if (furnace instanceof SmokerTileEntity) { diff --git a/src/main/java/de/ellpeck/naturesaura/reg/ModRegistry.java b/src/main/java/de/ellpeck/naturesaura/reg/ModRegistry.java index 02f5ef3a..6649293b 100644 --- a/src/main/java/de/ellpeck/naturesaura/reg/ModRegistry.java +++ b/src/main/java/de/ellpeck/naturesaura/reg/ModRegistry.java @@ -109,7 +109,8 @@ public final class ModRegistry { new BlockProjectileGenerator(), new BlockDimensionRail("overworld", DimensionType.OVERWORLD, DimensionType.THE_NETHER, DimensionType.THE_END), new BlockDimensionRail("nether", DimensionType.THE_NETHER, DimensionType.OVERWORLD), - new BlockDimensionRail("end", DimensionType.THE_END, DimensionType.OVERWORLD) + new BlockDimensionRail("end", DimensionType.THE_END, DimensionType.OVERWORLD), + new BlockBlastFurnaceBooster() ); if (ModConfig.instance.rfConverter.get())