/*******************************************************************************
* AbyssalCraft
* Copyright (c) 2012 - 2017 Shinoow.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Contributors:
* Shinoow - implementation
******************************************************************************/
package com.shinoow.abyssalcraft.client.gui.necronomicon;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.GlStateManager.DestFactor;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.RenderItem;
import net.minecraft.client.renderer.GlStateManager.SourceFactor;
import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.oredict.OreDictionary;
import org.lwjgl.input.Keyboard;
import com.shinoow.abyssalcraft.api.block.ACBlocks;
import com.shinoow.abyssalcraft.api.item.ACItems;
import com.shinoow.abyssalcraft.api.recipe.CrystallizerRecipes;
import com.shinoow.abyssalcraft.api.recipe.TransmutatorRecipes;
import com.shinoow.abyssalcraft.client.gui.necronomicon.buttons.ButtonCategory;
import com.shinoow.abyssalcraft.client.gui.necronomicon.buttons.ButtonNextPage;
import com.shinoow.abyssalcraft.client.lib.GuiRenderHelper;
import com.shinoow.abyssalcraft.lib.NecronomiconResources;
import com.shinoow.abyssalcraft.lib.NecronomiconText;
public class GuiNecronomiconMachines extends GuiNecronomicon {
private ButtonNextPage buttonNextPage;
private ButtonNextPage buttonPreviousPage;
private GuiButton buttonDone;
private ButtonCategory info, transmutator, crystallizer;
private boolean isMInfo, isTra, isCry;
public GuiNecronomiconMachines(int bookType){
super(bookType);
}
@Override
@SuppressWarnings("unchecked")
public void initGui()
{
buttonList.clear();
Keyboard.enableRepeatEvents(true);
buttonList.add(buttonDone = new GuiButton(0, width / 2 - 100, 4 + guiHeight, 200, 20, I18n.format("gui.done", new Object[0])));
int i = (width - guiWidth) / 2;
byte b0 = 2;
buttonList.add(buttonNextPage = new ButtonNextPage(1, i + 220, b0 + 154, true));
buttonList.add(buttonPreviousPage = new ButtonNextPage(2, i + 18, b0 + 154, false));
buttonList.add(info = new ButtonCategory(3, i + 14, b0 + 24, this, NecronomiconText.LABEL_INFO, ACItems.necronomicon));
buttonList.add(transmutator = new ButtonCategory(4, i + 14, b0 + 41, this, "container.abyssalcraft.transmutator", getItem(1)));
buttonList.add(crystallizer = new ButtonCategory(5, i + 14, b0 + 58, this, "container.abyssalcraft.crystallizer", getItem(2)));
// buttonList.add(engraver = new ButtonCategory(6, i + 14, b0 + 75, this, StatCollector.translateToLocal("container.abyssalcraft.engraver"), getItem(3)));
// buttonList.add(materializer = new ButtonCategory(7, i + 14, b0 + 92, this, StatCollector.translateToLocal("container.abyssalcraft.materializer"), getItem(3)));
updateButtons();
}
private void updateButtons()
{
buttonNextPage.visible = currTurnup < getTurnupLimit() - 1 && isInfo;
buttonPreviousPage.visible = true;
buttonDone.visible = true;
info.visible = true;
transmutator.visible = true;
crystallizer.visible = true;
// engraver.visible = true;
// materializer.visible = true;
}
@Override
protected void actionPerformed(GuiButton button)
{
if (button.enabled){
if(button.id == 0)
mc.displayGuiScreen((GuiScreen)null);
else if(button.id == 1){
if (currTurnup < getTurnupLimit() -1)
++currTurnup;
} else if(button.id == 2){
if(currTurnup == 0 && !isInfo)
mc.displayGuiScreen(new GuiNecronomiconInformation(getBookType()));
else if(currTurnup == 0 && isInfo){
initGui();
isInfo = isMInfo = isTra = isCry = false;
setTurnupLimit(2);
} else if (currTurnup > 0)
--currTurnup;
} else if(button.id == 3){
isInfo = true;
isMInfo = true;
drawButtons();
} else if(button.id == 4 && getBookType() >= 1){
isInfo = true;
isTra = true;
drawButtons();
} else if(button.id == 5 && getBookType() >= 2){
isInfo = true;
isCry = true;
drawButtons();
// } else if(button.id == 6 && getBookType() >= 3){
// isInfo = true;
// isEng = true;
// drawButtons();
// } else if(button.id == 7 && getBookType() >= 3){
// isInfo = true;
// isMat = true;
// drawButtons();
}
updateButtons();
}
}
@SuppressWarnings("unchecked")
private void drawButtons(){
buttonList.clear();
buttonList.add(buttonDone = new GuiButton(0, width / 2 - 100, 4 + guiHeight, 200, 20, I18n.format("gui.done", new Object[0])));
int i = (width - guiWidth) / 2;
byte b0 = 2;
buttonList.add(buttonNextPage = new ButtonNextPage(1, i + 215, b0 + 154, true));
buttonList.add(buttonPreviousPage = new ButtonNextPage(2, i + 18, b0 + 154, false));
}
@Override
protected void drawIndexText(){
int k = (width - guiWidth) / 2;
byte b0 = 2;
String stuff;
stuff = localize(NecronomiconText.LABEL_INFORMATION_MACHINES);
fontRendererObj.drawSplitString(stuff, k + 20, b0 + 16, 116, 0xC40000);
writeText(2, NecronomiconText.MACHINES_INFO);
}
private void setTurnups(int size){
if(size <= 12)
setTurnupLimit(1);
else if(size > 12 && size <= 24)
setTurnupLimit(2);
else if(size > 24 && size <= 36)
setTurnupLimit(3);
else if(size > 36 && size <= 48)
setTurnupLimit(4);
else if(size > 48 && size <= 60)
setTurnupLimit(5);
else if(size > 60 && size <= 72)
setTurnupLimit(6);
else if(size > 72 && size <= 84)
setTurnupLimit(7);
else if(size > 84 && size <= 96)
setTurnupLimit(8);
else if(size > 96 && size <= 108)
setTurnupLimit(9);
else if(size > 108 && size <= 120)
setTurnupLimit(10);
else if(size > 120 && size <= 132)
setTurnupLimit(11);
else if(size > 132 && size <= 144)
setTurnupLimit(12);
else if(size > 144 && size <= 156)
setTurnupLimit(13);
else if(size > 156 && size <= 168)
setTurnupLimit(14);
else if(size > 168 && size <= 180)
setTurnupLimit(15);
else if(size > 180 && size <= 192)
setTurnupLimit(16);
else if(size > 192 && size <= 204)
setTurnupLimit(17);
else if(size > 204 && size <= 216)
setTurnupLimit(18);
else if(size > 216 && size <= 228)
setTurnupLimit(19);
else if(size > 228 && size <= 240)
setTurnupLimit(20);
}
@Override
protected void drawInformationText(int x, int y){
int k = (width - guiWidth) / 2;
byte b0 = 2;
String stuff;
tooltipStack = null;
if(isMInfo){
stuff = localize(NecronomiconText.LABEL_INFO);
fontRendererObj.drawSplitString(stuff, k + 20, b0 + 16, 116, 0xC40000);
setTurnupLimit(4);
if(currTurnup == 0){
writeText(1, NecronomiconText.MACHINE_INFO_1, 50);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.ITEM);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
renderItem(k + 60, b0 + 28, new ItemStack(ACBlocks.transmutator_idle), x, y);
} else if(currTurnup == 1){
writeText(1, NecronomiconText.MACHINE_INFO_2, 50);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.ITEM);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
renderItem(k + 60, b0 + 28, new ItemStack(ACBlocks.crystallizer_idle), x, y);
} else if(currTurnup == 2){
writeText(1, NecronomiconText.MACHINE_INFO_3, 50);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.ITEM);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
renderItem(k + 60, b0 + 28, new ItemStack(ACBlocks.engraver), x, y);
} else if(currTurnup == 3){
writeText(1, NecronomiconText.MACHINE_INFO_4, 50);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.ITEM);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
renderItem(k + 60, b0 + 28, new ItemStack(ACBlocks.materializer), x, y);
}
}
if(isTra){
stuff = localize("container.abyssalcraft.transmutator");
fontRendererObj.drawSplitString(stuff, k + 20, b0 + 16, 116, 0xC40000);
Map<ItemStack, ItemStack> trans = TransmutatorRecipes.instance().getTransmutationList();
setTurnups(trans.size());
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.TRANSMUTATION);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
for(int n = 0; n < trans.size(); n++){
Entry<ItemStack, ItemStack> entry = (Entry<ItemStack, ItemStack>) trans.entrySet().toArray()[n];
if(currTurnup == 0){
drawTItems(entry, n, 0, 6, 12, x, y);
if(n == 12) break;
} else if(currTurnup == 1){
drawTItems(entry, n, 12, 18, 24, x, y);
if(n == 24) break;
} else if(currTurnup == 2){
drawTItems(entry, n, 24, 30, 36, x, y);
if(n == 36) break;
} else if(currTurnup == 3){
drawTItems(entry, n, 36, 42, 48, x, y);
if(n == 48) break;
} else if(currTurnup == 4){
drawTItems(entry, n, 48, 54, 60, x, y);
if(n == 60) break;
} else if(currTurnup == 5){
drawTItems(entry, n, 60, 66, 72, x, y);
if(n == 72) break;
} else if(currTurnup == 6){
drawTItems(entry, n, 72, 78, 84, x, y);
if(n == 84) break;
} else if(currTurnup == 7){
drawTItems(entry, n, 84, 90, 96, x, y);
if(n == 96) break;
} else if(currTurnup == 8){
drawTItems(entry, n, 96, 102, 108, x, y);
if(n == 108) break;
} else if(currTurnup == 9){
drawTItems(entry, n, 108, 114, 120, x, y);
if(n == 120) break;
} else if(currTurnup == 10){
drawTItems(entry, n, 120, 126, 132, x, y);
if(n == 132) break;
} else if(currTurnup == 11){
drawTItems(entry, n, 132, 138, 144, x, y);
if(n == 144) break;
} else if(currTurnup == 12){
drawTItems(entry, n, 144, 150, 156, x, y);
if(n == 156) break;
} else if(currTurnup == 13){
drawTItems(entry, n, 156, 162, 168, x, y);
if(n == 168) break;
} else if(currTurnup == 14){
drawTItems(entry, n, 168, 174, 180, x, y);
if(n == 180) break;
} else if(currTurnup == 15){
drawTItems(entry, n, 180, 186, 192, x, y);
if(n == 192) break;
} else if(currTurnup == 16){
drawTItems(entry, n, 192, 198, 204, x, y);
if(n == 204) break;
} else if(currTurnup == 17){
drawTItems(entry, n, 204, 210, 216, x, y);
if(n == 216) break;
} else if(currTurnup == 18){
drawTItems(entry, n, 216, 222, 228, x, y);
if(n == 228) break;
} else if(currTurnup == 19){
drawTItems(entry, n, 228, 234, 240, x, y);
if(n == 240) break;
}
}
}
if(isCry){
stuff = localize("container.abyssalcraft.crystallizer");
fontRendererObj.drawSplitString(stuff, k + 20, b0 + 16, 116, 0xC40000);
Map<ItemStack, ItemStack[]> cryst = CrystallizerRecipes.instance().getCrystallizationList();
setTurnups(cryst.size());
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
mc.renderEngine.bindTexture(NecronomiconResources.TRANSMUTATION);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
mc.renderEngine.bindTexture(NecronomiconResources.CRYSTALLIZATION);
drawTexturedModalRect(k, b0, 0, 0, 256, 256);
for(int n = 0; n < cryst.size(); n++){
Entry<ItemStack, ItemStack[]> entry = (Entry<ItemStack, ItemStack[]>) cryst.entrySet().toArray()[n];
if(currTurnup == 0){
drawCItems(entry, n, 0, 6, 12, x, y);
if(n == 12) break;
} else if(currTurnup == 1){
drawCItems(entry, n, 12, 18, 24, x, y);
if(n == 24) break;
} else if(currTurnup == 2){
drawCItems(entry, n, 24, 30, 36, x, y);
if(n == 36) break;
} else if(currTurnup == 3){
drawCItems(entry, n, 36, 42, 48, x, y);
if(n == 48) break;
} else if(currTurnup == 4){
drawCItems(entry, n, 48, 54, 60, x, y);
if(n == 60) break;
} else if(currTurnup == 5){
drawCItems(entry, n, 60, 66, 72, x, y);
if(n == 72) break;
} else if(currTurnup == 6){
drawCItems(entry, n, 72, 78, 84, x, y);
if(n == 84) break;
} else if(currTurnup == 7){
drawCItems(entry, n, 84, 90, 96, x, y);
if(n == 96) break;
} else if(currTurnup == 8){
drawCItems(entry, n, 96, 102, 108, x, y);
if(n == 108) break;
} else if(currTurnup == 9){
drawCItems(entry, n, 108, 114, 120, x, y);
if(n == 120) break;
} else if(currTurnup == 10){
drawCItems(entry, n, 120, 126, 132, x, y);
if(n == 132) break;
} else if(currTurnup == 11){
drawCItems(entry, n, 132, 138, 144, x, y);
if(n == 144) break;
} else if(currTurnup == 12){
drawCItems(entry, n, 144, 150, 156, x, y);
if(n == 156) break;
} else if(currTurnup == 13){
drawCItems(entry, n, 156, 162, 168, x, y);
if(n == 168) break;
} else if(currTurnup == 14){
drawCItems(entry, n, 168, 174, 180, x, y);
if(n == 180) break;
} else if(currTurnup == 15){
drawCItems(entry, n, 180, 186, 192, x, y);
if(n == 192) break;
} else if(currTurnup == 16){
drawCItems(entry, n, 192, 198, 204, x, y);
if(n == 204) break;
} else if(currTurnup == 17){
drawCItems(entry, n, 204, 210, 216, x, y);
if(n == 216) break;
} else if(currTurnup == 18){
drawCItems(entry, n, 216, 222, 228, x, y);
if(n == 228) break;
} else if(currTurnup == 19){
drawCItems(entry, n, 228, 234, 240, x, y);
if(n == 240) break;
}
}
}
if(tooltipStack != null)
{
List<String> tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().player, false);
List<String> parsedTooltip = new ArrayList();
boolean first = true;
for(String s : tooltipData)
{
String s_ = s;
if(!first)
s_ = TextFormatting.GRAY + s;
parsedTooltip.add(s_);
first = false;
}
GuiRenderHelper.renderTooltip(x, y, parsedTooltip);
}
}
private void drawTItems(Entry<ItemStack, ItemStack> entry, int num, int low, int mid, int high, int x, int y){
boolean unicode = fontRendererObj.getUnicodeFlag();
fontRendererObj.setUnicodeFlag(false);
int k = (width - guiWidth) / 2;
byte b0 = 2;
if(num < mid && num > low-1){
renderItem(k + 18, b0 + 28 + (num-low)*20 + num-low, entry.getKey(), x, y);
renderItem(k + 62, b0 + 28 + (num-low)*20 + num-low, entry.getValue(), x, y);
} else if(num > mid-1 && num < high){
renderItem(k + 141, b0 + 28 + (num-mid)*20 + num-mid, entry.getKey(), x, y);
renderItem(k + 185, b0 + 28 + (num-mid)*20 + num-mid, entry.getValue(), x, y);
}
fontRendererObj.setUnicodeFlag(unicode);
}
private void drawCItems(Entry<ItemStack, ItemStack[]> entry, int num, int low, int mid, int high, int x, int y){
boolean unicode = fontRendererObj.getUnicodeFlag();
fontRendererObj.setUnicodeFlag(false);
int k = (width - guiWidth) / 2;
byte b0 = 2;
if(num < mid && num > low-1){
renderItem(k + 18, b0 + 28 + (num-low)*20 + num-low, entry.getKey(), x, y);
renderItem(k + 62, b0 + 28 + (num-low)*20 + num-low, entry.getValue()[0], x, y);
renderItem(k + 62 + 33, b0 + 28 + (num-low)*20 + num-low, entry.getValue()[1], x, y);
} else if(num > mid-1 && num < high){
renderItem(k + 141, b0 + 28 + (num-mid)*20 + num-mid, entry.getKey(), x, y);
renderItem(k + 185, b0 + 28 + (num-mid)*20 + num-mid, entry.getValue()[0], x, y);
renderItem(k + 185 + 34, b0 + 28 + (num-mid)*20 + num-mid, entry.getValue()[1], x, y);
}
fontRendererObj.setUnicodeFlag(unicode);
}
private ItemStack tooltipStack;
public void renderItem(int xPos, int yPos, ItemStack stack, int mx, int my)
{
if(stack == null || stack.isEmpty()) return;
if(stack.getItemDamage() == OreDictionary.WILDCARD_VALUE)
stack.setItemDamage(0);
RenderItem render = Minecraft.getMinecraft().getRenderItem();
if(mx > xPos && mx < xPos+16 && my > yPos && my < yPos+16)
tooltipStack = stack;
GlStateManager.pushMatrix();
GlStateManager.enableBlend();
GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);
RenderHelper.enableGUIStandardItemLighting();
GlStateManager.enableRescaleNormal();
GlStateManager.enableBlend();
render.renderItemAndEffectIntoGUI(stack, xPos, yPos);
render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRendererObj, stack, xPos, yPos, null);
RenderHelper.disableStandardItemLighting();
GlStateManager.popMatrix();
GlStateManager.disableLighting();
}
}