/******************************************************************************* * 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 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.google.common.collect.Lists; import com.google.common.collect.Maps; import com.shinoow.abyssalcraft.api.APIUtils; import com.shinoow.abyssalcraft.api.ritual.NecronomiconCreationRitual; import com.shinoow.abyssalcraft.api.ritual.NecronomiconRitual; import com.shinoow.abyssalcraft.api.ritual.RitualRegistry; 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; import com.shinoow.abyssalcraft.lib.util.IHiddenRitual; public class GuiNecronomiconRitualEntry extends GuiNecronomicon { private ButtonNextPage buttonNextPage; private ButtonNextPage buttonPreviousPage; private GuiButton buttonDone; private GuiNecronomicon parent; private Map<Integer, String> dimToString = Maps.newHashMap(); /** Used to separate which rituals this entry should display */ private int ritualnum; private List<NecronomiconRitual> rituals = Lists.newArrayList(); public GuiNecronomiconRitualEntry(int bookType, GuiNecronomicon gui, int ritualnum){ super(bookType); parent = gui; isInfo = true; this.ritualnum = ritualnum; } @Override public void initGui(){ initStuff(); 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 + 215, b0 + 154, true)); buttonList.add(buttonPreviousPage = new ButtonNextPage(2, i + 18, b0 + 154, false)); updateButtons(); } private void updateButtons() { buttonNextPage.visible = currTurnup < getTurnupLimit() - 1; buttonPreviousPage.visible = true; buttonDone.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 = false; mc.displayGuiScreen(parent); } else if (currTurnup > 0) --currTurnup; updateButtons(); } @Override protected void drawInformationText(int x, int y){ drawPage(rituals.get(currTurnup), x, y); } private void drawPage(NecronomiconRitual ritual, int x, int y){ int k = (width - guiWidth) / 2; byte b0 = 2; String title = ritual.getLocalizedName(); fontRendererObj.drawSplitString(title, k + 20, b0 + 16, 116, 0xC40000); if(ritual.requiresSacrifice()) fontRendererObj.drawSplitString(localize(NecronomiconText.LABEL_SACRIFICE), k + 138, 164, 107, 0xC40000); writeText(1, localize(NecronomiconText.LABEL_REQUIRED_ENERGY) + ": " + ritual.getReqEnergy() + " PE", 125); writeText(2, localize(NecronomiconText.LABEL_LOCATION) + ": " + getDimension(ritual.getDimension())); writeText(2, ritual.getDescription(), 48); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture(NecronomiconResources.RITUAL); drawTexturedModalRect(k, b0, 0, 0, 256, 256); if(ritual.getSacrifice() != null){ mc.renderEngine.bindTexture(NecronomiconResources.RITUAL_INFUSION); drawTexturedModalRect(k, b0, 0, 0, 256, 256); } if(ritual instanceof NecronomiconCreationRitual){ mc.renderEngine.bindTexture(NecronomiconResources.RITUAL_CREATION); drawTexturedModalRect(k, b0, 0, 0, 256, 256); } tooltipStack = null; ItemStack[] offerings = new ItemStack[8]; if(ritual.getOfferings().length < 8) for(int i = 0; i < ritual.getOfferings().length; i++) offerings[i] = APIUtils.convertToStack(ritual.getOfferings()[i]); else offerings = getStacks(ritual.getOfferings()); //north renderItem(k + 58, b0 + 30, offerings[0], x, y); //north-east renderItem(k + 84, b0 + 40, offerings[1], x, y); //east renderItem(k + 94, b0 + 66, offerings[2], x, y); //south-east renderItem(k + 84, b0 + 92, offerings[3], x, y); //south renderItem(k + 58, b0 + 103, offerings[4], x, y); //south-west renderItem(k + 32, b0 + 92, offerings[5], x, y); //west renderItem(k + 22, b0 + 66, offerings[6], x, y); //north-west renderItem(k + 32, b0 + 40, offerings[7], x, y); //center renderItem(k + 58, b0 + 66, APIUtils.convertToStack(ritual.getSacrifice()), x, y); if(ritual instanceof NecronomiconCreationRitual) renderItem(k + 58, b0 + 139, ((NecronomiconCreationRitual) ritual).getItem(), x, y); 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 ItemStack[] getStacks(Object[] objects){ ItemStack[] stacks = new ItemStack[objects.length]; for(int i = 0; i < objects.length; i++) stacks[i] = APIUtils.convertToStack(objects[i]); return stacks; } private String getDimension(int dim){ if(!dimToString.containsKey(dim)) dimToString.put(dim, "DIM"+dim); return dimToString.get(dim); } 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.enableDepth(); render.renderItemAndEffectIntoGUI(stack, xPos, yPos); render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRendererObj, stack, xPos, yPos, null); RenderHelper.disableStandardItemLighting(); GlStateManager.popMatrix(); GlStateManager.disableLighting(); } private void initStuff(){ dimToString.put(-1, localize(NecronomiconText.LABEL_ANYWHERE)); dimToString.putAll(RitualRegistry.instance().getDimensionNameMappings()); for(NecronomiconRitual ritual : RitualRegistry.instance().getRituals()) if(ritual.getBookType() == ritualnum && !(ritual instanceof IHiddenRitual)) rituals.add(ritual); setTurnupLimit(rituals.size()); } }