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.api.criteria.ICriteria;
import joshie.progression.api.criteria.IReward;
import joshie.progression.api.criteria.IRewardProvider;
import joshie.progression.api.criteria.ITriggerProvider;
import joshie.progression.api.special.ICustomTooltip;
import joshie.progression.api.special.ICustomTreeIcon;
import joshie.progression.api.special.IMiniIcon;
import joshie.progression.api.special.IStackSizeable;
import joshie.progression.helpers.PlayerHelper;
import joshie.progression.helpers.SplitHelper;
import joshie.progression.player.PlayerTracker;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static joshie.progression.gui.core.GuiList.REWARDS;
public class FeatureRewards extends FeatureCriteria implements ISimpleEditorFieldProvider {
public boolean text = true;
public boolean showHidden = false;
public FeatureRewards() {}
public FeatureRewards(ICriteria criteria, boolean background) {
super(criteria, background);
}
@Override
public FeatureRewards copy() {
return new FeatureRewards(getCriteria(), background);
}
@Override
public void update(IFeatureProvider position) {
super.update(position);
if (getCriteria() != null) {
ICriteria criteria = getCriteria();
List<IRewardProvider> always = buildLists(criteria, true);
List<IRewardProvider> claim = buildLists(criteria, false);
int size = always.size() > claim.size() ? always.size(): claim.size();
position.setWidth((size * 17D) + ((size - 1) * 3D));
double height = always.size() != 0 && claim.size() != 0 ? 56D: 28D;
position.setHeight(height);
} else {
double width = position.getWidth();
position.setHeight(17D);
}
}
@Override
public boolean performClick(int gg, int gg2, int mouseButton) {
ICriteria criteria = getCriteria();
if (criteria == null) return false;
for (ITriggerProvider trigger: criteria.getTriggers()) {
if (!trigger.getProvided().isCompleted()) return false;
}
List<IRewardProvider> always = buildLists(criteria, true);
List<IRewardProvider> claim = buildLists(criteria, false);
int offsetMouseX = gg - position.getLeft();
int offsetMouseY = gg2 - position.getTop();
int offsetY = always.size() != 0 ? 30: 0;
int x = 0;
for (IRewardProvider reward : claim) {
UUID uuid = reward.isOnePerTeam() ? PlayerTracker.getClientPlayer().getTeam().getOwner() : PlayerHelper.getClientUUID();
if (!PlayerTracker.getClientPlayer().getMappings().getUnclaimedRewards(uuid).contains(reward)) continue;
if (offsetMouseX >= x && offsetMouseX <= x + 16 && offsetMouseY >= 10 + offsetY && offsetMouseY <= 10 + offsetY + 16) {
//Clicked
REWARDS.select(reward);
return true;
}
x += 20;
}
return false;
}
private void drawList(List<IRewardProvider> providers, int y) {
int x = 0;
for (IRewardProvider provider : providers) {
if (background) {
int color = 0xFFD0BD92;
if (REWARDS.isSelected(provider)) {
color = 0xFFCCCCCC;
}
EnchiridionAPI.draw.drawRectangle(position.getLeft() + x, position.getTop() + 10 + y, position.getLeft() + x + 16, position.getTop() + 10 + 16 + y, color);
}
IReward reward = provider.getProvided();
boolean mini = reward instanceof IMiniIcon;
int stackSize = reward instanceof IStackSizeable ? ((IStackSizeable)reward).getStackSize() : 1;
if (reward instanceof ICustomTreeIcon) {
((ICustomTreeIcon)reward).draw(position.getLeft() + x, position.getTop() + 10 + y, 1F);
} else {
if (provider.getIcon() == null) continue;
ItemStack stack = provider.getIcon().copy();
if (!mini) stack.stackSize = stackSize;
EnchiridionAPI.draw.drawStack(stack, position.getLeft() + x, position.getTop() + 10 + y, 1F);
}
if (reward instanceof IMiniIcon) {
GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT);
ItemStack miniIcon = ((IMiniIcon)reward).getMiniIcon();
miniIcon.stackSize = stackSize;
EnchiridionAPI.draw.drawStack(miniIcon, position.getLeft() + x, position.getTop() + y, 1F);
}
x += 20;
if (x > 160) {
x = 0;
y += 20;
}
}
}
private List<IRewardProvider> buildLists(final ICriteria criteria, final boolean value) {
List<IRewardProvider> list = new ArrayList<IRewardProvider>();
if (value && (criteria.givesAllRewards() || criteria.getRewards().size() < criteria.getAmountOfRewards())) {
for (IRewardProvider reward: criteria.getRewards()) {
if (!reward.isVisible() && !showHidden) continue;
else list.add(reward);
}
}
if (!criteria.givesAllRewards()) {
for (IRewardProvider reward : criteria.getRewards()) {
if (!reward.isVisible() && !showHidden) continue;
else if (!reward.mustClaim() && value) list.add(reward);
else if (!value && reward.mustClaim()) list.add(reward);
}
}
return list;
}
@Override
public void drawFeature(ICriteria criteria, int mouseX, int mouseY) {
update(position);
List<IRewardProvider> always = buildLists(criteria, true);
List<IRewardProvider> claim = buildLists(criteria, false);
int yOffsetClaimable = 0;
if (always.size() != 0) {
if (text) EnchiridionAPI.draw.drawSplitScaledString("Rewards", position.getLeft() - 2, position.getTop(), 200, 0x555555, 1F);
yOffsetClaimable = 30;
}
if (claim.size() > 0) {
if (text) EnchiridionAPI.draw.drawSplitScaledString("Select " + criteria.getAmountOfRewards() + " Rewards", position.getLeft() - 2, position.getTop() + yOffsetClaimable, 200, 0x555555, 1F);
}
drawList(always, 0);
drawList(claim, yOffsetClaimable);
}
public void addListTooltip(List<String> tooltip, List<IRewardProvider> list, int mouseX, int mouseY, int offsetY) {
int x = 0;
for (IRewardProvider reward : list) {
ItemStack stack = reward.getIcon();
if (mouseX >= x && mouseX <= x + 16 && mouseY >= 10 + offsetY && mouseY <= 10 + offsetY + 16) {
//tooltip.addAll(stack.getTooltip(MCClientHelper.getPlayer(), false));
//tooltip.add("---");
if (reward.getProvided() instanceof ICustomTooltip) ((ICustomTooltip)reward.getProvided()).addTooltip(tooltip);
else{
for (String s : SplitHelper.splitTooltip(reward.getDescription(), 32)) {
tooltip.add(s);
}
}
}
x += 20;
if (x > 160) {
x = 0;
offsetY += 20;
}
}
}
@Override
public void addFeatureTooltip(ICriteria criteria, List<String> tooltip, int mouseX, int mouseY) {
int offsetMouseX = mouseX - position.getLeft();
int offsetMouseY = mouseY - position.getTop();
List<IRewardProvider> always = buildLists(criteria, true);
List<IRewardProvider> claim = buildLists(criteria, false);
int offsetY = always.size() != 0 ? 30: 0;
addListTooltip(tooltip, always, offsetMouseX, offsetMouseY, 0);
addListTooltip(tooltip, claim, offsetMouseX, offsetMouseY, offsetY);
}
}