Made helper hooks for EntityLiving and EntityRenderer hooks for Optifine

This commit is contained in:
LexManos 2012-08-22 18:02:14 -07:00
parent 0680e211fc
commit 0b1997a9e6
4 changed files with 154 additions and 76 deletions

View File

@ -11,14 +11,20 @@ import net.minecraft.client.Minecraft;
import net.minecraft.src.Block; import net.minecraft.src.Block;
import net.minecraft.src.EntityItem; import net.minecraft.src.EntityItem;
import net.minecraft.src.EntityLiving; import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.Item; import net.minecraft.src.Item;
import net.minecraft.src.ItemBlock; import net.minecraft.src.ItemBlock;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import net.minecraft.src.MathHelper;
import net.minecraft.src.ModLoader; import net.minecraft.src.ModLoader;
import net.minecraft.src.MovingObjectPosition;
import net.minecraft.src.RenderBlocks; import net.minecraft.src.RenderBlocks;
import net.minecraft.src.RenderEngine; import net.minecraft.src.RenderEngine;
import net.minecraft.src.RenderGlobal;
import net.minecraft.src.Tessellator; import net.minecraft.src.Tessellator;
import net.minecraft.src.TexturePackBase; import net.minecraft.src.TexturePackBase;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.client.event.TextureLoadEvent; import net.minecraftforge.client.event.TextureLoadEvent;
import net.minecraftforge.common.IArmorTextureProvider; import net.minecraftforge.common.IArmorTextureProvider;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
@ -215,39 +221,9 @@ public class ForgeHooksClient
return _default; return _default;
} }
/**
* This is added for Optifine's convenience. And to explode if a ModMaker is developing.
* @param texture
*/
public static void onTextureLoadPre(String texture)
{
if (Tessellator.renderingWorldRenderer)
{
String msg = String.format("Warning: Texture %s not preloaded, will cause render glitches!", texture);
System.out.println(msg);
if (Tessellator.class.getPackage() != null)
{
if (Tessellator.class.getPackage().equals("net.minecraft.src"))
{
Minecraft mc = ModLoader.getMinecraftInstance();
if (mc.ingameGUI != null)
{
mc.ingameGUI.getChatGUI().printChatMessage(msg);
}
}
}
}
}
public static void onTextureLoad(String texture, TexturePackBase pack)
{
MinecraftForge.EVENT_BUS.post(new TextureLoadEvent(texture, pack));
}
public static boolean renderEntityItem(EntityItem entity, ItemStack item, float bobing, float rotation, Random random, RenderEngine engine, RenderBlocks renderBlocks) public static boolean renderEntityItem(EntityItem entity, ItemStack item, float bobing, float rotation, Random random, RenderEngine engine, RenderBlocks renderBlocks)
{ {
IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(item, ENTITY); IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(item, ENTITY);
if (customRenderer == null) if (customRenderer == null)
{ {
return false; return false;
@ -262,7 +238,7 @@ public class ForgeHooksClient
GL11.glTranslatef(0.0F, -bobing, 0.0F); GL11.glTranslatef(0.0F, -bobing, 0.0F);
} }
boolean is3D = customRenderer.shouldUseRenderHelper(ENTITY, item, BLOCK_3D); boolean is3D = customRenderer.shouldUseRenderHelper(ENTITY, item, BLOCK_3D);
if (item.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[item.itemID].getRenderType()))) if (item.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[item.itemID].getRenderType())))
{ {
engine.bindTexture(engine.getTexture(item.getItem().getTextureFile())); engine.bindTexture(engine.getTexture(item.getItem().getTextureFile()));
@ -314,8 +290,7 @@ public class ForgeHooksClient
GL11.glScalef(1.0F, 1.0F, -1F); GL11.glScalef(1.0F, 1.0F, -1F);
GL11.glRotatef(210F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(210F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
if(inColor) if(inColor)
{ {
int color = Item.itemsList[item.itemID].getColorFromDamage(item.getItemDamage(), 0); int color = Item.itemsList[item.itemID].getColorFromDamage(item.getItemDamage(), 0);
@ -324,7 +299,7 @@ public class ForgeHooksClient
float b = (float)(color & 0xff) / 255F; float b = (float)(color & 0xff) / 255F;
GL11.glColor4f(r, g, b, 1.0F); GL11.glColor4f(r, g, b, 1.0F);
} }
GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F);
renderBlocks.useInventoryTint = inColor; renderBlocks.useInventoryTint = inColor;
customRenderer.renderItem(INVENTORY, item, renderBlocks); customRenderer.renderItem(INVENTORY, item, renderBlocks);
@ -376,4 +351,60 @@ public class ForgeHooksClient
GL11.glPopMatrix(); GL11.glPopMatrix();
} }
} }
//Optifine Helper Functions u.u, these are here specifically for Optifine
//Note: When using Optfine, these methods are invoked using reflection, which
//incurs a major performance penalty.
public static void orientBedCamera(Minecraft mc, EntityLiving entity)
{
int x = MathHelper.floor_double(entity.posX);
int y = MathHelper.floor_double(entity.posY);
int z = MathHelper.floor_double(entity.posZ);
Block block = Block.blocksList[mc.theWorld.getBlockId(x, y, z)];
if (block != null && block.isBed(mc.theWorld, x, y, z, entity))
{
int var12 = block.getBedDirection(mc.theWorld, x, y, z);
GL11.glRotatef((float)(var12 * 90), 0.0F, 1.0F, 0.0F);
}
}
public static boolean onDrawBlockHighlight(RenderGlobal context, EntityPlayer player, MovingObjectPosition target, int subID, ItemStack currentItem, float partialTicks)
{
return MinecraftForge.EVENT_BUS.post(new DrawBlockHighlightEvent(context, player, target, subID, currentItem, partialTicks));
}
public static void dispatchRenderLast(RenderGlobal context, float partialTicks)
{
MinecraftForge.EVENT_BUS.post(new RenderWorldLastEvent(context, partialTicks));
}
public static void onTextureLoad(String texture, TexturePackBase pack)
{
MinecraftForge.EVENT_BUS.post(new TextureLoadEvent(texture, pack));
}
/**
* This is added for Optifine's convenience. And to explode if a ModMaker is developing.
* @param texture
*/
public static void onTextureLoadPre(String texture)
{
if (Tessellator.renderingWorldRenderer)
{
String msg = String.format("Warning: Texture %s not preloaded, will cause render glitches!", texture);
System.out.println(msg);
if (Tessellator.class.getPackage() != null)
{
if (Tessellator.class.getPackage().equals("net.minecraft.src"))
{
Minecraft mc = ModLoader.getMinecraftInstance();
if (mc.ingameGUI != null)
{
mc.ingameGUI.getChatGUI().printChatMessage(msg);
}
}
}
}
}
} }

