From 98f3f544cd5ba6963922b200f9b357427c35a498 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 14 Jan 2014 18:30:26 -0500 Subject: [PATCH] More salivation plant work --- .../client/gui/GuiSalinationController.java | 171 ++++++++++++++++-- common/mekanism/common/block/BlockBasic.java | 4 +- .../ContainerSalinationController.java | 164 ++++++++++++++--- .../tile/TileEntitySalinationController.java | 124 ++++++++++--- .../mekanism/gui/GuiSalinationController.png | Bin 2200 -> 4025 bytes 5 files changed, 388 insertions(+), 75 deletions(-) diff --git a/common/mekanism/client/gui/GuiSalinationController.java b/common/mekanism/client/gui/GuiSalinationController.java index 96c597c2b..e25f1744f 100644 --- a/common/mekanism/client/gui/GuiSalinationController.java +++ b/common/mekanism/client/gui/GuiSalinationController.java @@ -1,38 +1,171 @@ package mekanism.client.gui; -import java.util.List; +import java.util.ArrayList; -import mekanism.api.ListUtils; -import mekanism.client.gui.GuiEnergyInfo.IInfoHandler; +import mekanism.api.Coord4D; +import mekanism.api.gas.GasStack; +import mekanism.client.render.MekanismRenderer; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; import mekanism.common.inventory.container.ContainerSalinationController; +import mekanism.common.network.PacketTileEntity; import mekanism.common.tile.TileEntitySalinationController; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; - import net.minecraft.entity.player.InventoryPlayer; +import net.minecraftforge.fluids.FluidStack; + import org.lwjgl.opengl.GL11; public class GuiSalinationController extends GuiMekanism { - TileEntitySalinationController tileEntity; + public TileEntitySalinationController tileEntity; - public GuiSalinationController(InventoryPlayer inventory, TileEntitySalinationController tentity) - { - super(tentity, new ContainerSalinationController(inventory, tentity)); - tileEntity = tentity; - } + public GuiSalinationController(InventoryPlayer inventory, TileEntitySalinationController tentity) + { + super(tentity, new ContainerSalinationController(inventory, tentity)); + tileEntity = tentity; + } - @Override - protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + fontRenderer.drawString(tileEntity.getInvName(), 5, 5, 0x404040); + fontRenderer.drawString(MekanismUtils.localize("container.inventory"), 8, (ySize - 96) + 4, 0x404040); + + if(xAxis >= 7 && xAxis <= 23 && yAxis >= 14 && yAxis <= 72) + { + drawCreativeTabHoveringText(tileEntity.waterTank.getFluid() != null ? tileEntity.waterTank.getFluid().getFluid().getLocalizedName() + ": " + tileEntity.waterTank.getFluidAmount() : MekanismUtils.localize("gui.empty"), xAxis, yAxis); + } + + if(xAxis >= 153 && xAxis <= 169 && yAxis >= 14 && yAxis <= 72) + { + drawCreativeTabHoveringText(tileEntity.brineTank.getFluid() != null ? tileEntity.brineTank.getFluid().getFluid().getLocalizedName() + ": " + tileEntity.brineTank.getFluidAmount() : MekanismUtils.localize("gui.empty"), xAxis, yAxis); + } + + if(xAxis >= 49 && xAxis <= 127 && yAxis >= 64 && yAxis <= 72) + { + drawCreativeTabHoveringText(getTemp(), xAxis, yAxis); + } + + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + } + + public String getTemp() + { + float temp = (float)Math.round((tileEntity.getTemperature()*200)*100)/100F; + + return temp + " F"; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + { + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiSalinationController.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + int xAxis = mouseX - guiWidth; + int yAxis = mouseY - guiHeight; + + int displayInt; + + if(tileEntity.getScaledWaterLevel(58) > 0) + { + displayGauge(7, 14, tileEntity.getScaledWaterLevel(58), tileEntity.waterTank.getFluid(), null); + } + + if(tileEntity.getScaledBrineLevel(58) > 0) + { + displayGauge(153, 14, tileEntity.getScaledBrineLevel(58), tileEntity.brineTank.getFluid(), null); + } + + displayInt = tileEntity.getScaledTempLevel(78); + drawTexturedModalRect(guiWidth + 49, guiHeight + 64, 176, 59, displayInt, 8); + } + + @Override + protected void mouseClicked(int x, int y, int button) + { + super.mouseClicked(x, y, button); + + if(button == 0) + { + int xAxis = (x - (width - xSize) / 2); + int yAxis = (y - (height - ySize) / 2); + + if(xAxis > 44 && xAxis < 62 && yAxis > 13 && yAxis < 21) + { + ArrayList data = new ArrayList(); + data.add(0); + + PacketHandler.sendPacket(Transmission.SERVER, new PacketTileEntity().setParams(Coord4D.get(tileEntity), data)); + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); + } + else if(xAxis > 114 && xAxis < 132 && yAxis > 13 && yAxis < 21) + { + ArrayList data = new ArrayList(); + data.add(1); + + PacketHandler.sendPacket(Transmission.SERVER, new PacketTileEntity().setParams(Coord4D.get(tileEntity), data)); + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); + } + } + } + + public void displayGauge(int xPos, int yPos, int scale, FluidStack fluid, GasStack gas) { - super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + if(fluid == null && gas == null) + { + return; + } + + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + + int start = 0; + + while(true) + { + int renderRemaining = 0; + + if(scale > 16) + { + renderRemaining = 16; + scale -= 16; + } + else { + renderRemaining = scale; + scale = 0; + } + + mc.renderEngine.bindTexture(MekanismRenderer.getBlocksTexture()); + + if(fluid != null) + { + drawTexturedModelRectFromIcon(guiWidth + xPos, guiHeight + yPos + 58 - renderRemaining - start, fluid.getFluid().getIcon(), 16, 16 - (16 - renderRemaining)); + } + else if(gas != null) + { + drawTexturedModelRectFromIcon(guiWidth + xPos, guiHeight + yPos + 58 - renderRemaining - start, gas.getGas().getIcon(), 16, 16 - (16 - renderRemaining)); + } + + start+=16; + + if(renderRemaining == 0 || scale == 0) + { + break; + } + } mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiSalinationController.png")); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - int guiWidth = (width - xSize) / 2; - int guiHeight = (height - ySize) / 2; - drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + drawTexturedModalRect(guiWidth + xPos, guiHeight + yPos, 176, 0, 16, 59); } - - } diff --git a/common/mekanism/common/block/BlockBasic.java b/common/mekanism/common/block/BlockBasic.java index 8c32ac7fb..8aa9ae398 100644 --- a/common/mekanism/common/block/BlockBasic.java +++ b/common/mekanism/common/block/BlockBasic.java @@ -158,11 +158,11 @@ public class BlockBasic extends Block } else if(metadata == 14) { - TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); + TileEntitySalinationController tileEntity = (TileEntitySalinationController)world.getBlockTileEntity(x, y, z); if(side == tileEntity.facing) { - return icons[14][0]; + return tileEntity.structured ? icons[14][1] : icons[14][0]; } else { return icons[12][0]; diff --git a/common/mekanism/common/inventory/container/ContainerSalinationController.java b/common/mekanism/common/inventory/container/ContainerSalinationController.java index 1d17a0ce3..01e23483a 100644 --- a/common/mekanism/common/inventory/container/ContainerSalinationController.java +++ b/common/mekanism/common/inventory/container/ContainerSalinationController.java @@ -1,44 +1,154 @@ package mekanism.common.inventory.container; +import mekanism.common.inventory.slot.SlotEnergy.SlotDischarge; +import mekanism.common.inventory.slot.SlotOutput; import mekanism.common.tile.TileEntitySalinationController; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; - +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; public class ContainerSalinationController extends Container { - private TileEntitySalinationController tileEntity; + private TileEntitySalinationController tileEntity; - public ContainerSalinationController(InventoryPlayer inventory, TileEntitySalinationController tile) - { - tileEntity = tile; + public ContainerSalinationController(InventoryPlayer inventory, TileEntitySalinationController tentity) + { + tileEntity = tentity; + + addSlotToContainer(new Slot(tentity, 0, 28, 20)); + addSlotToContainer(new SlotOutput(tentity, 1, 28, 51)); + addSlotToContainer(new Slot(tentity, 2, 132, 20)); + addSlotToContainer(new SlotOutput(tentity, 3, 132, 51)); + + int slotY; - int slotX; - - for(slotX = 0; slotX < 3; slotX++) - { - for(int slotY = 0; slotY < 9; slotY++) - { - addSlotToContainer(new Slot(inventory, slotY + slotX * 9 + 9, 8 + slotY * 18, 84 + slotX * 18)); - } - } - - for(slotX = 0; slotX < 9; ++slotX) - { - addSlotToContainer(new Slot(inventory, slotX, 8 + slotX * 18, 142)); - } - - tileEntity.open(inventory.player); - tileEntity.openChest(); - } + for(slotY = 0; slotY < 3; ++slotY) + { + for(int slotX = 0; slotX < 9; ++slotX) + { + addSlotToContainer(new Slot(inventory, slotX + slotY * 9 + 9, 8 + slotX * 18, 84 + slotY * 18)); + } + } + for(slotY = 0; slotY < 9; ++slotY) + { + addSlotToContainer(new Slot(inventory, slotY, 8 + slotY * 18, 142)); + } + + tileEntity.open(inventory.player); + tileEntity.openChest(); + } + + @Override + public void onContainerClosed(EntityPlayer entityplayer) + { + super.onContainerClosed(entityplayer); + + tileEntity.close(entityplayer); + tileEntity.closeChest(); + } @Override - public boolean canInteractWith(EntityPlayer entityplayer) + public boolean canInteractWith(EntityPlayer entityplayer) { - return tileEntity.isUseableByPlayer(entityplayer); - } + return tileEntity.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotID) + { + ItemStack stack = null; + Slot currentSlot = (Slot)inventorySlots.get(slotID); + + if(currentSlot != null && currentSlot.getHasStack()) + { + ItemStack slotStack = currentSlot.getStack(); + stack = slotStack.copy(); + + if(slotID == 1 || slotID == 3) + { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + else if(FluidContainerRegistry.isEmptyContainer(slotStack)) + { + if(slotID != 2) + { + if(!mergeItemStack(slotStack, 2, 3, false)) + { + return null; + } + } + else if(slotID == 2) + { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + } + else if(FluidContainerRegistry.isFilledContainer(slotStack) && FluidContainerRegistry.getFluidForFilledItem(slotStack).getFluid() == FluidRegistry.WATER) + { + if(slotID != 0) + { + if(!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else if(slotID == 0) + { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + } + else { + if(slotID >= 4 && slotID <= 30) + { + if(!mergeItemStack(slotStack, 31, inventorySlots.size(), false)) + { + return null; + } + } + else if(slotID > 30) + { + if(!mergeItemStack(slotStack, 4, 30, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + } + + if(slotStack.stackSize == 0) + { + currentSlot.putStack((ItemStack)null); + } + else { + currentSlot.onSlotChanged(); + } + + if(slotStack.stackSize == stack.stackSize) + { + return null; + } + + currentSlot.onPickupFromSlot(player, slotStack); + } + + return stack; + } } diff --git a/common/mekanism/common/tile/TileEntitySalinationController.java b/common/mekanism/common/tile/TileEntitySalinationController.java index d253a9f8d..14f9480f9 100644 --- a/common/mekanism/common/tile/TileEntitySalinationController.java +++ b/common/mekanism/common/tile/TileEntitySalinationController.java @@ -6,13 +6,13 @@ import java.util.Set; import mekanism.api.Coord4D; import mekanism.common.IConfigurable; -import mekanism.common.IRedstoneControl.RedstoneControl; +import mekanism.common.tank.TankUpdateProtocol; import mekanism.common.util.MekanismUtils; import mekanism.generators.common.tile.TileEntityAdvancedSolarGenerator; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatMessageComponent; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; @@ -22,8 +22,11 @@ import com.google.common.io.ByteArrayDataInput; public class TileEntitySalinationController extends TileEntitySalinationTank implements IConfigurable { - public static int MAX_WATER = 100000; - public static int MAX_BRINE = 1000; + public static final int MAX_WATER = 100000; + public static final int MAX_BRINE = 1000; + + public static final int MAX_SOLARS = 4; + public static final int WARMUP = 300; public FluidTank waterTank = new FluidTank(MAX_WATER); public FluidTank brineTank = new FluidTank(MAX_BRINE); @@ -36,7 +39,7 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp public double partialWater = 0; public double partialBrine = 0; - public float baseTemperature = 0; + public float temperature = 0; public int height = 0; @@ -51,6 +54,8 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp public TileEntitySalinationController() { super("SalinationController"); + + inventory = new ItemStack[4]; } @Override @@ -65,11 +70,14 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp refresh(); } - setTemperature(); + updateTemperature(); if(canOperate()) { - partialWater += baseTemperature * (height + 7)/8; + int brineNeeded = brineTank.getCapacity()-brineTank.getFluidAmount(); + int waterStored = waterTank.getFluidAmount(); + + double waterUse = Math.min(brineTank.getFluidAmount(), getTemperature()*100); if(partialWater >= 1) { @@ -111,11 +119,18 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp { if(!updatedThisTick) { + clearStructure(); structured = buildStructure(); if(!structured) { - clearStructure(); + temperature = Math.min(getMaxTemperature(), getTemperature()); + } + else { + if(waterTank.getFluid() != null) + { + waterTank.getFluid().amount = Math.min(waterTank.getFluid().amount, getMaxWater()); + } } } } @@ -123,34 +138,61 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp public boolean canOperate() { - if(!structured || height < 1 || waterTank.getFluid() == null || !waterTank.getFluid().containsFluid(FluidRegistry.getFluidStack("water", 100))) + if(!structured || height < 3 || height > 18 || waterTank.getFluid() == null) { return false; } - - boolean solarsActive = true; - - for(TileEntityAdvancedSolarGenerator solarPanel : solars) + + if(!waterTank.getFluid().containsFluid(FluidRegistry.getFluidStack("water", 1)) || brineTank.getCapacity()-brineTank.getFluidAmount() == 0) { - if(solarPanel == null || solarPanel.isInvalid()) - { - clearStructure(); - return false; - } - - solarsActive &= solarPanel.seesSun; + return false; } - return solarsActive; + return true; } - - public void setTemperature() + + public void updateTemperature() { - if(!temperatureSet) + float max = getMaxTemperature(); + float incr = (max/WARMUP)*getTempMultiplier(); + + if(getTempMultiplier() == 0) { - baseTemperature = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord).getFloatTemperature(); - temperatureSet = true; + temperature = Math.max(0, getTemperature()-(incr*2)); } + else { + temperature = Math.min(max, getTemperature()+incr); + } + } + + public float getTemperature() + { + return temperature; + } + + public float getMaxTemperature() + { + return 1 + (height-3)*0.5F; + } + + public float getTempMultiplier() + { + return worldObj.getBiomeGenForCoordsBody(xCoord, zCoord).getFloatTemperature()*(getActiveSolars()/MAX_SOLARS); + } + + public int getActiveSolars() + { + int ret = 0; + + for(TileEntityAdvancedSolarGenerator solar : solars) + { + if(solar.seesSun) + { + ret++; + } + } + + return ret; } public boolean buildStructure() @@ -180,7 +222,7 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp middle++; } - if(middle != height-2) + if(height < 3 || height > 18 || middle != height-2) { height = 0; return false; @@ -255,6 +297,11 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp return true; } + public int getMaxWater() + { + return height*4*TankUpdateProtocol.FLUID_PER_TANK; + } + public int getCorner(int x, int z) { if(x == 0 && z == 0) @@ -399,6 +446,21 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp return false; } } + + public int getScaledWaterLevel(int i) + { + return waterTank.getFluid() != null ? waterTank.getFluid().amount*i / 10000 : 0; + } + + public int getScaledBrineLevel(int i) + { + return brineTank.getFluid() != null ? brineTank.getFluid().amount*i / 10000 : 0; + } + + public int getScaledTempLevel(int i) + { + return (int)(getMaxTemperature() == 0 ? 0 : getTemperature()*i/getMaxTemperature()); + } @Override public boolean onSneakRightClick(EntityPlayer player, int side) @@ -436,6 +498,7 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp structured = dataStream.readBoolean(); controllerConflict = dataStream.readBoolean(); clientSolarAmount = dataStream.readInt(); + height = dataStream.readInt(); MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord); } @@ -468,6 +531,7 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp data.add(structured); data.add(controllerConflict); data.add(getSolarAmount()); + data.add(height); return data; } @@ -494,6 +558,9 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp waterTank.readFromNBT(nbtTags.getCompoundTag("waterTank")); brineTank.readFromNBT(nbtTags.getCompoundTag("brineTank")); + + partialWater = nbtTags.getDouble("partialWater"); + partialBrine = nbtTags.getDouble("partialBrine"); } @Override @@ -503,6 +570,9 @@ public class TileEntitySalinationController extends TileEntitySalinationTank imp nbtTags.setCompoundTag("waterTank", waterTank.writeToNBT(new NBTTagCompound())); nbtTags.setCompoundTag("brineTank", brineTank.writeToNBT(new NBTTagCompound())); + + nbtTags.setDouble("partialWater", partialWater); + nbtTags.setDouble("partialBrine", partialBrine); } public void clearStructure() diff --git a/resources/assets/mekanism/gui/GuiSalinationController.png b/resources/assets/mekanism/gui/GuiSalinationController.png index 58ecf752f3410f1c454b6020576235e946445044..00281908bb2766f7336f14de7911f768100a763f 100644 GIT binary patch literal 4025 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