From 647c8379093e149f0e2d953c8f5e464ba464118e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 30 Jul 2023 19:00:35 +0200 Subject: [PATCH 1/2] and now for something completely different --- .../blocks/machine/MachineElectrolyser.java | 52 ++++--- .../com/hbm/interfaces/IControlReceiver.java | 4 +- .../container/ContainerElectrolyserFluid.java | 54 +++++++ .../inventory/gui/GUIElectrolyserFluid.java | 60 +++++++ .../java/com/hbm/packet/NBTControlPacket.java | 15 +- .../machine/TileEntityElectrolyser.java | 147 ++++++------------ .../gui/processing/gui_electrolyser_fluid.png | Bin 3941 -> 4936 bytes .../gui/processing/gui_electrolyser_metal.png | Bin 4062 -> 5971 bytes 8 files changed, 200 insertions(+), 132 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index fb3ee992f..d6ca71710 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -26,12 +26,12 @@ public class MachineElectrolyser extends BlockDummyable { @Override public int[] getDimensions() { - return new int[] {0, 0, 4, 4, 2, 2}; + return new int[] {0, 0, 5, 5, 1, 3}; } @Override public int getOffset() { - return 4; + return 5; } @Override @@ -42,33 +42,39 @@ public class MachineElectrolyser extends BlockDummyable { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {1, 0, 4, 4, 1, 1}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, -1, 4, 4, 0, 0}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, 1, -1, -2, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, 1, -1, -1, 1}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, 3, -3, -2, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, 3, -3, -1, 1}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, -1, 1, -2, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, -1, 1, -1, 1}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, -3, 3, -2, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, -3, 3, -1, 1}, this, dir); + + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {2, -1, 5, 5, 1, 1}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -3, 5, 5, 0, 0}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 4, -4, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 2, -2, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 0, 0, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -2, 2, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -4, 4, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 4, -4, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 2, -2, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -2, 2, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -4, 4, -1, 2}, this, dir); } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, getDimensions(), x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {1, 0, 4, 4, 1, 1}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, -1, 4, 4, 0, 0}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, 1, -1, -2, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, 1, -1, -1, 1}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, 3, -3, -2, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, 3, -3, -1, 1}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, -1, 1, -2, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, -1, 1, -1, 1}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, 0, -3, 3, -2, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , 3 + y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {0, 0, -3, 3, -1, 1}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y , z + dir.offsetZ * o, getDimensions(), x, y, z, dir)) return false; + + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {2, -1, 5, 5, 1, 1}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -3, 5, 5, 0, 0}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 4, -4, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 2, -2, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 0, 0, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -2, 2, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -4, 4, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 4, -4, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 2, -2, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -2, 2, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -4, 4, -1, 2}, x, y, z, dir)) return false; return true; } diff --git a/src/main/java/com/hbm/interfaces/IControlReceiver.java b/src/main/java/com/hbm/interfaces/IControlReceiver.java index 74ff5d0c6..fe49fdf2e 100644 --- a/src/main/java/com/hbm/interfaces/IControlReceiver.java +++ b/src/main/java/com/hbm/interfaces/IControlReceiver.java @@ -10,6 +10,8 @@ import net.minecraft.nbt.NBTTagCompound; public interface IControlReceiver { public boolean hasPermission(EntityPlayer player); - + public void receiveControl(NBTTagCompound data); + /* this was the easiest way of doing this without needing to change all 7 quadrillion implementors */ + public default void receiveControl(EntityPlayer player, NBTTagCompound data) { } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java new file mode 100644 index 000000000..d52d54c24 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java @@ -0,0 +1,54 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotTakeOnly; +import com.hbm.tileentity.machine.TileEntityElectrolyser; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; + +public class ContainerElectrolyserFluid extends Container { + + private TileEntityElectrolyser electrolyser; + + public ContainerElectrolyserFluid(InventoryPlayer invPlayer, TileEntityElectrolyser tedf) { + electrolyser = tedf; + + //Battery + this.addSlotToContainer(new Slot(tedf, 0, 186, 109)); + //Upgrades + this.addSlotToContainer(new Slot(tedf, 1, 186, 140)); + this.addSlotToContainer(new Slot(tedf, 2, 186, 158)); + //Fluid ID + this.addSlotToContainer(new Slot(tedf, 3, 6, 18)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 6, 54)); + //Input + this.addSlotToContainer(new Slot(tedf, 5, 24, 18)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 6, 24, 54)); + //Output + this.addSlotToContainer(new Slot(tedf, 7, 78, 18)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 8, 78, 54)); + this.addSlotToContainer(new Slot(tedf, 9, 134, 18)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 10, 134, 54)); + //Byproducts + this.addSlotToContainer(new SlotTakeOnly(tedf, 11, 154, 18)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 12, 154, 36)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 13, 154, 54)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 180)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return electrolyser.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java new file mode 100644 index 000000000..f23f12075 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java @@ -0,0 +1,60 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerElectrolyserFluid; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityElectrolyser; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIElectrolyserFluid extends GuiInfoContainer { + + public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_electrolyser_fluid.png"); + private TileEntityElectrolyser electrolyser; + + public GUIElectrolyserFluid(InventoryPlayer invPlayer, TileEntityElectrolyser electrolyser) { + super(new ContainerElectrolyserFluid(invPlayer, electrolyser)); + this.electrolyser = electrolyser; + + this.xSize = 210; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + electrolyser.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 42, guiTop + 18, 16, 52); + electrolyser.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 96, guiTop + 18, 16, 52); + electrolyser.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 18, 16, 52); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 186, guiTop + 18, 16, 89, electrolyser.power, electrolyser.maxPower); + } + + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.electrolyser.hasCustomInventoryName() ? this.electrolyser.getInventoryName() : I18n.format(this.electrolyser.getInventoryName()); + + this.fontRendererObj.drawString(name, (this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2) - 16, 7, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + electrolyser.tanks[0].renderTank(guiLeft + 42, guiTop + 70, this.zLevel, 16, 52); + electrolyser.tanks[1].renderTank(guiLeft + 96, guiTop + 70, this.zLevel, 16, 52); + electrolyser.tanks[2].renderTank(guiLeft + 116, guiTop + 70, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/packet/NBTControlPacket.java b/src/main/java/com/hbm/packet/NBTControlPacket.java index 8ce47aa3c..226b3eae1 100644 --- a/src/main/java/com/hbm/packet/NBTControlPacket.java +++ b/src/main/java/com/hbm/packet/NBTControlPacket.java @@ -32,7 +32,6 @@ public class NBTControlPacket implements IMessage { try { buffer.writeNBTTagCompoundToBuffer(nbt); - } catch (IOException e) { e.printStackTrace(); } @@ -45,9 +44,8 @@ public class NBTControlPacket implements IMessage { y = buf.readInt(); z = buf.readInt(); - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } + if(buffer == null) buffer = new PacketBuffer(Unpooled.buffer()); + buffer.writeBytes(buf); } @@ -58,9 +56,8 @@ public class NBTControlPacket implements IMessage { buf.writeInt(y); buf.writeInt(z); - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } + if (buffer == null) buffer = new PacketBuffer(Unpooled.buffer()); + buf.writeBytes(buffer); } @@ -85,8 +82,10 @@ public class NBTControlPacket implements IMessage { IControlReceiver tile = (IControlReceiver)te; - if(tile.hasPermission(p)) + if(tile.hasPermission(p)) { + tile.receiveControl(p, nbt); tile.receiveControl(nbt); + } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index c2eb12a1a..378317d76 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -1,17 +1,10 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; -import java.util.List; - -import com.hbm.blocks.BlockDummyable; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.container.ContainerElectrolyser; -import com.hbm.inventory.fluid.FluidType; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerElectrolyserFluid; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.gui.GUIElectrolyser; -import com.hbm.lib.Library; +import com.hbm.inventory.gui.GUIElectrolyserFluid; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -24,9 +17,8 @@ import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidAcceptor, IGUIProvider /* TODO: new fluid API */ { +public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyUser, IControlReceiver, IGUIProvider { public long power; public static final long maxPower = 20000000; @@ -43,11 +35,19 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public FluidTank[] tanks; public TileEntityElectrolyser() { - super(24); - tanks = new FluidTank[3]; - tanks[0] = new FluidTank(Fluids.WATER, 16000, 0); - tanks[1] = new FluidTank(Fluids.HYDROGEN, 16000, 1); - tanks[2] = new FluidTank(Fluids.OXYGEN, 16000, 2); + //0: Battery + //1-2: Upgrades + //// FLUID + //3-4: Fluid ID + //5-10: Fluid IO + //11-13: Byproducts + //// METAL + super(21); + tanks = new FluidTank[4]; + tanks[0] = new FluidTank(Fluids.WATER, 16000); + tanks[1] = new FluidTank(Fluids.HYDROGEN, 16000); + tanks[2] = new FluidTank(Fluids.OXYGEN, 16000); + tanks[3] = new FluidTank(Fluids.NITRIC_ACID, 16000); } @Override @@ -60,9 +60,6 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(!worldObj.isRemote) { - this.tanks[0].updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); - - NBTTagCompound data = new NBTTagCompound(); data.setLong("power", this.power); data.setInteger("progressFluid", this.progressFluid); @@ -70,25 +67,20 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn data.setInteger("usage", this.usage); data.setInteger("processFluidTime", this.processFluidTime); data.setInteger("processOreTime", this.processOreTime); + for(int i = 0; i < 4; i++) tanks[i].writeToNBT(data, "t" + i); this.networkPack(data, 50); - - fillFluidInit(tanks[1].getTankType()); - fillFluidInit(tanks[2].getTankType()); } - } - + @Override - public void fillFluidInit(FluidType type) { - - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - - fillFluid(xCoord + dir.offsetX * 5 + rot.offsetX * -1, yCoord-1, zCoord + dir.offsetZ * 5 + rot.offsetZ * -1, getTact(), type); - fillFluid(xCoord + dir.offsetX * 5 + rot.offsetX * -1, yCoord-1, zCoord + dir.offsetZ * 5 + rot.offsetZ * 1, getTact(), type); - fillFluid(xCoord + dir.offsetX * -5 + rot.offsetX * -1, yCoord-1, zCoord + dir.offsetZ * 5 + rot.offsetZ * -1, getTact(), type); - fillFluid(xCoord + dir.offsetX * -5 + rot.offsetX * -1, yCoord-1, zCoord + dir.offsetZ * 5 + rot.offsetZ * 1, getTact(), type); - + public void networkUnpack(NBTTagCompound nbt) { + this.power = nbt.getLong("power"); + this.progressFluid = nbt.getInteger("progressFluid"); + this.progressOre = nbt.getInteger("progressOre"); + this.usage = nbt.getInteger("usage"); + this.processFluidTime = nbt.getInteger("processFluidTime"); + this.processOreTime = nbt.getInteger("processOreTime"); + for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); } AxisAlignedBB bb = null; @@ -98,12 +90,12 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(bb == null) { bb = AxisAlignedBB.getBoundingBox( - xCoord - 3, + xCoord - 5, yCoord - 0, - zCoord - 4, - xCoord + 3, + zCoord - 5, + xCoord + 6, yCoord + 4, - zCoord + 4 + zCoord + 6 ); } @@ -126,65 +118,6 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn return maxPower; } - @Override - public void setFillForSync(int fill, int index) { - tanks[index].setFill(fill); - - } - - @Override - public void setFluidFill(int fill, FluidType type) { - for(int i = 0; i < 3; i++) { - if(type == tanks[i].getTankType()) - tanks[i].setFill(fill); - } - - } - - @Override - public void setTypeForSync(FluidType type, int index) { - tanks[index].setTankType(type); - - } - - @Override - public int getFluidFill(FluidType type) { - for(int i = 0; i < 3; i++) { - if(type == tanks[i].getTankType() && tanks[i].getFill() != 0) - return tanks[i].getFill(); - } - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - for(int i = 0; i < 3; i++) { - if(type == tanks[i].getTankType() && tanks[i].getMaxFill() != 0) - return tanks[i].getMaxFill(); - } - return 0; - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - public boolean getTact() { - return worldObj.getTotalWorldTime() % 20 < 10; - } - - @Override - public List getFluidList(FluidType type) { - return new ArrayList(); - } - - @Override - public void clearFluidList(FluidType type) { - return; - } - @Override public void setPower(long power) { this.power = power; @@ -192,13 +125,27 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerElectrolyser(player.inventory, this); + return new ContainerElectrolyserFluid(player.inventory, this); } @Override @SideOnly(Side.CLIENT) public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIElectrolyser(player.inventory, this); + return new GUIElectrolyserFluid(player.inventory, this); } + @Override + public void receiveControl(NBTTagCompound data) { + + } + + @Override + public void receiveControl(EntityPlayer player, NBTTagCompound data) { + + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_fluid.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_fluid.png index 32b6d976e04ce0678c30d159a2cfdae5e8eb0701..b55cc63435db77cc96dbcfaec5c18f01579841d4 100644 GIT binary patch literal 4936 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 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_metal.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_metal.png index 9c16575363dd0795125335cfb4397c9bb4ace475..0de879b3d28bf92a94cc4dfc9ea95376c948b8fc 100644 GIT binary patch literal 5971 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 Date: Mon, 31 Jul 2023 20:45:57 +0200 Subject: [PATCH 2/2] NEI handlers for custom machines, nether bedrock ores, electrolyser crap --- changelog | 15 +- gradle.properties | 2 +- .../blocks/machine/BlockCustomMachine.java | 22 +- .../blocks/machine/MachineElectrolyser.java | 69 +++--- src/main/java/com/hbm/config/WorldConfig.java | 7 +- .../hbm/handler/nei/CustomMachineHandler.java | 208 ++++++++++++++++++ .../container/ContainerElectrolyserMetal.java | 48 ++++ .../inventory/gui/GUIElectrolyserFluid.java | 20 ++ .../inventory/gui/GUIElectrolyserMetal.java | 67 ++++++ .../recipes/ElectrolyserFluidRecipes.java | 67 ++++++ .../recipes/ElectrolyserMetalRecipes.java | 58 +++++ .../recipes/loader/SerializableRecipe.java | 2 + .../hbm/items/block/ItemCustomMachine.java | 13 +- src/main/java/com/hbm/lib/HbmWorldGen.java | 29 ++- src/main/java/com/hbm/main/NEIConfig.java | 12 + .../machine/TileEntityElectrolyser.java | 164 +++++++++++++- .../com/hbm/world/feature/BedrockOre.java | 46 ++-- .../hbm/textures/gui/nei/gui_nei_custom.png | Bin 0 -> 1171 bytes .../gui/processing/gui_electrolyser_fluid.png | Bin 4936 -> 4966 bytes 19 files changed, 761 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/hbm/handler/nei/CustomMachineHandler.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java create mode 100644 src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java create mode 100644 src/main/java/com/hbm/inventory/recipes/ElectrolyserMetalRecipes.java create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_custom.png diff --git a/changelog b/changelog index 07447e1f7..dc78b26b6 100644 --- a/changelog +++ b/changelog @@ -1,13 +1,10 @@ ## Added -* New command `/ntmsatellites` - * `/ntmsatellites orbit` will send the held saatellite into orbit - * `/ntmsatellites descend ` will delete the given satellite ## Changed -* Updated russian localization -* It's no longer possible to insert items into the satellite cargo pad, it's only for unloading -* The satellite linker will no longer assign new frequencies in the randomizer slot if that frequency is already taken -* Custom machines will now show a hologram showing how they are built +* Bedrock ores now spawn in the nether + * Nether bedrock ores include red phosphorus and glowstone, both yielding powders instead of ores + * All current nether bedrock ores are tier 1 and do not require any bore fluid +* Custom machines now show their recipes in NEI + * All it took was battling NEI's source code for 3 hours and my sanity -## Fixed -* Fixed crash caused by mobs spawning in highly polluted area \ No newline at end of file +## Fixed \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index d305d95b5..fb976de9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,4 @@ credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion al \ Voxelstice (OpenComputers integration, turbine spinup), BallOfEnergy1 (OpenComputers integration), martemen\ \ (project settings), Pvndols (thorium fuel recipe, gas turbine), JamesH2 (blood mechanics, nitric acid,\ \ particle emitter), sdddddf80 (recipe configs, chinese localization, custom machine holograms),\ - \ SuperCraftAlex (tooltips) LePeep (coilgun model), Maksymisio (polish localization) + \ SuperCraftAlex (tooltips) LePeep (coilgun model, BDCL QC), Maksymisio (polish localization) diff --git a/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java b/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java index 0dac71ca5..72efa3313 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java +++ b/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Random; import com.hbm.config.CustomMachineConfigJSON; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -92,10 +93,19 @@ public class BlockCustomMachine extends BlockContainer { TileEntityCustomMachine tile = (TileEntityCustomMachine) world.getTileEntity(x, y, z); - if(tile != null && stack.hasTagCompound()) { - tile.machineType = stack.stackTagCompound.getString("machineType"); - tile.init(); - tile.markChanged(); + if(tile != null) { + int id = stack.getItemDamage() - 100; + + if(id >= 0 && id < CustomMachineConfigJSON.customMachines.size()) { + + MachineConfiguration config = CustomMachineConfigJSON.niceList.get(id); + + if(config != null) { + tile.machineType = config.unlocalizedName; + tile.init(); + tile.markChanged(); + } + } } } @@ -126,8 +136,6 @@ public class BlockCustomMachine extends BlockContainer { if(tile != null) { ItemStack stack = new ItemStack(item, 1, CustomMachineConfigJSON.niceList.indexOf(tile.config) + 100); - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setString("machineType", tile.machineType); ret.add(stack); } } @@ -142,8 +150,6 @@ public class BlockCustomMachine extends BlockContainer { if(tile != null && tile.machineType != null && !tile.machineType.isEmpty()) { ItemStack stack = new ItemStack(this, 1, CustomMachineConfigJSON.niceList.indexOf(tile.config) + 100); - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setString("machineType", tile.machineType); return stack; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index d6ca71710..3c6b7beac 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -20,7 +20,7 @@ public class MachineElectrolyser extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityElectrolyser(); - if(meta >= 6) return new TileEntityProxyCombo(false, true, true); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } @@ -42,39 +42,54 @@ public class MachineElectrolyser extends BlockDummyable { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {2, -1, 5, 5, 1, 1}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -3, 5, 5, 0, 0}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 4, -4, -3, 3}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 2, -2, -3, 3}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 0, 0, -3, 3}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -2, 2, -3, 3}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -4, 4, -3, 3}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 4, -4, -1, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 2, -2, -1, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 0, 0, -1, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -2, 2, -1, 2}, this, dir); - MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -4, 4, -1, 2}, this, dir); + x += dir.offsetX * o; + z += dir.offsetZ * o; + + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {2, -1, 5, 5, 1, 1}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -3, 5, 5, 0, 0}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, 4, -4, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, 2, -2, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, 0, 0, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, -2, 2, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, -4, 4, -3, 3}, this, dir); + MultiblockHandlerXR.fillSpace(world,x + dir.offsetX * 4, y + 3, z + dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world,x + dir.offsetX * 2, y + 3, z + dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x, y + 3, z, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x - dir.offsetX * 2, y + 3, z - dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x - dir.offsetX * 4, y + 3, z - dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, this, dir); + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); + this.makeExtra(world, x - dir.offsetX * 5 + rot.offsetX, y, z - dir.offsetZ * 5 + rot.offsetZ); + this.makeExtra(world, x - dir.offsetX * 5 - rot.offsetX, y, z - dir.offsetZ * 5 - rot.offsetZ); + this.makeExtra(world, x + dir.offsetX * 5, y, z + dir.offsetZ * 5); + this.makeExtra(world, x + dir.offsetX * 5 + rot.offsetX, y, z + dir.offsetZ * 5 + rot.offsetZ); + this.makeExtra(world, x + dir.offsetX * 5 - rot.offsetX, y, z + dir.offsetZ * 5 - rot.offsetZ); } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y , z + dir.offsetZ * o, getDimensions(), x, y, z, dir)) return false; + x += dir.offsetX * o; + z += dir.offsetZ * o; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {2, -1, 5, 5, 1, 1}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -3, 5, 5, 0, 0}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 4, -4, -3, 3}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 2, -2, -3, 3}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, 0, 0, -3, 3}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -2, 2, -3, 3}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y, z + dir.offsetZ * o, new int[] {3, -1, -4, 4, -3, 3}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 4, -4, -1, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 2, -2, -1, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -2, 2, -1, 2}, x, y, z, dir)) return false; - if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 3, z + dir.offsetZ * o, new int[] {0, 0, -4, 4, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y , z, getDimensions(), x, y, z, dir)) return false; + + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {2, -1, 5, 5, 1, 1}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -3, 5, 5, 0, 0}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, 4, -4, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, 2, -2, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, 0, 0, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, -2, 2, -3, 3}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, -4, 4, -3, 3}, x, y, z, dir)) return false; + + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * 4, y + 3, z + dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * 2, y + 3, z + dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x, y + 3, z, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x - dir.offsetX * 2, y + 3, z - dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; + if(!MultiblockHandlerXR.checkSpace(world, x - dir.offsetX * 4, y + 3, z - dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; return true; } diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index cf0f08a67..c2ac4bbb3 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -48,6 +48,8 @@ public class WorldConfig { public static int bedrockNiterSpawn = 50; public static int bedrockFluoriteSpawn = 50; public static int bedrockRedstoneSpawn = 50; + public static int bedrockGlowstoneSpawn = 100; + public static int bedrockPhosphorusSpawn = 50; public static int ironClusterSpawn = 4; public static int titaniumClusterSpawn = 2; @@ -153,7 +155,10 @@ public class WorldConfig { bedrockNiterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B11_bedrockNiterWeight", "Spawn weight for niter bedrock ore", 50); bedrockFluoriteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B12_bedrockFluoriteWeight", "Spawn weight for fluorite bedrock ore", 50); bedrockRedstoneSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B13_bedrockRedstoneWeight", "Spawn weight for redstone bedrock ore", 50); - bedrockChlorocalciteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B14_bedrockbChlorocalciteWeight", "Spawn weight for chlorocalcite bedrock ore", 35); + bedrockChlorocalciteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B14_bedrockChlorocalciteWeight", "Spawn weight for chlorocalcite bedrock ore", 35); + + bedrockGlowstoneSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN00_bedrockGlowstoneWeight", "Spawn weight for glowstone bedrock ore", 100); + bedrockPhosphorusSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN01_bedrockPhosphorusWeight", "Spawn weight for phosphorus bedrock ore", 50); ironClusterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.C00_ironClusterSpawn", "Amount of iron cluster veins per chunk", 4); titaniumClusterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.C01_titaniumClusterSpawn", "Amount of titanium cluster veins per chunk", 2); diff --git a/src/main/java/com/hbm/handler/nei/CustomMachineHandler.java b/src/main/java/com/hbm/handler/nei/CustomMachineHandler.java new file mode 100644 index 000000000..cf3570f79 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CustomMachineHandler.java @@ -0,0 +1,208 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.config.CustomMachineConfigJSON; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.CustomMachineRecipes; +import com.hbm.inventory.recipes.CustomMachineRecipes.CustomMachineRecipe; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.lib.RefStrings; +import com.hbm.util.ItemStackUtil; +import com.hbm.util.Tuple.Pair; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class CustomMachineHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public MachineConfiguration conf; + + @Override + public TemplateRecipeHandler newInstance() { // brick by brick, suck my dick + try { + return new CustomMachineHandler(conf); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + + public CustomMachineHandler(MachineConfiguration conf) { + super(); + this.conf = conf; + loadTransferRects(); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + List inputs = new ArrayList(); + PositionedStack machine; + List outputs = new ArrayList(); + + public RecipeSet(CustomMachineRecipe recipe) { + + for(int i = 0; i < 3; i++) if(recipe.inputFluids.length > i) inputs.add(new PositionedStack(ItemFluidIcon.make(recipe.inputFluids[i]), 12 + i * 18, 6)); + for(int i = 0; i < 3; i++) if(recipe.inputItems.length > i) inputs.add(new PositionedStack(recipe.inputItems[i].extractForNEI(), 12 + i * 18, 24)); + for(int i = 3; i < 6; i++) if(recipe.inputItems.length > i) inputs.add(new PositionedStack(recipe.inputItems[i].extractForNEI(), 12 + i * 18, 42)); + + for(int i = 0; i < 3; i++) if(recipe.outputFluids.length > i) outputs.add(new PositionedStack(ItemFluidIcon.make(recipe.outputFluids[i]), 102 + i * 18, 6)); + + for(int i = 0; i < 3; i++) if(recipe.outputItems.length > i) { + Pair pair = recipe.outputItems[i]; + ItemStack out = pair.getKey(); + if(pair.getValue() != 1) { + ItemStackUtil.addTooltipToStack(out, EnumChatFormatting.RED + "" + (((int)(pair.getValue() * 1000)) / 10D) + "%"); + } + outputs.add(new PositionedStack(out, 102 + i * 18, 24)); + } + + for(int i = 3; i < 6; i++) if(recipe.outputItems.length > i) { + Pair pair = recipe.outputItems[i]; + ItemStack out = pair.getKey(); + if(pair.getValue() != 1) { + ItemStackUtil.addTooltipToStack(out, EnumChatFormatting.RED + "" + (((int)(pair.getValue() * 1000)) / 10D) + "%"); + } + outputs.add(new PositionedStack(out, 102 + i * 18, 42)); + } + + this.machine = new PositionedStack(new ItemStack(ModBlocks.custom_machine, 1, 100 + CustomMachineConfigJSON.niceList.indexOf(conf)), 75, 42); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, inputs); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.addAll(inputs); + other.add(machine); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return conf.localizedName; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_custom.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntm_" + conf.unlocalizedName)) { + + List recipes = CustomMachineRecipes.recipes.get(conf.recipeKey); + + if(recipes != null) for(CustomMachineRecipe recipe : recipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + List recipes = CustomMachineRecipes.recipes.get(conf.recipeKey); + + System.out.println(conf.recipeKey); + + if(recipes != null) outer:for(CustomMachineRecipe recipe : recipes) { + + for(Pair stack : recipe.outputItems) { + + if(NEIServerUtils.areStacksSameTypeCrafting(stack.getKey(), result)) { + this.arecipes.add(new RecipeSet(recipe)); + continue outer; + } + } + + for(FluidStack fluid : recipe.outputFluids) { + ItemStack drop = ItemFluidIcon.make(fluid); + + if(compareFluidStacks(result, drop)) { + this.arecipes.add(new RecipeSet(recipe)); + continue outer; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntm_" + conf.unlocalizedName)) { + loadCraftingRecipes("ntm_" + conf.unlocalizedName, new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + List recipes = CustomMachineRecipes.recipes.get(conf.recipeKey); + + if(recipes != null) outer:for(CustomMachineRecipe recipe : recipes) { + + for(AStack stack : recipe.inputItems) { + + List stacks = stack.extractForNEI(); + + for(ItemStack sta : stacks) { + if(NEIServerUtils.areStacksSameTypeCrafting(ingredient, sta)) { + this.arecipes.add(new RecipeSet(recipe)); + continue outer; + } + } + } + + for(FluidStack fluid : recipe.inputFluids) { + ItemStack drop = ItemFluidIcon.make(fluid); + + if(compareFluidStacks(ingredient, drop)) { + this.arecipes.add(new RecipeSet(recipe)); + continue outer; + } + } + } + } + + public static boolean compareFluidStacks(ItemStack sta1, ItemStack sta2) { + return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); + } + + @Override + public void loadTransferRects() { + if(this.conf == null) return; + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntm_" + conf.unlocalizedName)); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java new file mode 100644 index 000000000..881f1382c --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java @@ -0,0 +1,48 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.tileentity.machine.TileEntityElectrolyser; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; + +public class ContainerElectrolyserMetal extends Container { + + private TileEntityElectrolyser electrolyser; + + public ContainerElectrolyserMetal(InventoryPlayer invPlayer, TileEntityElectrolyser tedf) { + electrolyser = tedf; + + //Battery + this.addSlotToContainer(new Slot(tedf, 0, 186, 109)); + //Upgrades + this.addSlotToContainer(new Slot(tedf, 1, 186, 140)); + this.addSlotToContainer(new Slot(tedf, 2, 186, 158)); + //Input + this.addSlotToContainer(new Slot(tedf, 14, 10, 22)); + //Outputs + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 15, 136, 18)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 16, 154, 18)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 17, 136, 36)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 18, 154, 36)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 19, 136, 54)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 20, 154, 54)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 180)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return electrolyser.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java index f23f12075..fa4964eed 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java @@ -4,11 +4,15 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerElectrolyserFluid; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityElectrolyser; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; public class GUIElectrolyserFluid extends GuiInfoContainer { @@ -37,6 +41,13 @@ public class GUIElectrolyserFluid extends GuiInfoContainer { protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); + + if(guiLeft + 8 <= x && guiLeft + 8 + 54 > x && guiTop + 82 < y && guiTop + 82 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("sgm", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, electrolyser.xCoord, electrolyser.yCoord, electrolyser.zCoord)); + } } @Override @@ -52,6 +63,15 @@ public class GUIElectrolyserFluid extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int p = (int) (electrolyser.power * 89 / electrolyser.maxPower); + drawTexturedModalRect(guiLeft + 186, guiTop + 107 - p, 210, 89 - p, 16, p); + + if(electrolyser.power >= electrolyser.usage) + drawTexturedModalRect(guiLeft + 190, guiTop + 4, 226, 40, 9, 12); + + int e = electrolyser.progressFluid * 41 / electrolyser.processFluidTime; + drawTexturedModalRect(guiLeft + 62, guiTop + 26, 226, 0, 12, e); electrolyser.tanks[0].renderTank(guiLeft + 42, guiTop + 70, this.zLevel, 16, 52); electrolyser.tanks[1].renderTank(guiLeft + 96, guiTop + 70, this.zLevel, 16, 52); diff --git a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java new file mode 100644 index 000000000..e63e67df2 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerElectrolyserMetal; +import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.machine.TileEntityElectrolyser; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public class GUIElectrolyserMetal extends GuiInfoContainer { + + public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_electrolyser_metal.png"); + private TileEntityElectrolyser electrolyser; + + public GUIElectrolyserMetal(InventoryPlayer invPlayer, TileEntityElectrolyser electrolyser) { + super(new ContainerElectrolyserMetal(invPlayer, electrolyser)); + this.electrolyser = electrolyser; + + this.xSize = 210; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + electrolyser.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 36, guiTop + 18, 16, 52); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 186, guiTop + 18, 16, 89, electrolyser.power, electrolyser.maxPower); + } + + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 8 <= x && guiLeft + 8 + 54 > x && guiTop + 82 < y && guiTop + 82 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("sgf", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, electrolyser.xCoord, electrolyser.yCoord, electrolyser.zCoord)); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.electrolyser.hasCustomInventoryName() ? this.electrolyser.getInventoryName() : I18n.format(this.electrolyser.getInventoryName()); + + this.fontRendererObj.drawString(name, (this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2) - 16, 7, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + electrolyser.tanks[3].renderTank(guiLeft + 36, guiTop + 70, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java b/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java new file mode 100644 index 000000000..5a61fb756 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.HashMap; + +import com.google.gson.JsonElement; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; + +public class ElectrolyserFluidRecipes extends SerializableRecipe { + + public static HashMap recipes = new HashMap(); + + @Override + public void registerDefaults() { + recipes.put(Fluids.WATER, new ElectrolysisRecipe(1_000, new FluidStack(Fluids.HYDROGEN, 100), new FluidStack(Fluids.OXYGEN, 100))); + recipes.put(Fluids.HEAVYWATER, new ElectrolysisRecipe(1_000, new FluidStack(Fluids.DEUTERIUM, 50), new FluidStack(Fluids.OXYGEN, 50))); + + recipes.put(Fluids.POTASSIUM_CHLORIDE, new ElectrolysisRecipe(250, new FluidStack(Fluids.CHLORINE, 125), new FluidStack(Fluids.NONE, 0), new ItemStack(ModItems.dust))); + recipes.put(Fluids.CALCIUM_CHLORIDE, new ElectrolysisRecipe(250, new FluidStack(Fluids.CHLORINE, 125), new FluidStack(Fluids.CALCIUM_SOLUTION, 125))); + } + + @Override + public String getFileName() { + return "hbmElectrolyzerFluid.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public void readRecipe(JsonElement recipe) { + + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + + } + + public static class ElectrolysisRecipe { + public FluidStack output1; + public FluidStack output2; + public int amount; + public ItemStack[] byproduct; + + public ElectrolysisRecipe(int amount, FluidStack output1, FluidStack output2, ItemStack... byproduct) { + this.output1 = output1; + this.output2 = output2; + this.amount = amount; + this.byproduct = byproduct; + } + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/ElectrolyserMetalRecipes.java b/src/main/java/com/hbm/inventory/recipes/ElectrolyserMetalRecipes.java new file mode 100644 index 000000000..40b3555c7 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/ElectrolyserMetalRecipes.java @@ -0,0 +1,58 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.HashMap; + +import com.google.gson.JsonElement; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; + +import net.minecraft.item.ItemStack; + +public class ElectrolyserMetalRecipes extends SerializableRecipe { + + public static HashMap recipes = new HashMap(); + + @Override + public void registerDefaults() { + + } + + public static ElectrolysisMetalRecipe getRecipe(ItemStack stack) { + return null; + } + + @Override + public String getFileName() { + return "hbmElectrolyzerMetal.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public void readRecipe(JsonElement recipe) { + + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + + } + + public static class ElectrolysisMetalRecipe { + + public MaterialStack output1; + public MaterialStack output2; + public ItemStack[] byproducts; + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index c719bd86c..c2252db37 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -62,6 +62,8 @@ public abstract class SerializableRecipe { recipeHandlers.add(new MixerRecipes()); recipeHandlers.add(new OutgasserRecipes()); recipeHandlers.add(new CompressorRecipes()); + recipeHandlers.add(new ElectrolyserFluidRecipes()); + recipeHandlers.add(new MatDistribution()); recipeHandlers.add(new CustomMachineRecipes()); } diff --git a/src/main/java/com/hbm/items/block/ItemCustomMachine.java b/src/main/java/com/hbm/items/block/ItemCustomMachine.java index 434b61c06..61b1cf00c 100644 --- a/src/main/java/com/hbm/items/block/ItemCustomMachine.java +++ b/src/main/java/com/hbm/items/block/ItemCustomMachine.java @@ -12,7 +12,6 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; public class ItemCustomMachine extends ItemBlock { @@ -24,10 +23,7 @@ public class ItemCustomMachine extends ItemBlock { public void getSubItems(Item item, CreativeTabs tab, List list) { for(int i = 0; i < CustomMachineConfigJSON.niceList.size(); i++) { - MachineConfiguration conf = CustomMachineConfigJSON.niceList.get(i); ItemStack stack = new ItemStack(item, 1, i + 100); - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setString("machineType", conf.unlocalizedName); list.add(stack); } } @@ -35,15 +31,14 @@ public class ItemCustomMachine extends ItemBlock { @Override public String getItemStackDisplayName(ItemStack stack) { - if(stack.hasTagCompound()) { - String name = stack.getTagCompound().getString("machineType"); - MachineConfiguration conf = CustomMachineConfigJSON.customMachines.get(name); + int id = stack.getItemDamage() - 100; + + if(id >= 0 && id < CustomMachineConfigJSON.customMachines.size()) { + MachineConfiguration conf = CustomMachineConfigJSON.niceList.get(id); if(conf != null) { return conf.localizedName; } - - return "INVALID MACHINE CONTROLLER (" + name + ")"; } return "INVALID MACHINE CONTROLLER"; diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 6d2af30ab..323e01b0c 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -116,14 +116,15 @@ public class HbmWorldGen implements IWorldGenerator { if(WorldConfig.alexandriteSpawn > 0 && rand.nextInt(WorldConfig.alexandriteSpawn) == 0) DungeonToolbox.generateOre(world, rand, i, j, 1, 3, 10, 5, ModBlocks.ore_alexandrite); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_iron, rand, 24); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_titanium, rand, 32); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_tungsten, rand, 32); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_cinnebar, rand, 16); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_zirconium, rand, 16); - DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_borax, rand, 16); - if(WorldConfig.overworldOre) { + + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_iron, rand, 24); + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_titanium, rand, 32); + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.6D, ModBlocks.cluster_depth_tungsten, rand, 32); + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_cinnebar, rand, 16); + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_zirconium, rand, 16); + DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_borax, rand, 16); + DungeonToolbox.generateOre(world, rand, i, j, 25, 6, 30, 10, ModBlocks.ore_gneiss_iron, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, 10, 6, 30, 10, ModBlocks.ore_gneiss_gold, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.uraniumSpawn * 3, 6, 30, 10, ModBlocks.ore_gneiss_uranium, ModBlocks.stone_gneiss); @@ -721,10 +722,18 @@ public class HbmWorldGen implements IWorldGenerator { if(GeneralConfig.enablePlutoniumOre) DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.netherPlutoniumSpawn, 4, 0, 127, ModBlocks.ore_nether_plutonium, Blocks.netherrack); - } + + if(rand.nextInt(10) == 0) { + WeightedRandomGeneric item = (WeightedRandomGeneric) WeightedRandom.getRandomItem(rand, BedrockOre.weightedOresNether); + BedrockOreDefinition def = item.get(); + int randPosX = i + rand.nextInt(2) + 8; + int randPosZ = j + rand.nextInt(2) + 8; + BedrockOre.generate(world, randPosX, randPosZ, def.stack, def.acid, def.color, def.tier, ModBlocks.stone_depth_nether); + } - DepthDeposit.generateConditionNether(world, i, 0, 3, j, 7, 0.6D, ModBlocks.ore_depth_nether_neodymium, rand, 16); - DepthDeposit.generateConditionNether(world, i, 125, 3, j, 7, 0.6D, ModBlocks.ore_depth_nether_neodymium, rand, 16); + DepthDeposit.generateConditionNether(world, i, 0, 3, j, 7, 0.6D, ModBlocks.ore_depth_nether_neodymium, rand, 16); + DepthDeposit.generateConditionNether(world, i, 125, 3, j, 7, 0.6D, ModBlocks.ore_depth_nether_neodymium, rand, 16); + } for(int k = 0; k < 30; k++){ int x = i + rand.nextInt(16); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index d0d0fa102..c5bc758a2 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -4,6 +4,8 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre; +import com.hbm.config.CustomMachineConfigJSON; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; import com.hbm.config.VersatileConfig; import com.hbm.handler.nei.*; import com.hbm.items.ModItems; @@ -14,6 +16,8 @@ import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.IHighlightHandler; import codechicken.nei.api.ItemInfo.Layout; +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; import codechicken.nei.recipe.ICraftingHandler; import codechicken.nei.recipe.IUsageHandler; import net.minecraft.entity.player.EntityPlayer; @@ -69,6 +73,8 @@ public class NEIConfig implements IConfigureNEI { registerHandler(new SawmillHandler()); registerHandler(new MixerHandler()); registerHandler(new OutgasserHandler()); + + for(MachineConfiguration conf : CustomMachineConfigJSON.niceList) registerHandlerBypass(new CustomMachineHandler(conf)); //fluids registerHandler(new FluidRecipeHandler()); @@ -153,6 +159,12 @@ public class NEIConfig implements IConfigureNEI { API.registerRecipeHandler((ICraftingHandler) o); API.registerUsageHandler((IUsageHandler) o); } + + /** Bypasses the utterly useless restriction of one registered handler per class */ + public static void registerHandlerBypass(Object o) { + GuiCraftingRecipe.craftinghandlers.add((ICraftingHandler) o); + GuiUsageRecipe.usagehandlers.add((IUsageHandler) o); + } @Override public String getName() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 378317d76..0550dddc0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -1,24 +1,40 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerElectrolyserFluid; +import com.hbm.inventory.container.ContainerElectrolyserMetal; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIElectrolyserFluid; +import com.hbm.inventory.gui.GUIElectrolyserMetal; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.ElectrolyserFluidRecipes; +import com.hbm.inventory.recipes.ElectrolyserFluidRecipes.ElectrolysisRecipe; +import com.hbm.inventory.recipes.ElectrolyserMetalRecipes; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidStandardTransceiver; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; 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.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyUser, IControlReceiver, IGUIProvider { +public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IControlReceiver, IGUIProvider { public long power; public static final long maxPower = 20000000; @@ -31,6 +47,10 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public int progressOre; public static final int processOreTimeBase = 1000; public int processOreTime; + + public MaterialStack leftStack; + public MaterialStack rightStack; + public int maxMaterial = MaterialShapes.BLOCK.q(16); public FluidTank[] tanks; @@ -42,6 +62,8 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn //5-10: Fluid IO //11-13: Byproducts //// METAL + //14: Crystal + //15-20: Outputs super(21); tanks = new FluidTank[4]; tanks[0] = new FluidTank(Fluids.WATER, 16000); @@ -49,6 +71,22 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn tanks[2] = new FluidTank(Fluids.OXYGEN, 16000); tanks[3] = new FluidTank(Fluids.NITRIC_ACID, 16000); } + + @Override + public int[] getAccessibleSlotsFromSide(int meta) { + return new int[] { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + if(i == 14) return ElectrolyserMetalRecipes.getRecipe(itemStack) != null; + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i != 14; + } @Override public String getName() { @@ -60,6 +98,41 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(!worldObj.isRemote) { + this.tanks[0].setType(3, 4, slots); + this.tanks[0].loadTank(5, 6, slots); + this.tanks[1].unloadTank(7, 8, slots); + this.tanks[2].unloadTank(9, 10, slots); + + if(worldObj.getTotalWorldTime() % 20 == 0) { + for(DirPos pos : this.getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[3].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + UpgradeManager.eval(slots, 1, 2); + int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); + int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + + processFluidTime = processFluidTimeBase - processFluidTimeBase * speedLevel / 4; + processOreTime = processOreTimeBase - processOreTimeBase * speedLevel / 4; + usage = usageBase - usageBase * powerLevel / 4; + + if(this.canProcessFluid()) { + this.progressFluid++; + this.power -= this.usage; + + if(this.progressFluid >= this.processFluidTime) { + this.processFluids(); + this.progressFluid = 0; + this.markChanged(); + } + } + NBTTagCompound data = new NBTTagCompound(); data.setLong("power", this.power); data.setInteger("progressFluid", this.progressFluid); @@ -71,6 +144,20 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn this.networkPack(data, 50); } } + + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + return new DirPos[] { + new DirPos(xCoord - dir.offsetX * 6, yCoord, zCoord - dir.offsetZ * 6, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 6 + rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 + rot.offsetZ, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 6 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 - rot.offsetZ, dir.getOpposite()), + new DirPos(xCoord + dir.offsetX * 6, yCoord, zCoord + dir.offsetZ * 6, dir), + new DirPos(xCoord + dir.offsetX * 6 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 + rot.offsetZ, dir), + new DirPos(xCoord + dir.offsetX * 6 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 - rot.offsetZ, dir) + }; + } @Override public void networkUnpack(NBTTagCompound nbt) { @@ -83,6 +170,56 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); } + public boolean canProcessFluid() { + + if(this.power < usage) return false; + + ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); + + if(recipe == null) return false; + if(recipe.amount > tanks[0].getFill()) return false; + if(recipe.output1.type == tanks[1].getTankType() && recipe.output1.fill + tanks[1].getFill() > tanks[1].getMaxFill()) return false; + if(recipe.output2.type == tanks[2].getTankType() && recipe.output2.fill + tanks[2].getFill() > tanks[2].getMaxFill()) return false; + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[11 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) continue; + if(!slot.isItemEqual(byproduct)) return false; + if(slot.stackSize + byproduct.stackSize > slot.getMaxStackSize()) return false; + } + } + + return true; + } + + public void processFluids() { + + ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); + tanks[0].setFill(tanks[0].getFill() - recipe.amount); + tanks[1].setTankType(recipe.output1.type); + tanks[2].setTankType(recipe.output2.type); + tanks[1].setFill(tanks[1].getFill() + recipe.output1.fill); + tanks[2].setFill(tanks[2].getFill() + recipe.output2.fill); + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[11 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) { + slots[11 + i] = byproduct.copy(); + } else { + slots[11 + i].stackSize += byproduct.stackSize; + } + } + } + } + AxisAlignedBB bb = null; @Override @@ -123,15 +260,32 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn this.power = power; } + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] {tanks[1], tanks[2]}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tanks[0], tanks[3]}; + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerElectrolyserFluid(player.inventory, this); + if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); + return new ContainerElectrolyserMetal(player.inventory, this); } @Override @SideOnly(Side.CLIENT) public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIElectrolyserFluid(player.inventory, this); + if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); + return new GUIElectrolyserMetal(player.inventory, this); } @Override @@ -141,7 +295,9 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { - + + if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); + if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); } @Override diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index cce83e8ec..15077d50f 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -20,33 +20,41 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class BedrockOre { - + public static List> weightedOres = new ArrayList(); + public static List> weightedOresNether = new ArrayList(); public static void init() { - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.IRON, 1), WorldConfig.bedrockIronSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.COPPER, 1), WorldConfig.bedrockCopperSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.BORAX, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockBoraxSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.CHLOROCALCITE, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockChlorocalciteSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.ASBESTOS, 2), WorldConfig.bedrockAsbestosSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.NIOBIUM, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiobiumSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.TITANIUM, 2, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockTitaniumSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.TUNGSTEN, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockTungstenSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); - registerBedrockOre(new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); - registerBedrockOre(new BedrockOreDefinition(new ItemStack(Items.coal, 4), 1, 0x202020), WorldConfig.bedrockCoalSpawn); - registerBedrockOre(new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); - registerBedrockOre(new BedrockOreDefinition(new ItemStack(ModItems.fluorite, 4), 1, 0xd0d0d0), WorldConfig.bedrockFluoriteSpawn); - registerBedrockOre(new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.IRON, 1), WorldConfig.bedrockIronSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.COPPER, 1), WorldConfig.bedrockCopperSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.BORAX, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockBoraxSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.CHLOROCALCITE, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockChlorocalciteSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.ASBESTOS, 2), WorldConfig.bedrockAsbestosSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NIOBIUM, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiobiumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TITANIUM, 2, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockTitaniumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TUNGSTEN, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockTungstenSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 4), 1, 0x202020), WorldConfig.bedrockCoalSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.fluorite, 4), 1, 0xd0d0d0), WorldConfig.bedrockFluoriteSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); + + registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.glowstone_dust, 4), 1, 0xF9FF4D), WorldConfig.bedrockGlowstoneSpawn); + registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(ModItems.powder_fire, 4), 1, 0xD7341F), WorldConfig.bedrockPhosphorusSpawn); } - public static void registerBedrockOre(BedrockOreDefinition def, int weight) { + public static void registerBedrockOre(List list, BedrockOreDefinition def, int weight) { WeightedRandomGeneric weighted = new WeightedRandomGeneric(def, weight); - weightedOres.add(weighted); + list.add(weighted); } public static void generate(World world, int x, int z, ItemStack stack, FluidStack acid, int color, int tier) { + generate(world, x, z, stack, acid, color, tier, ModBlocks.stone_depth); + } + + public static void generate(World world, int x, int z, ItemStack stack, FluidStack acid, int color, int tier, Block depthRock) { for(int ix = x - 1; ix <= x + 1; ix++) { for(int iz = z - 1; iz <= z + 1; iz++) { @@ -77,7 +85,7 @@ public class BedrockOre { Block b = world.getBlock(ix, iy, iz); if(b.isReplaceableOreGen(world, ix, iy, iz, Blocks.stone) || b.isReplaceableOreGen(world, ix, iy, iz, Blocks.bedrock)) { - world.setBlock(ix, iy, iz, ModBlocks.stone_depth); + world.setBlock(ix, iy, iz, depthRock); } } } diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_custom.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_custom.png new file mode 100644 index 0000000000000000000000000000000000000000..c28a69cf4fb1169db87a8a20583dc22ab5ffe364 GIT binary patch literal 1171 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGwrm#2$k zNX4ADcO3I>TM4iwSbf-}?xlBu`G*qYozg3%>mOxXWWN9W?cK7<+R`^y^cNjbeEz%P zK*#HznftGJB=O|=EuC{}rmyDg&(9Z_7H{46_DTgq!RnP?8Qe;=o__iD^~>vxUuQfJ zDlTPw-pDm|#hI(W%>2cj{=C}P)c|6Pg}rFq8Fjxb%Z6dc)hksD%)7LomT$Oxb-E+Z z<(tZ%cd#yyewI~xd*w%l2Vudl8F^mZ5@l#9ewkmlj^WwOIF1ir{`|R*PVpufS)6G`d^>q4`In`;r35`}4UBK*+rHp%aZm}+YtyQ!IDrTJd zDg8k9_oj=lT!eM!2Ns_@BIR%trXE@ElVS$$E1halc8j0gQJ&AdA_D57^J^GG)(HD< zsc}2IGyNKa*a|4y9htpZ`T#I&esj&WfjRSL%&nxK^|{=6%V(9I*g2*8c2juxQ?Z2Y zx6l6i`L`~fuibftm0?_9NrwyDr~mNF?D7zFlI8Xab@Q45>DXt zwdcIiJdOR)#|obBl`O{|aWM!LvwjfIp5OSt`sl+q=P$)DvOIl|&MW2Mz*l!|5hKgv z2kE|23@XbQ9g=`ln)?Dja1d?YsC;3n)png@SAX5TUb9}VxGvRw!LK(QB}>n(wZ8i0 zTio7fXN=ZBG(q(eNtLm9eT%#J>cX`*vW*G4Wh|@C>%y&v8nMlCYEjkal1p=fS?83{1OP@q&~g9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_fluid.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_electrolyser_fluid.png index b55cc63435db77cc96dbcfaec5c18f01579841d4..30b63b55ee4fa83b8890751e3fca91c92e336041 100644 GIT binary patch literal 4966 zcmb_g=U-Dxx1NL+>4+3TNDRjV(p3;Co)qpQ<@?H7itP?vUt}mMFF-w~&R^646s#$(l~LIz6U#U`J;SwuUvgIyI+# zI+O4H85j5pXt8UO2&+2M$mTWeb1QRGtagF@ap7?>d(u+;yPX2s>L{Dz6@PluW!e`3 z;M|*>U=kkha3Hk3y**m0xu>UxapuFwfw}d)ohg#UE`3D1vIwtm^5~%;xwW4rB;~tR zSsrD}QIWh6O)GaowG%AyZpj9JEmM~qT*uDadF z#b@frwtfF@DZW@?73p>)7s#<@LQaN})Fh%wX=!PR@2{H9s=L{)Y-}mFmSVIVhxt4w zP1(VE$NYR@WaO8wE~}U$T0$@|7`>a9lzkgtBC-zh{HQ2KY48dQdchQ{gb{D=z8XHE~eL4HwT zp}C)f4oghvFfS(;cff#hZ~=lcI{@Utde8cL8Dt#kt0=#0@tG|WkVOlNi!U_oXNC80 zJ$V00H|;TZ+nZ>Rw)^#P!L*eg2l!~7#+Q3vsj+;6RBDXj69HpbVS942Y)mw%zC7sD zr5AQwU_Lo5t)k{&_f$bN0pK8|Z}aB>PU|#c=6c;qUfB3uukjkI+2Pv#EH5qeULD4) zz9z`d0@J_&%ri3_hRqR;u|4)~dEKSD=FW(<775=y&Fl?};tE3Aogs~FE!A!F zjNeUlu(r_OlF@tcAoUS2JZ8(CAfV}IJRpp||FdR~WLrN`P`s7r zx`*~Bc+0y4zKVTVh@gDbO+TH;o|F$(x!+ytpFx)?5{5sV4Xml4&FI#z_7G%9gH`

_<0>`I&@#!sL9d8GP;!kGK<4Ybkg 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

2y=+S zprw|2ujx~^RXKshYBAgMl$0-g^Z}t6)!!DyV9(b_=K6&$o>FEHk=L_=8yg!-`xP!q z1*<{pmN+LkQOwaY2Y(}qlClT6LgCjI)5zJqKJ$pOSZ*MXQzGenjE#j&ba3{sPu32u z>gNKA?zh!ul@6s-Jf>dy6cplyqhsbzvz>p%A=adbwO&!y7c+xl!^%Sbxus9ZuL(K} zN`Yz94N+9of@0$pld~4H)%8$HB=mkjKE@at_1!a=worcY@0=54HJ7<9w_7k#QBm9< z{vsLPP+*R_?%I!tQ4D>^)}WEC^*ctB$Fxjb&SnYO@Ks-}EBzhpVwnnLge)5$cEVcC zC>ut#uf0_!)4jOpo+Ad+>lcb7zBAGPqizZBg&{M_cURumF~;pZm@?JcaM)jMgF-XW z8l!O|BO@2K=T`_kTF@>Xiz=G~*B6M(Z3@)TrXO#5+kNckriMASj`KEU?7-O@>}?6l zk;KY9G!B@4Ao8LP9jK_N_%O5NA1lSs+^b|bwl*6%E3?oXBA^zY5F;>~a^_CPybT$} z+IW?8tYYpZzd4R}mOE$D5gvKa%E*BKEqt!?XB8<)frBaCf zeXs#`W4Trq%E1Nk@UZq^Gk!-%M4k~?eWBs_?=Zqf0 NdP&b1SFC$A25BLNkRnSZYk2HSj7eq9 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