View File

@ -3,6 +3,8 @@ package net.minecraftforge.common;
import java.util.*; import java.util.*;
import net.minecraft.src.*; import net.minecraft.src.*;
import net.minecraftforge.event.entity.living.*;
import net.minecraftforge.event.entity.living.LivingEvent.*;
public class ForgeHooks public class ForgeHooks
{ {
@ -284,4 +286,54 @@ public class ForgeHooks
player.inventory.currentItem = slot; player.inventory.currentItem = slot;
return true; return true;
} }
//Optifine Helper Functions u.u, these are here specifically for Optifine
//Note: When using Optfine, these methods are invoked using reflection, which
//incurs a major performance penalty.
public static void onLivingSetAttackTarget(EntityLiving entity, EntityLiving target)
{
MinecraftForge.EVENT_BUS.post(new LivingSetAttackTargetEvent(entity, target));
}
public static boolean onLivingUpdate(EntityLiving entity)
{
return MinecraftForge.EVENT_BUS.post(new LivingUpdateEvent(entity));
}
public static boolean onLivingAttack(EntityLiving entity, DamageSource src, int amount)
{
return MinecraftForge.EVENT_BUS.post(new LivingAttackEvent(entity, src, amount));
}
public static int onLivingHurt(EntityLiving entity, DamageSource src, int amount)
{
LivingHurtEvent event = new LivingHurtEvent(entity, src, amount);
return (MinecraftForge.EVENT_BUS.post(event) ? 0 : event.ammount);
}
public static boolean onLivingDeath(EntityLiving entity, DamageSource src)
{
return MinecraftForge.EVENT_BUS.post(new LivingDeathEvent(entity, src));
}
public static boolean onLivingDrops(EntityLiving entity, DamageSource source, ArrayList<EntityItem> drops, int lootingLevel, boolean recentlyHit, int specialDropValue)
{
return MinecraftForge.EVENT_BUS.post(new LivingDropsEvent(entity, source, drops, lootingLevel, recentlyHit, specialDropValue));
}
public static float onLivingFall(EntityLiving entity, float distance)
{
LivingFallEvent event = new LivingFallEvent(entity, distance);
return (MinecraftForge.EVENT_BUS.post(event) ? 0.0f : event.distance);
}
public static boolean isLivingOnLadder(Block block, World world, int x, int y, int z)
{
return block != null && block.isLadder(world, x, y, z);
}
public static void onLivingJump(EntityLiving entity)
{
MinecraftForge.EVENT_BUS.post(new LivingJumpEvent(entity));
}
} }

