More patches converted.

Refactored some of the events to be a better hiarachy.
This commit is contained in:
LexManos 2012-08-06 15:07:53 -07:00
parent 80ad4be5b1
commit 31a908b754
55 changed files with 1616 additions and 584 deletions

View file

@ -46,6 +46,19 @@ public class ForgeHooksClient
public static TreeSet<TesKey> renderTextures = new TreeSet<TesKey>();
public static Tessellator defaultTessellator = null;
public static boolean inWorld = false;
public static HashMap<TesKey, IRenderContextHandler> renderHandlers = new HashMap<TesKey, IRenderContextHandler>();
public static IRenderContextHandler unbindContext = null;
protected static void registerRenderContextHandler(String texture, int subID, IRenderContextHandler handler)
{
Integer texID = textures.get(texture);
if (texID == null)
{
texID = ModLoader.getMinecraftInstance().renderEngine.getTexture(texture);
textures.put(texture, texID);
}
renderHandlers.put(new TesKey(texID, subID), handler);
}
public static void bindTexture(String texture, int subID)
{
@ -57,11 +70,11 @@ public class ForgeHooksClient
}
if (!inWorld)
{
/*if (unbindContext != null)
if (unbindContext != null)
{
unbindContext.afterRenderContext();
unbindContext = null;
}*/
}
if (Tessellator.instance.isDrawing)
{
int mode = Tessellator.instance.drawMode;
@ -69,11 +82,11 @@ public class ForgeHooksClient
Tessellator.instance.startDrawing(mode);
}
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texID);
/*unbindContext = renderHandlers.get(new TesKey(texID, subID));
unbindContext = renderHandlers.get(new TesKey(texID, subID));
if (unbindContext != null)
{
unbindContext.beforeRenderContext();
}*/
}
return;
}
bindTessellator(texID, subID);
@ -91,11 +104,11 @@ public class ForgeHooksClient
{
int mode = Tessellator.instance.drawMode;
Tessellator.instance.draw();
/*if (unbindContext != null)
if (unbindContext != null)
{
unbindContext.afterRenderContext();
unbindContext = null;
}*/
}
Tessellator.instance.startDrawing(mode);
}
GL11.glBindTexture(GL11.GL_TEXTURE_2D, ModLoader.getMinecraftInstance().renderEngine.getTexture("/terrain.png"));
@ -142,20 +155,20 @@ public class ForgeHooksClient
inWorld = false;
for (TesKey info : renderTextures)
{
//IRenderContextHandler handler = renderHandlers.get(info);
IRenderContextHandler handler = renderHandlers.get(info);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, info.texture);
Tessellator tess = tessellators.get(info);
//if (handler == null)
//{
if (handler == null)
{
tess.draw();
/*}
}
else
{
Tessellator.instance = tess;
handler.beforeRenderContext();
tess.draw();
handler.afterRenderContext();
}*/
}
}
GL11.glBindTexture(GL11.GL_TEXTURE_2D, ModLoader.getMinecraftInstance().renderEngine.getTexture("/terrain.png"));
Tessellator.renderingWorldRenderer = false;

View file

@ -1,4 +1,4 @@
package net.minecraft.src.forge;
package net.minecraftforge.client;
import net.minecraft.src.EntityItem;
import net.minecraft.src.EntityLiving;

View file

