From bd779b9660417e526690e1485f92670d80445778 Mon Sep 17 00:00:00 2001 From: Lizbeth Rika Date: Sat, 28 Feb 2015 16:19:50 +0000 Subject: [PATCH] Proper bow render. Closes #604. --- .../client/core/proxy/ClientProxy.java | 4 + .../botania/client/render/item/RenderBow.java | 97 +++++++++++++++++++ .../render/item/RenderTransparentItem.java | 2 +- .../equipment/tool/bow/ItemLivingwoodBow.java | 1 + .../botania/common/lib/LibObfuscation.java | 1 + 5 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/vazkii/botania/client/render/item/RenderBow.java diff --git a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java index cd3593235..12ea5a7b8 100644 --- a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java +++ b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java @@ -64,6 +64,7 @@ import vazkii.botania.client.render.entity.RenderCorporeaSpark; import vazkii.botania.client.render.entity.RenderDoppleganger; import vazkii.botania.client.render.entity.RenderPixie; import vazkii.botania.client.render.entity.RenderSpark; +import vazkii.botania.client.render.item.RenderBow; import vazkii.botania.client.render.item.RenderFloatingFlowerItem; import vazkii.botania.client.render.item.RenderLens; import vazkii.botania.client.render.item.RenderLexicon; @@ -179,6 +180,7 @@ public class ClientProxy extends CommonProxy { RenderTransparentItem renderTransparentItem = new RenderTransparentItem(); RenderFloatingFlowerItem renderFloatingFlower = new RenderFloatingFlowerItem(); + RenderBow renderBow = new RenderBow(); MinecraftForgeClient.registerItemRenderer(ModItems.lens, new RenderLens()); if(ConfigHandler.lexicon3dModel) @@ -187,6 +189,8 @@ public class ClientProxy extends CommonProxy { MinecraftForgeClient.registerItemRenderer(ModItems.spark, renderTransparentItem); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.floatingFlower), renderFloatingFlower); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.floatingSpecialFlower), renderFloatingFlower); + MinecraftForgeClient.registerItemRenderer(ModItems.livingwoodBow, renderBow); + MinecraftForgeClient.registerItemRenderer(ModItems.crystalBow, renderBow); RenderTileFloatingFlower renderTileFloatingFlower = new RenderTileFloatingFlower(); ClientRegistry.bindTileEntitySpecialRenderer(TileAltar.class, new RenderTileAltar()); diff --git a/src/main/java/vazkii/botania/client/render/item/RenderBow.java b/src/main/java/vazkii/botania/client/render/item/RenderBow.java new file mode 100644 index 000000000..1730cf671 --- /dev/null +++ b/src/main/java/vazkii/botania/client/render/item/RenderBow.java @@ -0,0 +1,97 @@ +/** + * This class was created by . 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 @ [Feb 28, 2015, 3:43:09 PM (GMT)] + */ +package vazkii.botania.client.render.item; + +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import vazkii.botania.common.core.helper.ObfuscationHelper; +import vazkii.botania.common.lib.LibObfuscation; + +public class RenderBow implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type != ItemRenderType.INVENTORY; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch(type) { + case ENTITY : { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, 0F, 0F); + if(item.isOnItemFrame()) + GL11.glTranslatef(0F, -0.3F, 0.01F); + render(item, null, false); + GL11.glPopMatrix(); + break; + } + case EQUIPPED : { + render(item, data[1] instanceof EntityPlayer ? (EntityPlayer) data[1] : null, true); + break; + } + case EQUIPPED_FIRST_PERSON : { + render(item, data[1] instanceof EntityPlayer ? (EntityPlayer) data[1] : null, false); + break; + } + default : break; + } + } + + public void render(ItemStack item, EntityPlayer player, boolean transform) { + int dmg = item.getItemDamage(); + IIcon icon = item.getItem().getIconFromDamageForRenderPass(dmg, 0); + if(player != null) { + ItemStack using = ReflectionHelper.getPrivateValue(EntityPlayer.class, player, LibObfuscation.ITEM_IN_USE); + int time = ReflectionHelper.getPrivateValue(EntityPlayer.class, player, LibObfuscation.ITEM_IN_USE_COUNT); + icon = item.getItem().getIcon(item, 0, player, using, time); + if(transform) { + GL11.glTranslatef(0.2F, -0.3F, 0.1F); + //GL11.glRotatef(20.0F, 0.0F, 1.0F, 0.0F); + //GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + } + } + + float f = icon.getMinU(); + float f1 = icon.getMaxU(); + float f2 = icon.getMinV(); + float f3 = icon.getMaxV(); + float scale = 1F / 16F; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + ItemRenderer.renderItemIn2D(Tessellator.instance, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), scale); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + + GL11.glColor4f(1F, 1F, 1F, 1F); + } + + +} diff --git a/src/main/java/vazkii/botania/client/render/item/RenderTransparentItem.java b/src/main/java/vazkii/botania/client/render/item/RenderTransparentItem.java index d5d1dbc29..72b6bc127 100644 --- a/src/main/java/vazkii/botania/client/render/item/RenderTransparentItem.java +++ b/src/main/java/vazkii/botania/client/render/item/RenderTransparentItem.java @@ -54,7 +54,7 @@ public class RenderTransparentItem implements IItemRenderer { } } - public static void render(ItemStack item) { + public void render(ItemStack item) { int dmg = item.getItemDamage(); IIcon icon = item.getItem().getIconFromDamageForRenderPass(dmg, 0); float f = icon.getMinU(); diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/bow/ItemLivingwoodBow.java b/src/main/java/vazkii/botania/common/item/equipment/tool/bow/ItemLivingwoodBow.java index fe354549a..f9a863c9f 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/bow/ItemLivingwoodBow.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/bow/ItemLivingwoodBow.java @@ -51,6 +51,7 @@ public class ItemLivingwoodBow extends ItemBow implements IManaUsingItem { setCreativeTab(BotaniaCreativeTab.INSTANCE); setUnlocalizedName(name); setMaxDamage(500); + setFull3D(); } @Override diff --git a/src/main/java/vazkii/botania/common/lib/LibObfuscation.java b/src/main/java/vazkii/botania/common/lib/LibObfuscation.java index 7e0c042f7..633407343 100644 --- a/src/main/java/vazkii/botania/common/lib/LibObfuscation.java +++ b/src/main/java/vazkii/botania/common/lib/LibObfuscation.java @@ -43,6 +43,7 @@ public final class LibObfuscation { // EntityPlayer public static final String[] ITEM_IN_USE = new String[] { "itemInUse", "field_71074_e", "f" }; + public static final String[] ITEM_IN_USE_COUNT = new String[] { "itemInUseCount", "field_71072_f", "g" }; // Potion public static final String[] IS_BAD_EFFECT = new String[] { "isBadEffect", "field_76418_K", "J" };