/*
* 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.carts;
import mods.railcraft.api.carts.locomotive.LocomotiveRenderType;
import mods.railcraft.common.fluids.FluidHelper;
import mods.railcraft.common.fluids.Fluids;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.items.ItemTicket;
import mods.railcraft.common.plugins.forge.FuelPlugin;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.inventory.wrappers.InventoryMapper;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.steam.SolidFuelProvider;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
/**
*
* @author CovertJaguar <http://www.railcraft.info/>
*/
public class EntityLocomotiveSteamSolid extends EntityLocomotiveSteam implements ISidedInventory {
private static final int SLOT_BURN = 2;
private static final int SLOT_FUEL_A = 3;
private static final int SLOT_FUEL_B = 4;
private static final int SLOT_FUEL_C = 5;
private static final int SLOT_TICKET = 6;
private static final int SLOT_DESTINATION = 7;
private static final int[] SLOTS = InvTools.buildSlotArray(0, 7);
private final IInventory invBurn = new InventoryMapper(this, SLOT_BURN, 1);
private final IInventory invStock = new InventoryMapper(this, SLOT_FUEL_A, 3);
private final IInventory invFuel = new InventoryMapper(this, SLOT_BURN, 4);
private final IInventory invTicket = new InventoryMapper(this, SLOT_TICKET, 2, false);
public EntityLocomotiveSteamSolid(World world) {
super(world);
}
public EntityLocomotiveSteamSolid(World world, double x, double y, double z) {
super(world, x, y, z);
}
@Override
public EnumCart getCartType() {
return EnumCart.LOCO_STEAM_SOLID;
}
@Override
public LocomotiveRenderType getRenderType() {
return LocomotiveRenderType.STEAM_SOLID;
}
@Override
protected void entityInit() {
super.entityInit();
boiler.setFuelProvider(new SolidFuelProvider(this, SLOT_BURN) {
@Override
public double getMoreFuel() {
if (isShutdown())
return 0;
return super.getMoreFuel();
}
});
}
@Override
public void onUpdate() {
super.onUpdate();
if (Game.isHost(worldObj)) {
InvTools.moveOneItem(invStock, invBurn);
InvTools.moveOneItem(invBurn, invWaterOutput, FluidContainerRegistry.EMPTY_BUCKET);
}
}
@Override
protected void openGui(EntityPlayer player) {
GuiHandler.openGui(EnumGui.LOCO_STEAM, player, worldObj, this);
}
@Override
public boolean needsRefuel() {
FluidStack water = tankWater.getFluid();
if (water == null || water.amount < tankWater.getCapacity() / 3)
return true;
int numItems = InvTools.countItems(invFuel);
if (numItems == 0)
return true;
int maxItems = InvTools.countMaxItemStackSize(invFuel);
return (double) numItems / (double) maxItems < 0.25;
}
@Override
protected IInventory getTicketInventory() {
return invTicket;
}
@Override
public int getSizeInventory() {
return 8;
}
@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_TICKET;
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
switch (slot) {
case SLOT_BURN:
case SLOT_FUEL_A:
case SLOT_FUEL_B:
case SLOT_FUEL_C:
return FuelPlugin.getBurnTime(stack) > 0;
case SLOT_LIQUID_INPUT:
return FluidHelper.containsFluidStack(stack, Fluids.WATER.get(1));
case SLOT_TICKET:
return ItemTicket.FILTER.matches(stack);
default:
return false;
}
}
}