/* * 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.CartTools; import mods.railcraft.api.carts.IItemCart; import mods.railcraft.api.carts.locomotive.LocomotiveRenderType; import mods.railcraft.common.fluids.FluidHelper; import mods.railcraft.common.fluids.FluidItemHelper; 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.util.inventory.InvTools; import mods.railcraft.common.util.inventory.filters.StackFilter; 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.item.EntityMinecart; 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, IItemCart { 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); // private boolean outOfWater = true; public EntityLocomotiveSteamSolid(World world) { super(world); } public EntityLocomotiveSteamSolid(World world, double x, double y, double z) { super(world, x, y, z); } @Override public ICartType 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() { // if (Game.isHost(worldObj)) { // if (RailcraftConfig.printSignalDebug()) { // if (outOfWater && !tankWater.isEmpty()) // outOfWater = false; // else if (!outOfWater && tankWater.isEmpty()) { // outOfWater = true; // Game.log(Level.INFO, "Solid Steam Locomotive ran out of water! [{0}, {1}, {2}] [locked:{3}] [idle:{4}] [mode:{5}]", posX, posY, posZ, Train.getTrain(this).isTrainLockedDown(), isIdle(), getMode().name()); // } // } // } super.onUpdate(); if (Game.isHost(worldObj)) { InvTools.moveOneItem(invStock, invBurn); InvTools.moveOneItem(invBurn, invWaterOutput, FluidContainerRegistry.EMPTY_BUCKET); if (InvTools.isEmptySlot(invStock)) { ItemStack stack = CartTools.transferHelper.pullStack(this, StackFilter.FUEL); if (stack != null) InvTools.moveItemStack(stack, invStock); } if (isSafeToFill() && tankWater.getFluidAmount() < tankWater.getCapacity() / 2) { FluidStack pulled = CartTools.transferHelper.pullFluid(this, Fluids.WATER.getB(1)); tankWater.fill(pulled, true); } } } @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 StackFilter.FUEL.matches(stack); case SLOT_LIQUID_INPUT: FluidStack fluidStack = FluidItemHelper.getFluidStackInContainer(stack); if (fluidStack != null && fluidStack.amount > FluidHelper.BUCKET_VOLUME) return false; return FluidItemHelper.containsFluid(stack, Fluids.WATER.get(1)); case SLOT_TICKET: return ItemTicket.FILTER.matches(stack); default: return false; } } @Override public boolean canPassItemRequests() { return true; } @Override public boolean canAcceptPushedItem(EntityMinecart requester, ItemStack stack) { return StackFilter.FUEL.matches(stack); } @Override public boolean canProvidePulledItem(EntityMinecart requester, ItemStack stack) { return false; } }