diff --git a/common/net/minecraftforge/fluids/BlockFluidBase.java b/common/net/minecraftforge/fluids/BlockFluidBase.java index 5ec9f9234..91716d0c4 100644 --- a/common/net/minecraftforge/fluids/BlockFluidBase.java +++ b/common/net/minecraftforge/fluids/BlockFluidBase.java @@ -451,4 +451,13 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock { return FluidRegistry.getFluid(fluidName); } + + @Override + public float getFilledPercentage(World world, int x, int y, int z) + { + int quantaRemaining = getQuantaValue(world, x, y, z) + 1; + float remaining = quantaRemaining / quantaPerBlockFloat; + if (remaining > 1) remaining = 1.0f; + return remaining * (density > 0 ? 1 : -1); + } } diff --git a/common/net/minecraftforge/fluids/IFluidBlock.java b/common/net/minecraftforge/fluids/IFluidBlock.java index f2f13b23e..3f5bec69d 100644 --- a/common/net/minecraftforge/fluids/IFluidBlock.java +++ b/common/net/minecraftforge/fluids/IFluidBlock.java @@ -37,4 +37,15 @@ public interface IFluidBlock * @return */ boolean canDrain(World world, int x, int y, int z); + + /** + * Returns the amount of a single block is filled. Value between 0 and 1. + * 1 meaning the entire 1x1x1 cube is full, 0 meaning completely empty. + * + * If the return value is negative. It will be treated as filling the block + * from the top down instead of bottom up. + * + * @return + */ + float getFilledPercentage(World world, int x, int y, int z); } diff --git a/patches/minecraft/net/minecraft/block/Block.java.patch b/patches/minecraft/net/minecraft/block/Block.java.patch index 07ccb81a6..df12f2016 100644 --- a/patches/minecraft/net/minecraft/block/Block.java.patch +++ b/patches/minecraft/net/minecraft/block/Block.java.patch @@ -167,7 +167,7 @@ } /** -@@ -1454,4 +1477,975 @@ +@@ -1454,4 +1477,979 @@ canBlockGrass[0] = true; StatList.initBreakableStats(); } @@ -1142,4 +1142,8 @@ + { + return false; + } ++ ++ @Deprecated //Implemented here as we changed the IFluidBlock interface, and this allows us to do so without breaking exisitng mods. ++ // To be removed next MC version {1.6.3+} ++ public float getFilledPercentage(World world, int x, int y, int z){ return 1; } } diff --git a/patches/minecraft/net/minecraft/block/BlockFluid.java.patch b/patches/minecraft/net/minecraft/block/BlockFluid.java.patch index 5c0bfbc93..5aa1d6cdd 100644 --- a/patches/minecraft/net/minecraft/block/BlockFluid.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockFluid.java.patch @@ -9,3 +9,17 @@ l += (i2 & 16711680) >> 16; i1 += (i2 & 65280) >> 8; j1 += i2 & 255; +@@ -81,6 +81,13 @@ + } + + return (float)(par0 + 1) / 9.0F; ++ } ++ ++ ++ @Deprecated //Implemented here for compatibility, need to change this when we make vanilla fluids use our fluid methods. ++ public float getFilledPercentage(IBlockAccess world, int x, int y, int z) ++ { ++ return 1 - BlockFluid.getFluidHeightPercent(world.getBlockMetadata(x, y, z)); + } + + @SideOnly(Side.CLIENT) diff --git a/patches/minecraft/net/minecraft/entity/Entity.java.patch b/patches/minecraft/net/minecraft/entity/Entity.java.patch index 9eada4431..3a732896e 100644 --- a/patches/minecraft/net/minecraft/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/entity/Entity.java.patch @@ -1,17 +1,22 @@ --- ../src_base/minecraft/net/minecraft/entity/Entity.java +++ ../src_work/minecraft/net/minecraft/entity/Entity.java -@@ -1,7 +1,10 @@ +@@ -1,10 +1,15 @@ package net.minecraft.entity; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; ++ +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.UUID; -@@ -13,8 +16,13 @@ ++ + import net.minecraft.block.Block; + import net.minecraft.block.BlockFluid; + import net.minecraft.block.StepSound; +@@ -13,8 +18,13 @@ import net.minecraft.crash.CrashReportCategory; import net.minecraft.enchantment.EnchantmentProtection; import net.minecraft.entity.effect.EntityLightningBolt; @@ -25,7 +30,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagDouble; -@@ -26,12 +34,16 @@ +@@ -26,12 +36,18 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; import net.minecraft.util.MathHelper; @@ -39,10 +44,12 @@ +import net.minecraftforge.common.IExtendedEntityProperties; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.EntityEvent; ++import net.minecraftforge.fluids.Fluid; ++import net.minecraftforge.fluids.IFluidBlock; public abstract class Entity { -@@ -218,6 +230,13 @@ +@@ -218,6 +234,13 @@ private boolean invulnerable; private UUID entityUniqueID; public EnumEntitySize myEntitySize; @@ -56,7 +63,7 @@ public Entity(World par1World) { -@@ -245,6 +264,15 @@ +@@ -245,6 +268,15 @@ this.dataWatcher.addObject(0, Byte.valueOf((byte)0)); this.dataWatcher.addObject(1, Short.valueOf((short)300)); this.entityInit(); @@ -72,7 +79,33 @@ } protected abstract void entityInit(); -@@ -1523,6 +1551,21 @@ +@@ -1164,11 +1196,20 @@ + int k = MathHelper.floor_double(this.posZ); + int l = this.worldObj.getBlockId(i, j, k); + +- if (l != 0 && Block.blocksList[l].blockMaterial == par1Material) +- { +- float f = BlockFluid.getFluidHeightPercent(this.worldObj.getBlockMetadata(i, j, k)) - 0.11111111F; +- float f1 = (float)(j + 1) - f; +- return d0 < (double)f1; ++ Block block = Block.blocksList[l]; ++ if (block != null && block.blockMaterial == par1Material) ++ { ++ double filled = block.getFilledPercentage(worldObj, i, j, k); ++ if (filled < 0) ++ { ++ filled *= -1; ++ //filled -= 0.11111111F; //Why this is needed.. not sure... ++ return d0 > (double)(j + (1 - filled)); ++ } ++ else ++ { ++ return d0 < (double)(j + filled); ++ } + } + else + { +@@ -1523,6 +1564,21 @@ par1NBTTagCompound.setInteger("PortalCooldown", this.timeUntilPortal); par1NBTTagCompound.setLong("UUIDMost", this.entityUniqueID.getMostSignificantBits()); par1NBTTagCompound.setLong("UUIDLeast", this.entityUniqueID.getLeastSignificantBits()); @@ -94,7 +127,7 @@ this.writeEntityToNBT(par1NBTTagCompound); if (this.ridingEntity != null) -@@ -1593,6 +1636,26 @@ +@@ -1593,6 +1649,26 @@ this.setPosition(this.posX, this.posY, this.posZ); this.setRotation(this.rotationYaw, this.rotationPitch); @@ -121,7 +154,7 @@ this.readEntityFromNBT(par1NBTTagCompound); if (this.func_142008_O()) -@@ -1705,7 +1768,14 @@ +@@ -1705,7 +1781,14 @@ { EntityItem entityitem = new EntityItem(this.worldObj, this.posX, this.posY + (double)par2, this.posZ, par1ItemStack); entityitem.delayBeforeCanPickup = 10; @@ -137,7 +170,7 @@ return entityitem; } } -@@ -2001,7 +2071,7 @@ +@@ -2001,7 +2084,7 @@ */ public boolean isRiding() { @@ -146,7 +179,7 @@ } /** -@@ -2363,7 +2433,7 @@ +@@ -2363,7 +2446,7 @@ public float func_82146_a(Explosion par1Explosion, World par2World, int par3, int par4, int par5, Block par6Block) { @@ -155,7 +188,7 @@ } public boolean func_96091_a(Explosion par1Explosion, World par2World, int par3, int par4, int par5, int par6, float par7) -@@ -2426,4 +2496,170 @@ +@@ -2426,4 +2509,170 @@ { return this.getEntityName(); }