Updated Electrolytic Separator internals to support redstone control

This commit is contained in:
aidancbrady 2015-12-31 14:55:49 -05:00
parent bd3bc4402f
commit 3ff2ede090
2 changed files with 114 additions and 27 deletions

View file

@ -1,26 +1,18 @@
package mekanism.client.gui; package mekanism.client.gui;
import java.util.ArrayList; import cpw.mods.fml.relauncher.Side;
import java.util.List; import cpw.mods.fml.relauncher.SideOnly;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.gas.GasTank; import mekanism.api.gas.GasTank;
import mekanism.api.util.ListUtils; import mekanism.api.util.ListUtils;
import mekanism.client.gui.element.GuiEnergyInfo; import mekanism.client.gui.element.*;
import mekanism.client.gui.element.GuiEnergyInfo.IInfoHandler; import mekanism.client.gui.element.GuiEnergyInfo.IInfoHandler;
import mekanism.client.gui.element.GuiFluidGauge;
import mekanism.client.gui.element.GuiFluidGauge.IFluidInfoHandler; import mekanism.client.gui.element.GuiFluidGauge.IFluidInfoHandler;
import mekanism.client.gui.element.GuiGasGauge;
import mekanism.client.gui.element.GuiGasGauge.IGasInfoHandler; import mekanism.client.gui.element.GuiGasGauge.IGasInfoHandler;
import mekanism.client.gui.element.GuiGauge;
import mekanism.client.gui.element.GuiPowerBar;
import mekanism.client.gui.element.GuiProgress;
import mekanism.client.gui.element.GuiProgress.IProgressInfoHandler; import mekanism.client.gui.element.GuiProgress.IProgressInfoHandler;
import mekanism.client.gui.element.GuiProgress.ProgressBar; import mekanism.client.gui.element.GuiProgress.ProgressBar;
import mekanism.client.gui.element.GuiSlot;
import mekanism.client.gui.element.GuiSlot.SlotOverlay; import mekanism.client.gui.element.GuiSlot.SlotOverlay;
import mekanism.client.gui.element.GuiSlot.SlotType; import mekanism.client.gui.element.GuiSlot.SlotType;
import mekanism.client.gui.element.GuiUpgradeTab;
import mekanism.client.sound.SoundHandler; import mekanism.client.sound.SoundHandler;
import mekanism.common.Mekanism; import mekanism.common.Mekanism;
import mekanism.common.inventory.container.ContainerElectrolyticSeparator; import mekanism.common.inventory.container.ContainerElectrolyticSeparator;
@ -32,11 +24,10 @@ import mekanism.common.util.MekanismUtils;
import mekanism.common.util.MekanismUtils.ResourceType; import mekanism.common.util.MekanismUtils.ResourceType;
import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.entity.player.InventoryPlayer;
import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTank;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.Side; import java.util.ArrayList;
import cpw.mods.fml.relauncher.SideOnly; import java.util.List;
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public class GuiElectrolyticSeparator extends GuiMekanism public class GuiElectrolyticSeparator extends GuiMekanism
@ -49,6 +40,7 @@ public class GuiElectrolyticSeparator extends GuiMekanism
tileEntity = tentity; tileEntity = tentity;
guiElements.add(new GuiRedstoneControl(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiElectrolyticSeparator.png")));
guiElements.add(new GuiUpgradeTab(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiElectrolyticSeparator.png"))); guiElements.add(new GuiUpgradeTab(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiElectrolyticSeparator.png")));
guiElements.add(new GuiEnergyInfo(new IInfoHandler() { guiElements.add(new GuiEnergyInfo(new IInfoHandler() {
@Override @Override

View file

@ -2,14 +2,13 @@ package mekanism.common.tile;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.MekanismConfig;
import mekanism.api.Range4D; import mekanism.api.Range4D;
import mekanism.api.gas.*; import mekanism.api.gas.*;
import mekanism.common.Mekanism; import mekanism.common.Mekanism;
import mekanism.common.Upgrade; import mekanism.common.Upgrade;
import mekanism.common.Upgrade.IUpgradeInfoHandler; import mekanism.common.Upgrade.IUpgradeInfoHandler;
import mekanism.common.base.ISustainedData; import mekanism.common.base.*;
import mekanism.common.base.ITankManager;
import mekanism.common.base.IUpgradeTile;
import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.block.BlockMachine.MachineType;
import mekanism.common.integration.IComputerIntegration; import mekanism.common.integration.IComputerIntegration;
import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage;
@ -33,7 +32,7 @@ import net.minecraftforge.fluids.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock implements IFluidHandler, IComputerIntegration, ITubeConnection, ISustainedData, IGasHandler, IUpgradeTile, IUpgradeInfoHandler, ITankManager public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock implements IFluidHandler, IComputerIntegration, ITubeConnection, ISustainedData, IGasHandler, IUpgradeTile, IUpgradeInfoHandler, ITankManager, IRedstoneControl, IActiveState
{ {
/** This separator's water slot. */ /** This separator's water slot. */
public FluidTank fluidTank = new FluidTank(24000); public FluidTank fluidTank = new FluidTank(24000);
@ -63,14 +62,23 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
public double energyPerTick; public double energyPerTick;
public int updateDelay;
public boolean isActive = false; public boolean isActive = false;
public boolean clientActive = false;
public double prevEnergy;
public SeparatorRecipe cachedRecipe; public SeparatorRecipe cachedRecipe;
public double clientEnergyUsed; public double clientEnergyUsed;
public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 4); public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 4);
/** This machine's current RedstoneControl type. */
public RedstoneControl controlType = RedstoneControl.DISABLED;
public TileEntityElectrolyticSeparator() public TileEntityElectrolyticSeparator()
{ {
super("ElectrolyticSeparator", MachineType.ELECTROLYTIC_SEPARATOR.baseEnergy); super("ElectrolyticSeparator", MachineType.ELECTROLYTIC_SEPARATOR.baseEnergy);
@ -82,8 +90,29 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
{ {
super.onUpdate(); super.onUpdate();
if(worldObj.isRemote && updateDelay > 0)
{
updateDelay--;
if(updateDelay == 0 && clientActive != isActive)
{
isActive = clientActive;
MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord);
}
}
if(!worldObj.isRemote) if(!worldObj.isRemote)
{ {
if(updateDelay > 0)
{
updateDelay--;
if(updateDelay == 0 && clientActive != isActive)
{
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
}
}
ChargeUtils.discharge(3, this); ChargeUtils.discharge(3, this);
if(inventory[0] != null) if(inventory[0] != null)
@ -132,8 +161,10 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
SeparatorRecipe recipe = getRecipe(); SeparatorRecipe recipe = getRecipe();
if(canOperate(recipe) && getEnergy() >= energyPerTick) if(canOperate(recipe) && getEnergy() >= energyPerTick && MekanismUtils.canFunction(this))
{ {
setActive(true);
boolean update = BASE_ENERGY_USAGE != recipe.energyUsage; boolean update = BASE_ENERGY_USAGE != recipe.energyUsage;
BASE_ENERGY_USAGE = recipe.energyUsage; BASE_ENERGY_USAGE = recipe.energyUsage;
@ -143,8 +174,6 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
recalculateUpgradables(Upgrade.ENERGY); recalculateUpgradables(Upgrade.ENERGY);
} }
setActive(true);
int operations = operate(recipe); int operations = operate(recipe);
double prev = getEnergy(); double prev = getEnergy();
@ -152,7 +181,10 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
clientEnergyUsed = prev-getEnergy(); clientEnergyUsed = prev-getEnergy();
} }
else { else {
if(prevEnergy >= getEnergy())
{
setActive(false); setActive(false);
}
} }
int dumpAmount = 8*(int)Math.pow(2, upgradeComponent.getUpgrades(Upgrade.SPEED)); int dumpAmount = 8*(int)Math.pow(2, upgradeComponent.getUpgrades(Upgrade.SPEED));
@ -229,6 +261,8 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this))); Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
} }
prevEnergy = getEnergy();
} }
else { else {
if(clientDumpLeft) if(clientDumpLeft)
@ -434,12 +468,20 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
rightTank.setGas(null); rightTank.setGas(null);
} }
controlType = RedstoneControl.values()[dataStream.readInt()];
dumpLeft = GasMode.values()[dataStream.readInt()]; dumpLeft = GasMode.values()[dataStream.readInt()];
dumpRight = GasMode.values()[dataStream.readInt()]; dumpRight = GasMode.values()[dataStream.readInt()];
clientDumpLeft = dataStream.readBoolean(); clientDumpLeft = dataStream.readBoolean();
clientDumpRight = dataStream.readBoolean(); clientDumpRight = dataStream.readBoolean();
isActive = dataStream.readBoolean(); clientActive = dataStream.readBoolean();
clientEnergyUsed = dataStream.readDouble(); clientEnergyUsed = dataStream.readDouble();
if(updateDelay == 0 && clientActive != isActive)
{
updateDelay = MekanismConfig.general.UPDATE_DELAY;
isActive = clientActive;
MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord);
}
} }
@Override @Override
@ -477,6 +519,7 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
data.add(false); data.add(false);
} }
data.add(controlType.ordinal());
data.add(dumpLeft.ordinal()); data.add(dumpLeft.ordinal());
data.add(dumpRight.ordinal()); data.add(dumpRight.ordinal());
data.add(clientDumpLeft); data.add(clientDumpLeft);
@ -503,6 +546,9 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
fluidTank.readFromNBT(nbtTags.getCompoundTag("fluidTank")); fluidTank.readFromNBT(nbtTags.getCompoundTag("fluidTank"));
} }
isActive = nbtTags.getBoolean("isActive");
controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")];
leftTank.read(nbtTags.getCompoundTag("leftTank")); leftTank.read(nbtTags.getCompoundTag("leftTank"));
rightTank.read(nbtTags.getCompoundTag("rightTank")); rightTank.read(nbtTags.getCompoundTag("rightTank"));
@ -520,6 +566,9 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
nbtTags.setTag("fluidTank", fluidTank.writeToNBT(new NBTTagCompound())); nbtTags.setTag("fluidTank", fluidTank.writeToNBT(new NBTTagCompound()));
} }
nbtTags.setBoolean("isActive", isActive);
nbtTags.setInteger("controlType", controlType.ordinal());
nbtTags.setTag("leftTank", leftTank.write(new NBTTagCompound())); nbtTags.setTag("leftTank", leftTank.write(new NBTTagCompound()));
nbtTags.setTag("rightTank", rightTank.write(new NBTTagCompound())); nbtTags.setTag("rightTank", rightTank.write(new NBTTagCompound()));
@ -693,9 +742,55 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp
return false; return false;
} }
@Override
public RedstoneControl getControlType()
{
return controlType;
}
@Override
public void setControlType(RedstoneControl type)
{
controlType = type;
MekanismUtils.saveChunk(this);
}
@Override
public boolean canPulse()
{
return false;
}
@Override
public void setActive(boolean active) public void setActive(boolean active)
{ {
isActive = active; isActive = active;
if(clientActive != active && updateDelay == 0)
{
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
updateDelay = 10;
clientActive = active;
}
}
@Override
public boolean getActive()
{
return isActive;
}
@Override
public boolean renderUpdate()
{
return false;
}
@Override
public boolean lightUpdate()
{
return true;
} }
@Override @Override