From 34d72b4f8062dd4363973a6d70d2f853486be41f Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 15 Jun 2022 16:54:45 +0200 Subject: [PATCH] iron furnace, some universal code for solid fuels --- .../java/com/hbm/handler/FuelHandler.java | 11 +-- .../container/ContainerFurnaceIron.java | 4 + .../com/hbm/inventory/gui/GUIFurnaceIron.java | 23 +++++ .../java/com/hbm/module/ModuleBurnTime.java | 97 +++++++++++++++++++ .../machine/TileEntityFurnaceIron.java | 66 ++++++++++++- .../machine/TileEntityMachineIGenerator.java | 5 - 6 files changed, 193 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/hbm/module/ModuleBurnTime.java diff --git a/src/main/java/com/hbm/handler/FuelHandler.java b/src/main/java/com/hbm/handler/FuelHandler.java index c7ca18eae..be29e2440 100644 --- a/src/main/java/com/hbm/handler/FuelHandler.java +++ b/src/main/java/com/hbm/handler/FuelHandler.java @@ -14,12 +14,11 @@ public class FuelHandler implements IFuelHandler { int single = 200; - if(fuel.getItem().equals(ModItems.solid_fuel)) - return single * 16; - if(fuel.getItem().equals(ModItems.solid_fuel_presto)) - return single * 40; - if(fuel.getItem().equals(ModItems.solid_fuel_presto_triplet)) - return single * 200; + if(fuel.getItem().equals(ModItems.solid_fuel)) return single * 16; + if(fuel.getItem().equals(ModItems.solid_fuel_presto)) return single * 40; + if(fuel.getItem().equals(ModItems.solid_fuel_presto_triplet)) return single * 200; + if(fuel.getItem().equals(ModItems.rocket_fuel)) return single * 32; + if(fuel.getItem().equals(ModItems.biomass)) return 800; if(fuel.getItem().equals(ModItems.biomass_compressed)) diff --git a/src/main/java/com/hbm/inventory/container/ContainerFurnaceIron.java b/src/main/java/com/hbm/inventory/container/ContainerFurnaceIron.java index 5e51e4c6a..34b9673ad 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerFurnaceIron.java +++ b/src/main/java/com/hbm/inventory/container/ContainerFurnaceIron.java @@ -17,10 +17,14 @@ public class ContainerFurnaceIron extends Container { public ContainerFurnaceIron(InventoryPlayer invPlayer, TileEntityFurnaceIron furnace) { this.furnace = furnace; + //input this.addSlotToContainer(new Slot(furnace, 0, 53, 17)); + //fuel this.addSlotToContainer(new Slot(furnace, 1, 53, 53)); this.addSlotToContainer(new Slot(furnace, 2, 71, 53)); + //output this.addSlotToContainer(new SlotSmelting(invPlayer.player, furnace, 3, 125, 35)); + //upgrade this.addSlotToContainer(new SlotUpgrade(furnace, 4, 17, 35)); for(int i = 0; i < 3; i++) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java b/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java index 4bf6f42aa..45b4cb753 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java @@ -1,5 +1,7 @@ package com.hbm.inventory.gui; +import java.util.List; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerFurnaceIron; @@ -10,6 +12,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; import net.minecraft.util.ResourceLocation; public class GUIFurnaceIron extends GuiContainer { @@ -25,6 +28,26 @@ public class GUIFurnaceIron extends GuiContainer { this.ySize = 166; } + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 1; i < 3; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + + if(!slot.getHasStack()) { + + List bonuses = this.diFurnace.burnModule.getDesc(); + + if(!bonuses.isEmpty()) { + this.func_146283_a(bonuses, x, y); + } + } + } + } + } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); diff --git a/src/main/java/com/hbm/module/ModuleBurnTime.java b/src/main/java/com/hbm/module/ModuleBurnTime.java new file mode 100644 index 000000000..3abb1bc37 --- /dev/null +++ b/src/main/java/com/hbm/module/ModuleBurnTime.java @@ -0,0 +1,97 @@ +package com.hbm.module; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.items.ModItems; +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.util.EnumChatFormatting; + +/** + * A simple module for determining the burn time of a stack with added options to define bonuses + * @author hbm + * + */ +public class ModuleBurnTime { + + private double modLog = 1.0D; + private double modWood = 1.0D; + private double modCoal = 1.0D; + private double modLignite = 1.0D; + private double modCoke = 1.0D; + private double modSolid = 1.0D; + private double modRocket = 1.0D; + + public int getBurnTime(ItemStack stack) { + int fuel = TileEntityFurnace.getItemBurnTime(stack); + + if(fuel == 0) + return 0; + + if(stack.getItem() == ModItems.solid_fuel) return (int) (fuel * modSolid); + if(stack.getItem() == ModItems.solid_fuel_presto) return (int) (fuel * modSolid); + if(stack.getItem() == ModItems.solid_fuel_presto_triplet) return (int) (fuel * modSolid); + + if(stack.getItem() == ModItems.rocket_fuel) return (int) (fuel * modRocket); + + List names = ItemStackUtil.getOreDictNames(stack); + + for(String name : names) { + if(name.contains("Coke")) return (int) (fuel * modCoke); + if(name.contains("Coal")) return (int) (fuel * modCoal); + if(name.contains("Lignite")) return (int) (fuel * modLignite); + if(name.startsWith("log")) return (int) (fuel * modLog); + if(name.contains("Wood")) return (int) (fuel * modWood); + } + + return fuel; + } + + public List getDesc() { + List list = new ArrayList(); + + list.add(EnumChatFormatting.YELLOW + "Burn time bonuses:"); + + addIf(list, "Logs", modLog); + addIf(list, "Wood", modWood); + addIf(list, "Coal", modCoal); + addIf(list, "Lignite", modLignite); + addIf(list, "Coke", modCoke); + addIf(list, "Solid Fuel", modSolid); + addIf(list, "Rocket Fuel", modRocket); + + if(list.size() == 1) + list.clear(); + + return list; + } + + private void addIf(List list, String name, double mod) { + + if(mod != 1.0D) + list.add(EnumChatFormatting.YELLOW + "- " + name + ": " + getPercent(mod)); + } + + private String getPercent(double mod) { + mod -= 1D; + String num = (((int) (mod * 1000)) / 10D) + "%"; + + if(mod < 0) + num = EnumChatFormatting.RED + "-" + num; + else + num = EnumChatFormatting.GREEN + "+" + num; + + return num; + } + + public ModuleBurnTime setLogMod(double mod) { this.modLog = mod; return this; } + public ModuleBurnTime setWoodMod(double mod) { this.modWood = mod; return this; } + public ModuleBurnTime setCoalMod(double mod) { this.modCoal = mod; return this; } + public ModuleBurnTime setLigniteMod(double mod) { this.modLignite = mod; return this; } + public ModuleBurnTime setCokeMod(double mod) { this.modCoke = mod; return this; } + public ModuleBurnTime setSolidMod(double mod) { this.modSolid = mod; return this; } + public ModuleBurnTime setRocketMod(double mod) { this.modRocket = mod; return this; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index e05d31c5c..8772e2647 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -1,15 +1,19 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerFurnaceIron; import com.hbm.inventory.gui.GUIFurnaceIron; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.module.ModuleBurnTime; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.world.World; public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUIProvider { @@ -17,8 +21,21 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public int maxBurnTime; public int burnTime; + public int progress; + public int processingTime; + public static final int baseTime = 200; + + public ModuleBurnTime burnModule; + public TileEntityFurnaceIron() { super(5); + + burnModule = new ModuleBurnTime() + .setLigniteMod(1.25) + .setCoalMod(1.25) + .setCokeMod(1.5) + .setSolidMod(2) + .setRocketMod(2); } @Override @@ -31,24 +48,51 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI if(!worldObj.isRemote) { + UpgradeManager.eval(slots, 4, 4); + this.processingTime = baseTime - (100 * Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) / 3); + if(burnTime <= 0) { for(int i = 1; i < 3; i++) { if(slots[i] != null) { - int fuel = TileEntityFurnace.getItemBurnTime(slots[i]); + int fuel = burnModule.getBurnTime(slots[i]); if(fuel > 0) { this.maxBurnTime = this.burnTime = fuel; + slots[i].stackSize--; + + if(slots[i].stackSize == 0) { + slots[i] = slots[i].getItem().getContainerItem(slots[i]); + } + break; } } } } + if(canSmelt()) { + this.progress++; + + if(this.progress > this.processingTime) { + ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[0]); + + if(slots[3] == null) { + slots[3] = result.copy(); + } else { + slots[3].stackSize += result.stackSize; + } + + this.decrStackSize(0, 1); + } + } + NBTTagCompound data = new NBTTagCompound(); data.setInteger("maxBurnTime", this.maxBurnTime); data.setInteger("burnTime", this.burnTime); + data.setInteger("progress", this.progress); + data.setInteger("processingTime", this.processingTime); this.networkPack(data, 50); } } @@ -57,6 +101,24 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public void networkUnpack(NBTTagCompound nbt) { this.maxBurnTime = nbt.getInteger("maxBurnTime"); this.burnTime = nbt.getInteger("burnTime"); + this.progress = nbt.getInteger("progress"); + this.processingTime = nbt.getInteger("processingTime"); + } + + public boolean canSmelt() { + + if(this.burnTime <= 0) return false; + if(slots[0] == null) return false; + + ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[0]); + + if(result == null) return false; + if(slots[3] == null) return true; + + if(!result.isItemEqual(slots[3])) return false; + if(result.stackSize + slots[3].stackSize > slots[3].getMaxStackSize()) return false; + + return true; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index cc517b12f..04191a8f6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -1,9 +1,5 @@ package com.hbm.tileentity.machine; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.inventory.FluidTank; @@ -11,7 +7,6 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.types.FluidTypeFlammable; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemRTGPellet; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.RTGUtil;