Implemented gutter gravity system

This commit is contained in:
Calclavia 2014-03-08 14:12:17 -08:00
parent 33df875a9b
commit b51029e578
6 changed files with 73 additions and 103 deletions

View file

@ -18,7 +18,6 @@ import resonantinduction.archaic.firebox.BlockFirebox;
import resonantinduction.archaic.firebox.BlockHotPlate;
import resonantinduction.archaic.firebox.TileFirebox;
import resonantinduction.archaic.firebox.TileHotPlate;
import resonantinduction.archaic.fluid.grate.BlockGrate;
import resonantinduction.archaic.fluid.grate.TileGrate;
import resonantinduction.archaic.fluid.gutter.TileGutter;
import resonantinduction.archaic.fluid.tank.TileTank;
@ -107,7 +106,7 @@ public class Archaic
blockMillstone = contentRegistry.createTile(BlockMillstone.class, TileMillstone.class);
blockCast = contentRegistry.createTile(BlockCastingMold.class, TileCastingMold.class);
blockGutter = contentRegistry.newBlock(TileGutter.class);
blockGrate = contentRegistry.createTile(BlockGrate.class, TileGrate.class);
blockGrate = contentRegistry.newBlock(TileGrate.class);
blockFilter = contentRegistry.createTile(BlockFilter.class, TileFilter.class);
blockTank = contentRegistry.newBlock(TileTank.class);

View file

@ -1,78 +0,0 @@
package resonantinduction.archaic.fluid.grate;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Icon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.Reference;
import calclavia.lib.prefab.block.BlockRotatable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class BlockGrate extends BlockRotatable
{
private Icon iconFront;
public BlockGrate(int id)
{
super(id, Material.iron);
rotationMask = Byte.parseByte("111111", 2);
}
@Override
public TileEntity createNewTileEntity(World var1)
{
return new TileGrate();
}
@Override
public void registerIcons(IconRegister iconRegister)
{
iconFront = iconRegister.registerIcon(Reference.PREFIX + "grate_front");
super.registerIcons(iconRegister);
}
@Override
public boolean isOpaqueCube()
{
return false;
}
@Override
@SideOnly(Side.CLIENT)
public boolean renderAsNormalBlock()
{
return false;
}
@Override
public Icon getIcon(int side, int metadata)
{
if (side == 1)
{
return iconFront;
}
return blockIcon;
}
@Override
public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side)
{
TileEntity entity = world.getBlockTileEntity(x, y, z);
ForgeDirection dir = ForgeDirection.getOrientation(side);
if (entity instanceof TileGrate)
{
if (dir == ((TileGrate) entity).getDirection())
{
return iconFront;
}
}
return blockIcon;
}
}

View file