@ -2,7 +2,7 @@
* This software is provided under the terms of the Minecraft Forge Public
* License v1.0.
*/
package net.minecraft.src.forge;
package net.minecraftforge.client;
public interface IRenderContextHandler
{

View file

@ -3,7 +3,7 @@
* License v1.0.
*/
package net.minecraft.src.forge;
package net.minecraftforge.client;
import org.lwjgl.opengl.Display;
@ -14,18 +14,10 @@ import net.minecraft.src.ItemStack;
import net.minecraft.src.ModLoader;
import net.minecraft.src.RenderBlocks;
import net.minecraft.src.World;
import net.minecraft.src.forge.IItemRenderer.ItemRenderType;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
public class MinecraftForgeClient
{
/**
* Registers a new block highlight handler.
*/
public static void registerHighlightHandler(IHighlightHandler handler)
{
ForgeHooksClient.highlightHandlers.add(handler);
}
/** Register a new render context handler. A render context is a block
* of rendering performed with similar OpenGL modes, for example,
* texture name.
@ -41,74 +33,7 @@ public class MinecraftForgeClient
}
/**
* Registers a Texture Load Handler
* @param handler The handler
*/
public static void registerTextureLoadHandler(ITextureLoadHandler handler)
{
ForgeHooksClient.textureLoadHandlers.add(handler);
}
/**
* Registers a Render Last Handler
* @param handler The handler
*/
public static void registerRenderLastHandler(IRenderWorldLastHandler handler)
{
ForgeHooksClient.renderWorldLastHandlers.add(handler);
}
/**
* Registers a Sound Handler
* @param handler The handler
*/
public static void registerSoundHandler(ISoundHandler handler)
{
ForgeHooksClient.soundHandlers.add(handler);
checkMinecraftVersion("Minecraft Minecraft 1.2.5", "Interface check in registerSoundHandler, remove it Mods should be updated");
try
{
if (handler.getClass().getDeclaredMethod("onPlaySoundAtEntity", Entity.class, String.class, float.class, float.class) != null)
{
ForgeHooksClient.soundHandlers2.add(handler);
}
}
catch (Exception e)
{
if (World.class.getName().contains("World"))
{
e.printStackTrace();
}
}
}
/** Bind a texture. This is used to bind a texture file when
* performing your own rendering, rather than using ITextureProvider.
*
* This variation is reserved for future expansion.
*/
public static void bindTexture(String texture, int subid)
{
ForgeHooksClient.bindTexture(texture, subid);
}
/** Bind a texture. This is used to bind a texture file when
* performing your own rendering, rather than using ITextureProvider.
*/
public static void bindTexture(String texture)
{
ForgeHooksClient.bindTexture(texture, 0);
}
/** Unbind a texture. This binds the default texture, when you are
* finished performing custom rendering.
*/
public static void unbindTexture()
{
ForgeHooksClient.unbindTexture();
}
/** Preload a texture. Textures must be preloaded before the first
* Preload a texture. Textures must be preloaded before the first
* use, or they will cause visual anomalies.
*/
public static void preloadTexture(String texture)
@ -118,14 +43,15 @@ public class MinecraftForgeClient
/** Render a block. Render a block which may have a custom texture.
*/
public static void renderBlock(RenderBlocks render, Block block, int X, int Y, int Z)
public static void renderBlock(RenderBlocks render, Block block, int x, int y, int z)
{
ForgeHooksClient.beforeBlockRender(block, render);
render.renderBlockByRenderType(block, X, Y, Z);
render.renderBlockByRenderType(block, x, y, z);
ForgeHooksClient.afterBlockRender(block, render);
}
/** Get the current render pass.
/**
* Get the current render pass.
*/
public static int getRenderPass()
{
@ -134,7 +60,8 @@ public class MinecraftForgeClient
private static IItemRenderer[] customItemRenderers = new IItemRenderer[Item.itemsList.length];
/** Register a custom renderer for a specific item. This can be used to
/**
* Register a custom renderer for a specific item. This can be used to
* render the item in-world as an EntityItem, when the item is equipped, or
* when the item is in an inventory slot.
* @param itemID The item ID (shifted index) to handle rendering.

View file

@ -8,14 +8,21 @@ public avd.w # yOffset
public avd.x # zOffset
public-f avd.a # instance remove final
public avd.z # isDrawing
#ItemPickaxe
# ItemPickaxe
public+f rp.c # blocksEffectiveAgainst
#ItemAxe
# ItemAxe
public+f re.c # blocksEffectiveAgainst
#ItemSpade
# ItemSpade
public+f sa.c # blocksEffectiveAgainst
#ItemTool
# ItemTool
public gs.a # efficiencyOnProperMaterial
public gs.bY # damageVsEntity
#EntityEnderman
public no.d # EntityEnderman.carriableBlocks
# EntityEnderman
public no.d # carriableBlocks
# RenderEngine
public ave.k # texturePack
# RenderGlobal
public ava.h # theWorld
public ava.i # renderEngine
public ava.q # mc
public ava.r # globalRenderBlocks

View file

@ -175,16 +175,6 @@ public class ForgeHooks
}
static
{
grassList.add(new GrassEntry(Block.plantYellow, 0, 20));
grassList.add(new GrassEntry(Block.plantRed, 0, 10));
seedList.add(new SeedEntry(new ItemStack(Item.seeds), 10));
initTools();
System.out.printf("MinecraftForge v%s Initialized\n", ForgeVersion.getVersion());
ModLoader.getLogger().info(String.format("MinecraftForge v%s Initialized", ForgeVersion.getVersion()));
}
public static String getTexture(String _default, Object obj)
{
if (obj instanceof Item)
@ -200,4 +190,32 @@ public class ForgeHooks
return _default;
}
}
public static int getTotalArmorValue(EntityPlayer player)
{
int ret = 0;
for (int x = 0; x < player.inventory.armorInventory.length; x++)
{
ItemStack stack = player.inventory.armorInventory[x];
if (stack != null && stack.getItem() instanceof ISpecialArmor)
{
ret += ((ISpecialArmor)stack.getItem()).getArmorDisplay(player, stack, x);
}
else if (stack != null && stack.getItem() instanceof ItemArmor)
{
ret += ((ItemArmor)stack.getItem()).damageReduceAmount;
}
}
return ret;
}
static
{
grassList.add(new GrassEntry(Block.plantYellow, 0, 20));
grassList.add(new GrassEntry(Block.plantRed, 0, 10));
seedList.add(new SeedEntry(new ItemStack(Item.seeds), 10));
initTools();
System.out.printf("MinecraftForge v%s Initialized\n", ForgeVersion.getVersion());
ModLoader.getLogger().info(String.format("MinecraftForge v%s Initialized", ForgeVersion.getVersion()));
}
}

View file

@ -0,0 +1,319 @@
/**
* This software is provided under the terms of the Minecraft Forge Public
* License v1.0.
*/
package net.minecraftforge.common;
import java.util.ArrayList;
import java.util.Arrays;
import net.minecraft.src.DamageSource;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemArmor;
import net.minecraft.src.ItemStack;
/**
* This interface is to be implemented by ItemArmor classes. It will allow to
* modify computation of damage and health loss. Computation will be called
* before the actual armor computation, which can then be cancelled.
*
* @see ItemArmor
*/
public interface ISpecialArmor
{
/**
* Retrieves the modifiers to be used when calculating armor damage.
*
* Armor will higher priority will have damage applied to them before
* lower priority ones. If there are multiple pieces of armor with the
* same priority, damage will be distributed between them based on there
* absorption ratio.
*
* @param entity The entity wearing the armor.
* @param armor The ItemStack of the armor item itself.
* @param source The source of the damage, which can be used to alter armor
* properties based on the type or source of damage.
* @param damage The total damage being applied to the entity
* @param slot The armor slot the item is in.
* @return A ArmorProperties instance holding information about how the armor effects damage.
*/
public ArmorProperties getProperties(EntityLiving player, ItemStack armor, DamageSource source, double damage, int slot);
/**
* Get the displayed effective armor.
*
* @param player The player wearing the armor.
* @param armor The ItemStack of the armor item itself.
* @param slot The armor slot the item is in.
* @return The number of armor points for display, 2 per shield.
*/
public abstract int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot);
/**
* Applies damage to the ItemStack. The mod is responsible for reducing the
* item durability and stack size. If the stack is depleted it will be cleaned
* up automatically.
*
* @param entity The entity wearing the armor
* @param armor The ItemStack of the armor item itself.
* @param source The source of the damage, which can be used to alter armor
* properties based on the type or source of damage.
* @param damage The amount of damage being applied to the armor
* @param slot The armor slot the item is in.
*/
public abstract void damageArmor(EntityLiving entity, ItemStack stack, DamageSource source, int damage, int slot);
public static class ArmorProperties implements Comparable<ArmorProperties>
{
public int Priority = 0;
public int AbsorbMax = Integer.MAX_VALUE;
public double AbsorbRatio = 0;
public int Slot = 0;
private static final boolean DEBUG = false; //Only enable this if you wish to be spamed with debugging information.
//Left it in because I figured it'd be useful for modders developing custom armor.
public ArmorProperties(int priority, double ratio, int max)
{
Priority = priority;
AbsorbRatio = ratio;
AbsorbMax = max;
}
/**
* Gathers and applies armor reduction to damage being dealt to a entity.
*
* @param entity The Entity being damage
* @param inventory An array of armor items
* @param source The damage source type
* @param damage The total damage being done
* @return The left over damage that has not been absorbed by the armor
*/
public static int ApplyArmor(EntityLiving entity, ItemStack[] inventory, DamageSource source, double damage)
{
if (DEBUG)
{
System.out.println("Start: " + damage + " " + (damage * 25));
}
damage *= 25;
ArrayList<ArmorProperties> dmgVals = new ArrayList<ArmorProperties>();
for (int x = 0; x < inventory.length; x++)
{
ItemStack stack = inventory[x];
if (stack == null)
{
continue;
}
ArmorProperties prop = null;
if (stack.getItem() instanceof ISpecialArmor)
{
ISpecialArmor armor = (ISpecialArmor)stack.getItem();
prop = armor.getProperties(entity, stack, source, damage / 25D, x).copy();
}
else if (stack.getItem() instanceof ItemArmor && !source.isUnblockable())
{
ItemArmor armor = (ItemArmor)stack.getItem();
prop = new ArmorProperties(0, armor.damageReduceAmount / 25D, armor.getMaxDamage() + 1 - stack.getItemDamage());
}
if (prop != null)
{
prop.Slot = x;
dmgVals.add(prop);
}
}
if (dmgVals.size() > 0)
{
ArmorProperties[] props = dmgVals.toArray(new ArmorProperties[0]);
StandardizeList(props, damage);
int level = props[0].Priority;
double ratio = 0;
for (ArmorProperties prop : props)
{
if (level != prop.Priority)
{
damage -= (damage * ratio);
ratio = 0;
level = prop.Priority;
}
ratio += prop.AbsorbRatio;
double absorb = damage * prop.AbsorbRatio;
if (absorb > 0)
{
ItemStack stack = inventory[prop.Slot];
int itemDamage = (int)(absorb / 25D < 1 ? 1 : absorb / 25D);
if (stack.getItem() instanceof ISpecialArmor)
{
((ISpecialArmor)stack.getItem()).damageArmor(entity, stack, source, itemDamage, prop.Slot);
}
else
{
if (DEBUG)
{
System.out.println("Item: " + stack.toString() + " Absorbed: " + (absorb / 25D) + " Damaged: " + itemDamage);
}
stack.damageItem(itemDamage, entity);
}
if (stack.stackSize <= 0)
{
if (entity instanceof EntityPlayer)
{
stack.onItemDestroyedByUse((EntityPlayer)entity);
}
inventory[prop.Slot] = null;
}
}
}
damage -= (damage * ratio);
}
damage += entity.carryoverDamage;
if (DEBUG)
{
System.out.println("Return: " + (int)(damage / 25D) + " " + damage);
}
entity.carryoverDamage = (int)damage % 25;
return (int)(damage / 25D);
}
/**
* Sorts and standardizes the distribution of damage over armor.
*
* @param armor The armor information
* @param damage The total damage being received
*/
private static void StandardizeList(ArmorProperties[] armor, double damage)
{
Arrays.sort(armor);
int start = 0;
double total = 0;
int priority = armor[0].Priority;
int pStart = 0;
boolean pChange = false;
boolean pFinished = false;
if (DEBUG)
{
for (ArmorProperties prop : armor)
{
System.out.println(prop);
}
System.out.println("========================");
}
for (int x = 0; x < armor.length; x++)
{
total += armor[x].AbsorbRatio;
if (x == armor.length - 1 || armor[x].Priority != priority)
{
if (armor[x].Priority != priority)
{
total -= armor[x].AbsorbRatio;
x--;
pChange = true;
}
if (total > 1)
{
for (int y = start; y <= x; y++)
{
double newRatio = armor[y].AbsorbRatio / total;
if (newRatio * damage > armor[y].AbsorbMax)
{
armor[y].AbsorbRatio = (double)armor[y].AbsorbMax / damage;
total = 0;
for (int z = pStart; z <= y; z++)
{
total += armor[z].AbsorbRatio;
}
start = y + 1;
x = y;
break;
}
else
{
armor[y].AbsorbRatio = newRatio;
pFinished = true;
}
}
if (pChange && pFinished)
{
damage -= (damage * total);
total = 0;
start = x + 1;
priority = armor[start].Priority;
pStart = start;
pChange = false;
pFinished = false;
if (damage <= 0)
{
for (int y = x + 1; y < armor.length; y++)
{
armor[y].AbsorbRatio = 0;
}
break;
}
}
}
else
{
for (int y = start; y <= x; y++)
{
total -= armor[y].AbsorbRatio;
if (damage * armor[y].AbsorbRatio > armor[y].AbsorbMax)
{
armor[y].AbsorbRatio = (double)armor[y].AbsorbMax / (double)damage;
}
total += armor[y].AbsorbRatio;
}
damage -= (damage * total);
total = 0;
if (x != armor.length - 1)
{
start = x + 1;
priority = armor[start].Priority;
pStart = start;
pChange = false;
if (damage <= 0)
{
for (int y = x + 1; y < armor.length; y++)
{
armor[y].AbsorbRatio = 0;
}
break;
}
}
}
}
}
if (DEBUG)
{
for (ArmorProperties prop : armor)
{
System.out.println(prop);
}
}
}
public int compareTo(ArmorProperties o)
{
if (o.Priority != Priority)
{
return o.Priority - Priority;
}
double left = ( AbsorbRatio == 0 ? 0 : AbsorbMax * 100.0D / AbsorbRatio);
double right = (o.AbsorbRatio == 0 ? 0 : o.AbsorbMax * 100.0D / o.AbsorbRatio);
return (int)(left - right);
}
public String toString()
{
return String.format("%d, %d, %f, %d", Priority, AbsorbMax, AbsorbRatio, (AbsorbRatio == 0 ? 0 : (int)(AbsorbMax * 100.0D / AbsorbRatio)));
}
public ArmorProperties copy()
{
return new ArmorProperties(Priority, AbsorbRatio, AbsorbMax);
}
}
}

View file

@ -1,34 +0,0 @@
package net.minecraftforge.event.entity;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityItem;
import net.minecraft.src.EntityPlayer;
public class EntityItemPickupEvent extends EntityEvent
{
private final EntityItem item;
private final EntityPlayer player;
public EntityItemPickupEvent(EntityItem item, EntityPlayer player)
{
super(item);
this.item = item;
this.player = player;
}
public EntityItem getItem()
{
return item;
}
public EntityPlayer getPlayer()
{
return player;
}
@Override
public boolean isCancelable()
{
return true;
}
}

View file

@ -1,19 +0,0 @@
package net.minecraftforge.event.entity;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityPlayer;
public class PlayerEvent extends EntityEvent
{
private final EntityPlayer player;
public PlayerEvent(EntityPlayer player)
{
super(player);
this.player = player;
}
public EntityPlayer getPlayer()
{
return player;
}
}

View file

@ -3,6 +3,7 @@ package net.minecraftforge.event.entity;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemStack;
import net.minecraft.src.World;
import net.minecraftforge.event.entity.player.PlayerEvent;
public class UseHoeEvent extends PlayerEvent
{

View file

@ -0,0 +1,14 @@
package net.minecraftforge.event.entity.living;
import net.minecraft.src.EntityLiving;
import net.minecraftforge.event.entity.EntityEvent;
public class LivingEvent extends EntityEvent
{
public final EntityLiving entityLiving;
public LivingEvent(EntityLiving entity)
{
super(entity);
entityLiving = entity;
}
}

View file

@ -0,0 +1,32 @@
package net.minecraftforge.event.entity.living;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.World;
public class LivingSpecialSpawnEvent extends LivingEvent
{
public final World world;
public final float x;
public final float y;
public final float z;
private boolean handeled = false;
public LivingSpecialSpawnEvent(EntityLiving entity, World world, float x, float y, float z)
{
super(entity);
this.world = world;
this.x = x;
this.y = y;
this.z = z;
}
public void setHandeled()
{
handeled = true;
}
public boolean isHandeled()
{
return handeled;
}
}

View file

@ -1,12 +1,12 @@
package net.minecraftforge.event.entity;
package net.minecraftforge.event.entity.player;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemStack;
public class ArrowLooseEvent extends PlayerEvent
{
private final ItemStack bow;
private int charge;
public final ItemStack bow;
public int charge;
public ArrowLooseEvent(EntityPlayer player, ItemStack bow, int charge)
{
@ -20,19 +20,4 @@ public class ArrowLooseEvent extends PlayerEvent
{
return true;
}
public ItemStack getBow()
{
return bow;
}
public int getCharge()
{
return charge;
}
public void setCharge(int charge)
{
this.charge = charge;
}
}

View file

@ -1,11 +1,11 @@
package net.minecraftforge.event.entity;
package net.minecraftforge.event.entity.player;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemStack;
public class ArrowNockEvent extends PlayerEvent
{
private ItemStack result;
public ItemStack result;
public ArrowNockEvent(EntityPlayer player, ItemStack result)
{
@ -18,14 +18,4 @@ public class ArrowNockEvent extends PlayerEvent
{
return true;
}
public ItemStack getResultStack()
{
return result;
}
public void setResultStack(ItemStack result)
{
this.result = result;
}
}

View file

@ -1,4 +1,4 @@
package net.minecraftforge.event.entity;
package net.minecraftforge.event.entity.player;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.World;

View file

@ -0,0 +1,22 @@
package net.minecraftforge.event.entity.player;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityItem;
import net.minecraft.src.EntityPlayer;
public class EntityItemPickupEvent extends PlayerEvent
{
public final EntityItem item;
public EntityItemPickupEvent(EntityPlayer player, EntityItem item)
{
super(player);
this.item = item;
}
@Override
public boolean isCancelable()
{
return true;
}
}

View file

@ -1,4 +1,4 @@
package net.minecraftforge.event.entity;
package net.minecraftforge.event.entity.player;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemStack;
@ -7,11 +7,11 @@ import net.minecraft.src.World;
public class FillBucketEvent extends PlayerEvent
{
private final ItemStack current;
private final World world;
private final MovingObjectPosition target;
public final ItemStack current;
public final World world;
public final MovingObjectPosition target;
private ItemStack result;
public ItemStack result;
private boolean handeled = false;
public FillBucketEvent(EntityPlayer player, ItemStack current, World world, MovingObjectPosition target)
@ -28,21 +28,6 @@ public class FillBucketEvent extends PlayerEvent
return true;
}
public ItemStack getCurrentItem()
{
return current;
}
public World getWorld()
{
return world;
}
public MovingObjectPosition getTarget()
{
return target;
}
public boolean isHandeled()
{
return handeled;
@ -52,15 +37,4 @@ public class FillBucketEvent extends PlayerEvent
{
handeled = true;
}
public ItemStack getResult()
{
return result;
}
public void setResult(ItemStack result)
{
this.result = result;
}
}

View file

@ -0,0 +1,15 @@
package net.minecraftforge.event.entity.player;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityPlayer;
import net.minecraftforge.event.entity.living.LivingEvent;
public class PlayerEvent extends LivingEvent
{
public final EntityPlayer entityPlayer;
public PlayerEvent(EntityPlayer player)
{
super(player);
entityPlayer = player;
}
}

View file

@ -1,9 +0,0 @@
package net.minecraft.src.forge;
@Deprecated //Now consolidated into IITemRenderer
public enum ItemRenderType
{
ENTITY, // Render type for in-world EntityItems
EQUIPPED, // Render type for an item equipped in-hand
INVENTORY; // Render type for items shown in a GUI inventory slot
}

View file

@ -1,267 +0,0 @@
/**
* This software is provided under the terms of the Minecraft Forge Public
* License v1.0.
*/
package net.minecraft.src.forge;
import java.util.ArrayList;
import java.util.Arrays;
import net.minecraft.src.DamageSource;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemArmor;
import net.minecraft.src.ItemStack;
public class ArmorProperties implements Comparable<ArmorProperties>
{
public int Priority = 0;
public int AbsorbMax = Integer.MAX_VALUE;
public double AbsorbRatio = 0;
public int Slot = 0;
private static final boolean DEBUG = false; //Only enable this if you wish to be spamed with debugging information.
//Left it in because I figured it'd be useful for modders developing custom armor.
public ArmorProperties(int priority, double ratio, int max)
{
Priority = priority;
AbsorbRatio = ratio;
AbsorbMax = max;
}
/**
* Gathers and applies armor reduction to damage being dealt to a entity.
*
* @param entity The Entity being damage
* @param inventory An array of armor items
* @param source The damage source type
* @param damage The total damage being done
* @return The left over damage that has not been absorbed by the armor
*/
public static int ApplyArmor(EntityLiving entity, ItemStack[] inventory, DamageSource source, double damage)
{
if (DEBUG)
{
System.out.println("Start: " + damage + " " + (damage * 25));
}
damage *= 25;
ArrayList<ArmorProperties> dmgVals = new ArrayList<ArmorProperties>();
for (int x = 0; x < inventory.length; x++)
{
ItemStack stack = inventory[x];
if (stack == null)
{
continue;
}
ArmorProperties prop = null;
if (stack.getItem() instanceof ISpecialArmor)
{
ISpecialArmor armor = (ISpecialArmor)stack.getItem();
prop = armor.getProperties(entity, stack, source, damage / 25D, x).copy();
}
else if (stack.getItem() instanceof ItemArmor && !source.isUnblockable())
{
ItemArmor armor = (ItemArmor)stack.getItem();
prop = new ArmorProperties(0, armor.damageReduceAmount / 25D, armor.getMaxDamage() + 1 - stack.getItemDamage());
}
if (prop != null)
{
prop.Slot = x;
dmgVals.add(prop);
}
}
if (dmgVals.size() > 0)
{
ArmorProperties[] props = dmgVals.toArray(new ArmorProperties[0]);
StandardizeList(props, damage);
int level = props[0].Priority;
double ratio = 0;
for (ArmorProperties prop : props)
{
if (level != prop.Priority)
{
damage -= (damage * ratio);
ratio = 0;
level = prop.Priority;
}
ratio += prop.AbsorbRatio;
double absorb = damage * prop.AbsorbRatio;
if (absorb > 0)
{
ItemStack stack = inventory[prop.Slot];
int itemDamage = (int)(absorb / 25D < 1 ? 1 : absorb / 25D);
if (stack.getItem() instanceof ISpecialArmor)
{
((ISpecialArmor)stack.getItem()).damageArmor(entity, stack, source, itemDamage, prop.Slot);
}
else
{
if (DEBUG)
{
System.out.println("Item: " + stack.toString() + " Absorbed: " + (absorb / 25D) + " Damaged: " + itemDamage);
}
stack.damageItem(itemDamage, entity);
}
if (stack.stackSize <= 0)
{
if (entity instanceof EntityPlayer)
{
stack.onItemDestroyedByUse((EntityPlayer)entity);
}
inventory[prop.Slot] = null;
}
}
}
damage -= (damage * ratio);
}
damage += entity.carryoverDamage;
if (DEBUG)
{
System.out.println("Return: " + (int)(damage / 25D) + " " + damage);
}
entity.carryoverDamage = (int)damage % 25;
return (int)(damage / 25D);
}
/**
* Sorts and standardizes the distribution of damage over armor.
*
* @param armor The armor information
* @param damage The total damage being received
*/
private static void StandardizeList(ArmorProperties[] armor, double damage)
{
Arrays.sort(armor);
int start = 0;
double total = 0;
int priority = armor[0].Priority;
int pStart = 0;
boolean pChange = false;
boolean pFinished = false;
if (DEBUG)
{
for (ArmorProperties prop : armor)
{
System.out.println(prop);
}
System.out.println("========================");
}
for (int x = 0; x < armor.length; x++)
{
total += armor[x].AbsorbRatio;
if (x == armor.length - 1 || armor[x].Priority != priority)
{
if (armor[x].Priority != priority)
{
total -= armor[x].AbsorbRatio;
x--;
pChange = true;
}
if (total > 1)
{
for (int y = start; y <= x; y++)
{
double newRatio = armor[y].AbsorbRatio / total;
if (newRatio * damage > armor[y].AbsorbMax)
{
armor[y].AbsorbRatio = (double)armor[y].AbsorbMax / damage;
total = 0;
for (int z = pStart; z <= y; z++)
{
total += armor[z].AbsorbRatio;
}
start = y + 1;
x = y;
break;
}
else
{
armor[y].AbsorbRatio = newRatio;
pFinished = true;
}
}
if (pChange && pFinished)
{
damage -= (damage * total);
total = 0;
start = x + 1;
priority = armor[start].Priority;
pStart = start;
pChange = false;
pFinished = false;
if (damage <= 0)
{
for (int y = x + 1; y < armor.length; y++)
{
armor[y].AbsorbRatio = 0;
}
break;
}
}
}
else
{
for (int y = start; y <= x; y++)
{
total -= armor[y].AbsorbRatio;
if (damage * armor[y].AbsorbRatio > armor[y].AbsorbMax)
{
armor[y].AbsorbRatio = (double)armor[y].AbsorbMax / (double)damage;
}
total += armor[y].AbsorbRatio;
}
damage -= (damage * total);
total = 0;
if (x != armor.length - 1)
{
start = x + 1;
priority = armor[start].Priority;
pStart = start;
pChange = false;
if (damage <= 0)
{
for (int y = x + 1; y < armor.length; y++)
{
armor[y].AbsorbRatio = 0;
}
break;
}
}
}
}
}
if (DEBUG)
{
for (ArmorProperties prop : armor)
{
System.out.println(prop);
}
}
}
public int compareTo(ArmorProperties o)
{
if (o.Priority != Priority)
{
return o.Priority - Priority;
}
double left = ( AbsorbRatio == 0 ? 0 : AbsorbMax * 100.0D / AbsorbRatio);
double right = (o.AbsorbRatio == 0 ? 0 : o.AbsorbMax * 100.0D / o.AbsorbRatio);
return (int)(left - right);
}
public String toString()
{
return String.format("%d, %d, %f, %d", Priority, AbsorbMax, AbsorbRatio, (AbsorbRatio == 0 ? 0 : (int)(AbsorbMax * 100.0D / AbsorbRatio)));
}
public ArmorProperties copy()
{
return new ArmorProperties(Priority, AbsorbRatio, AbsorbMax);
}
}

View file

@ -1,64 +0,0 @@
/**
* This software is provided under the terms of the Minecraft Forge Public
* License v1.0.
*/
package net.minecraft.src.forge;
import net.minecraft.src.DamageSource;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ItemArmor;
import net.minecraft.src.ItemStack;
/**
* This interface is to be implemented by ItemArmor classes. It will allow to
* modify computation of damage and health loss. Computation will be called
* before the actual armor computation, which can then be cancelled.
*
* @see ItemArmor
*/
public interface ISpecialArmor
{
/**
* Retrieves the modifiers to be used when calculating armor damage.
*
* Armor will higher priority will have damage applied to them before
* lower priority ones. If there are multiple pieces of armor with the
* same priority, damage will be distributed between them based on there
* absorption ratio.
*
* @param entity The entity wearing the armor.
* @param armor The ItemStack of the armor item itself.
* @param source The source of the damage, which can be used to alter armor
* properties based on the type or source of damage.
* @param damage The total damage being applied to the entity
* @param slot The armor slot the item is in.
* @return A ArmorProperties instance holding information about how the armor effects damage.
*/
public ArmorProperties getProperties(EntityLiving player, ItemStack armor, DamageSource source, double damage, int slot);
/**
* Get the displayed effective armor.
*
* @param player The player wearing the armor.
* @param armor The ItemStack of the armor item itself.
* @param slot The armor slot the item is in.
* @return The number of armor points for display, 2 per shield.
*/
public abstract int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot);
/**
* Applies damage to the ItemStack. The mod is responsible for reducing the
* item durability and stack size. If the stack is depleted it will be cleaned
* up automatically.
*
* @param entity The entity wearing the armor
* @param armor The ItemStack of the armor item itself.
* @param source The source of the damage, which can be used to alter armor
* properties based on the type or source of damage.
* @param damage The amount of damage being applied to the armor
* @param slot The armor slot the item is in.
*/
public abstract void damageArmor(EntityLiving entity, ItemStack stack, DamageSource source, int damage, int slot);
}

View file

@ -6,7 +6,7 @@
import java.util.Iterator;
+
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.EntityItemPickupEvent;
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
public class EntityItem extends Entity
{
@ -14,7 +14,7 @@
{
int var2 = this.item.stackSize;
+ EntityItemPickupEvent event = new EntityItemPickupEvent(this, par1EntityPlayer);
+ EntityItemPickupEvent event = new EntityItemPickupEvent(par1EntityPlayer, this);
+ MinecraftForge.EVENT_BUS.post(event);
+
+ if (delayBeforeCanPickup == 0 && (!event.isCanceled() || item.stackSize <= 0))

View file

@ -0,0 +1,77 @@
--- ../src_base/common/net/minecraft/src/EntityMooshroom.java
+++ ../src_work/common/net/minecraft/src/EntityMooshroom.java
@@ -1,6 +1,10 @@
package net.minecraft.src;
-public class EntityMooshroom extends EntityCow
+import java.util.ArrayList;
+
+import net.minecraftforge.common.IShearable;
+
+public class EntityMooshroom extends EntityCow implements IShearable
{
public EntityMooshroom(World par1World)
{
@@ -31,31 +35,7 @@
}
}
- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && this.getGrowingAge() >= 0)
- {
- this.setDead();
- this.worldObj.spawnParticle("largeexplode", this.posX, this.posY + (double)(this.height / 2.0F), this.posZ, 0.0D, 0.0D, 0.0D);
-
- if (!this.worldObj.isRemote)
- {
- EntityCow var3 = new EntityCow(this.worldObj);
- var3.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
- var3.setEntityHealth(this.getHealth());
- var3.renderYawOffset = this.renderYawOffset;
- this.worldObj.spawnEntityInWorld(var3);
-
- for (int var4 = 0; var4 < 5; ++var4)
- {
- this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY + (double)this.height, this.posZ, new ItemStack(Block.mushroomRed)));
- }
- }
-
- return true;
- }
- else
- {
- return super.interact(par1EntityPlayer);
- }
+ return super.interact(par1EntityPlayer);
}
/**
@@ -65,4 +45,29 @@
{
return new EntityMooshroom(this.worldObj);
}
+
+ @Override
+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z)
+ {
+ return getGrowingAge() >= 0;
+ }
+
+ @Override
+ public ArrayList<ItemStack> onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune)
+ {
+ setDead();
+ EntityCow entitycow = new EntityCow(worldObj);
+ entitycow.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch);
+ entitycow.setEntityHealth(getHealth());
+ entitycow.renderYawOffset = renderYawOffset;
+ worldObj.spawnEntityInWorld(entitycow);
+ worldObj.spawnParticle("largeexplode", posX, posY + (double)(height / 2.0F), posZ, 0.0D, 0.0D, 0.0D);
+
+ ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
+ for (int x = 0; x < 5; x++)
+ {
+ ret.add(new ItemStack(Block.mushroomRed));
+ }
+ return ret;
+ }
}

View file

@ -0,0 +1,62 @@
--- ../src_base/common/net/minecraft/src/FurnaceRecipes.java
+++ ../src_work/common/net/minecraft/src/FurnaceRecipes.java
@@ -1,5 +1,6 @@
package net.minecraft.src;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -10,6 +11,7 @@
/** The list of smelting results. */
private Map smeltingList = new HashMap();
private Map field_77605_c = new HashMap();
+ private Map metaSmeltingList = new HashMap();
/**
* Used to call methods addSmelting and getSmeltingResult.
@@ -50,7 +52,9 @@
/**
* Returns the smelting result of an item.
+ * Deprecated in favor of a metadata sensitive version
*/
+ @Deprecated
public ItemStack getSmeltingResult(int par1)
{
return (ItemStack)this.smeltingList.get(Integer.valueOf(par1));
@@ -65,4 +69,34 @@
{
return this.field_77605_c.containsKey(Integer.valueOf(par1)) ? ((Float)this.field_77605_c.get(Integer.valueOf(par1))).floatValue() : 0.0F;
}
+
+ /**
+ * Add a metadata-sensitive furnace recipe
+ * @param itemID The Item ID
+ * @param metadata The Item Metadata
+ * @param itemstack The ItemStack for the result
+ */
+ public void addSmelting(int itemID, int metadata, ItemStack itemstack)
+ {
+ metaSmeltingList.put(Arrays.asList(itemID, metadata), itemstack);
+ }
+
+ /**
+ * Used to get the resulting ItemStack form a source ItemStack
+ * @param item The Source ItemStack
+ * @return The result ItemStack
+ */
+ public ItemStack getSmeltingResult(ItemStack item)
+ {
+ if (item == null)
+ {
+ return null;
+ }
+ ItemStack ret = (ItemStack)metaSmeltingList.get(Arrays.asList(item.itemID, item.getItemDamage()));
+ if (ret != null)
+ {
+ return ret;
+ }
+ return (ItemStack)smeltingList.get(Integer.valueOf(item.itemID));
+ }
}

View file

@ -4,8 +4,8 @@
package net.minecraft.src;
+
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.ArrowLooseEvent;
+import net.minecraftforge.event.entity.ArrowNockEvent;
+import net.minecraftforge.event.entity.player.ArrowLooseEvent;
+import net.minecraftforge.event.entity.player.ArrowNockEvent;
public class ItemBow extends Item
{
@ -21,7 +21,7 @@
+ {
+ return;
+ }
+ var6 = event.getCharge();
+ var6 = event.charge;
+
boolean var5 = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0;
@ -39,7 +39,7 @@
+ MinecraftForge.EVENT_BUS.post(event);
+ if (event.isCanceled())
+ {
+ return event.getResultStack();
+ return event.result;
+ }
+
if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex))

View file

@ -3,7 +3,7 @@
@@ -1,4 +1,6 @@
package net.minecraft.src;
+
+import net.minecraftforge.event.entity.FillBucketEvent;
+import net.minecraftforge.event.entity.player.FillBucketEvent;
public class ItemBucket extends Item
{
@ -19,7 +19,7 @@
+
+ if (event.isHandeled())
+ {
+ return event.getResult();
+ return event.result;
+ }
+
if (var12.typeOfHit == EnumMovingObjectType.TILE)

View file

@ -1,6 +1,13 @@
--- ../src_base/common/net/minecraft/src/SlotCrafting.java
+++ ../src_work/common/net/minecraft/src/SlotCrafting.java
@@ -107,6 +107,7 @@
@@ -1,4 +1,6 @@
package net.minecraft.src;
+
+import net.minecraftforge.common.ForgeHooks;
public class SlotCrafting extends Slot
{
@@ -107,6 +109,7 @@
*/
public void onPickupFromSlot(ItemStack par1ItemStack)
{
@ -8,7 +15,7 @@
this.onCrafting(par1ItemStack);
for (int var2 = 0; var2 < this.craftMatrix.getSizeInventory(); ++var2)
@@ -119,7 +120,7 @@
@@ -119,7 +122,7 @@
if (var3.getItem().hasContainerItem())
{

View file

@ -0,0 +1,54 @@
--- ../src_base/common/net/minecraft/src/SpawnerAnimals.java
+++ ../src_work/common/net/minecraft/src/SpawnerAnimals.java
@@ -1,9 +1,14 @@
package net.minecraft.src;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
+
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingSpecialSpawnEvent;
public final class SpawnerAnimals
{
@@ -79,6 +84,12 @@
if ((!var34.getPeacefulCreature() || par2) && (var34.getPeacefulCreature() || par1) && par0WorldServer.countEntities(var34.getCreatureClass()) <= var34.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256)
{
Iterator var35 = eligibleChunksForSpawning.keySet().iterator();
+ if (mod_MinecraftForge.SPAWNER_MAKE_MORE_RANDOM)
+ {
+ ArrayList<ChunkCoordIntPair> tmp = new ArrayList(eligibleChunksForSpawning.keySet());
+ Collections.shuffle(tmp);
+ var35 = tmp.iterator();
+ }
label108:
while (var35.hasNext())
@@ -207,7 +218,8 @@
else
{
int var5 = par1World.getBlockId(par2, par3 - 1, par4);
- return var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4);
+ boolean spawnBlock = (Block.blocksList[var5] != null && Block.blocksList[var5].canCreatureSpawn(par0EnumCreatureType, par1World, par2, par3 - 1, par4));
+ return spawnBlock && var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4);
}
}
@@ -216,6 +228,13 @@
*/
private static void creatureSpecificInit(EntityLiving par0EntityLiving, World par1World, float par2, float par3, float par4)
{
+ LivingSpecialSpawnEvent event = new LivingSpecialSpawnEvent(par0EntityLiving, par1World, par2, par3, par4);
+ MinecraftForge.EVENT_BUS.post(event);
+ if (event.isHandeled())
+ {
+ return;
+ }
+
if (par0EntityLiving instanceof EntitySpider && par1World.rand.nextInt(100) == 0)
{
EntitySkeleton var7 = new EntitySkeleton(par1World);

View file

@ -0,0 +1,35 @@
--- ../src_base/common/net/minecraft/src/WorldGenBigMushroom.java
+++ ../src_work/common/net/minecraft/src/WorldGenBigMushroom.java
@@ -54,7 +54,9 @@
{
var13 = par1World.getBlockId(var11, var9, var12);
- if (var13 != 0 && var13 != Block.leaves.blockID)
+ Block block = Block.blocksList[var13];
+
+ if (var13 != 0 && block != null && !block.isLeaves(par1World, var11, var9, var12))
{
var8 = false;
}
@@ -181,7 +183,9 @@
var15 = 0;
}
- if ((var15 != 0 || par4 >= par4 + var7 - 1) && !Block.opaqueCubeLookup[par1World.getBlockId(var13, var11, var14)])
+ Block block = Block.blocksList[par1World.getBlockId(var13, var11, var14)];
+
+ if ((var15 != 0 || par4 >= par4 + var7 - 1) && (block == null || block.canBeReplacedByLeaves(par1World, var13, var11, var14)))
{
this.setBlockAndMetadata(par1World, var13, var11, var14, Block.mushroomCapBrown.blockID + var6, var15);
}
@@ -193,7 +197,9 @@
{
var12 = par1World.getBlockId(par3, par4 + var11, par5);
- if (!Block.opaqueCubeLookup[var12])
+ Block block = Block.blocksList[var12];
+
+ if (block == null || block.canBeReplacedByLeaves(par1World, par3, par4 + var11, par5))
{
this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.mushroomCapBrown.blockID + var6, 10);
}

View file

@ -0,0 +1,23 @@
--- ../src_base/common/net/minecraft/src/WorldGenDungeons.java
+++ ../src_work/common/net/minecraft/src/WorldGenDungeons.java
@@ -1,6 +1,8 @@
package net.minecraft.src;
import java.util.Random;
+
+import net.minecraftforge.common.MinecraftForge;
public class WorldGenDungeons extends WorldGenerator
{
@@ -117,9 +119,9 @@
if (var16 != null)
{
- for (int var17 = 0; var17 < 8; ++var17)
+ for (int var17 = 0; var17 < MinecraftForge.getDungeonLootTries(); ++var17)
{
- ItemStack var18 = this.pickCheckLootItem(par2Random);
+ ItemStack var18 = MinecraftForge.getRandomDungeonLoot(par2Random);
if (var18 != null)
{

View file

@ -0,0 +1,36 @@
--- ../src_base/common/net/minecraft/src/WorldGenForest.java
+++ ../src_work/common/net/minecraft/src/WorldGenForest.java
@@ -43,7 +43,9 @@
{
var12 = par1World.getBlockId(var10, var8, var11);
- if (var12 != 0 && var12 != Block.leaves.blockID)
+ Block block = Block.blocksList[var12];
+
+ if (var12 != 0 && (block != null && !block.isLeaves(par1World, var10, var8, var11)))
{
var7 = false;
}
@@ -82,7 +84,10 @@
{
int var15 = var14 - par5;
- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)])
+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)];
+
+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14)))
{
this.setBlockAndMetadata(par1World, var12, var16, var14, Block.leaves.blockID, 2);
}
@@ -94,7 +99,9 @@
{
var10 = par1World.getBlockId(par3, par4 + var16, par5);
- if (var10 == 0 || var10 == Block.leaves.blockID)
+ Block block = Block.blocksList[var10];
+
+ if (var10 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5))
{
this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 2);
}

View file

@ -0,0 +1,36 @@
--- ../src_base/common/net/minecraft/src/WorldGenMinable.java
+++ ../src_work/common/net/minecraft/src/WorldGenMinable.java
@@ -6,6 +6,7 @@
{
/** The block ID of the ore to be placed using this generator. */
private int minableBlockId;
+ private int minableBlockMeta = 0;
/** The number of blocks to generate. */
private int numberOfBlocks;
@@ -14,6 +15,12 @@
{
this.minableBlockId = par1;
this.numberOfBlocks = par2;
+ }
+
+ public WorldGenMinable(int id, int meta, int number)
+ {
+ this(id, number);
+ minableBlockMeta = meta;
}
public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
@@ -57,9 +64,10 @@
{
double var45 = ((double)var44 + 0.5D - var24) / (var28 / 2.0D);
- if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && par1World.getBlockId(var38, var41, var44) == Block.stone.blockID)
+ Block block = Block.blocksList[par1World.getBlockId(var38, var41, var44)];
+ if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && (block != null && block.isGenMineableReplaceable(par1World, var38, var41, var44)))
{
- par1World.setBlock(var38, var41, var44, this.minableBlockId);
+ par1World.setBlockAndMetadata(var38, var41, var44, this.minableBlockId, minableBlockMeta);
}
}
}

View file

@ -0,0 +1,34 @@
--- ../src_base/common/net/minecraft/src/WorldGenShrub.java
+++ ../src_work/common/net/minecraft/src/WorldGenShrub.java
@@ -17,10 +17,16 @@
{
int var15;
- for (boolean var6 = false; ((var15 = par1World.getBlockId(par3, par4, par5)) == 0 || var15 == Block.leaves.blockID) && par4 > 0; --par4)
+ Block block = null;
+ do
{
- ;
- }
+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)];
+ if (block != null && !block.isLeaves(par1World, par3, par4, par5))
+ {
+ break;
+ }
+ par4--;
+ } while (par4 > 0);
int var7 = par1World.getBlockId(par3, par4, par5);
@@ -42,7 +48,10 @@
{
int var14 = var13 - par5;
- if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var11, var8, var13)])
+ block = Block.blocksList[par1World.getBlockId(var11, var8, var13)];
+
+ if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var11, var8, var13)))
{
this.setBlockAndMetadata(par1World, var11, var8, var13, Block.leaves.blockID, this.field_76527_a);
}

