package micdoodle8.mods.galacticraft.core.inventory;
import micdoodle8.mods.galacticraft.api.item.IItemElectric;
import micdoodle8.mods.galacticraft.core.energy.EnergyConfigHandler;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Creates a slot with a specific amount of items that matches the slot's
* requirements. Allows easy shift right clicking management and slot blocking
* in classes. In your container you can use this.getSlot(i).isItemValid to
* justify the player's shift clicking actions to match the slot.
*
* @author Calclavia
*/
public class SlotSpecific extends Slot
{
public ItemStack[] validItemStacks = new ItemStack[0];
@SuppressWarnings("rawtypes")
public Class[] validClasses = new Class[0];
public boolean isInverted = false;
public boolean isMetadataSensitive = false;
public SlotSpecific(IInventory par2IInventory, int par3, int par4, int par5, ItemStack... itemStacks)
{
super(par2IInventory, par3, par4, par5);
this.setItemStacks(itemStacks);
}
@SuppressWarnings("rawtypes")
public SlotSpecific(IInventory par2IInventory, int par3, int par4, int par5, Class... validClasses)
{
super(par2IInventory, par3, par4, par5);
if (validClasses != null && Arrays.asList(validClasses).contains(IItemElectric.class))
{
try
{
if (EnergyConfigHandler.isRFAPILoaded())
{
ArrayList<Class> existing = new ArrayList(Arrays.asList(validClasses));
existing.add(cofh.api.energy.IEnergyContainerItem.class);
validClasses = existing.toArray(new Class[existing.size()]);
}
if (EnergyConfigHandler.isIndustrialCraft2Loaded())
{
ArrayList<Class> existing = new ArrayList(Arrays.asList(validClasses));
existing.add(ic2.api.item.IElectricItem.class);
existing.add(ic2.api.item.ISpecialElectricItem.class);
validClasses = existing.toArray(new Class[existing.size()]);
}
if (EnergyConfigHandler.isMekanismLoaded())
{
ArrayList<Class> existing = new ArrayList(Arrays.asList(validClasses));
existing.add(mekanism.api.energy.IEnergizedItem.class);
validClasses = existing.toArray(new Class[existing.size()]);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
this.setClasses(validClasses);
}
public SlotSpecific setMetadataSensitive()
{
this.isMetadataSensitive = true;
return this;
}
public SlotSpecific setItemStacks(ItemStack... validItemStacks)
{
this.validItemStacks = validItemStacks;
return this;
}
@SuppressWarnings("rawtypes")
public SlotSpecific setClasses(Class... validClasses)
{
this.validClasses = validClasses;
return this;
}
public SlotSpecific toggleInverted()
{
this.isInverted = !this.isInverted;
return this;
}
/**
* Check if the stack is a valid item for this slot. Always true beside for
* the armor slots.
*/
@SuppressWarnings("rawtypes")
@Override
public boolean isItemValid(ItemStack compareStack)
{
boolean returnValue = false;
for (ItemStack itemStack : this.validItemStacks)
{
if (compareStack.isItemEqual(itemStack) || !this.isMetadataSensitive && compareStack.getItem() == itemStack.getItem())
{
returnValue = true;
break;
}
}
if (!returnValue)
{
for (Class clazz : this.validClasses)
{
if (clazz.isInstance(compareStack.getItem()))
{
returnValue = true;
break;
}
}
}
if (this.isInverted)
{
return !returnValue;
}
return returnValue;
}
}