package joshie.harvest.shops.gui.button;
import joshie.harvest.api.shops.IPurchasable;
import joshie.harvest.core.HFTrackers;
import joshie.harvest.core.helpers.MCClientHelper;
import joshie.harvest.core.helpers.StackRenderHelper;
import joshie.harvest.core.helpers.StackHelper;
import joshie.harvest.core.lib.HFModInfo;
import joshie.harvest.core.network.PacketHandler;
import joshie.harvest.player.stats.StatsClient;
import joshie.harvest.shops.data.ShopData;
import joshie.harvest.shops.gui.GuiNPCShop;
import joshie.harvest.shops.packet.PacketPurchaseItem;
import joshie.harvest.town.TownHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import static joshie.harvest.shops.gui.GuiNPCShop.SHOP_EXTRA;
public class ButtonListing<I extends IPurchasable> extends GuiButton {
private static final int HOVER = 2;
protected final GuiNPCShop shop;
protected final I purchasable;
protected int state;
private int hoverTimer;
private int stackSize = 1;
private boolean clicked;
private final ShopData data;
@SuppressWarnings("unchecked")
public ButtonListing(GuiNPCShop shop, IPurchasable purchasable, int buttonId, int x, int y) {
super(buttonId, x, y, purchasable.getDisplayName());
this.height = 18;
this.shop = shop;
this.purchasable = (I) purchasable;
this.data = TownHelper.getClosestTownToEntity(MCClientHelper.getPlayer(), false).getShops();
}
@Override
public void drawButton(@Nonnull Minecraft mc, int mouseX, int mouseY) {
if (visible) {
FontRenderer fontrenderer = mc.fontRendererObj;
mc.getTextureManager().bindTexture(SHOP_EXTRA);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
hovered = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
int originalState = getHoverState(hovered);
state = originalState;
if (state == HOVER && !canPurchase1()) {
state = 1;
}
GlStateManager.enableBlend();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
drawBackground();
mouseDragged(mc, mouseX, mouseY);
int j = 14737632;
if (packedFGColour != 0) {
j = packedFGColour;
} else if (!enabled) {
j = 10526880;
} else if (state == HOVER && hovered) {
j = 16777120;
}
drawForeground(mc, fontrenderer, j);
GlStateManager.color(1.0F, 1.0F, 1.0F);
if (originalState == HOVER && purchasable.getCost() >= 0) {
List<String> list = new ArrayList<>();
purchasable.addTooltip(list);
shop.addTooltip(list);
}
}
}
private void drawBackground() {
drawTexturedModalRect(xPosition, yPosition, 0, state * 18, width / 2, height);
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, state * 18, width / 2, height);
}
protected void drawForeground(Minecraft mc, FontRenderer fontrenderer, int j) {
StackRenderHelper.drawStack(purchasable.getDisplayStack(), xPosition + 2, yPosition + 1, 1F);
drawString(fontrenderer, displayString, xPosition + 20, yPosition + (height - 8) / 2, j);
GlStateManager.color(1.0F, 1.0F, 1.0F);
//Draw the cost
String cost = shop.getCostAsString(data.getSellValue(shop.getShop(), purchasable));
if (purchasable.getCost() != 0) {
int width = fontrenderer.getStringWidth(cost);
drawString(fontrenderer, cost, xPosition + 180 - width, yPosition + (height - 8) / 2, j);
mc.renderEngine.bindTexture(HFModInfo.ELEMENTS);
drawTexturedModalRect(xPosition + 184, (yPosition + (height - 8) / 2) - 2, 244, 0, 12, 12);
} else {
int width = fontrenderer.getStringWidth(cost);
drawString(fontrenderer, cost, xPosition + 194 - width, yPosition + (height - 8) / 2, j);
}
}
@Override
public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) {
clicked = super.mousePressed(mc, mouseX, mouseY);
return clicked;
}
@Override
protected void mouseDragged(Minecraft mc, int mouseX, int mouseY) {
if (clicked && hovered) {
if (hoverTimer == 0 || (hoverTimer %20 == 0 && GuiScreen.isCtrlKeyDown())) {
if (GuiScreen.isShiftKeyDown() && canPurchaseX(stackSize + 10)) {
stackSize += 10;
StatsClient stats = HFTrackers.getClientPlayerTracker().getStats();
stats.setGoldValue(stats.getGold() - (data.getSellValue(shop.getShop(), purchasable) * 10));
if (purchasable.getCost() >= 0) shop.updatePurchased(StackHelper.toStack(purchasable.getDisplayStack(), 10 * purchasable.getDisplayStack().stackSize), 10 * purchasable.getDisplayStack().stackSize);
if (hoverTimer %40 == 1) playPressSound(mc.getSoundHandler());
} else if (canPurchaseX(stackSize + 1)) {
stackSize++;
if (purchasable.getCost() >= 0) shop.updatePurchased(purchasable.getDisplayStack(), purchasable.getDisplayStack().stackSize);
StatsClient stats = HFTrackers.getClientPlayerTracker().getStats();
stats.setGoldValue(stats.getGold() - data.getSellValue(shop.getShop(), purchasable));
if (hoverTimer %40 == 1) playPressSound(mc.getSoundHandler());
}
hoverTimer++;
}
if (GuiScreen.isCtrlKeyDown()) {
hoverTimer++;
}
} else {
hoverTimer = 0;
stackSize = 0;
}
}
@Override
public void mouseReleased(int mouseX, int mouseY) {
if (stackSize > 0) {
PacketHandler.sendToServer(new PacketPurchaseItem(shop.getShop(), purchasable, stackSize));
stackSize = 0; //Reset
}
//Reset the clicking timer
clicked = false;
}
@Override
public void playPressSound(SoundHandler soundHandlerIn) {
if (state == HOVER) super.playPressSound(soundHandlerIn);
}
private boolean canPurchaseX(int x) {
StatsClient stats = HFTrackers.getClientPlayerTracker().getStats();
return (purchasable.getStock() == 0 || x <= purchasable.getStock()) && stats.getGold() - (purchasable.getCost() * x) >= 0 && purchasable.canDo(MCClientHelper.getWorld(), MCClientHelper.getPlayer(), x);
}
private boolean canPurchase1() {
return canPurchaseX(1);
}
}