View file

@ -0,0 +1,44 @@
--- ../src_base/common/net/minecraft/src/WorldGenSwamp.java
+++ ../src_work/common/net/minecraft/src/WorldGenSwamp.java
@@ -44,7 +44,7 @@
{
var12 = par1World.getBlockId(var10, var8, var11);
- if (var12 != 0 && var12 != Block.leaves.blockID)
+ if (var12 != 0 && (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11)))
{
if (var12 != Block.waterStill.blockID && var12 != Block.waterMoving.blockID)
{
@@ -91,7 +91,10 @@
{
int var15 = var14 - par5;
- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)])
+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)];
+
+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14)))
{
this.setBlock(par1World, var12, var16, var14, Block.leaves.blockID);
}
@@ -103,7 +106,9 @@
{
var10 = par1World.getBlockId(par3, par4 + var16, par5);
- if (var10 == 0 || var10 == Block.leaves.blockID || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID)
+ Block block = Block.blocksList[var10];
+
+ if (var10 == 0 || (block != null && block.isLeaves(par1World, par3, par4 + var16, par5)) || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID)
{
this.setBlock(par1World, par3, par4 + var16, par5, Block.wood.blockID);
}
@@ -118,7 +123,8 @@
{
for (var13 = par5 - var11; var13 <= par5 + var11; ++var13)
{
- if (par1World.getBlockId(var12, var16, var13) == Block.leaves.blockID)
+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var13)];
+ if (block != null && block.isLeaves(par1World, var12, var16, var13))
{
if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12 - 1, var16, var13) == 0)
{

View file

@ -0,0 +1,36 @@
--- ../src_base/common/net/minecraft/src/WorldGenTaiga1.java
+++ ../src_work/common/net/minecraft/src/WorldGenTaiga1.java
@@ -41,7 +41,9 @@
{
var15 = par1World.getBlockId(var13, var11, var14);
- if (var15 != 0 && var15 != Block.leaves.blockID)
+ Block block = Block.blocksList[var15];
+
+ if (var15 != 0 && (block == null || !block.isLeaves(par1World, var13, var11, var14)))
{
var10 = false;
}
@@ -77,7 +79,10 @@
{
int var17 = var16 - par5;
- if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var13, var16)])
+ Block block = Block.blocksList[par1World.getBlockId(var14, var13, var16)];
+
+ if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var13, var16)))
{
this.setBlockAndMetadata(par1World, var14, var13, var16, Block.leaves.blockID, 1);
}
@@ -98,7 +103,9 @@
{
var14 = par1World.getBlockId(par3, par4 + var13, par5);
- if (var14 == 0 || var14 == Block.leaves.blockID)
+ Block block = Block.blocksList[var14];
+
+ if (var14 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var13, par5))
{
this.setBlockAndMetadata(par1World, par3, par4 + var13, par5, Block.wood.blockID, 1);
}

