/* * 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.gamma; import mods.railcraft.common.carts.CartUtils; import mods.railcraft.common.gui.buttons.IButtonTextureSet; import mods.railcraft.common.gui.buttons.IMultiButtonState; import mods.railcraft.common.gui.buttons.MultiButtonController; import mods.railcraft.common.gui.buttons.StandardButtonTextureSets; import mods.railcraft.common.gui.tooltips.ToolTip; import mods.railcraft.common.plugins.forge.LocalizationPlugin; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.inventory.PhantomInventory; import mods.railcraft.common.util.network.IGuiReturnHandler; 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.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; /** * @author CovertJaguar <http://www.railcraft.info> */ public abstract class TileLoaderItemBase extends TileLoaderBase implements IGuiReturnHandler, ISidedInventory { protected static final int[] SLOTS = InvTools.buildSlotArray(0, 9); private final PhantomInventory invFilters = new PhantomInventory(9, this); private final MultiButtonController<EnumTransferMode> transferModeController = new MultiButtonController(EnumTransferMode.ALL.ordinal(), EnumTransferMode.values()); private final MultiButtonController<EnumRedstoneMode> redstoneModeController = new MultiButtonController(0, getValidRedstoneModes()); protected boolean movedItemCart = false; public MultiButtonController<EnumTransferMode> getTransferModeController() { return transferModeController; } public EnumRedstoneMode[] getValidRedstoneModes() { return EnumRedstoneMode.values(); } public MultiButtonController<EnumRedstoneMode> getRedstoneModeController() { return redstoneModeController; } public final PhantomInventory getItemFilters() { return invFilters; } public abstract Slot getBufferSlot(int id, int x, int y); @Override public int[] getAccessibleSlotsFromSide(int side) { return SLOTS; } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { return isItemValidForSlot(slot, stack); } @Override protected void setPowered(boolean p) { if (!isSendCartGateAction() && redstoneModeController.getButtonState() == EnumRedstoneMode.MANUAL) { super.setPowered(false); return; } super.setPowered(p); } @Override public boolean canHandleCart(EntityMinecart cart) { if (isSendCartGateAction()) return false; if (!(cart instanceof IInventory)) return false; IInventory cartInv = (IInventory) cart; if (cartInv.getSizeInventory() <= 0) return false; ItemStack minecartSlot1 = getCartFilters().getStackInSlot(0); ItemStack minecartSlot2 = getCartFilters().getStackInSlot(1); if (minecartSlot1 != null || minecartSlot2 != null) if (!CartUtils.doesCartMatchFilter(minecartSlot1, cart) && !CartUtils.doesCartMatchFilter(minecartSlot2, cart)) return false; return true; } @Override public boolean isProcessing() { return movedItemCart; } @Override public boolean isManualMode() { return redstoneModeController.getButtonState() == EnumRedstoneMode.MANUAL; } public final EnumTransferMode getMode() { return transferModeController.getButtonState(); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeByte(transferModeController.getCurrentState()); data.writeByte(redstoneModeController.getCurrentState()); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); transferModeController.setCurrentState(data.readByte()); redstoneModeController.setCurrentState(data.readByte()); } @Override public void writeGuiData(DataOutputStream data) throws IOException { data.writeByte(transferModeController.getCurrentState()); data.writeByte(redstoneModeController.getCurrentState()); } @Override public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException { transferModeController.setCurrentState(data.readByte()); redstoneModeController.setCurrentState(data.readByte()); } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); transferModeController.writeToNBT(data, "mode"); redstoneModeController.writeToNBT(data, "redstone"); getItemFilters().writeToNBT("invFilters", data); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); transferModeController.readFromNBT(data, "mode"); redstoneModeController.readFromNBT(data, "redstone"); if (data.getBoolean("waitTillComplete")) { redstoneModeController.setCurrentState(EnumRedstoneMode.COMPLETE.ordinal()); } if (data.hasKey("filters")) { NBTTagCompound filters = data.getCompoundTag("filters"); getItemFilters().readFromNBT("Items", filters); } else { getItemFilters().readFromNBT("invFilters", data); } } public enum EnumTransferMode implements IMultiButtonState { TRANSFER("railcraft.gui.item.loader.transfer"), STOCK("railcraft.gui.item.loader.stock"), EXCESS("railcraft.gui.item.loader.excess"), ALL("railcraft.gui.item.loader.all"); private final String label; private final ToolTip tip; private EnumTransferMode(String label) { this.label = label; this.tip = ToolTip.buildToolTip(label + ".tip"); } @Override public String getLabel() { return LocalizationPlugin.translate(label); } @Override public IButtonTextureSet getTextureSet() { return StandardButtonTextureSets.SMALL_BUTTON; } @Override public ToolTip getToolTip() { return tip; } } public enum EnumRedstoneMode implements IMultiButtonState { IMMEDIATE("railcraft.gui.item.loader.immediate"), COMPLETE("railcraft.gui.item.loader.complete"), MANUAL("railcraft.gui.item.loader.manual"), PARTIAL("railcraft.gui.item.loader.partial"); private final String label; private final ToolTip tip; private EnumRedstoneMode(String label) { this.label = label; this.tip = ToolTip.buildToolTip(label + ".tip"); } @Override public String getLabel() { return LocalizationPlugin.translate(label); } @Override public StandardButtonTextureSets getTextureSet() { return StandardButtonTextureSets.SMALL_BUTTON; } @Override public ToolTip getToolTip() { return tip; } } }