package minefantasy.mf2.client.render;
import minefantasy.mf2.api.archery.AmmoMechanicsMF;
import minefantasy.mf2.api.helpers.TextureHelperMF;
import minefantasy.mf2.item.archery.ItemBowMF;
import mods.battlegear2.api.quiver.IArrowContainer2;
import mods.battlegear2.api.quiver.QuiverArrowRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.client.FMLClientHandler;
public class RenderBow implements IItemRenderer
{
private boolean isLongbow;
public RenderBow(boolean big)
{
isLongbow = big;
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type)
{
return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return false;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data)
{
if(data.length <2 || !(data[1] instanceof EntityLivingBase))
{
renderEquippedBow(item, (EntityLivingBase) null, false);
}
else
{
switch (type)
{
case EQUIPPED_FIRST_PERSON:
renderEquippedBow(item, (EntityLivingBase) data[1], true);
break;
case EQUIPPED:
renderEquippedBow(item, (EntityLivingBase) data[1], false);
break;
default:
break;
}
}
}
private void renderEquippedBow(ItemStack item, EntityLivingBase entityLivingBase, boolean firstPerson)
{
GL11.glPushMatrix();
if(firstPerson)
{
GL11.glTranslatef(0.1F, -0.1F, 0F);
}
else
{
GL11.glTranslatef(0.2F, -0.25F, 0F);
}
ItemBowMF bow = null;
if(item != null && item.getItem() instanceof ItemBowMF)
{
bow = (ItemBowMF)item.getItem();
}
ItemStack arrowStack = AmmoMechanicsMF.getArrowOnBow(item);
int drawAmount = -2;
if(entityLivingBase != null && entityLivingBase instanceof EntityPlayer)
{
EntityPlayer player = (EntityPlayer)entityLivingBase;
int timer = player.getItemInUseDuration();
if(bow != null)
{
drawAmount = bow.getDrawAmount(timer);
//arrowStack = bow.getArrow(item);
}
else
{
if (timer >= 18)
drawAmount = 2;
else if (timer > 13)
drawAmount = 1;
else if (timer > 0)
drawAmount = 0;
}
ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase);
if(quiver != null){
arrowStack = ((IArrowContainer2)quiver.getItem()).getStackInSlot(quiver, ((IArrowContainer2)quiver.getItem()).getSelectedSlot(quiver));
}
if(timer == 0)
{
arrowStack = null;
}
}
else
{
drawAmount = 2;
}
Tessellator tessellator = Tessellator.instance;
GL11.glPushMatrix();
if(isLongbow)
{
GL11.glTranslatef(-1/3F, -1/3F, 0F);
GL11.glScalef(1.5F, 1.5F, 1.0F);
if(entityLivingBase == null)
{
GL11.glTranslatef((0F/16F), -(4F/16F), 0F);
}
}
for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++)
{
IIcon icon = item.getItem().getIcon(item, layer);
if(bow != null)
{
icon = bow.getIcon(item, layer, drawAmount);
}
GL11.glPushMatrix();
int colour = item.getItem().getColorFromItemStack(item, layer);
float red = (float)(colour >> 16 & 255) / 255.0F;
float green = (float)(colour >> 8 & 255) / 255.0F;
float blue = (float)(colour & 255) / 255.0F;
GL11.glColor4f(red, green, blue, 1.0F);
ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
GL11.glColor3f(1F, 1F, 1F);
GL11.glPopMatrix();
}
GL11.glPopMatrix();
if(arrowStack == null && drawAmount > -2)
{
arrowStack = new ItemStack(Items.arrow);
}
if(arrowStack != null && entityLivingBase != null)
{
int x = -3;
int y = -20;
if(isLongbow)
{
x += 1;
y += 1;
}
for(int layer = 0; layer < arrowStack.getItem().getRenderPasses(arrowStack.getItemDamage()); layer++)
{
IIcon icon = arrowStack.getItem().getIcon(arrowStack, layer);
GL11.glPushMatrix();
int colour = arrowStack.getItem().getColorFromItemStack(arrowStack, layer);
float red = (float)(colour >> 16 & 255) / 255.0F;
float green = (float)(colour >> 8 & 255) / 255.0F;
float blue = (float)(colour & 255) / 255.0F;
GL11.glColor4f(red, green, blue, 1.0F);
GL11.glTranslatef(-(x+drawAmount)/16F, -(y+drawAmount)/16F, firstPerson?-0.5F/16F:0.5F/16F);
GL11.glRotatef(-90, 0, 0, 1);
ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
GL11.glColor3f(1F, 1F, 1F);
GL11.glPopMatrix();
}
}
if(item.isItemEnchanted())
{
renderEnchantmentEffects(tessellator);
}
GL11.glPopMatrix();
}
public static void renderEnchantmentEffects(Tessellator tessellator)
{
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glDisable(GL11.GL_LIGHTING);
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
float f7 = 0.76F;
GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F);
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glPushMatrix();
float f8 = 0.125F;
GL11.glScalef(f8, f8, f8);
float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F;
GL11.glTranslatef(f9, 0.0F, 0.0F);
GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F);
ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glScalef(f8, f8, f8);
f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F;
GL11.glTranslatef(-f9, 0.0F, 0.0F);
GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F);
ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F);
GL11.glPopMatrix();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDepthFunc(GL11.GL_LEQUAL);
}
}