package shedar.mods.ic2.nuclearcontrol.tileentities;
import ic2.core.network.NetworkManager;
import ic2.api.network.INetworkClientTileEntityEventListener;
import ic2.api.network.INetworkDataProvider;
import ic2.api.network.INetworkUpdateListener;
import ic2.api.reactor.IReactor;
import ic2.api.reactor.IReactorChamber;
import ic2.api.tile.IWrenchable;
import ic2.core.IC2;
import java.util.List;
import java.util.Vector;
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.Facing;
import net.minecraftforge.common.util.ForgeDirection;
import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl;
import shedar.mods.ic2.nuclearcontrol.ITextureHelper;
import shedar.mods.ic2.nuclearcontrol.blocks.subblocks.ThermalMonitor;
import shedar.mods.ic2.nuclearcontrol.items.ItemCard55Reactor;
import shedar.mods.ic2.nuclearcontrol.utils.BlockDamages;
import shedar.mods.ic2.nuclearcontrol.utils.NuclearHelper;
public class TileEntityThermo extends TileEntity implements INetworkDataProvider, INetworkUpdateListener,
INetworkClientTileEntityEventListener, IWrenchable, ITextureHelper {
protected boolean init;
private int prevHeatLevel;
public int heatLevel;
private int mappedHeatLevel;
private int prevOnFire;
public int onFire;
private short prevFacing;
public short facing;
private boolean prevInvertRedstone;
private boolean invertRedstone;
private static int[] Coords = new int[3];
protected int updateTicker;
protected int tickRate;
public TileEntityThermo(){
init = false;
onFire = 0;
prevOnFire = 0;
facing = 0;
prevFacing = 0;
mappedHeatLevel = 500;
prevHeatLevel = 500;
heatLevel = 500;
updateTicker = 0;
tickRate = -1;
prevInvertRedstone = false;
invertRedstone = false;
}
protected void initData(){
if (!worldObj.isRemote)
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
init = true;
}
public boolean isInvertRedstone(){
return invertRedstone;
}
public void setInvertRedstone(boolean value){
invertRedstone = value;
if(prevInvertRedstone != value){
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
}
prevInvertRedstone = value;
}
@Override
public short getFacing(){
return (short) Facing.oppositeSide[facing];
}
@Override
public void setFacing(short f){
setSide((short) Facing.oppositeSide[f]);
}
private void setSide(short f){
facing = f;
if(init && prevFacing != f)
((NetworkManager)IC2.network.get()).updateTileEntityField(this, "facing");
prevFacing = f;
}
@Override
public List<String> getNetworkedFields() {
Vector<String> vector = new Vector<String>(3);
vector.add("heatLevel");
vector.add("onFire");
vector.add("facing");
vector.add("invertRedstone");
return vector;
}
@Override
public void onNetworkUpdate(String field) {
if(field.equals("heatLevel") && prevHeatLevel != heatLevel){
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
prevHeatLevel = heatLevel;
}
if(field.equals("facing") && prevFacing != facing){
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
prevFacing = facing;
}
if(field.equals("onFire") && prevOnFire != onFire){
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
prevOnFire = onFire;
}
if(field.equals("invertRedstone") && prevInvertRedstone != invertRedstone){
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
prevInvertRedstone = invertRedstone;
}
}
@Override
public void onNetworkEvent(EntityPlayer entityplayer, int i){
if(i < 0)
switch(i){
case -1:
setInvertRedstone(false);
break;
case -2:
setInvertRedstone(true);
break;
default:
break;
}
else
setHeatLevel(i);
}
public void setOnFire(int f) {
onFire = f;
if (prevOnFire != f)
IC2.network.get().updateTileEntityField(this, "onFire");
prevOnFire = onFire;
}
public int getOnFire() {
return onFire;
}
public void setHeatLevel(int h){
heatLevel = h;
if(prevHeatLevel != h){
IC2.network.get().updateTileEntityField(this, "heatLevel");
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
}
prevHeatLevel = heatLevel;
mappedHeatLevel = h;
}
public void setHeatLevelWithoutNotify(int h){
heatLevel = h;
prevHeatLevel = heatLevel;
mappedHeatLevel = h;
}
public Integer getHeatLevel(){
return heatLevel;
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound){
super.readFromNBT(nbttagcompound);
if(nbttagcompound.hasKey("heatLevel")){
int heat = nbttagcompound.getInteger("heatLevel");
setHeatLevelWithoutNotify(heat);
prevFacing = facing = nbttagcompound.getShort("facing");
prevInvertRedstone = invertRedstone = nbttagcompound.getBoolean("invert");
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setInteger("heatLevel", getHeatLevel());
nbttagcompound.setShort("facing", facing);
nbttagcompound.setBoolean("invert", isInvertRedstone());
}
protected void checkStatus() {
byte fire;
IReactorChamber chamber = NuclearHelper.getReactorChamberAroundCoord(worldObj, xCoord, yCoord, zCoord);
IReactor reactor = null;
if(chamber != null)
reactor = chamber.getReactor();
if(reactor == null)
reactor = NuclearHelper.getReactorAroundCoord(worldObj, xCoord, yCoord, zCoord);
if(reactor == null && chamber == null){
decodeSides(xCoord, yCoord, zCoord);
reactor = ItemCard55Reactor.getReactor(worldObj, Coords[0], Coords[1], Coords[2]);
}
if (reactor != null) {
if (tickRate == -1) {
tickRate = reactor.getTickRate() / 2;
if (tickRate == 0)
tickRate = 1;
updateTicker = tickRate;
}
int reactorHeat = reactor.getHeat();
if (reactorHeat >= heatLevel)//Normally mappedHeatLevel
fire = 1;
else
fire = 0;
}else
fire = -1;
if(fire != getOnFire()){
setOnFire(fire);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
}
}
protected void decodeSides(int x, int y, int z){
ForgeDirection facing;
if (this.getFacing () > 5)
facing = ForgeDirection.UNKNOWN;
else
facing = ForgeDirection.VALID_DIRECTIONS[this.getFacing()].getOpposite();
Coords[0] = x + facing.offsetX;
Coords[1] = y + facing.offsetY;
Coords[2] = z + facing.offsetZ;
}
@Override
public void updateEntity() {
if (!init)
initData();
if (!worldObj.isRemote) {
if (tickRate != -1 && updateTicker-- > 0)
return;
updateTicker = tickRate;
checkStatus();
}
}
@Override
public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) {
return false;
}
@Override
public boolean wrenchCanRemove(EntityPlayer entityPlayer) {
return true;
}
@Override
public float getWrenchDropRate() {
return 1;
}
@Override
public int modifyTextureIndex(int texture) {
if (texture != ThermalMonitor.I_FACE_GREEN)
return texture;
int fireState = getOnFire();
switch (fireState) {
case 1:
texture = ThermalMonitor.I_FACE_RED;
break;
case 0:
texture = ThermalMonitor.I_FACE_GREEN;
break;
default:
texture = ThermalMonitor.I_FACE_GRAY;
break;
}
return texture;
}
@Override
public ItemStack getWrenchDrop(EntityPlayer entityPlayer) {
return new ItemStack(IC2NuclearControl.blockNuclearControlMain, 1, BlockDamages.DAMAGE_THERMAL_MONITOR);
}
}