package joshie.progression.plugins.enchiridion.features; import joshie.enchiridion.api.EnchiridionAPI; import joshie.enchiridion.api.book.IFeatureProvider; import joshie.enchiridion.api.gui.ISimpleEditorFieldProvider; import joshie.progression.ItemProgression.ItemMeta; import joshie.progression.api.criteria.*; import joshie.progression.api.special.*; import joshie.progression.helpers.MCClientHelper; import joshie.progression.helpers.SplitHelper; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import org.lwjgl.opengl.GL11; import java.util.List; import static joshie.progression.ItemProgression.getStackFromMeta; import static joshie.progression.Progression.translate; public class FeatureTasks extends FeatureCriteria implements ISimpleEditorFieldProvider { private transient static final ItemStack COMPLETED = getStackFromMeta(ItemMeta.completed); public boolean text = true; public boolean showHidden = false; public FeatureTasks() {} public FeatureTasks(ICriteria criteria, boolean background) { super(criteria, background); } @Override public FeatureTasks copy() { return new FeatureTasks(getCriteria(), background); } @Override public void update(IFeatureProvider position) { super.update(position); ICriteria criteria = getCriteria(); if (criteria != null) { int size = criteria.getTriggers().size(); for (ITriggerProvider trigger: criteria.getTriggers()) { size += trigger.getConditions().size(); } double xWidth = Math.max(size, 9D); double yHeight = Math.ceil(size / 9D); position.setWidth((xWidth * 17D) + ((xWidth - 1) * 3D)); double height = 28D + ((yHeight - 1D) * 20D); position.setHeight(height); } else { double width = position.getWidth(); position.setHeight(17D); } } @Override public boolean performClick(int mouseX, int mouseY, int mouseButton) { ICriteria criteria = getCriteria(); if (criteria == null) return false; int x = 0; int offsetMouseX = mouseX - position.getLeft(); int offsetMouseY = mouseY - position.getTop(); int offsetY = 10; for (ITriggerProvider trigger : criteria.getTriggers()) { if (trigger.isVisible() || showHidden) { if (trigger.getProvided() instanceof IClickable) { if (offsetMouseY >= offsetY && offsetMouseY <= offsetY + 16) { if (offsetMouseX >= x && offsetMouseX <= x + 17) { return (((IClickable) trigger.getProvided()).onClicked(trigger.getIcon())); } } } x += 20; if (x > 160) { x = 0; offsetY += 20; } } for (IConditionProvider condition : trigger.getConditions()) { if (condition.isVisible() || showHidden) { x += 20; if (x > 160) { x = 0; offsetY += 20; } } } } return false; } @Override public void drawFeature(ICriteria criteria, int mouseX, int mouseY) { update(position); int x = 0; int y = 10; for (ITriggerProvider triggerProvider : criteria.getTriggers()) { if (triggerProvider.isVisible() || showHidden) { ITrigger trigger = triggerProvider.getProvided(); int color = triggerProvider.getConditions().size() > 0 ? triggerProvider.getColor() : 0xFFD0BD92; boolean mini = trigger instanceof IMiniIcon; int stackSize = trigger instanceof IStackSizeable ? ((IStackSizeable)trigger).getStackSize() : 1; if (background) EnchiridionAPI.draw.drawBorderedRectangle(position.getLeft() + x, position.getTop() + y, position.getLeft() + x + 16, position.getTop() + 16 + y, 0xFFD0BD92, color); if (trigger instanceof ICustomTreeIcon) { ((ICustomTreeIcon) trigger).draw(position.getLeft() + x, position.getTop() + y, 1F); } else { if (triggerProvider.getIcon() == null) continue; ItemStack stack = triggerProvider.getIcon().copy(); if (!mini) stack.stackSize = stackSize; EnchiridionAPI.draw.drawStack(stack, position.getLeft() + x, position.getTop() + y, 1F); } if (mini) { GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT); ItemStack miniIcon = ((IMiniIcon)trigger).getMiniIcon(); miniIcon.stackSize = stackSize; EnchiridionAPI.draw.drawStack(miniIcon, position.getLeft() + x, position.getTop() + y, 1F); } if (trigger.isCompleted()) { EnchiridionAPI.draw.drawStack(COMPLETED, position.getLeft() + x, position.getTop() + y, 1F); } x += 20; if (x > 160) { x = 0; y += 20; } } for (IConditionProvider conditionProvider : triggerProvider.getConditions()) { if (conditionProvider.isVisible() || showHidden) { ICondition condition = conditionProvider.getProvided(); boolean mini = condition instanceof IMiniIcon; int stackSize = condition instanceof IStackSizeable ? ((IStackSizeable)condition).getStackSize() : 1; if (background) EnchiridionAPI.draw.drawBorderedRectangle(position.getLeft() + x, position.getTop() + y, position.getLeft() + x + 16, position.getTop() + y + 16, 0xFFD0BD92, conditionProvider.getColor()); if (condition instanceof ICustomTreeIcon) { ((ICustomTreeIcon) condition).draw(position.getLeft() + x, position.getTop() + y, 1F); } else { if (conditionProvider.getIcon() == null) continue; ItemStack stack = conditionProvider.getIcon().copy(); if (!mini) stack.stackSize = stackSize; EnchiridionAPI.draw.drawStack(stack, position.getLeft() + x, position.getTop() + y, 1F); } if (condition instanceof IMiniIcon) { GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT); ItemStack miniIcon = ((IMiniIcon)condition).getMiniIcon(); miniIcon.stackSize = stackSize; EnchiridionAPI.draw.drawStack(miniIcon, position.getLeft() + x, position.getTop() + y, 1F); } boolean completed = triggerProvider.getProvided().isCompleted(); if (!completed && conditionProvider.isInverted() && !conditionProvider.isSatisfied()) completed = true; else if (!completed && !conditionProvider.isInverted() && conditionProvider.isSatisfied()) completed = true; if (completed) { EnchiridionAPI.draw.drawStack(COMPLETED, position.getLeft() + x, position.getTop() + y, 1F); } x += 20; if (x > 160) { x = 0; y += 20; } } } } if (criteria.getTriggers().size() != 0) { if (text) EnchiridionAPI.draw.drawSplitScaledString(translate("tasks"), position.getLeft() - 2, position.getTop(), 200, 0x555555, 1F); } } @Override public void addFeatureTooltip(ICriteria criteria, List<String> tooltip, int mouseX, int mouseY) { int x = 0; int offsetMouseX = mouseX - position.getLeft(); int offsetMouseY = mouseY - position.getTop(); int offsetY = 10; for (ITriggerProvider trigger : criteria.getTriggers()) { if (trigger.isVisible() || showHidden) { if (offsetMouseY >= offsetY && offsetMouseY <= offsetY + 16) { if (offsetMouseX >= x && offsetMouseX <= x + 17) { ItemStack stack = trigger.getIcon(); if (stack != null) { tooltip.addAll(stack.getTooltip(MCClientHelper.getPlayer(), false)); if (trigger.getProvided() instanceof IAdditionalTooltip) { ((IAdditionalTooltip) trigger.getProvided()).addHoverTooltip("filters", stack, tooltip); } tooltip.add("---"); if (trigger.getProvided() instanceof ICustomTooltip) ((ICustomTooltip) trigger.getProvided()).addTooltip(tooltip); else { for (String s : SplitHelper.splitTooltip(trigger.getDescription(), 32)) { tooltip.add(s); } } } } } x += 20; if (x > 160) { x = 0; offsetY += 20; } } for (IConditionProvider condition: trigger.getConditions()) { if (condition.isVisible() || showHidden) { if (offsetMouseY >= offsetY && offsetMouseY <= offsetY + 16) { if (offsetMouseX >= x && offsetMouseX <= x + 17) { ItemStack stack = condition.getIcon(); tooltip.addAll(stack.getTooltip(MCClientHelper.getPlayer(), false)); if (condition.getProvided() instanceof IAdditionalTooltip) { ((IAdditionalTooltip) condition.getProvided()).addHoverTooltip("filters", stack, tooltip); } tooltip.add("---"); if (condition.getProvided() instanceof ICustomTooltip) ((ICustomTooltip) condition.getProvided()).addTooltip(tooltip); else { for (String s : SplitHelper.splitTooltip(condition.getDescription(), 32)) { tooltip.add(s); } } } x += 20; if (x > 160) { x = 0; offsetY += 20; } } } } } } }