package codechicken.nei;
import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiCCTextField;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.core.inventory.GuiContainerWidget;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.FontUtils;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.StatCollector;
import java.awt.*;
import java.util.ArrayList;
public class GuiPotionCreator extends GuiContainerWidget
{
public class GuiSlotPotionEffects extends GuiScrollSlot
{
public int selectedslot = -1;
public boolean enabled = true;
private ArrayList<Potion> validPotions = new ArrayList<Potion>();
public GuiSlotPotionEffects(int x, int y) {
super(x, y, 108, 76);
for (Potion p : Potion.potionTypes)
if (p != null)
validPotions.add(p);
setSmoothScroll(false);
setMargins(0, 0, 0, 0);
}
@Override
public int getSlotHeight(int slot) {
return 19;
}
@Override
public void drawBackground(float frame) {
super.drawBackground(frame);
drawRect(x, y, x + width, y + height, 0xFF000000);
}
@Override
public void drawOverlay(float frame) {
}
@Override
public int scrollbarGuideAlignment() {
return 0;
}
@Override
public Dimension scrollbarDim() {
Dimension dim = super.scrollbarDim();
dim.width = 7;
return dim;
}
@Override
protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
GlStateManager.color(1, 1, 1, 1);
Potion potion = validPotions.get(slot);
PotionEffect effect = getEffect(potion.id);
boolean blank = effect == null;
if (effect == null)
effect = new PotionEffect(potion.id, 1200, 0);
int shade = selectedslot == slot ? 2 : blank ? 1 : 0;
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
drawTexturedModalRect(x, y, 0, 166 + getSlotHeight(slot) * shade, width - 30, getSlotHeight(slot));
drawTexturedModalRect(x + width - 30, y, width - 23, 166 + getSlotHeight(slot) * shade, 30, getSlotHeight(slot));
if (potion.hasStatusIcon()) {
CCRenderState.changeTexture("textures/gui/container/inventory.png");
int icon = potion.getStatusIconIndex();
drawTexturedModalRect(x + 1, y + 1, icon % 8 * 18, 198 + icon / 8 * 18, 18, 18);
}
String name = StatCollector.translateToLocal(potion.getName());
String amp = effect.getAmplifier() > 0 ? " " + translateAmplifier(effect.getAmplifier()) : "";
int textColour = shade == 0 ? 0x685e4a : shade == 1 ? 0x407f10 : 0xffff80;
if (fontRenderer.getStringWidth(name + amp) < width - 20) {
fontRenderer.drawString(name + amp, x + 20, y + 1, textColour);
} else {
fontRenderer.drawString(name, x + 20, y + 1, textColour);
FontUtils.drawRightString(amp, x + width - 10, y + 10, textColour);
}
String duration = Potion.getDurationString(effect);
textColour = shade == 0 ? 0xA0A0A0 : shade == 1 ? 0x808080 : 0xCCCCCC;
fontRenderer.drawStringWithShadow(duration, x + 20, y + 10, textColour);
}
private PotionEffect getEffect(int id) {
ItemStack potion = container.potionInv.getStackInSlot(0);
if (potion != null && potion.hasTagCompound() && potion.getTagCompound().hasKey("CustomPotionEffects")) {
NBTTagList potionTagList = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
for (int i = 0; i < potionTagList.tagCount(); i++) {
PotionEffect effect = PotionEffect.readCustomPotionEffectFromNBT(potionTagList.getCompoundTagAt(i));
if (effect.getPotionID() == id)
return effect;
}
}
return null;
}
@Override
protected int getNumSlots() {
return validPotions.size();
}
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count) {
if (!enabled)
return;
if (button == 0) {
select(slot);
applyEffect();
} else if (button == 1) {
deselect();
container.removePotionEffect(validPotions.get(slot).id);
}
}
public void selectNext() {
if (selectedslot >= 0 && selectedslot + 1 < getNumSlots()) {
select(selectedslot + 1);
showSlot(selectedslot);
}
}
public void selectPrev() {
if (selectedslot > 0) {
select(selectedslot - 1);
showSlot(selectedslot);
}
}
public void setEnabled(boolean b) {
if (b == enabled)
return;
enabled = b;
if (!enabled)
deselect();
}
private void select(int slot) {
selectedslot = slot;
durationField.setEnabled(true);
PotionEffect effect = getEffect(validPotions.get(slot).id);
if (effect == null)
effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
durationField.setDurationTicks(effect.getDuration());
amplifier = effect.getAmplifier();
validateInputButtons();
}
private void deselect() {
selectedslot = -1;
durationField.setEnabled(false);
ampDown.setEnabled(false);
ampUp.setEnabled(false);
}
public int selectedPotion() {
return validPotions.get(selectedslot).id;
}
}
public class GuiDurationField extends GuiCCTextField
{
private String baseValue;
public GuiDurationField(int x, int y, int width, int height) {
super(x, y, width, height, "100");
setMaxStringLength(4);
setAllowedCharacters("0123456789");
baseValue = getText();
}
public void setDurationTicks(int i) {
i /= 20;
String minutes = Integer.toString(i / 60);
String seconds = Integer.toString(i % 60);
if (seconds.length() == 1)
seconds = '0' + seconds;
setText(minutes + seconds);
}
@Override
public void setEnabled(boolean b) {
super.setEnabled(b);
if (!isEnabled())
setText("100");
}
@Override
public void onFocusChanged() {
if (isFocused())
baseValue = getText();
else {
if (!validateValue())
setText(baseValue);
else
applyEffect();
}
}
@Override
public void onTextChanged(String oldText) {
validateInputButtons();
}
private boolean validateValue() {
try {
int i = Integer.parseInt(getText());
return i > 1 && getDurationTicks() < Short.MAX_VALUE && i / 100 <= 60 && i % 100 < 60;
} catch (NumberFormatException nfe) {
return false;
}
}
@Override
public void drawText() {
String s = getText();
String seconds = s.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
String minutes = s.length() < 3 ? "" : s.substring(0, s.length() - 2);
int ty = y + height / 2 - 4;
int tcolour = getTextColour();
FontUtils.drawCenteredString(":", x + width / 2 + 1, ty, tcolour);
FontUtils.drawRightString(seconds, x + width - 3, ty, tcolour);
FontUtils.drawRightString(minutes, x + width / 2 - 1, ty, tcolour);
}
@Override
public int getTextColour() {
return isFocused() ? 0xCCCCCC : 0x909090;
}
public int getDurationTicks() {
int i = Integer.parseInt(getText());
return ((i / 100) * 60 + (i % 100)) * 20;
}
}
int amplifier = 0;
GuiCCButton ampDown;
GuiCCButton ampUp;
GuiSlotPotionEffects slotPotionEffects;
GuiDurationField durationField;
ContainerPotionCreator container;
public GuiPotionCreator(InventoryPlayer inventoryplayer) {
super(new ContainerPotionCreator(inventoryplayer, new ContainerPotionCreator.InventoryPotionStore()), 176, 208);
container = (ContainerPotionCreator) inventorySlots;
}
public void applyEffect() {
if (slotPotionEffects.selectedslot >= 0)
container.setPotionEffect(slotPotionEffects.selectedPotion(), durationField.getDurationTicks(), amplifier);
}
public String translateAmplifier(int amplifier) {
switch (amplifier) {
case 0:
return "I";
case 1:
return "II";
case 2:
return "III";
case 3:
return "IV";
case 4:
return "V";
}
return Integer.toString(amplifier);
}
public void validateInputButtons() {
ampDown.setEnabled(amplifier > 0);
ampUp.setEnabled(amplifier < 3);
}
@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2) {
//fontRenderer.drawString("Potion", 12, 6, 0x404040);
}
@Override
public void drawBackground() {
CCRenderState.changeTexture("nei:textures/gui/potion.png");
drawTexturedModalRect(0, 0, 0, 0, xSize, ySize);
FontUtils.drawCenteredString("Favourite Potions", xSize / 2, 4, 0x404040);
fontRendererObj.drawString("Duration", 12, 40, 0x404040);
fontRendererObj.drawString("Level", 19, 73, 0x404040);
FontUtils.drawCenteredString(translateAmplifier(amplifier), 33, 86, 0xFF606060);
}
@Override
public void addWidgets() {
add(ampDown = new GuiCCButton(10, 84, 12, 12, "<").setActionCommand("ampDown"));
add(ampUp = new GuiCCButton(44, 84, 12, 12, ">").setActionCommand("ampUp"));
add(durationField = new GuiDurationField(15, 53, 35, 12));
add(slotPotionEffects = new GuiSlotPotionEffects(60, 38));
}
@Override
public void updateScreen() {
super.updateScreen();
slotPotionEffects.setEnabled(container.potionInv.getStackInSlot(0) != null);
}
@Override
public void actionPerformed(String ident, Object... params) {
if (ident.equals("ampDown"))
amplifier--;
else if (ident.equals("ampUp"))
amplifier++;
applyEffect();
validateInputButtons();
}
}