/*
* 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.blocks.RailcraftTileEntity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.common.blocks.machine.IEnumMachine;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.fluids.Fluids;
import mods.railcraft.common.plugins.buildcraft.triggers.INeedsFuel;
import mods.railcraft.common.plugins.buildcraft.triggers.ITemperature;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.inventory.StandaloneInventory;
import mods.railcraft.common.fluids.FluidHelper;
import mods.railcraft.common.fluids.tanks.FilteredTank;
import mods.railcraft.common.plugins.forge.FuelPlugin;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.steam.SolidFuelProvider;
import mods.railcraft.common.util.steam.Steam;
import mods.railcraft.common.util.steam.SteamBoiler;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public class TileEngineSteamHobby extends TileEngineSteam implements IInventory, ISidedInventory, INeedsFuel, ITemperature {
public static final byte SLOT_FUEL = 0;
public static final byte SLOT_LIQUID_INPUT = 1;
public static final byte SLOT_LIQUID_OUTPUT = 2;
private static final int OUTPUT_MJ = 2;
private static final int STEAM_USED = Steam.STEAM_PER_MJ * OUTPUT_MJ;
private static final float FUEL_PER_CONVERSION_MULTIPLIER = 1.25F;
private static final byte TICKS_PER_BOILER_CYCLE = 20;
private static final byte TANK_WATER = 1;
private static final int[] SLOTS = InvTools.buildSlotArray(0, 3);
public final SteamBoiler boiler;
private StandaloneInventory inv = new StandaloneInventory(3, (IInventory) this);
public TileEngineSteamHobby() {
FilteredTank tankWater = new FilteredTank(4 * FluidHelper.BUCKET_VOLUME, Fluids.WATER.get(), this);
getTankManager().add(tankWater);
getTankManager().get(TANK_STEAM).setCapacity(4 * FluidHelper.BUCKET_VOLUME);
boiler = new SteamBoiler(tankWater, getTankManager().get(TANK_STEAM));
boiler.setTicksPerCycle(TICKS_PER_BOILER_CYCLE);
boiler.setEfficiencyModifier(FUEL_PER_CONVERSION_MULTIPLIER);
boiler.setFuelProvider(new SolidFuelProvider(inv, SLOT_FUEL) {
@Override
public double getMoreFuel() {
if (getEnergyStage() == EnergyStage.OVERHEAT || !isPowered()) return 0;
return super.getMoreFuel();
}
});
}
@Override
public IEnumMachine getMachineType() {
return EnumMachineBeta.ENGINE_STEAM_HOBBY;
}
@Override
public boolean openGui(EntityPlayer player) {
GuiHandler.openGui(EnumGui.ENGINE_HOBBY, player, worldObj, xCoord, yCoord, zCoord);
return true;
}
@Override
public boolean blockActivated(EntityPlayer player, int side) {
ItemStack current = player.getCurrentEquippedItem();
if (current != null && current.getItem() != Items.bucket)
if (Game.isHost(worldObj)) {
if (FluidHelper.handleRightClick(this, ForgeDirection.getOrientation(side), player, true, false))
return true;
} else if (FluidHelper.isContainer(current))
return true;
return super.blockActivated(player, side);
}
@Override
public float getMaxOutputMJ() {
return OUTPUT_MJ;
}
@Override
public int steamUsedPerTick() {
return STEAM_USED;
}
@Override
public void burn() {
super.burn();
if (clock % FluidHelper.BUCKET_FILL_TIME == 0)
FluidHelper.drainContainers(this, inv, SLOT_LIQUID_INPUT, SLOT_LIQUID_OUTPUT);
boiler.tick(1);
}
@Override
public int getSizeInventory() {
return inv.getSizeInventory();
}
@Override
public ItemStack getStackInSlot(int slot) {
return inv.getStackInSlot(slot);
}
@Override
public ItemStack decrStackSize(int slot, int amount) {
return inv.decrStackSize(slot, amount);
}
@Override
public ItemStack getStackInSlotOnClosing(int var1) {
return null;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
inv.setInventorySlotContents(slot, stack);
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return RailcraftTileEntity.isUseableByPlayerHelper(this, player);
}
@Override
public String getInventoryName() {
return getName();
}
@Override
public int maxEnergy() {
return 10000;
}
@Override
public int maxEnergyReceived() {
return 300;
}
@Override
public int maxEnergyExtracted() {
return 40;
}
@Override
public boolean needsFuel() {
ItemStack fuel = inv.getStackInSlot(SLOT_FUEL);
return fuel == null || fuel.stackSize < 8;
}
@Override
public float getTemperature() {
return (float) boiler.getHeat();
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
inv.writeToNBT("Items", data);
boiler.writeToNBT(data);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
inv.readFromNBT("Items", data);
boiler.readFromNBT(data);
}
@Override
public int[] getAccessibleSlotsFromSide(int var1) {
return SLOTS;
}
@Override
public boolean canInsertItem(int slot, ItemStack stack, int side) {
return isItemValidForSlot(slot, stack);
}
@Override
public boolean canExtractItem(int slot, ItemStack stack, int side) {
return slot == SLOT_LIQUID_OUTPUT;
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
switch (slot) {
case SLOT_FUEL:
return FuelPlugin.getBurnTime(stack) > 0;
case SLOT_LIQUID_INPUT:
return Fluids.WATER.is(FluidContainerRegistry.getFluidForFilledItem(stack));
}
return false;
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
if (isPowered() && Fluids.STEAM.is(resource))
return fill(0, resource, doFill);
if (Fluids.WATER.is(resource))
return fill(1, resource, doFill);
return 0;
}
private int fill(int tankIndex, FluidStack resource, boolean doFill) {
if (tankIndex == 1)
if (boiler.isSuperHeated() && Steam.BOILERS_EXPLODE) {
FluidStack water = getTankManager().get(TANK_WATER).getFluid();
if (water == null || water.amount <= 0)
explode();
}
return getTankManager().fill(tankIndex, resource, doFill);
}
public void explode() {
if (Game.isHost(worldObj))
worldObj.createExplosion(null, xCoord, yCoord, zCoord, 2, true);
}
}