193 lines
5.8 KiB
Java
193 lines
5.8 KiB
Java
package universalelectricity.prefab.block;
|
|
|
|
import java.util.List;
|
|
|
|
import net.minecraft.block.BlockContainer;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
import universalelectricity.core.block.IConductor;
|
|
import universalelectricity.core.vector.Vector3;
|
|
import universalelectricity.prefab.tile.TileEntityConductor;
|
|
|
|
public abstract class BlockConductor extends BlockContainer
|
|
{
|
|
public boolean isWireCollision = true;
|
|
public Vector3 minVector = new Vector3(0.3, 0.3, 0.3);
|
|
public Vector3 maxVector = new Vector3(0.7, 0.7, 0.7);
|
|
|
|
public BlockConductor(int id, Material material)
|
|
{
|
|
super(id, material);
|
|
}
|
|
|
|
/**
|
|
* Called whenever the block is added into the world. Args: world, x, y, z
|
|
*/
|
|
@Override
|
|
public void onBlockAdded(World world, int x, int y, int z)
|
|
{
|
|
super.onBlockAdded(world, x, y, z);
|
|
|
|
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
|
|
|
|
if (tileEntity instanceof IConductor)
|
|
{
|
|
((IConductor) tileEntity).refresh();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed
|
|
* (coordinates passed are their own) Args: x, y, z, neighbor blockID
|
|
*/
|
|
@Override
|
|
public void onNeighborBlockChange(World world, int x, int y, int z, int blockID)
|
|
{
|
|
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
|
|
|
|
if (tileEntity instanceof IConductor)
|
|
{
|
|
((IConductor) tileEntity).refresh();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns a bounding box from the pool of bounding boxes (this means this box can change after
|
|
* the pool has been cleared to be reused)
|
|
*/
|
|
@Override
|
|
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
|
|
{
|
|
this.setBlockBoundsBasedOnState(world, x, y, z);
|
|
return super.getCollisionBoundingBoxFromPool(world, x, y, z);
|
|
}
|
|
|
|
@Override
|
|
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z)
|
|
{
|
|
this.setBlockBoundsBasedOnState(world, x, y, z);
|
|
return super.getSelectedBoundingBoxFromPool(world, x, y, z);
|
|
}
|
|
|
|
/**
|
|
* Returns the bounding box of the wired rectangular prism to render.
|
|
*/
|
|
@Override
|
|
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
|
|
{
|
|
if (this.isWireCollision)
|
|
{
|
|
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
|
|
|
|
if (tileEntity instanceof TileEntityConductor)
|
|
{
|
|
TileEntity[] connectable = ((TileEntityConductor) tileEntity).getAdjacentConnections();
|
|
|
|
if (connectable != null)
|
|
{
|
|
float minX = (float) this.minVector.x;
|
|
float minY = (float) this.minVector.y;
|
|
float minZ = (float) this.minVector.z;
|
|
float maxX = (float) this.maxVector.x;
|
|
float maxY = (float) this.maxVector.y;
|
|
float maxZ = (float) this.maxVector.z;
|
|
|
|
if (connectable[0] != null)
|
|
{
|
|
minY = 0.0F;
|
|
}
|
|
|
|
if (connectable[1] != null)
|
|
{
|
|
maxY = 1.0F;
|
|
}
|
|
|
|
if (connectable[2] != null)
|
|
{
|
|
minZ = 0.0F;
|
|
}
|
|
|
|
if (connectable[3] != null)
|
|
{
|
|
maxZ = 1.0F;
|
|
}
|
|
|
|
if (connectable[4] != null)
|
|
{
|
|
minX = 0.0F;
|
|
}
|
|
|
|
if (connectable[5] != null)
|
|
{
|
|
maxX = 1.0F;
|
|
}
|
|
|
|
this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisalignedbb, List list, Entity entity)
|
|
{
|
|
if (this.isWireCollision)
|
|
{
|
|
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
|
|
|
|
if (tileEntity instanceof TileEntityConductor)
|
|
{
|
|
TileEntity[] connectable = ((TileEntityConductor) tileEntity).getAdjacentConnections();
|
|
|
|
this.setBlockBounds((float) this.minVector.x, (float) this.minVector.y, (float) this.minVector.z, (float) this.maxVector.x, (float) this.maxVector.y, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
|
|
if (connectable[4] != null)
|
|
{
|
|
this.setBlockBounds(0, (float) this.minVector.y, (float) this.minVector.z, (float) this.maxVector.x, (float) this.maxVector.y, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
if (connectable[5] != null)
|
|
{
|
|
this.setBlockBounds((float) this.minVector.x, (float) this.minVector.y, (float) this.minVector.z, 1, (float) this.maxVector.y, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
if (connectable[0] != null)
|
|
{
|
|
this.setBlockBounds((float) this.minVector.x, 0, (float) this.minVector.z, (float) this.maxVector.x, (float) this.maxVector.y, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
if (connectable[1] != null)
|
|
{
|
|
this.setBlockBounds((float) this.minVector.x, (float) this.minVector.y, (float) this.minVector.z, (float) this.maxVector.x, 1, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
if (connectable[2] != null)
|
|
{
|
|
this.setBlockBounds((float) this.minVector.x, (float) this.minVector.y, 0, (float) this.maxVector.x, (float) this.maxVector.y, (float) this.maxVector.z);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
if (connectable[3] != null)
|
|
{
|
|
this.setBlockBounds((float) this.minVector.x, (float) this.minVector.y, (float) this.minVector.z, (float) this.maxVector.x, (float) this.maxVector.y, 1);
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
|
|
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
|
|
}
|
|
}
|
|
}
|