From 647c8379093e149f0e2d953c8f5e464ba464118e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 30 Jul 2023 19:00:35 +0200 Subject: [PATCH] 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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