package joshie.progression.criteria.rewards; import joshie.progression.api.criteria.IField; import joshie.progression.api.criteria.IFilterProvider; import joshie.progression.api.criteria.IFilterType; import joshie.progression.api.criteria.ProgressionRule; import joshie.progression.api.special.*; import joshie.progression.crafting.ActionType; import joshie.progression.crafting.CraftingRegistry; import joshie.progression.gui.fields.ItemFilterField; import joshie.progression.gui.fields.ItemFilterFieldPreview; import joshie.progression.gui.filters.FilterTypeAction; import joshie.progression.gui.filters.FilterTypeItem; import joshie.progression.helpers.MCClientHelper; import net.minecraft.client.gui.GuiScreen; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextFormatting; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @ProgressionRule(name="crafting", color=0xFF660000) public class RewardCraftability extends RewardBaseItemFilter implements ICustomDescription, ICustomWidth, ICustomTooltip, ISpecialFieldProvider, IAdditionalTooltip<ItemStack> { private static final HashSet<IHasEventBus> craftRegistry = new HashSet(); public List<IFilterProvider> actionfilters = new ArrayList(); protected transient IField field; public RewardCraftability() { field = new ItemFilterField("actionfilters", this); } @Override public String getDescription() { return (String) field.getField(); } @Override public int getWidth(DisplayMode mode) { return mode == DisplayMode.EDIT ? 85 : 100; } @Override public void addTooltip(List list) { ItemStack stack = preview == null ? BROKEN : preview; list.add(TextFormatting.BLUE + "Action Unlocked!"); if (actionfilters.size() >= 1) { //Always add the first 5 actions for (int i = 0; i < Math.min(5, actionfilters.size()); i++) { list.add("• " + ActionType.getCraftingActionFromIcon((ItemStack) actionfilters.get(i).getProvided().getRandom(MCClientHelper.getPlayer())).getDisplayName()); } //Now if we have more than 5 actions, add some extra text if (actionfilters.size() > 5) { if (GuiScreen.isShiftKeyDown()) { for (int i = 5; i < actionfilters.size(); i++) { list.add("• " + ActionType.getCraftingActionFromIcon((ItemStack) actionfilters.get(i).getProvided().getRandom(MCClientHelper.getPlayer())).getDisplayName()); } } else list.add(TextFormatting.AQUA + "" + TextFormatting.ITALIC + " Hold Shift for list of additional Actions"); } } else list.add(TextFormatting.AQUA + "" + TextFormatting.ITALIC + " This reward is broken"); list.add("------"); list.add(TextFormatting.GOLD + "Item"); list.add(TextFormatting.GRAY + " " + stack.getDisplayName()); } @Override public void addSpecialFields(List<IField> fields, DisplayMode mode) { if(mode == DisplayMode.EDIT) { fields.add(new ItemFilterFieldPreview("filters", this, 5, 44, 1.9F)); fields.add(new ItemFilterFieldPreview("actionfilters", this, 45, 44, 1.9F)); } else fields.add(new ItemFilterFieldPreview("filters", this, 35, 40, 2F)); } @Override public List<IFilterProvider> getAllFilters() { ArrayList<IFilterProvider> all = new ArrayList(); all.addAll(filters); all.addAll(actionfilters); return all; } @Override public IFilterType getFilterForField(String fieldname) { return fieldname.equals("actionfilters") ? FilterTypeAction.INSTANCE : FilterTypeItem.INSTANCE; } @Override public void onAdded(boolean isClient) { for (ActionType type : getTypesFromFilter()) { IHasEventBus bus = type.getCustomBus(); if (bus != null) { if (craftRegistry.add(bus)) { bus.getEventBus().register(bus); } } CraftingRegistry.get(isClient).addRequirement(type, getProvider().getCriteria(), filters); } } @Override public void onRemoved() { for (ActionType type : getTypesFromFilter()) { IHasEventBus bus = type.getCustomBus(); if (bus != null) { if (craftRegistry.remove(bus)) { bus.getEventBus().unregister(bus); } } } } //Helped methods private List<ActionType> getTypesFromFilter() { List<ActionType> list = new ArrayList(); for (IFilterProvider filter : actionfilters) { if (filter.getProvided().getType() == FilterTypeAction.INSTANCE) { ItemStack icon = (ItemStack) filter.getProvided().getRandom(null); if (icon != null) { ActionType type = null; for (ActionType action : ActionType.values()) { if (action.getIcon().getItem() == icon.getItem() && action.getIcon().getItemDamage() == icon.getItemDamage()) { type = action; break; } } if (type != null) list.add(type); } } } return list; } @Override public void addHoverTooltip(String field, ItemStack stack, List<String> tooltip) { if (field.equals("actionfilters")) { tooltip.clear(); //How dare you try to display the itemstacks tooltip! tooltip.add(ActionType.getCraftingActionFromIcon(stack).getDisplayName()); } } }