View file

@ -0,0 +1,36 @@
--- ../src_base/common/net/minecraft/src/WorldGenTaiga2.java
+++ ../src_work/common/net/minecraft/src/WorldGenTaiga2.java
@@ -45,7 +45,9 @@
{
var15 = par1World.getBlockId(var13, var11, var14);
- if (var15 != 0 && var15 != Block.leaves.blockID)
+ Block block = Block.blocksList[var15];
+
+ if (var15 != 0 && block != null && !block.isLeaves(par1World, var13, var11, var14))
{
var10 = false;
}
@@ -87,7 +89,10 @@
{
int var20 = var19 - par5;
- if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var17, var16, var19)])
+ Block block = Block.blocksList[par1World.getBlockId(var17, var16, var19)];
+
+ if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var17, var16, var19)))
{
this.setBlockAndMetadata(par1World, var17, var16, var19, Block.leaves.blockID, 1);
}
@@ -117,7 +122,9 @@
{
var17 = par1World.getBlockId(par3, par4 + var16, par5);
- if (var17 == 0 || var17 == Block.leaves.blockID)
+ Block block = Block.blocksList[var17];
+
+ if (var17 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5))
{
this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 1);
}

View file

@ -0,0 +1,50 @@
--- ../src_base/common/net/minecraft/src/WorldGenTrees.java
+++ ../src_work/common/net/minecraft/src/WorldGenTrees.java
@@ -64,7 +64,13 @@
{
var12 = par1World.getBlockId(var10, var8, var11);
- if (var12 != 0 && var12 != Block.leaves.blockID && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && var12 != Block.wood.blockID)
+ Block block = Block.blocksList[var12];
+
+ if (var12 != 0 &&
+ !block.isLeaves(par1World, var10, var8, var11) &&
+ var12 != Block.grass.blockID &&
+ var12 != Block.dirt.blockID &&
+ !block.isWood(par1World, var10, var8, var11))
{
var7 = false;
}
@@ -107,7 +113,10 @@
{
int var17 = var16 - par5;
- if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var11, var16)])
+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var16)];
+
+ if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) &&
+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var11, var16)))
{
this.setBlockAndMetadata(par1World, var14, var11, var16, Block.leaves.blockID, this.metaLeaves);
}
@@ -119,7 +128,9 @@
{
var12 = par1World.getBlockId(par3, par4 + var11, par5);
- if (var12 == 0 || var12 == Block.leaves.blockID)
+ Block block = Block.blocksList[var12];
+
+ if (var12 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var11, par5))
{
this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.wood.blockID, this.metaWood);
@@ -159,7 +170,8 @@
{
for (var15 = par5 - var13; var15 <= par5 + var13; ++var15)
{
- if (par1World.getBlockId(var14, var11, var15) == Block.leaves.blockID)
+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var15)];
+ if (block != null && block.isLeaves(par1World, var14, var11, var15))
{
if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 - 1, var11, var15) == 0)
{

View file

@ -0,0 +1,96 @@
--- ../src_base/minecraft/net/minecraft/src/Entity.java
+++ ../src_work/minecraft/net/minecraft/src/Entity.java
@@ -1,5 +1,6 @@
package net.minecraft.src;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
@@ -180,6 +181,11 @@
public boolean isAirBorne;
public EnumEntitySize myEntitySize;
+ /** Forge: Used to store custom data for each entity. */
+ private NBTTagCompound customEntityData;
+ protected boolean captureDrops = false;
+ protected ArrayList<EntityItem> capturedDrops = new ArrayList<EntityItem>();
+
public Entity(World par1World)
{
this.entityId = nextEntityID++;
@@ -1364,6 +1370,10 @@
par1NBTTagCompound.setShort("Fire", (short)this.fire);
par1NBTTagCompound.setShort("Air", (short)this.getAir());
par1NBTTagCompound.setBoolean("OnGround", this.onGround);
+ if (customEntityData != null)
+ {
+ par1NBTTagCompound.setCompoundTag("ForgeData", customEntityData);
+ }
this.writeEntityToNBT(par1NBTTagCompound);
}
@@ -1405,6 +1415,10 @@
this.onGround = par1NBTTagCompound.getBoolean("OnGround");
this.setPosition(this.posX, this.posY, this.posZ);
this.setRotation(this.rotationYaw, this.rotationPitch);
+ if (par1NBTTagCompound.hasKey("ForgeData"))
+ {
+ customEntityData = par1NBTTagCompound.getCompoundTag("ForgeData");
+ }
this.readEntityFromNBT(par1NBTTagCompound);
}
@@ -1490,7 +1504,14 @@
{
EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY + (double)par2, this.posZ, par1ItemStack);
var3.delayBeforeCanPickup = 10;
- this.worldObj.spawnEntityInWorld(var3);
+ if (captureDrops)
+ {
+ capturedDrops.add(var3);
+ }
+ else
+ {
+ this.worldObj.spawnEntityInWorld(var3);
+ }
return var3;
}
@@ -1813,7 +1834,7 @@
*/
public boolean isRiding()
{
- return this.ridingEntity != null || this.getFlag(2);
+ return (this.ridingEntity != null && ridingEntity.shouldRiderSit()) || this.getFlag(2);
}
/**
@@ -2074,4 +2095,27 @@
{
return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] {this.getClass().getSimpleName(), this.getEntityName(), Integer.valueOf(this.entityId), this.worldObj == null ? "~NULL~" : this.worldObj.getWorldInfo().getWorldName(), Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ)});
}
+
+ /**
+ * Returns a NBTTagCompound that can be used to store custom data for this entity.
+ * It will be written, and read from disc, so it persists over world saves.
+ * @return A NBTTagCompound
+ */
+ public NBTTagCompound getEntityData()
+ {
+ if (customEntityData == null)
+ {
+ customEntityData = new NBTTagCompound();
+ }
+ return customEntityData;
+ }
+
+ /**
+ * Used in model rendering to determine if the entity riding this entity should be in the 'sitting' position.
+ * @return false to prevent an entity that is mounted to this entity from displaying the 'sitting' animation.
+ */
+ public boolean shouldRiderSit()
+ {
+ return true;
+ }
}

