package vazkii.botania.client.core.handler; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.model.ModelBook; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHandSide; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderSpecificHandEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import vazkii.botania.client.gui.lexicon.GuiLexicon; import vazkii.botania.client.lib.LibResources; import vazkii.botania.common.Botania; import vazkii.botania.common.core.handler.ConfigHandler; import vazkii.botania.common.item.ItemLexicon; import vazkii.botania.common.item.ModItems; import vazkii.botania.common.lexicon.page.PageText; // Hacky way to render 3D lexicon, will be reevaluated in the future. public class RenderLexicon { private final ModelBook model = new ModelBook(); private final ResourceLocation texture = new ResourceLocation(LibResources.MODEL_LEXICA); private final String[] QUOTES = new String[] { "\"Neat!\" - Direwolf20", "\"It's pretty ledge.\" - Haighyorkie", "\"I don't really like it.\" - CrustyMustard", "\"It's a very thinky mod.\" - AdamG3691", "\"You must craft the tiny potato.\" - TheFractangle", "\"Vazkii did a thing.\" - cpw" }; int quote = -1; @SubscribeEvent public void renderItem(RenderSpecificHandEvent evt) { Minecraft mc = Minecraft.getMinecraft(); if(!ConfigHandler.lexicon3dModel || mc.gameSettings.thirdPersonView != 0 || mc.player.getHeldItem(evt.getHand()).isEmpty() || mc.player.getHeldItem(evt.getHand()).getItem() != ModItems.lexicon) return; evt.setCanceled(true); try { renderItemInFirstPerson(mc.player, evt.getPartialTicks(), evt.getInterpolatedPitch(), evt.getHand(), evt.getSwingProgress(), evt.getItemStack(), evt.getEquipProgress()); } catch (Throwable throwable) { Botania.LOGGER.warn("Failed to render lexicon"); } } private void renderItemInFirstPerson(AbstractClientPlayer player, float partialTicks, float interpPitch, EnumHand hand, float swingProgress, ItemStack stack, float equipProgress) throws Throwable { // Cherry picked from ItemRenderer.renderItemInFirstPerson boolean flag = hand == EnumHand.MAIN_HAND; EnumHandSide enumhandside = flag ? player.getPrimaryHand() : player.getPrimaryHand().opposite(); GlStateManager.pushMatrix(); boolean flag1 = enumhandside == EnumHandSide.RIGHT; float f = -0.4F * MathHelper.sin(MathHelper.sqrt(swingProgress) * (float)Math.PI); float f1 = 0.2F * MathHelper.sin(MathHelper.sqrt(swingProgress) * ((float)Math.PI * 2F)); float f2 = -0.2F * MathHelper.sin(swingProgress * (float)Math.PI); int i = flag1 ? 1 : -1; GlStateManager.translate(i * f, f1, f2); transformSideFirstPerson(enumhandside, equipProgress); transformFirstPerson(enumhandside, swingProgress); doRender(enumhandside, partialTicks, stack); GlStateManager.popMatrix(); } private void doRender(EnumHandSide side, float partialTicks, ItemStack stack) { Minecraft mc = Minecraft.getMinecraft(); GlStateManager.pushMatrix(); mc.renderEngine.bindTexture(texture); float opening; float pageFlip; float ticks = ClientTickHandler.ticksWithLexicaOpen; if(ticks > 0 && ticks < 10) { if(Minecraft.getMinecraft().currentScreen instanceof GuiLexicon) ticks += partialTicks; else ticks -= partialTicks; } GlStateManager.translate(0.3F + 0.02F * ticks, 0.475F + 0.01F * ticks, -0.2F - 0.01F * ticks); GlStateManager.rotate(87.5F + ticks * (side == EnumHandSide.RIGHT ? 5 : 10), 0F, 1F, 0F); GlStateManager.rotate(ticks * 2.85F, 0F, 0F, 1F); opening = ticks / 12F; float pageFlipTicks = ClientTickHandler.pageFlipTicks; if(pageFlipTicks > 0) pageFlipTicks -= ClientTickHandler.partialTicks; pageFlip = pageFlipTicks / 5F; model.render(null, 0F, 0F, pageFlip, opening, 0F, 1F / 16F); if(ticks < 3) { FontRenderer font = Minecraft.getMinecraft().fontRendererObj; GlStateManager.rotate(180F, 0F, 0F, 1F); GlStateManager.translate(-0.3F, -0.21F, -0.07F); GlStateManager.scale(0.0035F, 0.0035F, -0.0035F); String title = ItemLexicon.getTitle(stack); font.drawString(font.trimStringToWidth(title, 80), 0, 0, 0xD69700); GlStateManager.translate(0F, 10F, 0F); GlStateManager.scale(0.6F, 0.6F, 0.6F); font.drawString(TextFormatting.ITALIC + "" + TextFormatting.BOLD + I18n.format("botaniamisc.edition", ItemLexicon.getEdition()), 0, 0, 0xA07100); if(quote == -1) quote = mc.world.rand.nextInt(QUOTES.length); String quoteStr = QUOTES[quote]; GlStateManager.translate(-5F, 3F, 0F); PageText.renderText(0, 0, 140, 100, 0, false, 0x79ff92, quoteStr); GlStateManager.color(1F, 1F, 1F); GlStateManager.translate(2F, 98F, 0F); font.drawString(I18n.format("botaniamisc.lexiconcover0"), 0, 0, 0x79ff92); GlStateManager.translate(0F, 10F, 0F); font.drawString(TextFormatting.UNDERLINE + "" + TextFormatting.ITALIC + I18n.format("botaniamisc.lexiconcover1"), 0, 0, 0x79ff92); GlStateManager.translate(0F, -30F, 0F); String authorTitle = I18n.format("botaniamisc.lexiconcover2"); int len = font.getStringWidth(authorTitle); font.drawString(authorTitle, 62 - len / 2, 0, 0xD69700); } GlStateManager.popMatrix(); } // Copy - ItemRenderer.transformSideFirstPerson // Arg - Side, EquipProgress private void transformSideFirstPerson(EnumHandSide p_187459_1_, float p_187459_2_) { int i = p_187459_1_ == EnumHandSide.RIGHT ? 1 : -1; GlStateManager.translate(i * 0.56F, -0.52F + p_187459_2_ * -0.6F, -0.72F); } // Copy with modification - ItemRenderer.transformFirstPerson // Arg - Side, SwingProgress private void transformFirstPerson(EnumHandSide p_187453_1_, float p_187453_2_) { int i = p_187453_1_ == EnumHandSide.RIGHT ? 1 : -1; // Botania - added GlStateManager.translate(p_187453_1_ == EnumHandSide.RIGHT ? 0.5F : 0.3F, -0.25F, 0.2F); GlStateManager.rotate(90F, 0F, 1F, 0F); GlStateManager.rotate(12F, 0F, 0F, -1F); // End add float f = MathHelper.sin(p_187453_2_ * p_187453_2_ * (float)Math.PI); GlStateManager.rotate(i * (45.0F + f * -20.0F), 0.0F, 1.0F, 0.0F); float f1 = MathHelper.sin(MathHelper.sqrt(p_187453_2_) * (float)Math.PI); GlStateManager.rotate(i * f1 * -20.0F, 0.0F, 0.0F, 1.0F); GlStateManager.rotate(f1 * -80.0F, 1.0F, 0.0F, 0.0F); GlStateManager.rotate(i * -45.0F, 0.0F, 1.0F, 0.0F); } }