diff --git a/client/net/minecraftforge/client/event/RenderLivingEvent.java b/client/net/minecraftforge/client/event/RenderLivingEvent.java index 6c64db9c3..7b028e1f5 100644 --- a/client/net/minecraftforge/client/event/RenderLivingEvent.java +++ b/client/net/minecraftforge/client/event/RenderLivingEvent.java @@ -15,6 +15,16 @@ public abstract class RenderLivingEvent extends Event this.entity = entity; this.renderer = renderer; } + + @Cancelable + public static class Pre extends RenderLivingEvent + { + public Pre(EntityLivingBase entity, RendererLivingEntity renderer){ super(entity, renderer); } + } + public static class Post extends RenderLivingEvent + { + public Post(EntityLivingBase entity, RendererLivingEntity renderer){ super(entity, renderer); } + } public abstract static class Specials extends RenderLivingEvent { diff --git a/common/net/minecraftforge/fluids/BlockFluidBase.java b/common/net/minecraftforge/fluids/BlockFluidBase.java index 5aea68e42..826ec6c07 100644 --- a/common/net/minecraftforge/fluids/BlockFluidBase.java +++ b/common/net/minecraftforge/fluids/BlockFluidBase.java @@ -15,11 +15,11 @@ import net.minecraft.world.World; /** * This is a base implementation for Fluid blocks. - * + * * It is highly recommended that you extend this class or one of the Forge-provided child classes. - * + * * @author King Lemming, OvermindDL1 - * + * */ public abstract class BlockFluidBase extends Block implements IFluidBlock { @@ -39,6 +39,7 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock protected float quantaPerBlockFloat = 8F; protected int density = 1; protected int densityDir = -1; + protected int temperature = 295; protected int tickRate = 20; protected int renderPass = 1; @@ -55,6 +56,7 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock this.fluidName = fluid.getName(); this.density = fluid.density; + this.temperature = fluid.temperature; this.maxScaledLight = fluid.luminosity; this.tickRate = fluid.viscosity / 200; fluid.setBlockID(id); @@ -78,6 +80,12 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock return this; } + public BlockFluidBase setTemperature(int temperature) + { + this.temperature = temperature; + return this; + } + public BlockFluidBase setTickRate(int tickRate) { if (tickRate <= 0) tickRate = 20; @@ -121,7 +129,15 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock { return false; } - return true; + + if (this.density > getDensity(world, x, y, z)) + { + return true; + } + else + { + return false; + } } /** @@ -156,7 +172,15 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock return false; } Block.blocksList[bId].dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); - return true; + + if (this.density > getDensity(world, x, y, z)) + { + return true; + } + else + { + return false; + } } public abstract int getQuantaValue(IBlockAccess world, int x, int y, int z); @@ -272,7 +296,7 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock int lightUpBase = lightUp & 255; int lightThisExt = lightThis >> 16 & 255; int lightUpExt = lightUp >> 16 & 255; - return (lightThisBase > lightUpBase ? lightThisBase : lightUpBase) | + return (lightThisBase > lightUpBase ? lightThisBase : lightUpBase) | ((lightThisExt > lightUpExt ? lightThisExt : lightUpExt) << 16); } @@ -303,11 +327,21 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock } return ((BlockFluidBase)block).density; } + + public static final int getTemperature(IBlockAccess world, int x, int y, int z) + { + Block block = Block.blocksList[world.getBlockId(x, y, z)]; + if (!(block instanceof BlockFluidBase)) + { + return Integer.MAX_VALUE; + } + return ((BlockFluidBase)block).temperature; + } public static double getFlowDirection(IBlockAccess world, int x, int y, int z) { Block block = Block.blocksList[world.getBlockId(x, y, z)]; - if (!(block instanceof BlockFluidBase)) + if (!world.getBlockMaterial(x, y, z).isLiquid()) { return -1000.0; } @@ -381,7 +415,7 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock if (world.getBlockId(x, y + 1, z) == blockID) { - boolean flag = + boolean flag = isBlockSolid(world, x, y, z - 1, 2) || isBlockSolid(world, x, y, z + 1, 3) || isBlockSolid(world, x - 1, y, z, 4) || @@ -390,7 +424,7 @@ public abstract class BlockFluidBase extends Block implements IFluidBlock isBlockSolid(world, x, y + 1, z + 1, 3) || isBlockSolid(world, x - 1, y + 1, z, 4) || isBlockSolid(world, x + 1, y + 1, z, 5); - + if (flag) { vec = vec.normalize().addVector(0.0D, -6.0D, 0.0D); diff --git a/common/net/minecraftforge/fluids/BlockFluidClassic.java b/common/net/minecraftforge/fluids/BlockFluidClassic.java index ae63e2ceb..b5349ca6f 100644 --- a/common/net/minecraftforge/fluids/BlockFluidClassic.java +++ b/common/net/minecraftforge/fluids/BlockFluidClassic.java @@ -10,11 +10,11 @@ import net.minecraft.world.World; /** * This is a fluid block implementation which emulates vanilla Minecraft fluid behavior. - * + * * It is highly recommended that you use/extend this class for "classic" fluid blocks. - * + * * @author King Lemming - * + * */ public class BlockFluidClassic extends BlockFluidBase { @@ -92,8 +92,8 @@ public class BlockFluidClassic extends BlockFluidBase { int y2 = y - densityDir; - if (world.getBlockId(x, y2, z ) == blockID || - world.getBlockId(x - 1, y2, z ) == blockID || + if (world.getBlockId(x, y2, z ) == blockID || + world.getBlockId(x - 1, y2, z ) == blockID || world.getBlockId(x + 1, y2, z ) == blockID || world.getBlockId(x, y2, z - 1) == blockID || world.getBlockId(x, y2, z + 1) == blockID) @@ -128,9 +128,10 @@ public class BlockFluidClassic extends BlockFluidBase } } } - else if (quantaRemaining > quantaPerBlock) + // This is a "source" block, set meta to zero, and send a server only update + else if (quantaRemaining >= quantaPerBlock) { - world.setBlockMetadataWithNotify(x, y, z, 0, 3); + world.setBlockMetadataWithNotify(x, y, z, 0, 2); } // Flow vertically if possible @@ -226,7 +227,7 @@ public class BlockFluidClassic extends BlockFluidBase int cost = 1000; for (int adjSide = 0; adjSide < 4; adjSide++) { - if ((adjSide == 0 && side == 1) || + if ((adjSide == 0 && side == 1) || (adjSide == 1 && side == 0) || (adjSide == 2 && side == 3) || (adjSide == 3 && side == 2)) @@ -302,7 +303,15 @@ public class BlockFluidClassic extends BlockFluidBase { return false; } - return true; + + if (this.density > getDensity(world, x, y, z)) + { + return true; + } + else + { + return false; + } } protected int getLargerQuanta(IBlockAccess world, int x, int y, int z, int compare) diff --git a/common/net/minecraftforge/fluids/Fluid.java b/common/net/minecraftforge/fluids/Fluid.java index b7c6f9147..6e0890025 100644 --- a/common/net/minecraftforge/fluids/Fluid.java +++ b/common/net/minecraftforge/fluids/Fluid.java @@ -2,6 +2,9 @@ package net.minecraftforge.fluids; import java.util.Locale; +import java.util.Map; + +import com.google.common.collect.Maps; import net.minecraft.block.Block; import net.minecraft.util.Icon; @@ -15,21 +18,21 @@ import cpw.mods.fml.relauncher.SideOnly; /** * Minecraft Forge Fluid Implementation - * + * * This class is a fluid (liquid or gas) equivalent to "Item." It describes the nature of a fluid * and contains its general properties. - * + * * These properties do not have inherent gameplay mechanics - they are provided so that mods may * choose to take advantage of them. - * + * * Fluid implementations are not required to actively use these properties, nor are objects * interfacing with fluids required to make use of them, but it is encouraged. - * + * * The default values can be used as a reference point for mods adding fluids such as oil or heavy * water. - * + * * @author King Lemming - * + * */ public class Fluid { @@ -45,7 +48,7 @@ public class Fluid /** * The light level emitted by this fluid. - * + * * Default value is 0, as most fluids do not actively emit light. */ protected int luminosity = 0; @@ -53,31 +56,39 @@ public class Fluid /** * Density of the fluid - completely arbitrary; negative density indicates that the fluid is * lighter than air. - * + * * Default value is approximately the real-life density of water in kg/m^3. */ protected int density = 1000; + /** + * Temperature of the fluid - completely arbitrary; higher temperature indicates that the fluid is + * hotter than air. + * + * Default value is approximately the real-life room temperature of water in degrees Kelvin. + */ + protected int temperature = 295; + /** * Viscosity ("thickness") of the fluid - completely arbitrary; negative values are not * permissible. - * + * * Default value is approximately the real-life density of water in m/s^2 (x10^-3). */ protected int viscosity = 1000; /** * This indicates if the fluid is gaseous. - * + * * Useful for rendering the fluid in containers and the world. - * + * * Generally this is associated with negative density fluids. */ protected boolean isGaseous; /** * If there is a Block implementation of the Fluid, the BlockID is linked here. - * + * * The default value of -1 should remain for any Fluid without a Block implementation. */ protected int blockID = -1; @@ -132,6 +143,12 @@ public class Fluid return this; } + public Fluid setTemperature(int temperature) + { + this.temperature = temperature; + return this; + } + public Fluid setViscosity(int viscosity) { this.viscosity = viscosity; @@ -200,6 +217,11 @@ public class Fluid return this.density; } + public final int getTemperature() + { + return this.temperature; + } + public final int getViscosity() { return this.viscosity; @@ -252,6 +274,7 @@ public class Fluid /* Stack-based Accessors */ public int getLuminosity(FluidStack stack){ return getLuminosity(); } public int getDensity(FluidStack stack){ return getDensity(); } + public int getTemperature(FluidStack stack){ return getTemperature(); } public int getViscosity(FluidStack stack){ return getViscosity(); } public boolean isGaseous(FluidStack stack){ return isGaseous(); } public int getColor(FluidStack stack){ return getColor(); } @@ -259,8 +282,25 @@ public class Fluid /* World-based Accessors */ public int getLuminosity(World world, int x, int y, int z){ return getLuminosity(); } public int getDensity(World world, int x, int y, int z){ return getDensity(); } + public int getTemperature(World world, int x, int y, int z){ return getTemperature(); } public int getViscosity(World world, int x, int y, int z){ return getViscosity(); } public boolean isGaseous(World world, int x, int y, int z){ return isGaseous(); } public int getColor(World world, int x, int y, int z){ return getColor(); } public Icon getIcon(World world, int x, int y, int z){ return getIcon(); } + + private static Map legacyNames = Maps.newHashMap(); + static String convertLegacyName(String fluidName) + { + return fluidName != null && legacyNames.containsKey(fluidName) ? legacyNames.get(fluidName) : fluidName; + } + + /** + * Register a legacy liquid name with the Fluids system + * @param legacyName The legacy name to recognize + * @param canonicalName The canonical fluid name it will become + */ + public static void registerLegacyName(String legacyName, String canonicalName) + { + legacyNames.put(legacyName.toLowerCase(Locale.ENGLISH), canonicalName); + } } diff --git a/common/net/minecraftforge/fluids/FluidRegistry.java b/common/net/minecraftforge/fluids/FluidRegistry.java index 4eba91c67..62c86d05d 100644 --- a/common/net/minecraftforge/fluids/FluidRegistry.java +++ b/common/net/minecraftforge/fluids/FluidRegistry.java @@ -14,9 +14,9 @@ import com.google.common.collect.ImmutableMap; /** * Handles Fluid registrations. Fluids MUST be registered in order to function. - * + * * @author King Lemming, CovertJaguar (LiquidDictionary) - * + * */ public abstract class FluidRegistry { @@ -25,8 +25,8 @@ public abstract class FluidRegistry static HashMap fluids = new HashMap(); static BiMap fluidIDs = HashBiMap.create(); - public static final Fluid WATER = new Fluid("water").setBlockID(Block.waterStill.blockID); - public static final Fluid LAVA = new Fluid("lava").setBlockID(Block.lavaStill.blockID).setLuminosity(15).setDensity(3000).setViscosity(6000); + public static final Fluid WATER = new Fluid("water").setBlockID(Block.waterStill.blockID).setUnlocalizedName(Block.waterStill.getUnlocalizedName()); + public static final Fluid LAVA = new Fluid("lava").setBlockID(Block.lavaStill.blockID).setLuminosity(15).setDensity(3000).setViscosity(6000).setUnlocalizedName(Block.lavaStill.getUnlocalizedName()); public static int renderIdFluid = -1; @@ -50,7 +50,7 @@ public abstract class FluidRegistry /** * Register a new Fluid. If a fluid with the same name already exists, registration is denied. - * + * * @param fluid * The fluid to register. * @return True if the fluid was successfully registered; false if there is a name clash. diff --git a/common/net/minecraftforge/fluids/FluidStack.java b/common/net/minecraftforge/fluids/FluidStack.java index 99615501b..c41a9fccc 100644 --- a/common/net/minecraftforge/fluids/FluidStack.java +++ b/common/net/minecraftforge/fluids/FluidStack.java @@ -1,18 +1,20 @@ package net.minecraftforge.fluids; +import java.util.Locale; + import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; /** * ItemStack substitute for Fluids. - * + * * NOTE: Equality is based on the Fluid, not the amount. Use * {@link #isFluidStackIdentical(FluidStack)} to determine if FluidID, Amount and NBT Tag are all * equal. - * + * * @author King Lemming, SirSengir (LiquidStack) - * + * */ public class FluidStack { @@ -53,16 +55,31 @@ public class FluidStack */ public static FluidStack loadFluidStackFromNBT(NBTTagCompound nbt) { - if (nbt == null || FluidRegistry.getFluid(nbt.getString("FluidName")) == null) + if (nbt == null) { return null; } - FluidStack stack = new FluidStack(FluidRegistry.getFluidID(nbt.getString("FluidName")), nbt.getInteger("Amount")); + String fluidName = nbt.getString("FluidName"); + if (fluidName == null) + { + fluidName = nbt.hasKey("LiquidName") ? nbt.getString("LiquidName").toLowerCase(Locale.ENGLISH) : null; + fluidName = Fluid.convertLegacyName(fluidName); + } + + if (fluidName ==null || FluidRegistry.getFluid(fluidName) == null) + { + return null; + } + FluidStack stack = new FluidStack(FluidRegistry.getFluidID(fluidName), nbt.getInteger("Amount")); if (nbt.hasKey("Tag")) { stack.tag = nbt.getCompoundTag("Tag"); } + else if (nbt.hasKey("extra")) + { + stack.tag = nbt.getCompoundTag("extra"); + } return stack; } @@ -93,7 +110,7 @@ public class FluidStack /** * Determines if the FluidIDs and NBT Tags are equal. This does not check amounts. - * + * * @param other * The FluidStack for comparison * @return true if the Fluids (IDs and NBT Tags) are the same @@ -118,7 +135,7 @@ public class FluidStack /** * Determines if the Fluids are equal and this stack is larger. - * + * * @param other * @return true if this FluidStack contains the other FluidStack (same fluid and >= amount) */ @@ -129,7 +146,7 @@ public class FluidStack /** * Determines if the FluidIDs, Amounts, and NBT Tags are all equal. - * + * * @param other * - the FluidStack for comparison * @return true if the two FluidStacks are exactly the same @@ -142,7 +159,7 @@ public class FluidStack /** * Determines if the FluidIDs and NBT Tags are equal compared to a registered container * ItemStack. This does not check amounts. - * + * * @param other * The ItemStack for comparison * @return true if the Fluids (IDs and NBT Tags) are the same @@ -170,7 +187,7 @@ public class FluidStack /** * Default equality comparison for a FluidStack. Same functionality as isFluidEqual(). - * + * * This is included for use in data structures. */ @Override diff --git a/common/net/minecraftforge/fluids/RenderBlockFluid.java b/common/net/minecraftforge/fluids/RenderBlockFluid.java index 5a0e6b180..7386f52ba 100644 --- a/common/net/minecraftforge/fluids/RenderBlockFluid.java +++ b/common/net/minecraftforge/fluids/RenderBlockFluid.java @@ -1,4 +1,3 @@ - package net.minecraftforge.fluids; import net.minecraft.block.Block; @@ -29,12 +28,14 @@ public class RenderBlockFluid implements ISimpleBlockRenderingHandler { float total = 0; int count = 0; + + float end = 0; for (int i = 0; i < flow.length; i++) { - if (flow[i] >= 0.875F) + if (flow[i] >= 0.875F && end != 1F) { - return flow[i]; + end = flow[i]; } if (flow[i] >= 0) @@ -43,14 +44,18 @@ public class RenderBlockFluid implements ISimpleBlockRenderingHandler count++; } } - return total / count; + + if (end == 0) + end = total / count; + + return end; } public float getFluidHeightForRender(IBlockAccess world, int x, int y, int z, BlockFluidBase block) { if (world.getBlockId(x, y, z) == block.blockID) { - if (world.getBlockId(x, y - block.densityDir, z) == block.blockID) + if (world.getBlockMaterial(x, y - block.densityDir, z).isLiquid()) { return 1; } @@ -199,12 +204,12 @@ public class RenderBlockFluid implements ISimpleBlockRenderingHandler tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y - 1, z)); if (!rises) { - tessellator.setColorOpaque_F(LIGHT_Y_NEG, LIGHT_Y_NEG, LIGHT_Y_NEG); + tessellator.setColorOpaque_F(LIGHT_Y_NEG * red, LIGHT_Y_NEG * green, LIGHT_Y_NEG * blue); renderer.renderFaceYNeg(block, x, y + RENDER_OFFSET, z, block.getIcon(0, bMeta)); } else { - tessellator.setColorOpaque_F(LIGHT_Y_POS, LIGHT_Y_POS, LIGHT_Y_POS); + tessellator.setColorOpaque_F(LIGHT_Y_POS * red, LIGHT_Y_POS * green, LIGHT_Y_POS * blue); renderer.renderFaceYPos(block, x, y + RENDER_OFFSET, z, block.getIcon(1, bMeta)); } } @@ -319,4 +324,4 @@ public class RenderBlockFluid implements ISimpleBlockRenderingHandler { return FluidRegistry.renderIdFluid; } -} +} \ No newline at end of file diff --git a/fml b/fml index 10b16d32d..1d84e8063 160000 --- a/fml +++ b/fml @@ -1 +1 @@ -Subproject commit 10b16d32da4b7c32b15e69cf1c636505ebbe2540 +Subproject commit 1d84e8063e9d0dc73928dba006e6001201285cad diff --git a/patches/minecraft/net/minecraft/client/multiplayer/PlayerControllerMP.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/PlayerControllerMP.java.patch index c6c9920f7..18f79e8d5 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/PlayerControllerMP.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/PlayerControllerMP.java.patch @@ -33,19 +33,23 @@ if (flag) { -@@ -347,6 +357,12 @@ +@@ -347,8 +357,14 @@ float f2 = (float)par8Vec3.zCoord - (float)par6; boolean flag = false; int i1; +- +- if (!par1EntityPlayer.isSneaking() || par1EntityPlayer.getHeldItem() == null) + if (par3ItemStack != null && + par3ItemStack.getItem() != null && + par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7, f, f1, f2)) + { + return true; + } - - if (!par1EntityPlayer.isSneaking() || par1EntityPlayer.getHeldItem() == null) ++ ++ if (!par1EntityPlayer.isSneaking() || (par1EntityPlayer.getHeldItem() == null || par1EntityPlayer.getHeldItem().getItem().shouldPassSneakingClickToBlock(par2World, par4, par5, par6))) { + i1 = par2World.getBlockId(par4, par5, par6); + @@ -389,7 +405,15 @@ } else diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.java.patch index 59d63e9a6..9df5e61cf 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.java.patch @@ -20,7 +20,23 @@ public RendererLivingEntity(ModelBase par1ModelBase, float par2) { -@@ -442,12 +448,13 @@ +@@ -68,6 +74,7 @@ + + public void func_130000_a(EntityLivingBase par1EntityLivingBase, double par2, double par4, double par6, float par8, float par9) + { ++ if (MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Pre(par1EntityLivingBase, this))) return; + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + this.mainModel.onGround = this.renderSwingProgress(par1EntityLivingBase, par9); +@@ -277,6 +284,7 @@ + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + this.passSpecialRender(par1EntityLivingBase, par2, par4, par6); ++ MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(par1EntityLivingBase, this)); + } + + /** +@@ -442,12 +450,13 @@ */ protected void passSpecialRender(EntityLivingBase par1EntityLivingBase, double par2, double par4, double par6) { @@ -35,7 +51,7 @@ if (d3 < (double)(f2 * f2)) { -@@ -491,6 +498,7 @@ +@@ -491,6 +500,7 @@ } } }