package joshie.progression.criteria.conditions; import joshie.progression.Progression; import joshie.progression.api.IPlayerTeam; import joshie.progression.api.ProgressionAPI; import joshie.progression.api.criteria.IField; import joshie.progression.api.criteria.IFilterProvider; import joshie.progression.api.criteria.ProgressionRule; import joshie.progression.api.special.*; import joshie.progression.gui.fields.ItemFilterFieldPreview; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import java.util.List; @ProgressionRule(name="ininventory", color=0xFF660000) public class ConditionInInventory extends ConditionBaseItemFilter implements ICustomDescription, IEnum, ISpecialFieldProvider, IStackSizeable { private static enum CheckSlots { HELD(true, false), ARMOR, HOTBAR, INVENTORY, OFFHAND(false, true), ANYHAND(true, true); public boolean main; public boolean off; private CheckSlots() {} private CheckSlots(boolean main, boolean off) { this.main = main; this.off = off; } } public int stackSize = 1; public CheckSlots slotType = CheckSlots.INVENTORY; @Override public String getDescription() { if (getProvider().isInverted()) return Progression.format(getProvider().getUnlocalisedName() + ".description." + slotType.toString().toLowerCase() + ".inverted"); else return Progression.format(getProvider().getUnlocalisedName() + ".description." + slotType.toString().toLowerCase()); } @Override public void addSpecialFields(List<IField> fields, DisplayMode mode) { if (mode == DisplayMode.EDIT) fields.add(ProgressionAPI.fields.getItemPreview(this, "filters", 30, 50, 1.9F)); else fields.add(new ItemFilterFieldPreview("filters", this, 67, 40, 1.75F)); } @Override public int getStackSize() { return stackSize; } @Override public boolean isEnum(String name) { return name.equals("slotType"); } @Override public Enum next(String name) { int id = slotType.ordinal() + 1; if (id < CheckSlots.values().length) { return CheckSlots.values()[id]; } return CheckSlots.values()[0]; } @Override public boolean isSatisfied(IPlayerTeam team) { int counter = 0; for (EntityPlayer player: team.getTeamEntities()) { if (!team.isTrueTeam()) counter = 0; //Reset the counter if (slotType == CheckSlots.ARMOR) { for (ItemStack armor : player.inventory.armorInventory) { if (armor != null && matches(armor)) { counter += armor.stackSize; if (counter >= stackSize) return true; } } } else if (slotType == CheckSlots.HOTBAR) { counter += getAmount(player, 9); if (counter >= stackSize) return true; } else if (slotType == CheckSlots.INVENTORY) { counter += getAmount(player, 36); if (counter >= stackSize) return true; } else { if (slotType.main && matches(player.getHeldItemMainhand())) { counter += player.getHeldItemMainhand().stackSize; if (counter >= stackSize) return true; } if (slotType.off && matches(player.getHeldItemOffhand())) { counter += player.getHeldItemOffhand().stackSize; if (counter >= stackSize) return true; } } } return false; } //Helper Methods private boolean matches(ItemStack check) { for (IFilterProvider filter : filters) { if (filter.getProvided().matches(check)) return true; } return false; } private int getAmount(EntityPlayer player, int slots) { boolean hasItem = false; for (int i = 0; i < slots; i++) { if (matches(player.inventory.mainInventory[i])) { hasItem = true; break; } } if (!hasItem) return 0; int amount = 0; for (int i = 0; i < slots; i++) { ItemStack stack = player.inventory.mainInventory[i]; if (matches(stack)) { amount += stack.stackSize; } } return amount; } }