package com.insane.illuminatedbows.client; import static org.lwjgl.opengl.GL11.*; import java.lang.reflect.Field; import java.util.Random; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.Timer; import net.minecraftforge.client.IItemRenderer; import thaumcraft.api.wands.ItemFocusBasic; import thaumcraft.common.items.wands.ItemWandCasting; import com.insane.illuminatedbows.addons.thaumcraft.items.ItemFocusIlluminating; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.relauncher.ReflectionHelper; public class RenderWandHandler implements IItemRenderer { private IItemRenderer wandRenderer; private static final Random rand = new Random(); private int rot; private static final Field timer = ReflectionHelper.findField(Minecraft.class, "timer", "Q", "field_71428_T"); public RenderWandHandler(IItemRenderer wandRenderer) { this.wandRenderer = wandRenderer; } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return wandRenderer.shouldUseRenderHelper(type, item, helper); } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { wandRenderer.renderItem(type, item, data); ItemWandCasting wand = (ItemWandCasting) item.getItem(); ItemStack focusStack = wand.getFocusItem(item); if (focusStack == null) return; ItemFocusBasic focus = (ItemFocusBasic) wand.getFocusItem(item).getItem(); if (focus instanceof ItemFocusIlluminating && (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON)) { Tessellator tessellator = Tessellator.instance; float partialTicks = 0; try { partialTicks = ((Timer)timer.get(Minecraft.getMinecraft())).renderPartialTicks; } catch (Exception e) { e.printStackTrace(); } glPushMatrix(); EntityLivingBase entity = (EntityLivingBase) data[1]; if ((entity != null) && ((entity instanceof EntityPlayer)) && (((EntityPlayer)entity).getItemInUse() != null)) { float t = ((EntityPlayer)entity).getItemInUseDuration() + partialTicks; if (t > 3.0F) { t = 3.0F; } glTranslated(0.0D, 1.0D, 0.0D); if (type != IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) { glRotatef(33.0F, 0.0F, 0.0F, 1.0F); } else { glRotatef(10.0F, 1.0F, 0.0F, 0.0F); glRotatef(10.0F, 0.0F, 0.0F, 1.0F); } glRotatef(60.0F * (t / 3.0F), -1.0F, 0.0F, 0.0F); if ((wand.animation == ItemFocusBasic.WandFocusAnimation.WAVE) || ((wand.getFocus(item) != null) && (wand.getFocus(item).getAnimation(item) == ItemFocusBasic.WandFocusAnimation.WAVE))) { float wave = MathHelper.sin((((EntityPlayer)entity).getItemInUseDuration() + partialTicks) / 10.0F) * 10.0F; glRotatef(wave, 0.0F, 0.0F, 1.0F); wave = MathHelper.sin((((EntityPlayer)entity).getItemInUseDuration() + partialTicks) / 15.0F) * 10.0F; glRotatef(wave, 1.0F, 0.0F, 0.0F); } else if ((wand.getFocus(item) != null) && (wand.getFocus(item).getAnimation(item) == ItemFocusBasic.WandFocusAnimation.CHARGE)) { float wave = MathHelper.sin((((EntityPlayer)entity).getItemInUseDuration() + partialTicks) / 0.8F) * 1.0F; glRotatef(wave, 0.0F, 0.0F, 1.0F); wave = MathHelper.sin((((EntityPlayer)entity).getItemInUseDuration() + partialTicks) / 0.7F) * 1.0F; glRotatef(wave, 1.0F, 0.0F, 0.0F); } glTranslated(0.0D, -1.0D, 0.0D); if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { glTranslatef(0.75f, 1.5f, -0.3f); } else { glTranslatef(0.6f, 1.2f, -0.6f); } } else { glTranslatef(0.5f, 1.6f, 0.5f); } RenderHelper.disableStandardItemLighting(); glDisable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glEnable(GL_BLEND); OpenGlHelper.glBlendFunc(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE); glDisable(GL_ALPHA_TEST); glEnable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDepthMask(false); rand.setSeed(298347L); for (int i = 0; i < 15; i++) { glRotatef(rand.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F); glRotatef(rand.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F); glRotatef(rand.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F); glRotatef(rand.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F); glRotatef((rand.nextFloat() * 0.25f * rot) % 360, 0, 1, 0); tessellator.startDrawingQuads(); tessellator.setBrightness(0xFF); tessellator.setColorRGBA(255, 255, 100, 255); tessellator.addVertex(0, 0f, 0); tessellator.addVertex(0, 0f, 0); tessellator.setColorRGBA(255, 255, 100, 0); tessellator.addVertex(0.4f, 0.25f, 0.4f); tessellator.addVertex(0.4f, 0.55f, 0.4f); tessellator.draw(); } glDisable(GL_BLEND); glShadeModel(GL_FLAT); glColor4f(1.0F, 1.0F, 1.0F, 1.0F); glEnable(GL_TEXTURE_2D); glEnable(GL_ALPHA_TEST); glEnable(GL_LIGHTING); RenderHelper.enableStandardItemLighting(); glPopMatrix(); } } @SubscribeEvent public void onClientTick(ClientTickEvent event) { rot++; } }