--- ../src-base/minecraft/net/minecraft/entity/Entity.java
+++ ../src-work/minecraft/net/minecraft/entity/Entity.java
@@ -128,6 +128,14 @@
     private final CommandResultStats field_174837_as;
     private static final String __OBFID = "CL_00001533";
 
+    /** Forge: Used to store custom data for each entity. */
+    private NBTTagCompound customEntityData;
+    public boolean captureDrops = false;
+    public java.util.ArrayList<EntityItem> capturedDrops = new java.util.ArrayList<EntityItem>();
+    private UUID persistentID;
+
+    protected java.util.HashMap<String, net.minecraftforge.common.IExtendedEntityProperties> extendedProperties;
+
     public int func_145782_y()
     {
         return this.field_145783_c;
@@ -171,6 +179,7 @@
         this.field_70180_af.func_75682_a(2, "");
         this.field_70180_af.func_75682_a(4, Byte.valueOf((byte)0));
         this.func_70088_a();
+        extendedProperties = net.minecraftforge.event.ForgeEventFactory.onEntityConstructing(this, p_i1582_1_);
     }
 
     protected abstract void func_70088_a();
@@ -1010,10 +1019,7 @@
 
         if (block.func_149688_o() == p_70055_1_)
         {
-            float f = BlockLiquid.func_149801_b(iblockstate.func_177230_c().func_176201_c(iblockstate)) - 0.11111111F;
-            float f1 = (float)(blockpos.func_177956_o() + 1) - f;
-            boolean flag = d0 < (double)f1;
-            return !flag && this instanceof EntityPlayer ? false : flag;
+            return net.minecraftforge.common.ForgeHooks.isInsideOfMaterial(p_70055_1_, this, blockpos);
         }
         else
         {
@@ -1378,6 +1384,21 @@
                 p_70109_1_.func_74757_a("Silent", this.func_174814_R());
             }
 
+            if (customEntityData != null) p_70109_1_.func_74782_a("ForgeData", customEntityData);
+            for (String identifier : this.extendedProperties.keySet())
+            {
+                try
+                {
+                    net.minecraftforge.common.IExtendedEntityProperties props = this.extendedProperties.get(identifier);
+                    props.saveNBTData(p_70109_1_);
+                }
+                catch (Throwable t)
+                {
+                    net.minecraftforge.fml.common.FMLLog.severe("Failed to save extended properties for %s.  This is a mod issue.", identifier);
+                    t.printStackTrace();
+                }
+            }
+
             this.func_70014_b(p_70109_1_);
 
             if (this.field_70154_o != null)
@@ -1458,6 +1479,28 @@
             this.func_174805_g(p_70020_1_.func_74767_n("CustomNameVisible"));
             this.field_174837_as.func_179668_a(p_70020_1_);
             this.func_174810_b(p_70020_1_.func_74767_n("Silent"));
+
+            if (p_70020_1_.func_74764_b("ForgeData")) customEntityData = p_70020_1_.func_74775_l("ForgeData");
+            for (String identifier : this.extendedProperties.keySet())
+            {
+                try
+                {
+                    net.minecraftforge.common.IExtendedEntityProperties props = this.extendedProperties.get(identifier);
+                    props.loadNBTData(p_70020_1_);
+                }
+                catch (Throwable t)
+                {
+                    net.minecraftforge.fml.common.FMLLog.severe("Failed to load extended properties for %s.  This is a mod issue.", identifier);
+                    t.printStackTrace();
+                }
+            }
+
+            //Rawr, legacy code, Vanilla added a UUID, keep this so older maps will convert properly
+            if (p_70020_1_.func_74764_b("PersistentIDMSB") && p_70020_1_.func_74764_b("PersistentIDLSB"))
+            {
+                this.field_96093_i = new UUID(p_70020_1_.func_74763_f("PersistentIDMSB"), p_70020_1_.func_74763_f("PersistentIDLSB"));
+            }
+
             this.func_70037_a(p_70020_1_);
 
             if (this.func_142008_O())
@@ -1536,7 +1579,10 @@
         {
             EntityItem entityitem = new EntityItem(this.field_70170_p, this.field_70165_t, this.field_70163_u + (double)p_70099_2_, this.field_70161_v, p_70099_1_);
             entityitem.func_174869_p();
-            this.field_70170_p.func_72838_d(entityitem);
+            if (captureDrops)
+                this.capturedDrops.add(entityitem);
+            else
+                this.field_70170_p.func_72838_d(entityitem);
             return entityitem;
         }
         else
@@ -1810,7 +1856,7 @@
 
     public boolean func_70115_ae()
     {
-        return this.field_70154_o != null;
+        return this.field_70154_o != null && field_70154_o.shouldRiderSit();
     }
 
     public boolean func_70093_af()
@@ -2103,7 +2149,7 @@
 
     public float func_180428_a(Explosion p_180428_1_, World p_180428_2_, BlockPos p_180428_3_, IBlockState p_180428_4_)
     {
-        return p_180428_4_.func_177230_c().func_149638_a(this);
+        return p_180428_4_.func_177230_c().getExplosionResistance(p_180428_2_, p_180428_3_.func_177963_a(0, func_70047_e(), 0), this, p_180428_1_);
     }
 
     public boolean func_174816_a(Explosion p_174816_1_, World p_174816_2_, BlockPos p_174816_3_, IBlockState p_174816_4_, float p_174816_5_)
