/* This file is part of Project-Zed. Project-Zed is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Project-Zed is
* distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along
* with Project-Zed. If not, see <http://www.gnu.org/licenses/>
*/
package com.projectzed.mod.tileentity.container.pipe;
import com.hockeyhurd.hcorelib.api.math.Vector3;
import com.hockeyhurd.hcorelib.api.math.VectorHelper;
import com.projectzed.api.energy.EnergyNet;
import com.projectzed.api.energy.source.EnumColor;
import com.projectzed.api.energy.source.IColorComponent;
import com.projectzed.api.energy.storage.IEnergyContainer;
import com.projectzed.api.tileentity.IModularFrame;
import com.projectzed.api.tileentity.container.AbstractTileEntityPipe;
import com.projectzed.mod.handler.PacketHandler;
import com.projectzed.mod.handler.message.MessageTileEntityEnergyContainer;
import com.projectzed.mod.util.Reference;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
/**
* Class containing code for energy pipe;
*
* @author hockeyhurd
* @version Oct 25, 2014
*/
public class TileEntityEnergyPipeBase extends AbstractTileEntityPipe implements IEnergyContainer, IColorComponent {
public boolean flag;
protected int containerSize = 0;
protected int maxPowerStorage = 100000;
protected int storedPower;
protected boolean powerMode;
protected int importRate, exportRate;
public TileEntityEnergyPipeBase() {
super("energyPipe");
this.maxPowerStorage = Reference.Constants.BASE_PIPE_TRANSFER_RATE;
this.importRate = Reference.Constants.BASE_PIPE_TRANSFER_RATE;
this.exportRate = Reference.Constants.BASE_PIPE_TRANSFER_RATE;
}
/*
* (non-Javadoc)
* @see com.projectzed.api.energy.source.IColorComponent#getColor()
*/
@Override
public EnumColor getColor() {
return null;
}
/**
* Method is nullified on this implementation as their currently is no use for this
* <br>since energy pipes are independent of each other.
*/
public void setColor(EnumColor color) {
}
@Override
protected void updateConnections() {
for (EnumFacing dir : EnumFacing.VALUES) {
final BlockPos tilePos = new BlockPos(pos.getX() + dir.getFrontOffsetX(), pos.getY() + dir.getFrontOffsetY(),
pos.getZ() + dir.getFrontOffsetZ());
final TileEntity tileEntity = worldObj.getTileEntity(tilePos);
if (tileEntity instanceof IEnergyContainer) {
if (tileEntity instanceof TileEntityEnergyPipeBase) {
final TileEntityEnergyPipeBase pipe = (TileEntityEnergyPipeBase) tileEntity;
if (pipe.getColor() == getColor()) connections[dir.ordinal()] = dir.getOpposite();
}
else if (tileEntity instanceof IModularFrame) {
final IModularFrame frame = (IModularFrame) tileEntity;
if (frame.getSideValve(dir.getOpposite()) != 0) connections[dir.ordinal()] = dir.getOpposite();
else connections[dir.ordinal()] = null;
}
else connections[dir.ordinal()] = dir.getOpposite();
}
else connections[dir.ordinal()] = null;
}
}
@Override
public int requestPower(IEnergyContainer cont, int amount) {
if (cont != null && this.getMaxExportRate() >= amount) {
if (this.storedPower - amount >= 0) this.storedPower -= amount;
else {
amount = this.storedPower;
this.storedPower = 0;
}
return amount;
}
else return 0;
}
@Override
public int addPower(IEnergyContainer cont, int amount) {
if (cont != null && this.getMaxImportRate() >= amount) {
if (this.storedPower + amount <= this.maxPowerStorage) this.storedPower += amount;
else {
amount = this.maxPowerStorage - this.storedPower;
this.storedPower = this.maxPowerStorage;
}
return amount;
}
else return 0;
}
@Override
public void update() {
super.update();
importContents();
exportContents();
}
@Override
public int getMaxImportRate() {
return this.importRate;
}
@Override
public int getMaxExportRate() {
return this.exportRate;
}
public int getContainerSize() {
return this.containerSize;
}
protected void importContents() {
if (worldObj.isRemote) return;
if (this.storedPower >= this.maxPowerStorage) {
this.storedPower = this.maxPowerStorage;
return;
}
EnergyNet.importEnergyFromNeighbors(this, worldObj, pos.getX(), pos.getY(), pos.getZ(), lastReceivedDir);
EnergyNet.tryClearDirectionalTraffic(this, worldObj, pos.getX(), pos.getY(), pos.getZ(), lastReceivedDir);
// We don't need to send to client every tick! Once/sec. or so should suffice. (no gui)
if (worldObj.getTotalWorldTime() % 20L == 0) PacketHandler.INSTANCE.sendToAll(new MessageTileEntityEnergyContainer(this));
}
@Deprecated
protected void exportContents() {
}
/*@Override
public Packet getDescriptionPacket() {
return PacketHandler.INSTANCE.getPacketFrom(new MessageTileEntityEnergyContainer(this));
}*/
@Override
public NBTTagCompound getUpdateTag() {
PacketHandler.INSTANCE.getPacketFrom(new MessageTileEntityEnergyContainer(this));
final NBTTagCompound comp = getTileData();
saveNBT(comp);
return comp;
}
@Override
public void setMaxStorage(int max) {
this.maxPowerStorage = max;
}
@Override
public int getMaxStorage() {
return this.maxPowerStorage;
}
@Override
public void setEnergyStored(int amount) {
this.storedPower = amount;
}
@Override
public int getEnergyStored() {
return this.storedPower;
}
@Override
public void setLastReceivedDirection(EnumFacing dir) {
this.lastReceivedDir = dir;
}
@Override
public EnumFacing getLastReceivedDirection() {
return this.lastReceivedDir;
}
@Override
public Vector3<Integer> worldVec() {
return VectorHelper.toVector3i(pos);
}
@Override
public void readFromNBT(NBTTagCompound comp) {
super.readFromNBT(comp);
this.powerMode = comp.getBoolean("ProjectZedPowerMode");
int size = comp.getInteger("ProjectZedPowerStored");
this.storedPower = size >= 0 && size <= this.maxPowerStorage ? size : 0;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound comp) {
super.writeToNBT(comp);
comp.setBoolean("ProjectZedPowerMode", this.powerMode);
comp.setInteger("ProjectZedPowerStored", this.storedPower);
return comp;
}
}