    001package net.minecraft.entity.item;
    002
    003import java.util.List;
    004import net.minecraft.block.Block;
    005import net.minecraft.command.IEntitySelector;
    006import net.minecraft.entity.player.EntityPlayer;
    007import net.minecraft.nbt.NBTTagCompound;
    008import net.minecraft.tileentity.Hopper;
    009import net.minecraft.tileentity.TileEntityHopper;
    010import net.minecraft.util.DamageSource;
    011import net.minecraft.world.World;
    012import net.minecraftforge.common.MinecraftForge;
    013import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
    014
    015public class EntityMinecartHopper extends EntityMinecartContainer implements Hopper
    016{
    017    /** Whether this hopper minecart is being blocked by an activator rail. */
    018    private boolean isBlocked = true;
    019    private int transferTicker = -1;
    020
    021    public EntityMinecartHopper(World par1World)
    022    {
    023        super(par1World);
    024    }
    025
    026    public EntityMinecartHopper(World par1World, double par2, double par4, double par6)
    027    {
    028        super(par1World, par2, par4, par6);
    029    }
    030
    031    public int getMinecartType()
    032    {
    033        return 5;
    034    }
    035
    036    public Block getDefaultDisplayTile()
    037    {
    038        return Block.hopperBlock;
    039    }
    040
    041    public int getDefaultDisplayTileOffset()
    042    {
    043        return 1;
    044    }
    045
    046    /**
    047     * Returns the number of slots in the inventory.
    048     */
    049    public int getSizeInventory()
    050    {
    051        return 5;
    052    }
    053
    054    /**
    055     * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    056     */
    057    public boolean interact(EntityPlayer par1EntityPlayer)
    058    {
    059        if(MinecraftForge.EVENT_BUS.post(new MinecartInteractEvent(this, par1EntityPlayer)))
    060        {
    061            return true;
    062        }
    063        if (!this.worldObj.isRemote)
    064        {
    065            par1EntityPlayer.func_96125_a(this);
    066        }
    067
    068        return true;
    069    }
    070
    071    /**
    072     * Called every tick the minecart is on an activator rail.
    073     */
    074    public void onActivatorRailPass(int par1, int par2, int par3, boolean par4)
    075    {
    076        boolean flag1 = !par4;
    077
    078        if (flag1 != this.getBlocked())
    079        {
    080            this.setBlocked(flag1);
    081        }
    082    }
    083
    084    /**
    085     * Get whether this hopper minecart is being blocked by an activator rail.
    086     */
    087    public boolean getBlocked()
    088    {
    089        return this.isBlocked;
    090    }
    091
    092    /**
    093     * Set whether this hopper minecart is being blocked by an activator rail.
    094     */
    095    public void setBlocked(boolean par1)
    096    {
    097        this.isBlocked = par1;
    098    }
    099
    100    /**
    101     * Returns the worldObj for this tileEntity.
    102     */
    103    public World getWorldObj()
    104    {
    105        return this.worldObj;
    106    }
    107
    108    /**
    109     * Gets the world X position for this hopper entity.
    110     */
    111    public double getXPos()
    112    {
    113        return this.posX;
    114    }
    115
    116    /**
    117     * Gets the world Y position for this hopper entity.
    118     */
    119    public double getYPos()
    120    {
    121        return this.posY;
    122    }
    123
    124    /**
    125     * Gets the world Z position for this hopper entity.
    126     */
    127    public double getZPos()
    128    {
    129        return this.posZ;
    130    }
    131
    132    /**
    133     * Called to update the entity's position/logic.
    134     */
    135    public void onUpdate()
    136    {
    137        super.onUpdate();
    138
    139        if (!this.worldObj.isRemote && this.isEntityAlive() && this.getBlocked())
    140        {
    141            --this.transferTicker;
    142
    143            if (!this.canTransfer())
    144            {
    145                this.setTransferTicker(0);
    146
    147                if (this.func_96112_aD())
    148                {
    149                    this.setTransferTicker(4);
    150                    this.onInventoryChanged();
    151                }
    152            }
    153        }
    154    }
    155
    156    public boolean func_96112_aD()
    157    {
    158        if (TileEntityHopper.suckItemsIntoHopper(this))
    159        {
    160            return true;
    161        }
    162        else
    163        {
    164            List list = this.worldObj.selectEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.25D, 0.0D, 0.25D), IEntitySelector.selectAnything);
    165
    166            if (list.size() > 0)
    167            {
    168                TileEntityHopper.func_96114_a(this, (EntityItem)list.get(0));
    169            }
    170
    171            return false;
    172        }
    173    }
    174
    175    public void killMinecart(DamageSource par1DamageSource)
    176    {
    177        super.killMinecart(par1DamageSource);
    178        this.dropItemWithOffset(Block.hopperBlock.blockID, 1, 0.0F);
    179    }
    180
    181    /**
    182     * (abstract) Protected helper method to write subclass entity data to NBT.
    183     */
    184    protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    185    {
    186        super.writeEntityToNBT(par1NBTTagCompound);
    187        par1NBTTagCompound.setInteger("TransferCooldown", this.transferTicker);
    188    }
    189
    190    /**
    191     * (abstract) Protected helper method to read subclass entity data from NBT.
    192     */
    193    protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    194    {
    195        super.readEntityFromNBT(par1NBTTagCompound);
    196        this.transferTicker = par1NBTTagCompound.getInteger("TransferCooldown");
    197    }
    198
    199    /**
    200     * Sets the transfer ticker, used to determine the delay between transfers.
    201     */
    202    public void setTransferTicker(int par1)
    203    {
    204        this.transferTicker = par1;
    205    }
    206
    207    /**
    208     * Returns whether the hopper cart can currently transfer an item.
    209     */
    210    public boolean canTransfer()
    211    {
    212        return this.transferTicker > 0;
    213    }
    214}