View file

@ -34,11 +34,13 @@
{
var2 += (float)(var3 * var3 + 1);
}
@@ -1056,6 +1066,7 @@
@@ -1055,7 +1065,9 @@
*/
public void destroyCurrentEquippedItem()
{
+ ItemStack oldItem = getCurrentEquippedItem();
this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null);
+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, var5);
+ ForgeHooks.onDestroyCurrentItem(this, oldItem);
}
/**

View file

@ -0,0 +1,67 @@
--- ../src_base/minecraft/net/minecraft/src/EntitySheep.java
+++ ../src_work/minecraft/net/minecraft/src/EntitySheep.java
@@ -1,8 +1,11 @@
package net.minecraft.src;
+import java.util.ArrayList;
import java.util.Random;
-public class EntitySheep extends EntityAnimal
+import net.minecraftforge.common.IShearable;
+
+public class EntitySheep extends EntityAnimal implements IShearable
{
/**
* Holds the RGB table of the sheep colors - in OpenGL glColor3f values - used to render the sheep colored fleece.
@@ -129,27 +132,6 @@
*/
public boolean interact(EntityPlayer par1EntityPlayer)
{
- ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem();
-
- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && !this.getSheared() && !this.isChild())
- {
- if (!this.worldObj.isRemote)
- {
- this.setSheared(true);
- int var3 = 1 + this.rand.nextInt(3);
-
- for (int var4 = 0; var4 < var3; ++var4)
- {
- EntityItem var5 = this.entityDropItem(new ItemStack(Block.cloth.blockID, 1, this.getFleeceColor()), 1.0F);
- var5.motionY += (double)(this.rand.nextFloat() * 0.05F);
- var5.motionX += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
- var5.motionZ += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
- }
- }
-
- var2.damageItem(1, par1EntityPlayer);
- }
-
return super.interact(par1EntityPlayer);
}
@@ -282,4 +264,23 @@
this.setGrowingAge(var1);
}
}
+
+ @Override
+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z)
+ {
+ return !getSheared() && !isChild();
+ }
+
+ @Override
+ public ArrayList<ItemStack> onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune)
+ {
+ ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
+ setSheared(true);
+ int i = 1 + rand.nextInt(3);
+ for (int j = 0; j < i; j++)
+ {
+ ret.add(new ItemStack(Block.cloth.blockID, 1, getFleeceColor()));
+ }
+ return ret;
+ }
}

