package net.minecraft.entity.item;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.command.IEntitySelector;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.Hopper;
import net.minecraft.tileentity.TileEntityHopper;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
public class EntityMinecartHopper extends EntityMinecartContainer implements Hopper
{
/** Whether this hopper minecart is being blocked by an activator rail. */
private boolean isBlocked = true;
private int transferTicker = -1;
public EntityMinecartHopper(World par1World)
{
super(par1World);
}
public EntityMinecartHopper(World par1World, double par2, double par4, double par6)
{
super(par1World, par2, par4, par6);
}
public int getMinecartType()
{
return 5;
}
public Block getDefaultDisplayTile()
{
return Block.hopperBlock;
}
public int getDefaultDisplayTileOffset()
{
return 1;
}
/**
* Returns the number of slots in the inventory.
*/
public int getSizeInventory()
{
return 5;
}
/**
* Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
*/
public boolean interact(EntityPlayer par1EntityPlayer)
{
if(MinecraftForge.EVENT_BUS.post(new MinecartInteractEvent(this, par1EntityPlayer)))
{
return true;
}
if (!this.worldObj.isRemote)
{
par1EntityPlayer.displayGUIHopperMinecart(this);
}
return true;
}
/**
* Called every tick the minecart is on an activator rail.
*/
public void onActivatorRailPass(int par1, int par2, int par3, boolean par4)
{
boolean flag1 = !par4;
if (flag1 != this.getBlocked())
{
this.setBlocked(flag1);
}
}
/**
* Get whether this hopper minecart is being blocked by an activator rail.
*/
public boolean getBlocked()
{
return this.isBlocked;
}
/**
* Set whether this hopper minecart is being blocked by an activator rail.
*/
public void setBlocked(boolean par1)
{
this.isBlocked = par1;
}
/**
* Returns the worldObj for this tileEntity.
*/
public World getWorldObj()
{
return this.worldObj;
}
/**
* Gets the world X position for this hopper entity.
*/
public double getXPos()
{
return this.posX;
}
/**
* Gets the world Y position for this hopper entity.
*/
public double getYPos()
{
return this.posY;
}
/**
* Gets the world Z position for this hopper entity.
*/
public double getZPos()
{
return this.posZ;
}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
super.onUpdate();
if (!this.worldObj.isRemote && this.isEntityAlive() && this.getBlocked())
{
--this.transferTicker;
if (!this.canTransfer())
{
this.setTransferTicker(0);
if (this.func_96112_aD())
{
this.setTransferTicker(4);
this.onInventoryChanged();
}
}
}
}
public boolean func_96112_aD()
{
if (TileEntityHopper.suckItemsIntoHopper(this))
{
return true;
}
else
{
List list = this.worldObj.selectEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.25D, 0.0D, 0.25D), IEntitySelector.selectAnything);
if (list.size() > 0)
{
TileEntityHopper.func_96114_a(this, (EntityItem)list.get(0));
}
return false;
}
}
public void killMinecart(DamageSource par1DamageSource)
{
super.killMinecart(par1DamageSource);
this.dropItemWithOffset(Block.hopperBlock.blockID, 1, 0.0F);
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
{
super.writeEntityToNBT(par1NBTTagCompound);
par1NBTTagCompound.setInteger("TransferCooldown", this.transferTicker);
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
{
super.readEntityFromNBT(par1NBTTagCompound);
this.transferTicker = par1NBTTagCompound.getInteger("TransferCooldown");
}
/**
* Sets the transfer ticker, used to determine the delay between transfers.
*/
public void setTransferTicker(int par1)
{
this.transferTicker = par1;
}
/**
* Returns whether the hopper cart can currently transfer an item.
*/
public boolean canTransfer()
{
return this.transferTicker > 0;
}
}