package joshie.progression.gui.editors; import joshie.progression.api.criteria.ICriteria; import joshie.progression.api.criteria.IRewardProvider; import joshie.progression.api.criteria.ITriggerProvider; import joshie.progression.gui.core.GuiList; import joshie.progression.helpers.CollectionHelper; import joshie.progression.helpers.PlayerHelper; import joshie.progression.network.PacketHandler; import joshie.progression.network.PacketSelectRewards; import joshie.progression.player.PlayerTracker; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; import static joshie.progression.api.special.DisplayMode.EDIT; import static joshie.progression.gui.core.GuiList.*; public class FeatureReward extends FeatureDrawable<IRewardProvider> { private Set<IRewardProvider> selected; public FeatureReward() { super("reward", 140, NEW_REWARD, THEME.rewardBoxGradient1, THEME.rewardBoxGradient2, THEME.rewardBoxFont, THEME.rewardBoxGradient2); } public void reset(ICriteria criteria) { if (selected == null) { selected = new LinkedHashSet<IRewardProvider>(); } else { if (selected.size() > 0) { IRewardProvider first = null; for (IRewardProvider reward: selected) { first = reward; break; } //If we are a different criteria, then reset everything if (!first.getCriteria().getUniqueID().equals(criteria.getUniqueID())) { selected = new LinkedHashSet<IRewardProvider>(); } } } } @Override public boolean isReady() { return CRITERIA_EDITOR.get() != null; } @Override public List<IRewardProvider> getList() { return CRITERIA_EDITOR.get().getRewards(); } public Set<IRewardProvider> getSelected() { if (selected == null) { selected = new LinkedHashSet<IRewardProvider>(); } return selected; } @Override public int drawSpecial(IRewardProvider drawing, int offsetX, int offsetY, int mouseOffsetX, int mouseOffsetY) { boolean allTrue = true; for (ITriggerProvider provider: drawing.getCriteria().getTriggers()) { if (!provider.getProvided().isCompleted()) allTrue = false; } if (allTrue) { if (selected.contains(drawing) || !drawing.mustClaim()) { offset.drawGradient(offsetX, offsetY, 1, 2, drawing.getWidth(GuiList.MODE) - 1, 75, 0x33222222, 0x00CCCCCC, 0x00000000); } } return super.drawSpecial(drawing, offsetX, offsetY, mouseOffsetX, mouseOffsetY); } @Override public boolean clickSpecial(IRewardProvider provider, int mouseOffsetX, int mouseOffsetY) { if (MODE == EDIT) return false; //Don't you dare! if (mouseOffsetY < 2 || mouseOffsetY > 73) return false; for (ITriggerProvider trigger: provider.getCriteria().getTriggers()) { if (!trigger.getProvided().isCompleted()) return false; } UUID uuid = provider.isOnePerTeam() ? PlayerTracker.getClientPlayer().getTeam().getOwner() : PlayerHelper.getClientUUID(); if (!PlayerTracker.getClientPlayer().getMappings().getUnclaimedRewards(uuid).contains(provider)) return false; if (mouseOffsetX > 0 && mouseOffsetX < provider.getWidth(MODE) && provider.mustClaim()) { if (select(provider)) sendToServer(); return true; } return false; } public void sendToServer() { PacketHandler.sendToServer(new PacketSelectRewards(selected)); selected = new LinkedHashSet<IRewardProvider>(); //Reset the hashset } public boolean isSelected(IRewardProvider provider) { return selected == null? false: selected.contains(provider); } public boolean select(IRewardProvider provider) { return select(provider, false); } public boolean select(IRewardProvider provider, boolean simulate) { if (selected == null) return false; //You are not allowed to be visible if selections can't even happen //Click processed as this item must be claimed, now we check the side of selected, vs other things if (provider != null && !simulate) { if (selected.contains(provider)) { CollectionHelper.remove(selected, provider); return false; } //If we already had it, screw validation } int standard = 0; ICriteria criteria = provider.getCriteria(); int maximum = criteria.givesAllRewards() ? criteria.getRewards().size() : criteria.getAmountOfRewards(); for (IRewardProvider reward : criteria.getRewards()) { if (!reward.mustClaim()) standard++; } int current = selected.size() + standard; if (current < maximum && !simulate) { selected.add(provider); current++; } if (current >= maximum) { return true; } return false; } }