@@ -2357,4 +2403,176 @@
 
         EnchantmentHelper.func_151385_b(p_174815_1_, p_174815_2_);
     }
+
+    /* ================================== Forge Start =====================================*/
+    /**
+     * 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;
+    }
+
+    /**
+     * Called when a user uses the creative pick block button on this entity.
+     *
+     * @param target The full target the player is looking at
+     * @return A ItemStack to add to the player's inventory, Null if nothing should be added.
+     */
+    public ItemStack getPickedResult(MovingObjectPosition target)
+    {
+        if (this instanceof net.minecraft.entity.item.EntityPainting)
+        {
+            return new ItemStack(net.minecraft.init.Items.field_151159_an);
+        }
+        else if (this instanceof EntityLeashKnot)
+        {
+            return new ItemStack(net.minecraft.init.Items.field_151058_ca);
+        }
+        else if (this instanceof net.minecraft.entity.item.EntityItemFrame)
+        {
+            ItemStack held = ((net.minecraft.entity.item.EntityItemFrame)this).func_82335_i();
+            if (held == null)
+            {
+                return new ItemStack(net.minecraft.init.Items.field_151160_bD);
+            }
+            else
+            {
+                return held.func_77946_l();
+            }
+        }
+        else if (this instanceof net.minecraft.entity.item.EntityMinecart)
+        {
+            return ((net.minecraft.entity.item.EntityMinecart)this).getCartItem();
+        }
+        else if (this instanceof net.minecraft.entity.item.EntityBoat)
+        {
+            return new ItemStack(net.minecraft.init.Items.field_151124_az);
+        }
+        else if (this instanceof net.minecraft.entity.item.EntityArmorStand)
+        {
+            return new ItemStack(net.minecraft.init.Items.field_179565_cj);
+        }
+        else
+        {
+            int id = EntityList.func_75619_a(this);
+            if (id > 0 && EntityList.field_75627_a.containsKey(id))
+            {
+                return new ItemStack(net.minecraft.init.Items.field_151063_bx, 1, id);
+            }
+        }
+        return null;
+    }
+
+    public UUID getPersistentID()
+    {
+        return field_96093_i;
+    }
+
+    /**
+     * Reset the entity ID to a new value. Not to be used from Mod code
+     */
+    public final void resetEntityId()
+    {
+        this.field_145783_c = field_70152_a++;
+    }
+
+    public boolean shouldRenderInPass(int pass)
+    {
+        return pass == 0;
+    }
+
+    /**
+     * Returns true if the entity is of the @link{EnumCreatureType} provided
+     * @param type The EnumCreatureType type this entity is evaluating
+     * @param forSpawnCount If this is being invoked to check spawn count caps.
+     * @return If the creature is of the type provided
+     */
+    public boolean isCreatureType(EnumCreatureType type, boolean forSpawnCount)
+    {
+        return type.func_75598_a().isAssignableFrom(this.getClass());
+    }
+
+    /**
+     * Register the instance of IExtendedProperties into the entity's collection.
+     * @param identifier The identifier which you can use to retrieve these properties for the entity.
+     * @param properties The instanceof IExtendedProperties to register
+     * @return The identifier that was used to register the extended properties.  Empty String indicates an error.  If your requested key already existed, this will return a modified one that is unique.
+     */
+    public String registerExtendedProperties(String identifier, net.minecraftforge.common.IExtendedEntityProperties properties)
+    {
+        if (identifier == null)
+        {
+            net.minecraftforge.fml.common.FMLLog.warning("Someone is attempting to register extended properties using a null identifier.  This is not allowed.  Aborting.  This may have caused instability.");
+            return "";
+        }
+        if (properties == null)
+        {
+            net.minecraftforge.fml.common.FMLLog.warning("Someone is attempting to register null extended properties.  This is not allowed.  Aborting.  This may have caused instability.");
+            return "";
+        }
+
+        String baseIdentifier = identifier;
+        int identifierModCount = 1;
+        while (this.extendedProperties.containsKey(identifier))
+        {
+            identifier = String.format("%s%d", baseIdentifier, identifierModCount++);
+        }
+
+        if (baseIdentifier != identifier)
+        {
+            net.minecraftforge.fml.common.FMLLog.info("An attempt was made to register exended properties using an existing key.  The duplicate identifier (%s) has been remapped to %s.", baseIdentifier, identifier);
+        }
+
+        this.extendedProperties.put(identifier, properties);
+        return identifier;
+    }
+
+    /**
+     * Gets the extended properties identified by the passed in key
+     * @param identifier The key that identifies the extended properties.
+     * @return The instance of IExtendedProperties that was found, or null.
+     */
+    public net.minecraftforge.common.IExtendedEntityProperties getExtendedProperties(String identifier)
+    {
+        return this.extendedProperties.get(identifier);
+    }
+
+    /**
+     * If a rider of this entity can interact with this entity. Should return true on the
+     * ridden entity if so.
+     *
+     * @return if the entity can be interacted with from a rider
+     */
+    public boolean canRiderInteract()
+    {
+        return false;
+    }
+
+    /**
+     * If the rider should be dismounted from the entity when the entity goes under water
+     *
+     * @param rider The entity that is riding
+     * @return if the entity should be dismounted when under water
+     */
+    public boolean shouldDismountInWater(Entity rider)
+    {
+        return this instanceof EntityLivingBase;
+    }
+    /* ================================== Forge End =====================================*/
 }
