/** * This class was created by <Vazkii>. It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php * * File Created @ [Jun 28, 2015, 1:48:58 AM (GMT)] */ package vazkii.botania.common.lexicon.page; import java.util.ArrayList; import java.util.List; import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; 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 net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import vazkii.botania.api.internal.IGuiLexiconEntry; import vazkii.botania.api.lexicon.LexiconPage; import vazkii.botania.api.lexicon.multiblock.Multiblock; import vazkii.botania.api.lexicon.multiblock.MultiblockSet; import vazkii.botania.client.core.handler.MultiblockRenderHandler; import vazkii.botania.client.lib.LibResources; public class PageMultiblock extends LexiconPage { private static final ResourceLocation multiblockOverlay = new ResourceLocation(LibResources.GUI_MULTIBLOCK_OVERLAY); GuiButton button; final MultiblockSet set; final Multiblock mb; int ticksElapsed; public PageMultiblock(String unlocalizedName, MultiblockSet set) { super(unlocalizedName); mb = set.getForFacing(EnumFacing.SOUTH); this.set = set; } @Override @SideOnly(Side.CLIENT) public void renderScreen(IGuiLexiconEntry gui, int mx, int my) { TextureManager render = Minecraft.getMinecraft().renderEngine; render.bindTexture(multiblockOverlay); GlStateManager.enableBlend(); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GlStateManager.disableAlpha(); GlStateManager.color(1F, 1F, 1F, 1F); ((GuiScreen) gui).drawTexturedModalRect(gui.getLeft(), gui.getTop(), 0, 0, gui.getWidth(), gui.getHeight()); GlStateManager.disableBlend(); GlStateManager.enableAlpha(); final float maxX = 90, maxY = 60; GlStateManager.pushMatrix(); GlStateManager.translate(gui.getLeft() + gui.getWidth() / 2, gui.getTop() + 90, gui.getZLevel() + 100F); float diag = (float) Math.sqrt(mb.getXSize() * mb.getXSize() + mb.getZSize() * mb.getZSize()); float height = mb.getYSize(); float scaleX = maxX / diag; float scaleY = maxY / height; float scale = -Math.min(scaleY, scaleX); GlStateManager.scale(scale, scale, scale); GlStateManager.rotate(-20F, 1, 0, 0); GlStateManager.rotate(gui.getElapsedTicks(), 0, 1, 0); MultiblockRenderHandler.renderMultiblockOnPage(mb); GlStateManager.popMatrix(); FontRenderer font = Minecraft.getMinecraft().fontRendererObj; boolean unicode = font.getUnicodeFlag(); String s = TextFormatting.BOLD + I18n.format(getUnlocalizedName()); font.setUnicodeFlag(true); font.drawString(s, gui.getLeft() + gui.getWidth() / 2 - font.getStringWidth(s) / 2, gui.getTop() + 16, 0x000000); font.setUnicodeFlag(unicode); GlStateManager.enableRescaleNormal(); RenderHelper.enableGUIStandardItemLighting(); int x = gui.getLeft() + 15; int y = gui.getTop() + 25; Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(new ItemStack(Blocks.STONEBRICK), x, y); RenderHelper.disableStandardItemLighting(); GlStateManager.disableRescaleNormal(); GlStateManager.pushMatrix(); GlStateManager.translate(0F, 0F, 200F); if(mx >= x && mx < x + 16 && my >= y && my < y + 16) { List<String> mats = new ArrayList<>(); mats.add(I18n.format("botaniamisc.materialsRequired")); for(ItemStack stack : mb.materials) { String size = "" + stack.getCount(); if(size.length() < 2) size = "0" + size; mats.add(" " + TextFormatting.AQUA + size + " " + TextFormatting.GRAY + stack.getDisplayName()); } vazkii.botania.client.core.helper.RenderHelper.renderTooltip(mx, my, mats); } GlStateManager.popMatrix(); } @Override public void onOpened(IGuiLexiconEntry gui) { button = new GuiButton(101, gui.getLeft() + 30, gui.getTop() + gui.getHeight() - 50, gui.getWidth() - 60, 20, getButtonStr()); gui.getButtonList().add(button); } @SideOnly(Side.CLIENT) private String getButtonStr() { return I18n.format(MultiblockRenderHandler.currentMultiblock == set ? "botaniamisc.unvisualize" : "botaniamisc.visualize"); } @Override public void onClosed(IGuiLexiconEntry gui) { gui.getButtonList().remove(button); } @Override @SideOnly(Side.CLIENT) public void onActionPerformed(IGuiLexiconEntry gui, GuiButton button) { if(button == this.button) { if(MultiblockRenderHandler.currentMultiblock == set) MultiblockRenderHandler.setMultiblock(null); else MultiblockRenderHandler.setMultiblock(set); button.displayString = getButtonStr(); } } @Override @SideOnly(Side.CLIENT) public void updateScreen() { ++ticksElapsed; } }