001    package net.minecraft.item;
002    
003    import java.util.List;
004    import net.minecraft.block.Block;
005    import net.minecraft.creativetab.CreativeTabs;
006    import net.minecraft.entity.Entity;
007    import net.minecraft.entity.item.EntityBoat;
008    import net.minecraft.entity.player.EntityPlayer;
009    import net.minecraft.util.AxisAlignedBB;
010    import net.minecraft.util.EnumMovingObjectType;
011    import net.minecraft.util.MathHelper;
012    import net.minecraft.util.MovingObjectPosition;
013    import net.minecraft.util.Vec3;
014    import net.minecraft.world.World;
015    
016    public class ItemBoat extends Item
017    {
018        public ItemBoat(int par1)
019        {
020            super(par1);
021            this.maxStackSize = 1;
022            this.setCreativeTab(CreativeTabs.tabTransport);
023        }
024    
025        /**
026         * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
027         */
028        public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
029        {
030            float var4 = 1.0F;
031            float var5 = par3EntityPlayer.prevRotationPitch + (par3EntityPlayer.rotationPitch - par3EntityPlayer.prevRotationPitch) * var4;
032            float var6 = par3EntityPlayer.prevRotationYaw + (par3EntityPlayer.rotationYaw - par3EntityPlayer.prevRotationYaw) * var4;
033            double var7 = par3EntityPlayer.prevPosX + (par3EntityPlayer.posX - par3EntityPlayer.prevPosX) * (double)var4;
034            double var9 = par3EntityPlayer.prevPosY + (par3EntityPlayer.posY - par3EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par3EntityPlayer.yOffset;
035            double var11 = par3EntityPlayer.prevPosZ + (par3EntityPlayer.posZ - par3EntityPlayer.prevPosZ) * (double)var4;
036            Vec3 var13 = par2World.getWorldVec3Pool().getVecFromPool(var7, var9, var11);
037            float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI);
038            float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI);
039            float var16 = -MathHelper.cos(-var5 * 0.017453292F);
040            float var17 = MathHelper.sin(-var5 * 0.017453292F);
041            float var18 = var15 * var16;
042            float var20 = var14 * var16;
043            double var21 = 5.0D;
044            Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
045            MovingObjectPosition var24 = par2World.rayTraceBlocks_do(var13, var23, true);
046    
047            if (var24 == null)
048            {
049                return par1ItemStack;
050            }
051            else
052            {
053                Vec3 var25 = par3EntityPlayer.getLook(var4);
054                boolean var26 = false;
055                float var27 = 1.0F;
056                List var28 = par2World.getEntitiesWithinAABBExcludingEntity(par3EntityPlayer, par3EntityPlayer.boundingBox.addCoord(var25.xCoord * var21, var25.yCoord * var21, var25.zCoord * var21).expand((double)var27, (double)var27, (double)var27));
057                int var29;
058    
059                for (var29 = 0; var29 < var28.size(); ++var29)
060                {
061                    Entity var30 = (Entity)var28.get(var29);
062    
063                    if (var30.canBeCollidedWith())
064                    {
065                        float var31 = var30.getCollisionBorderSize();
066                        AxisAlignedBB var32 = var30.boundingBox.expand((double)var31, (double)var31, (double)var31);
067    
068                        if (var32.isVecInside(var13))
069                        {
070                            var26 = true;
071                        }
072                    }
073                }
074    
075                if (var26)
076                {
077                    return par1ItemStack;
078                }
079                else
080                {
081                    if (var24.typeOfHit == EnumMovingObjectType.TILE)
082                    {
083                        var29 = var24.blockX;
084                        int var33 = var24.blockY;
085                        int var34 = var24.blockZ;
086    
087                        if (par2World.getBlockId(var29, var33, var34) == Block.snow.blockID)
088                        {
089                            --var33;
090                        }
091    
092                        EntityBoat var35 = new EntityBoat(par2World, (double)((float)var29 + 0.5F), (double)((float)var33 + 1.0F), (double)((float)var34 + 0.5F));
093                        var35.rotationYaw = (float)(((MathHelper.floor_double((double)(par3EntityPlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3) - 1) * 90);
094    
095                        if (!par2World.getCollidingBoundingBoxes(var35, var35.boundingBox.expand(-0.1D, -0.1D, -0.1D)).isEmpty())
096                        {
097                            return par1ItemStack;
098                        }
099    
100                        if (!par2World.isRemote)
101                        {
102                            par2World.spawnEntityInWorld(var35);
103                        }
104    
105                        if (!par3EntityPlayer.capabilities.isCreativeMode)
106                        {
107                            --par1ItemStack.stackSize;
108                        }
109                    }
110    
111                    return par1ItemStack;
112                }
113            }
114        }
115    }