/* * 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 java.util.HashMap; import java.util.List; import java.util.Map; import mods.railcraft.api.core.items.IStackFilter; import mods.railcraft.common.blocks.RailcraftBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import mods.railcraft.common.blocks.machine.IEnumMachine; import mods.railcraft.common.blocks.machine.MultiBlockPattern; import mods.railcraft.common.blocks.machine.TileMultiBlock; import mods.railcraft.common.blocks.machine.alpha.TileCokeOven; import mods.railcraft.common.blocks.machine.alpha.TileSteamOven; import mods.railcraft.common.gui.EnumGui; import mods.railcraft.common.gui.GuiHandler; import mods.railcraft.common.plugins.buildcraft.triggers.INeedsFuel; import mods.railcraft.common.util.inventory.filters.StackFilter; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.inventory.wrappers.InventoryMapper; import mods.railcraft.common.fluids.Fluids; import mods.railcraft.common.plugins.forge.FuelPlugin; import mods.railcraft.common.util.inventory.AdjacentInventoryCache; import mods.railcraft.common.util.inventory.InventorySorter; import mods.railcraft.common.util.inventory.filters.InvertedStackFilter; import mods.railcraft.common.util.misc.ITileFilter; import mods.railcraft.common.util.steam.SolidFuelProvider; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; /** * * @author CovertJaguar <http://www.railcraft.info> */ public class TileBoilerFireboxSolid extends TileBoilerFirebox implements INeedsFuel { public static void placeSolidBoiler(World world, int x, int y, int z, int width, int height, boolean highPressure, int water, List<ItemStack> fuel) { for (MultiBlockPattern pattern : TileBoiler.patterns) { if (pattern.getPatternHeight() - 3 == height && pattern.getPatternWidthX() - 2 == width) { Map<Character, Integer> blockMapping = new HashMap<Character, Integer>(); blockMapping.put('F', EnumMachineBeta.BOILER_FIREBOX_SOLID.ordinal()); blockMapping.put('H', highPressure ? EnumMachineBeta.BOILER_TANK_HIGH_PRESSURE.ordinal() : EnumMachineBeta.BOILER_TANK_LOW_PRESSURE.ordinal()); TileEntity tile = pattern.placeStructure(world, x, y, z, RailcraftBlocks.getBlockMachineBeta(), blockMapping); if (tile instanceof TileBoilerFireboxSolid) { TileBoilerFireboxSolid master = (TileBoilerFireboxSolid) tile; master.tankWater.setFluid(Fluids.WATER.get(water)); IInventory invFuel = new InventoryMapper(master.inventory, SLOT_BURN, 4); for (ItemStack stack : fuel) { InvTools.moveItemStack(stack, invFuel); } } return; } } } 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[] SLOTS = InvTools.buildSlotArray(0, 6); private static final IStackFilter NOT_FUEL = new InvertedStackFilter(StackFilter.FUEL); private IInventory invBurn = new InventoryMapper(this, SLOT_BURN, 1); private IInventory invStock = new InventoryMapper(this, SLOT_FUEL_A, 3); private IInventory invFuel = new InventoryMapper(this, SLOT_BURN, 4); private boolean needsFuel = false; private final AdjacentInventoryCache invCache = new AdjacentInventoryCache(this, tileCache, new ITileFilter() { @Override public boolean matches(TileEntity tile) { if (tile instanceof TileSteamOven) return true; if (tile instanceof TileCokeOven) return true; if (tile instanceof TileBoiler) return false; if (tile instanceof IInventory) return ((IInventory) tile).getSizeInventory() >= 27; return false; } }, InventorySorter.SIZE_DECENDING); public TileBoilerFireboxSolid() { super(6); boiler.setFuelProvider(new SolidFuelProvider(this, SLOT_BURN)); } @Override public IEnumMachine getMachineType() { return EnumMachineBeta.BOILER_FIREBOX_SOLID; } @Override public boolean openGui(EntityPlayer player) { TileMultiBlock mBlock = getMasterBlock(); if (mBlock != null) { GuiHandler.openGui(EnumGui.BOILER_SOLID, player, worldObj, mBlock.xCoord, mBlock.yCoord, mBlock.zCoord); return true; } return false; } @Override protected void process() { if (clock % 4 == 0) { InvTools.moveOneItem(invStock, invBurn); InvTools.moveOneItem(invBurn, invWaterOutput, NOT_FUEL); } } @Override public void updateEntity() { super.updateEntity(); if (worldObj.isRemote) return; if (isMaster && clock % 4 == 0) needsFuel = !InvTools.numItemsMoreThan(invFuel, 64); if (needsFuel()) { TileBoilerFireboxSolid mBlock = (TileBoilerFireboxSolid) getMasterBlock(); if (mBlock != null) InvTools.moveOneItem(invCache.getAdjacentInventories(), mBlock.invFuel, StackFilter.FUEL); } } @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) { if(!isStructureValid()) return false; if (slot >= SLOT_BURN) return FuelPlugin.getBurnTime(stack) > 0; else if (slot == SLOT_LIQUID_INPUT) return Fluids.WATER.isContained(stack); return false; } @Override public boolean needsFuel() { TileBoilerFireboxSolid mBlock = (TileBoilerFireboxSolid) getMasterBlock(); if (mBlock != null) return mBlock.needsFuel; return false; } @Override public boolean hasCustomInventoryName() { return false; } }