View File

@ -15,7 +15,7 @@
public void setAttackTarget(EntityLiving par1EntityLiving) public void setAttackTarget(EntityLiving par1EntityLiving)
{ {
this.attackTarget = par1EntityLiving; this.attackTarget = par1EntityLiving;
+ MinecraftForge.EVENT_BUS.post(new LivingSetAttackTargetEvent(this, par1EntityLiving)); + ForgeHooks.onLivingSetAttackTarget(this, par1EntityLiving);
} }
public boolean isExplosiveMob(Class par1Class) public boolean isExplosiveMob(Class par1Class)
@ -23,7 +23,7 @@
{ {
this.entityLivingToAttack = par1EntityLiving; this.entityLivingToAttack = par1EntityLiving;
this.revengeTimer = this.entityLivingToAttack != null ? 60 : 0; this.revengeTimer = this.entityLivingToAttack != null ? 60 : 0;
+ MinecraftForge.EVENT_BUS.post(new LivingSetAttackTargetEvent(this, par1EntityLiving)); + ForgeHooks.onLivingSetAttackTarget(this, par1EntityLiving);
} }
protected void entityInit() protected void entityInit()
@ -31,7 +31,7 @@
*/ */
public void onUpdate() public void onUpdate()
{ {
+ if (MinecraftForge.EVENT_BUS.post(new LivingUpdateEvent(this))) + if (ForgeHooks.onLivingUpdate(this))
+ { + {
+ return; + return;
+ } + }
@ -43,7 +43,7 @@
*/ */
public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
{ {
+ if (MinecraftForge.EVENT_BUS.post(new LivingAttackEvent(this, par1DamageSource, par2))) + if (ForgeHooks.onLivingAttack(this, par1DamageSource, par2))
+ { + {
+ return false; + return false;
+ } + }
@ -51,25 +51,24 @@
if (this.worldObj.isRemote) if (this.worldObj.isRemote)
{ {
return false; return false;
@@ -1007,6 +1023,13 @@ @@ -1007,6 +1023,12 @@
*/ */
protected void damageEntity(DamageSource par1DamageSource, int par2) protected void damageEntity(DamageSource par1DamageSource, int par2)
{ {
+ LivingHurtEvent event = new LivingHurtEvent(this, par1DamageSource, par2); + par2 = ForgeHooks.onLivingHurt(this, par1DamageSource, par2);
+ if (MinecraftForge.EVENT_BUS.post(event) || event.ammount== 0) + if (par2 <= 0)
+ { + {
+ return; + return;
+ } + }
+ par2 = event.ammount;
+ +
par2 = this.applyArmorCalculations(par1DamageSource, par2); par2 = this.applyArmorCalculations(par1DamageSource, par2);
par2 = this.applyPotionDamageCalculations(par1DamageSource, par2); par2 = this.applyPotionDamageCalculations(par1DamageSource, par2);
this.health -= par2; this.health -= par2;
@@ -1070,6 +1093,11 @@ @@ -1070,6 +1092,11 @@
*/ */
public void onDeath(DamageSource par1DamageSource) public void onDeath(DamageSource par1DamageSource)
{ {
+ if (MinecraftForge.EVENT_BUS.post(new LivingDeathEvent(this, par1DamageSource))) + if (ForgeHooks.onLivingDeath(this, par1DamageSource))
+ { + {
+ return; + return;
+ } + }
@ -77,7 +76,7 @@
Entity var2 = par1DamageSource.getEntity(); Entity var2 = par1DamageSource.getEntity();
if (this.scoreValue >= 0 && var2 != null) if (this.scoreValue >= 0 && var2 != null)
@@ -1093,13 +1121,17 @@ @@ -1093,13 +1120,17 @@
var3 = EnchantmentHelper.getLootingModifier(((EntityPlayer)var2).inventory); var3 = EnchantmentHelper.getLootingModifier(((EntityPlayer)var2).inventory);
} }
@ -96,14 +95,14 @@
if (var4 < 5) if (var4 < 5)
{ {
@@ -1107,6 +1139,16 @@ @@ -1107,6 +1138,16 @@
} }
} }
} }
+ +
+ captureDrops = false; + captureDrops = false;
+ +
+ if (!MinecraftForge.EVENT_BUS.post(new LivingDropsEvent(this, par1DamageSource, capturedDrops, var3, recentlyHit > 0, var4))) + if (!ForgeHooks.onLivingDrops(this, par1DamageSource, capturedDrops, var3, recentlyHit > 0, var4))
+ { + {
+ for (EntityItem item : capturedDrops) + for (EntityItem item : capturedDrops)
+ { + {
@ -113,34 +112,33 @@
} }
this.worldObj.setEntityState(this, (byte)3); this.worldObj.setEntityState(this, (byte)3);
@@ -1150,6 +1192,13 @@ @@ -1150,6 +1191,12 @@
*/ */
protected void fall(float par1) protected void fall(float par1)
{ {
+ LivingFallEvent event = new LivingFallEvent(this, par1); + par1 = ForgeHooks.onLivingFall(this, par1);
+ if (MinecraftForge.EVENT_BUS.post(event)) + if (par1 <= 0)
+ { + {
+ return; + return;
+ } + }
+ par1 = event.distance;
+ +
super.fall(par1); super.fall(par1);
int var2 = MathHelper.ceiling_float_int(par1 - 3.0F); int var2 = MathHelper.ceiling_float_int(par1 - 3.0F);
@@ -1337,7 +1386,7 @@ @@ -1337,7 +1384,7 @@
int var2 = MathHelper.floor_double(this.boundingBox.minY); int var2 = MathHelper.floor_double(this.boundingBox.minY);
int var3 = MathHelper.floor_double(this.posZ); int var3 = MathHelper.floor_double(this.posZ);
int var4 = this.worldObj.getBlockId(var1, var2, var3); int var4 = this.worldObj.getBlockId(var1, var2, var3);
- return var4 == Block.ladder.blockID || var4 == Block.vine.blockID; - return var4 == Block.ladder.blockID || var4 == Block.vine.blockID;
+ return Block.blocksList[var4] != null && Block.blocksList[var4].isLadder(worldObj, var1, var2, var3); + return ForgeHooks.isLivingOnLadder(Block.blocksList[var4], worldObj, var1, var2, var3);
} }
/** /**
@@ -1600,6 +1649,7 @@ @@ -1600,6 +1647,7 @@
} }
this.isAirBorne = true; this.isAirBorne = true;
+ MinecraftForge.EVENT_BUS.post(new LivingJumpEvent(this)); + ForgeHooks.onLivingJump(this);
} }
/** /**

View File

@ -39,33 +39,30 @@
float var4 = 70.0F; float var4 = 70.0F;
if (par2) if (par2)
@@ -397,11 +409,14 @@ @@ -396,15 +408,7 @@
if (!this.mc.gameSettings.debugCamEnable) if (!this.mc.gameSettings.debugCamEnable)
{ {
int var10 = this.mc.theWorld.getBlockId(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); - int var10 = this.mc.theWorld.getBlockId(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ));
- -
- if (var10 == Block.bed.blockID) - if (var10 == Block.bed.blockID)
- { - {
- int var11 = this.mc.theWorld.getBlockMetadata(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); - int var11 = this.mc.theWorld.getBlockMetadata(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ));
- int var12 = var11 & 3; - int var12 = var11 & 3;
+ int x = MathHelper.floor_double(var2.posX); - GL11.glRotatef((float)(var12 * 90), 0.0F, 1.0F, 0.0F);
+ int y = MathHelper.floor_double(var2.posY); - }
+ int z = MathHelper.floor_double(var2.posZ); -
+ Block block = Block.blocksList[mc.theWorld.getBlockId(x, y, z)]; + ForgeHooksClient.orientBedCamera(mc, var2);
+ GL11.glRotatef(var2.prevRotationYaw + (var2.rotationYaw - var2.prevRotationYaw) * par1 + 180.0F, 0.0F, -1.0F, 0.0F);
+ if (block != null && block.isBed(mc.theWorld, x, y, z, var2)) GL11.glRotatef(var2.prevRotationPitch + (var2.rotationPitch - var2.prevRotationPitch) * par1, -1.0F, 0.0F, 0.0F);
+ { }
+ int var12 = block.getBedDirection(mc.theWorld, x, y, z); @@ -1037,8 +1041,11 @@
GL11.glRotatef((float)(var12 * 90), 0.0F, 1.0F, 0.0F);
}
@@ -1037,8 +1052,11 @@
var17 = (EntityPlayer)var4; var17 = (EntityPlayer)var4;
GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glDisable(GL11.GL_ALPHA_TEST);
this.mc.mcProfiler.endStartSection("outline"); this.mc.mcProfiler.endStartSection("outline");
- var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); - var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
- var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); - var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
+ if (!MinecraftForge.EVENT_BUS.post(new DrawBlockHighlightEvent(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))) + if (!ForgeHooksClient.onDrawBlockHighlight(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))
+ { + {
+ var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); + var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
+ var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); + var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
@ -73,13 +70,13 @@
GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_ALPHA_TEST);
} }
} }
@@ -1102,8 +1120,11 @@ @@ -1102,8 +1109,11 @@
var17 = (EntityPlayer)var4; var17 = (EntityPlayer)var4;
GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glDisable(GL11.GL_ALPHA_TEST);
this.mc.mcProfiler.endStartSection("outline"); this.mc.mcProfiler.endStartSection("outline");
- var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); - var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
- var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); - var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
+ if (!MinecraftForge.EVENT_BUS.post(new DrawBlockHighlightEvent(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))) + if (!ForgeHooksClient.onDrawBlockHighlight(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))
+ { + {
+ var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); + var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
+ var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1); + var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
@ -87,13 +84,13 @@
GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_ALPHA_TEST);
} }
@@ -1127,6 +1148,9 @@ @@ -1127,6 +1137,9 @@
this.setupFog(1, par1); this.setupFog(1, par1);
GL11.glPopMatrix(); GL11.glPopMatrix();
} }
+ +
+ this.mc.mcProfiler.endStartSection("fhooks"); + this.mc.mcProfiler.endStartSection("FRenderLast");
+ MinecraftForge.EVENT_BUS.post(new RenderWorldLastEvent(var5, par1)); + ForgeHooksClient.dispatchRenderLast(var5, par1);
this.mc.mcProfiler.endStartSection("hand"); this.mc.mcProfiler.endStartSection("hand");