View file

@ -0,0 +1,20 @@
--- ../src_base/minecraft/net/minecraft/src/GuiIngame.java
+++ ../src_work/minecraft/net/minecraft/src/GuiIngame.java
@@ -4,6 +4,8 @@
import java.util.List;
import java.util.Random;
import net.minecraft.client.Minecraft;
+import net.minecraftforge.common.ForgeHooks;
+
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
@@ -134,7 +136,7 @@
var47 = var7 - 39;
var22 = var47 - 10;
- var23 = this.mc.thePlayer.getTotalArmorValue();
+ var23 = ForgeHooks.getTotalArmorValue(mc.thePlayer);
int var24 = -1;
if (this.mc.thePlayer.isPotionActive(Potion.regeneration))

View file

@ -7,7 +7,7 @@
+
+import net.minecraftforge.common.ForgeHooks;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.BonemealEvent;
+import net.minecraftforge.event.entity.player.BonemealEvent;
public class ItemDye extends Item
{

View file

@ -0,0 +1,30 @@
--- ../src_base/minecraft/net/minecraft/src/MemoryConnection.java
+++ ../src_work/minecraft/net/minecraft/src/MemoryConnection.java
@@ -6,6 +6,8 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+
+import net.minecraftforge.common.ForgeHooks;
public class MemoryConnection implements NetworkManager
{
@@ -106,6 +108,7 @@
this.shuttingDown = true;
this.shutdownReason = par1Str;
this.field_74439_g = par2ArrayOfObj;
+ ForgeHooks.onDisconnect(this, par1Str, par2ArrayOfObj);
}
/**
@@ -151,4 +154,10 @@
this.readPacketCache.add(par1Packet);
}
}
+
+ @Override
+ public NetHandler getNetHandler()
+ {
+ return myNetHandler;
+ }
}

View file

@ -0,0 +1,20 @@
--- ../src_base/minecraft/net/minecraft/src/NetClientHandler.java
+++ ../src_work/minecraft/net/minecraft/src/NetClientHandler.java
@@ -18,6 +18,8 @@
import java.util.Random;
import javax.crypto.SecretKey;
import net.minecraft.client.Minecraft;
+import net.minecraftforge.common.ForgeHooks;
+
import org.lwjgl.input.Keyboard;
public class NetClientHandler extends NetHandler
@@ -56,6 +58,8 @@
this.mc = par1Minecraft;
Socket var4 = new Socket(InetAddress.getByName(par2Str), par3);
this.netManager = new TcpConnection(var4, "Client", this);
+
+ ForgeHooks.onConnect(netManager);
}
public NetClientHandler(Minecraft par1Minecraft, IntegratedServer par2IntegratedServer) throws IOException

View file

@ -0,0 +1,11 @@
--- ../src_base/minecraft/net/minecraft/src/NetworkManager.java
+++ ../src_work/minecraft/net/minecraft/src/NetworkManager.java
@@ -5,6 +5,8 @@
public interface NetworkManager
{
void setNetHandler(NetHandler var1);
+
+ NetHandler getNetHandler();
/**
* Adds the packet to the correct send queue (chunk data packets go to a separate queue).

View file

@ -1,6 +1,26 @@
--- ../src_base/minecraft/net/minecraft/src/PlayerControllerMP.java
+++ ../src_work/minecraft/net/minecraft/src/PlayerControllerMP.java
@@ -112,7 +112,7 @@
@@ -1,6 +1,7 @@
package net.minecraft.src;
import net.minecraft.client.Minecraft;
+import net.minecraftforge.common.ForgeHooks;
public class PlayerControllerMP
{
@@ -95,6 +96,11 @@
*/
public boolean onPlayerDestroyBlock(int par1, int par2, int par3, int par4)
{
+ ItemStack stack = mc.thePlayer.getCurrentEquippedItem();
+ if (stack != null && stack.getItem() != null && stack.getItem().onBlockStartBreak(stack, par1, par2, par3, mc.thePlayer))
+ {
+ return false;
+ }
if (this.currentGameType.isAdventure())
{
return false;
@@ -112,7 +118,7 @@
{
var5.playAuxSFX(2001, par1, par2, par3, var6.blockID + (var5.getBlockMetadata(par1, par2, par3) << 12));
int var7 = var5.getBlockMetadata(par1, par2, par3);
@ -9,3 +29,33 @@
if (var8)
{
@@ -290,6 +296,12 @@
public boolean onPlayerRightClick(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7, Vec3 par8Vec3)
{
this.syncCurrentPlayItem();
+ if (par3ItemStack != null &&
+ par3ItemStack.getItem() != null &&
+ par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7))
+ {
+ return true;
+ }
float var9 = (float)par8Vec3.xCoord - (float)par4;
float var10 = (float)par8Vec3.yCoord - (float)par5;
float var11 = (float)par8Vec3.zCoord - (float)par6;
@@ -333,6 +345,16 @@
else
{
return par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, var9, var10, var11);
+
+ if (!par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, var9, var10, var11))
+ {
+ return false;
+ }
+ if (par3ItemStack.stackSize <= 0)
+ {
+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, par3ItemStack);
+ }
+ return true;
}
}

View file

@ -0,0 +1,41 @@
--- ../src_base/minecraft/net/minecraft/src/RenderBiped.java
+++ ../src_work/minecraft/net/minecraft/src/RenderBiped.java
@@ -1,6 +1,10 @@
package net.minecraft.src;
import org.lwjgl.opengl.GL11;
+import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED;
+import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
public class RenderBiped extends RenderLiving
{
@@ -31,8 +35,11 @@
this.modelBipedMain.bipedRightArm.postRender(0.0625F);
GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
float var4;
-
- if (var3.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType()))
+
+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var3, EQUIPPED);
+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var3, BLOCK_3D));
+
+ if (var3.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())))
{
var4 = 0.5F;
GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
@@ -71,8 +78,11 @@
this.renderManager.itemRenderer.renderItem(par1EntityLiving, var3, 0);
if (var3.getItem().requiresMultipleRenderPasses())
- {
- this.renderManager.itemRenderer.renderItem(par1EntityLiving, var3, 1);
+ {
+ for (int x = 1; x < var3.getItem().getRenderPasses(var3.getItemDamage()); x++)
+ {
+ this.renderManager.itemRenderer.renderItem(par1EntityLiving, var3, x);
+ }
}
GL11.glPopMatrix();

View file

@ -0,0 +1,28 @@
--- ../src_base/minecraft/net/minecraft/src/RenderEngine.java
+++ ../src_work/minecraft/net/minecraft/src/RenderEngine.java
@@ -14,6 +14,9 @@
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
+
+import net.minecraftforge.client.ForgeHooksClient;
+
import org.lwjgl.opengl.GL11;
public class RenderEngine
@@ -155,6 +158,7 @@
try
{
+ ForgeHooksClient.onTextureLoadPre(par1Str);
this.singleIntBuffer.clear();
GLAllocation.generateTextureNames(this.singleIntBuffer);
int var3 = this.singleIntBuffer.get(0);
@@ -198,6 +202,7 @@
}
this.textureMap.put(par1Str, Integer.valueOf(var3));
+ ForgeHooksClient.onTextureLoad(par1Str, var6);
return var3;
}
catch (Exception var5)

View file

@ -0,0 +1,47 @@
--- ../src_base/minecraft/net/minecraft/src/RenderGlobal.java
+++ ../src_work/minecraft/net/minecraft/src/RenderGlobal.java
@@ -1787,6 +1787,7 @@
double var17 = this.mc.renderViewEntity.posY - par4;
double var19 = this.mc.renderViewEntity.posZ - par6;
EntityFX var21 = null;
+ Object effectObject = null;
if (par1Str.equals("hugeexplosion"))
{
@@ -1906,6 +1907,7 @@
else if (par1Str.equals("snowballpoof"))
{
var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.snowball);
+ effectObject = Item.snowball;
}
else if (par1Str.equals("dripWater"))
{
@@ -1922,6 +1924,7 @@
else if (par1Str.equals("slime"))
{
var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.slimeBall);
+ effectObject = Item.slimeBall;
}
else if (par1Str.equals("heart"))
{
@@ -1935,17 +1938,19 @@
{
var24 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1));
var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Item.itemsList[var24]);
+ effectObject = Item.itemsList[var24];
}
else if (par1Str.startsWith("tilecrack_"))
{
var24 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1));
var21 = new EntityDiggingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Block.blocksList[var24], 0, 0);
+ effectObject = Block.blocksList[var24];
}
}
if (var21 != null)
{
- this.mc.effectRenderer.addEffect((EntityFX)var21);
+ this.mc.effectRenderer.addEffect((EntityFX)var21, effectObject);
}
return (EntityFX)var21;