@ -5,6 +5,10 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.util.Icon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
@ -12,16 +16,51 @@ import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.core.Reference;
import resonantinduction.core.fluid.TilePressureNode;
import resonantinduction.core.grid.fluid.PressureNode;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.TileAdvanced;
import calclavia.lib.prefab.tile.IRotatable;
import calclavia.lib.utility.FluidUtility;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TileGrate extends TileAdvanced implements IFluidHandler
public class TileGrate extends TilePressureNode implements IRotatable
{
protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME);
@SideOnly(Side.CLIENT)
private static Icon iconFront, iconSide;
private GratePathfinder gratePath;
public TileGrate()
{
super(Material.rock);
isOpaqueCube = false;
normalRender = true;
rotationMask = Byte.parseByte("111111", 2);
node = new PressureNode(this);
}
@Override
public Icon getIcon(IBlockAccess world, int side)
{
return side == getDirection().ordinal() ? iconFront : iconSide;
}
@Override
public Icon getIcon(int side, int metadata)
{
return side == 1 ? iconFront : iconSide;
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister iconRegister)
{
iconFront = iconRegister.registerIcon(Reference.PREFIX + "grate_front");
iconSide = iconRegister.registerIcon(Reference.PREFIX + "grate");
}
@Override
public boolean canUpdate()
{
@ -61,17 +100,17 @@ public class TileGrate extends TileAdvanced implements IFluidHandler
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
tank.fill(resource, doFill);
getPressureTank().fill(resource, doFill);
if (tank.getFluidAmount() > 0)
if (getPressureTank().getFluidAmount() > 0)
{
if (gratePath == null)
{
gratePath = new GratePathfinder(true);
gratePath.startFill(new Vector3(this), tank.getFluid().getFluid().getID());
gratePath.startFill(new Vector3(this), getPressureTank().getFluid().getFluid().getID());
}
return tank.drain(gratePath.tryFill(tank.getFluidAmount(), 2000), true).amount;
return getPressureTank().drain(gratePath.tryFill(getPressureTank().getFluidAmount(), 2000), true).amount;
}
return 0;

View file

@ -83,18 +83,22 @@ public class RenderGutter extends TileEntitySpecialRenderer implements ISimpleIt
if (tileEntity.worldObj != null)
{
GL11.glPushMatrix();
GL11.glScaled(0.99, 0.99, 0.99);
FluidTank tank = ((TileGutter) tileEntity).getInternalTank();
double percentageFilled = (double) tank.getFluidAmount() / (double) tank.getCapacity();
double ySouthEast = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.EAST);
double yNorthEast = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.NORTH, ForgeDirection.EAST);
double ySouthWest = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.WEST);
double yNorthWest = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.NORTH, ForgeDirection.WEST);
if (percentageFilled > 0.1)
{
GL11.glPushMatrix();
GL11.glScaled(0.95, 0.95, 0.95);
FluidRenderUtility.renderFluidTesselation(tank, ySouthEast, yNorthEast, ySouthWest, yNorthWest);
GL11.glPopMatrix();
double ySouthEast = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.EAST);
double yNorthEast = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.NORTH, ForgeDirection.EAST);
double ySouthWest = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.WEST);
double yNorthWest = FluidUtility.getAveragePercentageFilledForSides(TileGutter.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.NORTH, ForgeDirection.WEST);
FluidRenderUtility.renderFluidTesselation(tank, ySouthEast, yNorthEast, ySouthWest, yNorthWest);
GL11.glPopMatrix();
}
}
GL11.glPopMatrix();

View file

@ -13,8 +13,9 @@ import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.archaic.fluid.grate.TileGrate;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.fluid.TilePressurizedNode;
import resonantinduction.core.fluid.TilePressureNode;
import resonantinduction.core.grid.fluid.IPressureNodeProvider;
import resonantinduction.core.grid.fluid.PressureNode;
import universalelectricity.api.vector.Vector3;
@ -28,7 +29,7 @@ import calclavia.lib.utility.WorldUtility;
* @author Calclavia
*
*/
public class TileGutter extends TilePressurizedNode
public class TileGutter extends TilePressureNode
{
public TileGutter()
{
@ -69,6 +70,11 @@ public class TileGutter extends TilePressurizedNode
else
{
connections.put(tile, dir);
if (tile instanceof TileGrate)
{
renderSides = WorldUtility.setEnableSide(renderSides, dir, true);
}
}
}
}
@ -85,12 +91,12 @@ public class TileGutter extends TilePressurizedNode
public int getPressure(ForgeDirection dir)
{
if (dir == ForgeDirection.UP)
return -3;
return -1;
if (dir == ForgeDirection.DOWN)
return +3;
return 2;
return pressure;
return 0;
}
@Override

View file

@ -16,11 +16,11 @@ import calclavia.lib.network.IPacketReceiverWithID;
*
* @author DarkGuardsman
*/
public abstract class TilePressurizedNode extends TileFluidNode implements IPressureNodeProvider, IPacketReceiverWithID
public abstract class TilePressureNode extends TileFluidNode implements IPressureNodeProvider, IPacketReceiverWithID
{
protected PressureNode node;
public TilePressurizedNode(Material material)
public TilePressureNode(Material material)
{
super(material);
getInternalTank().setCapacity(FluidContainerRegistry.BUCKET_VOLUME);