package joshie.progression.criteria.filters.potion; import joshie.progression.api.ProgressionAPI; import joshie.progression.api.criteria.IFilter; import joshie.progression.api.criteria.IFilterProvider; import joshie.progression.api.criteria.IFilterType; import joshie.progression.helpers.ItemHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; import java.util.*; public abstract class FilterPotionBase implements IFilter<ItemStack, ItemStack> { protected static final Random rand = new Random(); protected static final List<PotionEffect> EMPTY = new ArrayList(); private IFilterProvider provider; @Override public IFilterProvider getProvider() { return provider; } @Override public void setProvider(IFilterProvider provider) { this.provider = provider; } @Override public IFilterType getType() { return ProgressionAPI.filters.getPotionFilter(); } @Override public ItemStack getRandom(EntityPlayer player) { return ItemHelper.getRandomItem(this.getProvider()); } @Override public void apply(ItemStack stack) {} protected Set<Potion> getIds(Collection<PotionEffect> list) { Set<Potion> ids = new HashSet(); for (PotionEffect check : list) ids.add(check.getPotion()); return ids; } protected List<PotionEffect> getEffects(NBTTagCompound tagCompound) { List<PotionEffect> effects = PotionUtils.getEffectsFromTag(tagCompound); return effects != null ? effects : EMPTY; } public abstract boolean matches(PotionEffect effect); private boolean matches(Collection<PotionEffect> collection) { for (PotionEffect effect: collection) { if (matches(effect)) return true; } return false; } @Override public boolean matches(Object object) { if (object instanceof Collection) { return matches((Collection<PotionEffect>)object); } else if (object instanceof ItemStack) { return matches(getEffects(((ItemStack)object).getTagCompound())); } else if (object instanceof PotionEffect) { return matches(((PotionEffect)object)); } return false; } public abstract Collection<PotionEffect> getRandomEffects(); public static Collection<PotionEffect> getRandomEffects(List<IFilterProvider> filters) { int size = filters.size(); if (size == 0) return null; if (size == 1) return ((FilterPotionBase)filters.get(0).getProvided()).getRandomEffects(); else { return ((FilterPotionBase)filters.get(rand.nextInt(size)).getProvided()).getRandomEffects(); } } }