View file

@ -0,0 +1,22 @@
--- ../src_base/minecraft/net/minecraft/src/RenderManager.java
+++ ../src_work/minecraft/net/minecraft/src/RenderManager.java
@@ -124,12 +124,14 @@
if (par4EntityLiving.isPlayerSleeping())
{
- int var7 = par1World.getBlockId(MathHelper.floor_double(par4EntityLiving.posX), MathHelper.floor_double(par4EntityLiving.posY), MathHelper.floor_double(par4EntityLiving.posZ));
-
- if (var7 == Block.bed.blockID)
+ int x = MathHelper.floor_double(par4EntityLiving.posX);
+ int y = MathHelper.floor_double(par4EntityLiving.posY);
+ int z = MathHelper.floor_double(par4EntityLiving.posZ);
+ Block block = Block.blocksList[par1World.getBlockId(x, y, z)];
+
+ if (block != null && block.isBed(par1World, x, y, z, par4EntityLiving))
{
- int var8 = par1World.getBlockMetadata(MathHelper.floor_double(par4EntityLiving.posX), MathHelper.floor_double(par4EntityLiving.posY), MathHelper.floor_double(par4EntityLiving.posZ));
- int var9 = var8 & 3;
+ int var9 = block.getBedDirection(par1World, x, y, z);;
this.playerViewY = (float)(var9 * 90 + 180);
this.playerViewX = 0.0F;
}

View file

@ -0,0 +1,30 @@
--- ../src_base/minecraft/net/minecraft/src/RenderSnowMan.java
+++ ../src_work/minecraft/net/minecraft/src/RenderSnowMan.java
@@ -1,4 +1,9 @@
package net.minecraft.src;
+
+import net.minecraftforge.client.IItemRenderer;
+import static net.minecraftforge.client.IItemRenderer.ItemRenderType.*;
+import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.*;
+import net.minecraftforge.client.MinecraftForgeClient;
import org.lwjgl.opengl.GL11;
@@ -19,12 +24,15 @@
super.renderEquippedItems(par1EntitySnowman, par2);
ItemStack var3 = new ItemStack(Block.pumpkin, 1);
- if (var3 != null && var3.getItem().shiftedIndex < 256)
+ if (var3 != null && var3.getItem() instanceof ItemBlock)
{
GL11.glPushMatrix();
this.snowmanModel.field_78195_c.postRender(0.0625F);
- if (RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType()))
+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var3, EQUIPPED);
+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var3, BLOCK_3D));
+
+ if (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType()))
{
float var4 = 0.625F;
GL11.glTranslatef(0.0F, -0.34375F, 0.0F);

View file

@ -0,0 +1,53 @@
--- ../src_base/minecraft/net/minecraft/src/SoundPool.java
+++ ../src_work/minecraft/net/minecraft/src/SoundPool.java
@@ -2,6 +2,7 @@
import java.io.File;
import java.net.MalformedURLException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -33,6 +34,26 @@
*/
public SoundPoolEntry addSound(String par1Str, File par2File)
{
+ try
+ {
+ return addSound(par1Str, par2File.toURI().toURL());
+ }
+ catch (MalformedURLException ex)
+ {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * URL version of addSound, as the back-end sound engine has full support for various types of URLs
+ *
+ * @param par1Str The name of the sound to add
+ * @param url The url of the sound resource
+ * @return A SoundPoolEntry for the newly added sound
+ */
+ public SoundPoolEntry addSound(String par1Str, URL url)
+ {
try
{
String var3 = par1Str;
@@ -53,13 +74,13 @@
this.nameToSoundPoolEntriesMapping.put(par1Str, new ArrayList());
}
- SoundPoolEntry var4 = new SoundPoolEntry(var3, par2File.toURI().toURL());
+ SoundPoolEntry var4 = new SoundPoolEntry(var3, url);
((List)this.nameToSoundPoolEntriesMapping.get(par1Str)).add(var4);
this.allSoundPoolEntries.add(var4);
++this.numberOfSoundPoolEntries;
return var4;
}
- catch (MalformedURLException var5)
+ catch (Exception var5)
{
var5.printStackTrace();
throw new RuntimeException(var5);

View file

@ -0,0 +1,30 @@
--- ../src_base/minecraft/net/minecraft/src/TcpConnection.java
+++ ../src_work/minecraft/net/minecraft/src/TcpConnection.java
@@ -14,6 +14,8 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.crypto.SecretKey;
+
+import net.minecraftforge.common.ForgeHooks;
public class TcpConnection implements NetworkManager
{
@@ -399,6 +401,7 @@
{
;
}
+ ForgeHooks.onDisconnect(this, par1Str, par2ArrayOfObj);
}
}
@@ -559,4 +562,10 @@
{
return par0TcpConnection.writeThread;
}
+
+ @Override
+ public NetHandler getNetHandler()
+ {
+ return theNetHandler;
+ }
}

View file

@ -1,6 +1,6 @@
--- ../src_base/minecraft/net/minecraft/src/TileEntity.java
+++ ../src_work/minecraft/net/minecraft/src/TileEntity.java
@@ -243,4 +243,29 @@
@@ -243,4 +243,33 @@
addMapping(TileEntityEnchantmentTable.class, "EnchantTable");
addMapping(TileEntityEndPortal.class, "Airportal");
}
@ -23,10 +23,14 @@
+ * @param net The NetworkManager the packet originated from
+ * @param pkt The data packet
+ */
+ public void onDataPacket(NetworkManager net, Packet132TileEntityData pkt){}
+ public void onDataPacket(NetworkManager net, Packet132TileEntityData pkt)
+ {
+ }
+
+ /**
+ * Called when the chunk this TileEntity is on is Unloaded.
+ */
+ public void onChunkUnload(){}
+ public void onChunkUnload()
+ {
+ }
}

