Finished initial gutter

This commit is contained in:
Calclavia 2014-02-25 22:31:05 +08:00
parent 1442b683c7
commit 7ba79db7d7
4 changed files with 145 additions and 67 deletions

View file

@ -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

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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