diff --git a/archaic/src/main/java/resonantinduction/archaic/gutter/BlockGutter.java b/archaic/src/main/java/resonantinduction/archaic/gutter/BlockGutter.java index 95c1af24..f5f6fdb7 100644 --- a/archaic/src/main/java/resonantinduction/archaic/gutter/BlockGutter.java +++ b/archaic/src/main/java/resonantinduction/archaic/gutter/BlockGutter.java @@ -3,10 +3,10 @@ package resonantinduction.archaic.gutter; import java.util.List; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; @@ -15,6 +15,8 @@ import resonantinduction.core.Reference; import resonantinduction.core.prefab.fluid.BlockFluidNetwork; import resonantinduction.core.render.RIBlockRenderingHandler; import universalelectricity.api.UniversalElectricity; +import universalelectricity.api.vector.Vector3; +import calclavia.lib.render.RenderUtility; import calclavia.lib.utility.FluidUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -33,20 +35,45 @@ public class BlockGutter extends BlockFluidNetwork } @Override - public void addCollisionBoxesToList(World par1World, int x, int y, int z, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity entity) + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity entity) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.3125F, 1.0F); - super.addCollisionBoxesToList(par1World, x, y, z, par5AxisAlignedBB, par6List, entity); - float thickness = 0.125F; - this.setBlockBounds(0.0F, 0.0F, 0.0F, thickness, 1.0F, 1.0F); - super.addCollisionBoxesToList(par1World, x, y, z, par5AxisAlignedBB, par6List, entity); - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, thickness); - super.addCollisionBoxesToList(par1World, x, y, z, par5AxisAlignedBB, par6List, entity); - this.setBlockBounds(1.0F - thickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.addCollisionBoxesToList(par1World, x, y, z, par5AxisAlignedBB, par6List, entity); - this.setBlockBounds(0.0F, 0.0F, 1.0F - thickness, 1.0F, 1.0F, 1.0F); - super.addCollisionBoxesToList(par1World, x, y, z, par5AxisAlignedBB, par6List, entity); - this.setBlockBoundsForItemRender(); + float thickness = 0.1F; + + TileEntity tile = world.getBlockTileEntity(x, y, z); + + if (tile instanceof TileGutter) + { + byte renderSides = ((TileGutter) tile).renderSides; + + if (!RenderUtility.canRenderSide(renderSides, ForgeDirection.DOWN)) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, thickness, 1.0F); + super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); + } + + if (!RenderUtility.canRenderSide(renderSides, ForgeDirection.WEST)) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, thickness, 1.0F, 1.0F); + super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); + } + if (!RenderUtility.canRenderSide(renderSides, ForgeDirection.NORTH)) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, thickness); + super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); + } + if (!RenderUtility.canRenderSide(renderSides, ForgeDirection.EAST)) + { + this.setBlockBounds(1.0F - thickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); + } + if (!RenderUtility.canRenderSide(renderSides, ForgeDirection.SOUTH)) + { + this.setBlockBounds(0.0F, 0.0F, 1.0F - thickness, 1.0F, 1.0F, 1.0F); + super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); + } + } + + setBlockBounds(0.0F, 0.0F, 0.0F, 1, 0.99f, 1); } public void setBlockBoundsForItemRender() @@ -61,14 +88,44 @@ public class BlockGutter extends BlockFluidNetwork if (!world.isRemote && tile instanceof TileGutter) { - ((TileGutter) tile).fill(ForgeDirection.UNKNOWN, new FluidStack(FluidRegistry.WATER, 10), true); + ((TileGutter) tile).fill(ForgeDirection.UNKNOWN, new FluidStack(FluidRegistry.WATER, 1), true); } } @Override - public void onEntityCollidedWithBlock(World par1World, int x, int y, int z, Entity entity) + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { - entity.attackEntityFrom(DamageSource.cactus, 1.0F); + TileEntity tile = world.getBlockTileEntity(x, y, z); + + if (tile instanceof TileGutter) + { + if (((TileGutter) tile).getInternalTank().getFluidAmount() > 0) + { + int pressure = ((TileGutter) tile).getPressure(null); + + for (int i = 2; i < 6; i++) + { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Vector3 position = new Vector3(x, y, z).translate(dir); + + TileEntity checkTile = position.getTileEntity(world); + + if (checkTile instanceof TileGutter) + { + int deltaPressure = ((TileGutter) checkTile).getPressure(null) - pressure; + + entity.motionX += 0.01 * dir.offsetX * deltaPressure; + entity.motionY += 0.01 * dir.offsetY * deltaPressure; + entity.motionZ += 0.01 * dir.offsetZ * deltaPressure; + } + } + } + } + + if (entity instanceof EntityItem) + { + entity.noClip = true; + } } @Override diff --git a/archaic/src/main/java/resonantinduction/archaic/gutter/RenderGutter.java b/archaic/src/main/java/resonantinduction/archaic/gutter/RenderGutter.java index 214104ef..a773e980 100644 --- a/archaic/src/main/java/resonantinduction/archaic/gutter/RenderGutter.java +++ b/archaic/src/main/java/resonantinduction/archaic/gutter/RenderGutter.java @@ -29,7 +29,23 @@ public class RenderGutter extends TileEntitySpecialRenderer implements ISimpleIt public static void render(int meta, byte sides) { RenderUtility.bind(TEXTURE); - MODEL.renderAll(); + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + if (dir != ForgeDirection.UP && dir != ForgeDirection.DOWN) + { + if (!RenderUtility.canRenderSide(sides, dir)) + { + GL11.glPushMatrix(); + RenderUtility.rotateBlockBasedOnDirection(dir); + MODEL.renderOnly("left", "backCornerL", "frontCornerL"); + GL11.glPopMatrix(); + } + } + } + + if (!RenderUtility.canRenderSide(sides, ForgeDirection.DOWN)) + MODEL.renderOnly("base"); } @Override @@ -44,6 +60,8 @@ public class RenderGutter extends TileEntitySpecialRenderer implements ISimpleIt int capacity = tile.getInternalTank().getCapacity(); byte renderSides = (tile instanceof TileGutter ? tile.renderSides : (byte) 0); + render(0, renderSides); + if (liquid != null && liquid.amount > 0) { float percentage = (float) liquid.amount / (float) capacity; @@ -57,51 +75,17 @@ public class RenderGutter extends TileEntitySpecialRenderer implements ISimpleIt GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glTranslatef((float) 0F, (float) 0F, (float) 0.3F); - GL11.glScalef(0.4F, 0.4F, 0.4F); + float xScale = RenderUtility.canRenderSide(renderSides, ForgeDirection.EAST) || RenderUtility.canRenderSide(renderSides, ForgeDirection.WEST) ? 1.01f : 0.8f; + float zScale = RenderUtility.canRenderSide(renderSides, ForgeDirection.NORTH) || RenderUtility.canRenderSide(renderSides, ForgeDirection.SOUTH) ? 1.01f : 0.8f; + GL11.glTranslatef(-xScale / 2, -0.45f, -zScale / 2); + GL11.glScalef(xScale, 0.9f, zScale); GL11.glCallList(displayList[(int) (percentage * (RenderFluidHelper.DISPLAY_STAGES - 1))]); GL11.glPopAttrib(); GL11.glPopMatrix(); - - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) - { - if (RenderUtility.canRenderSide(renderSides, direction) && direction != ForgeDirection.UP && direction != ForgeDirection.DOWN) - { - GL11.glPushMatrix(); - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - switch (direction.ordinal()) - { - case 4: - GL11.glTranslatef((float) x + 0F, (float) y + 0.1F, (float) z + 0.3F); - break; - case 5: - GL11.glTranslatef((float) x + 0.7F, (float) y + 0.1F, (float) z + 0.3F); - break; - case 2: - GL11.glTranslatef((float) x + 0.3F, (float) y + 0.1F, (float) z + 0F); - break; - case 3: - GL11.glTranslatef((float) x + 0.3F, (float) y + 0.1F, (float) z + 0.7F); - break; - } - GL11.glScalef(0.3F, 0.4F, 0.4F); - - GL11.glCallList(displayList[(int) (percentage * (RenderFluidHelper.DISPLAY_STAGES - 1))]); - - GL11.glPopAttrib(); - GL11.glPopMatrix(); - } - } } - render(0, renderSides); GL11.glPopMatrix(); } @@ -110,7 +94,7 @@ public class RenderGutter extends TileEntitySpecialRenderer implements ISimpleIt { GL11.glPushMatrix(); GL11.glTranslated(0.5, 0.5, 0.5); - render(itemStack.getItemDamage(), Byte.parseByte("000011", 2)); + render(itemStack.getItemDamage(), Byte.parseByte("001100", 2)); GL11.glPopMatrix(); } } \ No newline at end of file diff --git a/archaic/src/main/java/resonantinduction/archaic/gutter/TileGutter.java b/archaic/src/main/java/resonantinduction/archaic/gutter/TileGutter.java index 7e4f3347..5fda0a80 100644 --- a/archaic/src/main/java/resonantinduction/archaic/gutter/TileGutter.java +++ b/archaic/src/main/java/resonantinduction/archaic/gutter/TileGutter.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidHandler; @@ -17,8 +18,6 @@ import calclavia.lib.utility.WrenchUtility; /** @author Darkguardsman */ public class TileGutter extends TileFluidNetwork implements IFluidPipe { - private int pressure; - public TileGutter() { getInternalTank().setCapacity(FluidContainerRegistry.BUCKET_VOLUME); @@ -28,11 +27,6 @@ public class TileGutter extends TileFluidNetwork implements IFluidPipe public void updateEntity() { super.updateEntity(); - - if (!worldObj.isRemote) - { - - } } @Override @@ -100,6 +94,11 @@ public class TileGutter extends TileFluidNetwork implements IFluidPipe @Override public int getPressure(ForgeDirection dir) { + if (dir == ForgeDirection.UP) + return - 3; + if (dir == ForgeDirection.DOWN) + return + 3; + return pressure; } @@ -112,7 +111,42 @@ public class TileGutter extends TileFluidNetwork implements IFluidPipe @Override public int getMaxFlowRate() { - return 10; + return 1; } + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) + { + int fill = getInternalTank().fill(resource, doFill); + onFluidChanged(); + return fill; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) + { + FluidStack drain = getInternalTank().drain(resource.amount, doDrain); + onFluidChanged(); + return drain; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) + { + FluidStack drain = getInternalTank().drain(maxDrain, doDrain); + onFluidChanged(); + return drain; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) + { + return from != ForgeDirection.UP; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) + { + return from != ForgeDirection.UP; + } } diff --git a/src/main/java/resonantinduction/core/prefab/fluid/TileFluidNetwork.java b/src/main/java/resonantinduction/core/prefab/fluid/TileFluidNetwork.java index f2660902..7f6116a3 100644 --- a/src/main/java/resonantinduction/core/prefab/fluid/TileFluidNetwork.java +++ b/src/main/java/resonantinduction/core/prefab/fluid/TileFluidNetwork.java @@ -36,6 +36,8 @@ import cpw.mods.fml.relauncher.SideOnly; */ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidConnector, IPacketReceiverWithID, IInformation { + protected int pressure; + protected FluidTank tank; protected Object[] connectedBlocks = new Object[6]; protected int colorID = 0; @@ -224,7 +226,8 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon } else if (id == PACKET_TANK) { - this.tank = new FluidTank(data.readInt()).readFromNBT(PacketHandler.readNBTTagCompound(data)); + tank = new FluidTank(data.readInt()).readFromNBT(PacketHandler.readNBTTagCompound(data)); + pressure = data.readInt(); return true; } } @@ -250,7 +253,7 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon public void sendTankUpdate() { - PacketHandler.sendPacketToClients(ResonantInduction.PACKET_TILE.getPacketWithID(PACKET_TANK, this, getInternalTank().getCapacity(), getInternalTank().writeToNBT(new NBTTagCompound())), this.worldObj, new Vector3(this), 60); + PacketHandler.sendPacketToClients(ResonantInduction.PACKET_TILE.getPacketWithID(PACKET_TANK, this, getInternalTank().getCapacity(), getInternalTank().writeToNBT(new NBTTagCompound()), pressure), this.worldObj, new Vector3(this), 60); } @Override