package joshie.progression.gui.fields; import joshie.progression.api.criteria.IFilter; import joshie.progression.api.criteria.IFilterProvider; import joshie.progression.api.criteria.IFilterType; import joshie.progression.api.criteria.IRuleProvider; import joshie.progression.api.gui.IDrawHelper; import joshie.progression.api.gui.Position; import joshie.progression.api.special.*; import joshie.progression.gui.editors.IItemSelectable; import joshie.progression.gui.filters.FilterTypeItem; import joshie.progression.helpers.MCClientHelper; import net.minecraft.item.ItemStack; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import static joshie.progression.api.special.DisplayMode.EDIT; import static joshie.progression.gui.core.GuiList.*; public class ItemField extends AbstractField implements IItemSelectable { private final IFilterType filter; private Field field; private Object object; private final int x; private final int y; private final float scale; private final int mouseX1; private final int mouseX2; private final int mouseY1; private final int mouseY2; public ItemField(String fieldName, Object object, int x, int y, float scale) { super(fieldName); this.x = x; this.y = y; this.scale = scale; this.mouseX1 = x; this.mouseX2 = (int) (x + 14 * scale); this.mouseY1 = y - 2; this.mouseY2 = (int) (y + 15 * scale); if (object instanceof IFilter) { this.filter = ((IFilter)object).getType(); } else if (object instanceof IFilterProvider) { this.filter = ((IFilterProvider)object).getProvided().getType(); } else if (object instanceof IHasFilters) { this.filter = ((IHasFilters) object).getFilterForField(fieldName); } else this.filter = FilterTypeItem.INSTANCE; try { this.field = object.getClass().getField(fieldName); this.object = object; } catch (Exception e) {} } @Override public String getFieldName() { return field.getName(); } @Override public boolean attemptClick(int mouseX, int mouseY) { if (MODE != EDIT) return false; boolean clicked = mouseX >= mouseX1 && mouseX <= mouseX2 && mouseY >= mouseY1 && mouseY <= mouseY2; if (clicked) { ITEM_EDITOR.select(filter, this, Position.BOTTOM); return true; } else return false; } public ItemStack getStack() { try { if (object instanceof IItemGetterCallback) { ItemStack ret = ((IItemGetterCallback) object).getItem(field.getName()); if (ret != null) return ret; } return (ItemStack) field.get(object); } catch (Exception e) { return null; } } @Override public String getField() { try { return getStack().getDisplayName(); } catch (Exception e) { return ""; } } @Override public void draw(IRuleProvider provider, IDrawHelper helper, int renderX, int renderY, int color, int yPos, int mouseX, int mouseY) { try { boolean hovered = mouseX >= mouseX1 && mouseX <= mouseX2 && mouseY >= mouseY1 && mouseY <= mouseY2; if (hovered) { List<String> tooltip = new ArrayList(); ItemStack stack = getStack(); tooltip.addAll(stack.getTooltip(MCClientHelper.getPlayer(), false)); if (object instanceof IAdditionalTooltip) { ((IAdditionalTooltip)object).addHoverTooltip(getFieldName(), stack, tooltip); } TOOLTIP.add(tooltip); } helper.drawStack(renderX, renderY, getStack(), x, y, scale); } catch (Exception e) {} } @Override public void setObject(Object object) { if (object instanceof ItemStack) { try { ItemStack stack = ((ItemStack) object).copy(); if (this.object instanceof ISetterCallback) { ((ISetterCallback) this.object).setField(field.getName(), stack); } else field.set(this.object, stack); //Init the object after we've set it if (this.object instanceof IInit) { ((IInit) this.object).init(true); } } catch (Exception e) { e.printStackTrace(); } //Update PREVIEW.updateSearch(); } } }