View file

@ -0,0 +1,27 @@
--- ../src_base/minecraft/net/minecraft/src/TileEntityRendererPiston.java
+++ ../src_work/minecraft/net/minecraft/src/TileEntityRendererPiston.java
@@ -1,6 +1,8 @@
package net.minecraft.src;
import net.minecraft.client.Minecraft;
+import net.minecraftforge.client.ForgeHooksClient;
+
import org.lwjgl.opengl.GL11;
public class TileEntityRendererPiston extends TileEntitySpecialRenderer
@@ -30,6 +32,7 @@
GL11.glShadeModel(GL11.GL_FLAT);
}
+ ForgeHooksClient.beforeBlockRender(var9, blockRenderer);
var10.startDrawingQuads();
var10.setTranslation((double)((float)par2 - (float)par1TileEntityPiston.xCoord + par1TileEntityPiston.getOffsetX(par8)), (double)((float)par4 - (float)par1TileEntityPiston.yCoord + par1TileEntityPiston.getOffsetY(par8)), (double)((float)par6 - (float)par1TileEntityPiston.zCoord + par1TileEntityPiston.getOffsetZ(par8)));
var10.setColorOpaque(1, 1, 1);
@@ -53,6 +56,7 @@
var10.setTranslation(0.0D, 0.0D, 0.0D);
var10.draw();
+ ForgeHooksClient.afterBlockRender(var9, blockRenderer);
RenderHelper.enableStandardItemLighting();
}
}