/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.machine.beta;
import mods.railcraft.common.util.steam.ISteamUser;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;
import mods.railcraft.common.blocks.RailcraftTileEntity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.common.blocks.machine.MultiBlockPattern;
import mods.railcraft.common.plugins.buildcraft.triggers.ITemperature;
import mods.railcraft.common.util.inventory.wrappers.InventoryMapper;
import mods.railcraft.common.util.inventory.StandaloneInventory;
import mods.railcraft.common.fluids.FluidHelper;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.ITileFilter;
import mods.railcraft.common.util.steam.Steam;
import mods.railcraft.common.util.steam.SteamBoiler;
import net.minecraft.inventory.ISidedInventory;
import net.minecraftforge.fluids.FluidStack;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public abstract class TileBoilerFirebox extends TileBoiler implements IInventory, ISidedInventory, ITemperature {
protected static final int SLOT_LIQUID_INPUT = 0;
protected static final int SLOT_LIQUID_OUTPUT = 1;
public final SteamBoiler boiler;
private boolean wasLit;
protected final StandaloneInventory inventory;
protected IInventory invWaterInput = new InventoryMapper(this, SLOT_LIQUID_INPUT, 1);
protected IInventory invWaterOutput = new InventoryMapper(this, SLOT_LIQUID_OUTPUT, 1, false);
protected TileBoilerFirebox(int invSize) {
super();
inventory = new StandaloneInventory(invSize, (IInventory) this);
boiler = new SteamBoiler(tankWater, tankSteam);
boiler.setTile(this);
}
@Override
public IIcon getIcon(int side) {
if (side > 1 && isBurning())
return getMachineType().getTexture(6);
return getMachineType().getTexture(side);
}
@Override
protected void onPatternLock(MultiBlockPattern pattern) {
int capacity = getNumTanks() * FluidHelper.BUCKET_VOLUME;
tankManager.setCapacity(TANK_STEAM, capacity * getSteamCapacityPerTank());
tankManager.setCapacity(TANK_WATER, capacity * 4);
boiler.setMaxHeat(((BoilerPattern) pattern).maxHeat);
boiler.setTicksPerCycle(((BoilerPattern) pattern).ticksPerCycle);
}
public boolean isBurning() {
TileBoilerFirebox mBlock = (TileBoilerFirebox) getMasterBlock();
if (mBlock == null)
return false;
return mBlock.boiler.isBurning();
}
protected void updateLighting() {
boolean b = isBurning();
if (wasLit != b) {
wasLit = b;
worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord);
markBlockForUpdate();
}
}
@Override
public int getLightValue() {
if (isStructureValid() && isBurning())
return 13;
return 0;
}
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(Random random) {
if (isStructureValid()) {
updateLighting();
if (isBurning() && random.nextInt(100) < 20) {
float f = (float) xCoord + 0.5F;
float f1 = (float) yCoord + 0.4375F + (random.nextFloat() * 3F / 16F);
float f2 = (float) zCoord + 0.5F;
float f3 = 0.52F;
float f4 = random.nextFloat() * 0.6F - 0.3F;
worldObj.spawnParticle("flame", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D);
}
}
}
@Override
public ITileFilter getOutputFilter() {
return ISteamUser.FILTER;
}
@Override
public void updateEntity() {
super.updateEntity();
if (Game.isNotHost(getWorld()))
return;
if (!isMaster || getState() == MultiBlockState.INVALID) {
boiler.reduceHeat(getNumTanks());
return;
}
if (isMaster) {
process();
boiler.tick(getNumTanks());
if (clock % FluidHelper.BUCKET_FILL_TIME == 0)
processBuckets();
}
}
protected abstract void process();
protected void processBuckets() {
FluidHelper.drainContainers(this, inventory, SLOT_LIQUID_INPUT, SLOT_LIQUID_OUTPUT);
}
@Override
protected void onPatternChanged() {
super.onPatternChanged();
reset();
}
@Override
protected void onMasterChanged() {
super.onMasterChanged();
reset();
}
private void reset() {
tankManager.get(TANK_STEAM).setFluid(null);
boiler.reset();
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
tankManager.writeTanksToNBT(data);
inventory.writeToNBT("inv", data);
boiler.writeToNBT(data);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
tankManager.readTanksFromNBT(data);
inventory.readFromNBT("inv", data);
boiler.readFromNBT(data);
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
tankManager.writePacketData(data);
data.writeBoolean(boiler.isBurning());
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
tankManager.readPacketData(data);
boiler.setBurning(data.readBoolean());
}
@Override
public ItemStack decrStackSize(int i, int j) {
TileBoilerFirebox mBlock = (TileBoilerFirebox) getMasterBlock();
if (mBlock != null)
return mBlock.inventory.decrStackSize(i, j);
return null;
}
@Override
public ItemStack getStackInSlot(int i) {
TileBoilerFirebox mBlock = (TileBoilerFirebox) getMasterBlock();
if (mBlock != null)
return mBlock.inventory.getStackInSlot(i);
else
return inventory.getStackInSlot(i);
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
TileBoilerFirebox mBlock = (TileBoilerFirebox) getMasterBlock();
if (mBlock != null)
mBlock.inventory.setInventorySlotContents(i, itemstack);
}
@Override
public String getInventoryName() {
return getName();
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public int getSizeInventory() {
return inventory.getSizeInventory();
}
@Override
public ItemStack getStackInSlotOnClosing(int var1) {
return null;
}
protected boolean handleClick(EntityPlayer player, int side) {
return FluidHelper.handleRightClick(this, ForgeDirection.getOrientation(side), player, true, false);
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
return fill(TANK_WATER, resource, doFill);
}
@Override
public float getTemperature() {
TileBoilerFirebox mBlock = (TileBoilerFirebox) getMasterBlock();
if (mBlock != null)
return (float) mBlock.boiler.getHeat();
return Steam.COLD_TEMP;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return RailcraftTileEntity.isUseableByPlayerHelper(this, player);
}
}