You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
13 KiB
Java
285 lines
13 KiB
Java
package com.zivilon.cinder_loe.mixins;
|
|
|
|
import com.zivilon.cinder_loe.CinderLoE;
|
|
import com.zivilon.cinder_loe.CinderLoE_Config;
|
|
import com.zivilon.cinder_loe.client.render.item.RenderHelper;
|
|
import com.zivilon.cinder_loe.util.Utilities;
|
|
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.GL12;
|
|
|
|
import org.spongepowered.asm.mixin.Dynamic;
|
|
import org.spongepowered.asm.mixin.Mixin;
|
|
import org.spongepowered.asm.mixin.Overwrite;
|
|
import org.spongepowered.asm.mixin.Shadow;
|
|
import org.spongepowered.asm.mixin.injection.At;
|
|
import org.spongepowered.asm.mixin.injection.Inject;
|
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.entity.EntityClientPlayerMP;
|
|
import net.minecraft.client.entity.EntityPlayerSP;
|
|
import net.minecraft.client.renderer.ItemRenderer;
|
|
import net.minecraft.client.renderer.OpenGlHelper;
|
|
import net.minecraft.client.renderer.RenderBlocks;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.entity.Render;
|
|
import net.minecraft.client.renderer.entity.RenderItem;
|
|
import net.minecraft.client.renderer.entity.RenderManager;
|
|
import net.minecraft.client.renderer.entity.RenderPlayer;
|
|
import net.minecraft.client.renderer.texture.TextureManager;
|
|
import net.minecraft.client.renderer.texture.TextureMap;
|
|
import net.minecraft.client.renderer.texture.TextureUtil;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.init.Items;
|
|
import net.minecraft.item.EnumAction;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemBlock;
|
|
import net.minecraft.item.ItemCloth;
|
|
import net.minecraft.item.ItemMap;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.IIcon;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.storage.MapData;
|
|
import net.minecraftforge.client.ForgeHooksClient;
|
|
import net.minecraftforge.client.IItemRenderer;
|
|
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
|
|
import net.minecraftforge.client.MinecraftForgeClient;
|
|
|
|
import static net.minecraftforge.client.IItemRenderer.ItemRenderType.*;
|
|
import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.*;
|
|
|
|
@Mixin(ItemRenderer.class)
|
|
public abstract class MixinItemRenderer {
|
|
|
|
@Shadow
|
|
private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png");
|
|
@Shadow
|
|
private ItemStack itemToRender;
|
|
@Shadow
|
|
private float equippedProgress;
|
|
@Shadow
|
|
private float prevEquippedProgress;
|
|
@Shadow
|
|
private RenderBlocks renderBlocksIr;
|
|
@Shadow
|
|
private Minecraft mc;
|
|
|
|
/**
|
|
* Reimplements the default behavior of the renderItem method.
|
|
*
|
|
* @author Shinare
|
|
* @reason Added support for semi-transparent item textures
|
|
* @param p_78443_1_ Don't ask me it's default parameter
|
|
* @param p_78443_2_ Don't ask me it's default parameter
|
|
* @param type Don't ask me it's default parameter
|
|
*/
|
|
@Overwrite(remap = false)
|
|
public void renderItem(EntityLivingBase p_78443_1_, ItemStack p_78443_2_, int p_78443_3_, ItemRenderType type) {
|
|
GL11.glPushMatrix();
|
|
TextureManager texturemanager = this.mc.getTextureManager();
|
|
Item item = p_78443_2_.getItem();
|
|
Block block = Block.getBlockFromItem(item);
|
|
|
|
if (p_78443_2_ != null && block != null && block.getRenderBlockPass() != 0) {
|
|
GL11.glEnable(GL11.GL_BLEND);
|
|
GL11.glEnable(GL11.GL_CULL_FACE);
|
|
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
|
|
}
|
|
IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(p_78443_2_, type);
|
|
if (customRenderer != null) {
|
|
texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber()));
|
|
ForgeHooksClient.renderEquippedItem(type, customRenderer, renderBlocksIr, p_78443_1_, p_78443_2_);
|
|
}
|
|
else
|
|
if (p_78443_2_.getItemSpriteNumber() == 0 && item instanceof ItemBlock && RenderBlocks.renderItemIn3d(block.getRenderType())) {
|
|
texturemanager.bindTexture(texturemanager.getResourceLocation(0));
|
|
|
|
if (p_78443_2_ != null && block != null && block.getRenderBlockPass() != 0) {
|
|
GL11.glDepthMask(false);
|
|
this.renderBlocksIr.renderBlockAsItem(block, p_78443_2_.getItemDamage(), 1.0F);
|
|
GL11.glDepthMask(true);
|
|
}
|
|
else {
|
|
this.renderBlocksIr.renderBlockAsItem(block, p_78443_2_.getItemDamage(), 1.0F);
|
|
}
|
|
}
|
|
else {
|
|
IIcon iicon = p_78443_1_.getItemIcon(p_78443_2_, p_78443_3_);
|
|
|
|
if (iicon == null) {
|
|
GL11.glPopMatrix();
|
|
return;
|
|
}
|
|
|
|
texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber()));
|
|
TextureUtil.func_152777_a(false, false, 1.0F);
|
|
Tessellator tessellator = Tessellator.instance;
|
|
float f = iicon.getMinU();
|
|
float f1 = iicon.getMaxU();
|
|
float f2 = iicon.getMinV();
|
|
float f3 = iicon.getMaxV();
|
|
float f4 = 0.0F;
|
|
float f5 = 0.3F;
|
|
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
|
|
GL11.glTranslatef(-f4, -f5, 0.0F);
|
|
float f6 = 1.5F;
|
|
GL11.glScalef(f6, f6, f6);
|
|
GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
|
|
GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
|
|
GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F);
|
|
|
|
RenderHelper.customRenderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F, false);
|
|
|
|
if (p_78443_2_.hasEffect(p_78443_3_)) {
|
|
GL11.glDepthFunc(GL11.GL_EQUAL);
|
|
GL11.glDisable(GL11.GL_LIGHTING);
|
|
texturemanager.bindTexture(RES_ITEM_GLINT);
|
|
GL11.glEnable(GL11.GL_BLEND);
|
|
OpenGlHelper.glBlendFunc(768, 1, 1, 0);
|
|
GL11.glColor4f(CinderLoE_Config.enchantment_color_red, CinderLoE_Config.enchantment_color_green, CinderLoE_Config.enchantment_color_blue, 1.0F);
|
|
GL11.glMatrixMode(GL11.GL_TEXTURE);
|
|
GL11.glPushMatrix();
|
|
float f8 = 0.125F;
|
|
GL11.glScalef(f8, f8, f8);
|
|
float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F;
|
|
GL11.glTranslatef(f9, 0.0F, 0.0F);
|
|
GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F);
|
|
|
|
RenderHelper.customRenderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F, true);
|
|
|
|
|
|
GL11.glPopMatrix();
|
|
GL11.glPushMatrix();
|
|
GL11.glScalef(f8, f8, f8);
|
|
f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F;
|
|
GL11.glTranslatef(-f9, 0.0F, 0.0F);
|
|
GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F);
|
|
|
|
RenderHelper.customRenderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F, true);
|
|
|
|
GL11.glPopMatrix();
|
|
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
|
GL11.glDisable(GL11.GL_BLEND);
|
|
GL11.glEnable(GL11.GL_LIGHTING);
|
|
GL11.glDepthFunc(GL11.GL_LEQUAL);
|
|
}
|
|
|
|
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
|
|
texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber()));
|
|
TextureUtil.func_147945_b();
|
|
}
|
|
|
|
if (p_78443_2_ != null && block != null && block.getRenderBlockPass() != 0) {
|
|
GL11.glDisable(GL11.GL_BLEND);
|
|
}
|
|
|
|
GL11.glPopMatrix();
|
|
}
|
|
|
|
private void customRenderItemIn2D(Tessellator p_78439_0_, float p_78439_1_, float p_78439_2_, float p_78439_3_, float p_78439_4_, int p_78439_5_, int p_78439_6_, float p_78439_7_, boolean enchant) {
|
|
if (!enchant) GL11.glPushMatrix(); // Save the current OpenGL state
|
|
if (!enchant) GL11.glEnable(GL11.GL_BLEND); // Enable blending
|
|
if (!enchant) OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); // Apply your custom blend function for semi-transparency
|
|
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(0.0F, 0.0F, 1.0F);
|
|
p_78439_0_.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)p_78439_1_, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV(1.0D, 0.0D, 0.0D, (double)p_78439_3_, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV(1.0D, 1.0D, 0.0D, (double)p_78439_3_, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)p_78439_1_, (double)p_78439_2_);
|
|
p_78439_0_.draw();
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(0.0F, 0.0F, -1.0F);
|
|
p_78439_0_.addVertexWithUV(0.0D, 1.0D, (double)(0.0F - p_78439_7_), (double)p_78439_1_, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV(1.0D, 1.0D, (double)(0.0F - p_78439_7_), (double)p_78439_3_, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV(1.0D, 0.0D, (double)(0.0F - p_78439_7_), (double)p_78439_3_, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV(0.0D, 0.0D, (double)(0.0F - p_78439_7_), (double)p_78439_1_, (double)p_78439_4_);
|
|
p_78439_0_.draw();
|
|
|
|
|
|
float f5 = 0.5F * (p_78439_1_ - p_78439_3_) / (float)p_78439_5_;
|
|
float f6 = 0.5F * (p_78439_4_ - p_78439_2_) / (float)p_78439_6_;
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(-1.0F, 0.0F, 0.0F);
|
|
int k;
|
|
float f7;
|
|
float f8;
|
|
|
|
for (k = 0; k < p_78439_5_; ++k) {
|
|
f7 = (float)k / (float)p_78439_5_;
|
|
f8 = p_78439_1_ + (p_78439_3_ - p_78439_1_) * f7 - f5;
|
|
p_78439_0_.addVertexWithUV((double)f7, 0.0D, (double)(0.0F - p_78439_7_), (double)f8, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV((double)f7, 0.0D, 0.0D, (double)f8, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV((double)f7, 1.0D, 0.0D, (double)f8, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV((double)f7, 1.0D, (double)(0.0F - p_78439_7_), (double)f8, (double)p_78439_2_);
|
|
}
|
|
|
|
p_78439_0_.draw();
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(1.0F, 0.0F, 0.0F);
|
|
float f9;
|
|
|
|
for (k = 0; k < p_78439_5_; ++k) {
|
|
f7 = (float)k / (float)p_78439_5_;
|
|
f8 = p_78439_1_ + (p_78439_3_ - p_78439_1_) * f7 - f5;
|
|
f9 = f7 + 1.0F / (float)p_78439_5_;
|
|
p_78439_0_.addVertexWithUV((double)f9, 1.0D, (double)(0.0F - p_78439_7_), (double)f8, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV((double)f9, 1.0D, 0.0D, (double)f8, (double)p_78439_2_);
|
|
p_78439_0_.addVertexWithUV((double)f9, 0.0D, 0.0D, (double)f8, (double)p_78439_4_);
|
|
p_78439_0_.addVertexWithUV((double)f9, 0.0D, (double)(0.0F - p_78439_7_), (double)f8, (double)p_78439_4_);
|
|
}
|
|
|
|
p_78439_0_.draw();
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(0.0F, 1.0F, 0.0F);
|
|
|
|
for (k = 0; k < p_78439_6_; ++k) {
|
|
f7 = (float)k / (float)p_78439_6_;
|
|
f8 = p_78439_4_ + (p_78439_2_ - p_78439_4_) * f7 - f6;
|
|
f9 = f7 + 1.0F / (float)p_78439_6_;
|
|
p_78439_0_.addVertexWithUV(0.0D, (double)f9, 0.0D, (double)p_78439_1_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(1.0D, (double)f9, 0.0D, (double)p_78439_3_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(1.0D, (double)f9, (double)(0.0F - p_78439_7_), (double)p_78439_3_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(0.0D, (double)f9, (double)(0.0F - p_78439_7_), (double)p_78439_1_, (double)f8);
|
|
}
|
|
|
|
p_78439_0_.draw();
|
|
p_78439_0_.startDrawingQuads();
|
|
p_78439_0_.setNormal(0.0F, -1.0F, 0.0F);
|
|
|
|
for (k = 0; k < p_78439_6_; ++k) {
|
|
f7 = (float)k / (float)p_78439_6_;
|
|
f8 = p_78439_4_ + (p_78439_2_ - p_78439_4_) * f7 - f6;
|
|
p_78439_0_.addVertexWithUV(1.0D, (double)f7, 0.0D, (double)p_78439_3_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(0.0D, (double)f7, 0.0D, (double)p_78439_1_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(0.0D, (double)f7, (double)(0.0F - p_78439_7_), (double)p_78439_1_, (double)f8);
|
|
p_78439_0_.addVertexWithUV(1.0D, (double)f7, (double)(0.0F - p_78439_7_), (double)p_78439_3_, (double)f8);
|
|
}
|
|
|
|
p_78439_0_.draw();
|
|
if (!enchant) GL11.glPopMatrix(); // Restore the saved OpenGL state
|
|
}
|
|
|
|
/**
|
|
* @author Shinare
|
|
* @reason Failsafe in case some @Redirect fails
|
|
*/
|
|
@Overwrite
|
|
public static void renderItemIn2D(Tessellator p_78439_0_, float p_78439_1_, float p_78439_2_, float p_78439_3_, float p_78439_4_, int p_78439_5_, int p_78439_6_, float p_78439_7_) {
|
|
// Redirect to new custom renderer. This should not be necessary but works as failsafe
|
|
RenderHelper.customRenderItemIn2D(p_78439_0_, p_78439_1_, p_78439_2_, p_78439_3_, p_78439_4_, p_78439_5_, p_78439_6_, p_78439_7_, false);
|
|
}
|
|
}
|