resonant-induction/archive/java/resonantinduction/old/transport/logistic/TileEntityRejector.java
2014-01-11 17:44:07 +08:00

139 lines
3.5 KiB
Java

package resonantinduction.old.transport.logistic;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.prefab.tile.TileEntityFilterable;
import resonantinduction.old.api.IBelt;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.PacketHandler;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.Player;
/** @author Darkguardsman */
public class TileEntityRejector extends TileEntityFilterable
{
/** should the piston fire, or be extended */
public boolean firePiston = false;
public TileEntityRejector()
{
super(100);
}
@Override
public void updateEntity()
{
super.updateEntity();
/** Has to update a bit faster than a conveyer belt */
if (this.ticks % 5 == 0)
{
this.firePiston = false;
Vector3 searchPosition = new Vector3(this);
searchPosition.modifyPositionFromSide(this.getDirection());
TileEntity tileEntity = searchPosition.getTileEntity(this.worldObj);
try
{
if (this.isFunctioning())
{
/**
* Find all entities in the position in which this block is facing and attempt
* to push it out of the way.
*/
AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox(searchPosition.x, searchPosition.y, searchPosition.z, searchPosition.x + 1, searchPosition.y + 1, searchPosition.z + 1);
List<Entity> entitiesInFront = this.worldObj.getEntitiesWithinAABB(Entity.class, bounds);
for (Entity entity : entitiesInFront)
{
if (this.canEntityBeThrow(entity))
{
this.throwItem(tileEntity, this.getDirection(), entity);
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/** Pushs an entity in the direction in which the rejector is facing */
public void throwItem(TileEntity tileEntity, ForgeDirection side, Entity entity)
{
this.firePiston = true;
// TODO add config to adjust the motion magnitude per rejector
entity.motionX = side.offsetX * 0.1;
entity.motionY += 0.10000000298023224D;
entity.motionZ = side.offsetZ * 0.1;
this.consumePower(1, true);
if (!this.worldObj.isRemote && tileEntity instanceof IBelt)
{
((IBelt) tileEntity).ignoreEntity(entity);
}
}
/** Checks to see if the rejector can push the entity in the facing direction */
public boolean canEntityBeThrow(Entity entity)
{
// TODO Add other things than items
if (entity instanceof EntityItem)
{
EntityItem entityItem = (EntityItem) entity;
ItemStack itemStack = entityItem.getEntityItem();
return this.isFiltering(itemStack);
}
return false;
}
@Override
public boolean canConnect(ForgeDirection dir)
{
return dir != this.getDirection();
}
@Override
public Packet getDescriptionPacket()
{
return PacketHandler.instance().getTilePacket(this.getChannel(), "rejector", this, this.functioning, this.isInverted(), this.firePiston);
}
@Override
public boolean simplePacket(String id, ByteArrayDataInput dis, Player player)
{
try
{
if (this.worldObj.isRemote && !super.simplePacket(id, dis, player))
{
if (id.equalsIgnoreCase("rejector"))
{
this.functioning = dis.readBoolean();
this.setInverted(dis.readBoolean());
this.firePiston = dis.readBoolean();
return true;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
}