public override bool PlantOn(IntVector3 blockPos)
    {
        Tuple <IntVector3, byte>[] treeBlocks = new Tuple <IntVector3, byte> [48];
        for (int i = 0; i < 48; i++)
        {
            treeBlocks[i] = Tuple.Create(blockPos + treeBlockVectors[i].Item1, treeBlockVectors[i].Item2);
        }

        if (!CanGrowOn(blockPos))
        {
            return(false);
        }

        terrain.SetBlocks(treeBlocks);
        plantBlocks.Add(blockPos);
        Tuple <int, int> gridPos = Tuple.Create(blockPos.x / GRID_SIZE, blockPos.z / GRID_SIZE);

        if (!grid.ContainsKey(gridPos))
        {
            grid[gridPos] = new List <IntVector3>();
        }
        grid[gridPos].Add(blockPos);

        CollisionShape collisionShape = new CollisionShape();
        BoxShape       b = new BoxShape();

        b.SetExtents(new Vector3(Block.SIZE * 3.0f, 4.0f * Block.SIZE, Block.SIZE * 3.0f)); //trees are 8ish blocks tall
        collisionShape.SetShape(b);

        PhysicsBody physicsBody = new StaticBody();

        physicsBody.AddToGroup("plants");
        physicsBody.AddToGroup("alive");


        //Don't collide with player
        physicsBody.SetCollisionLayerBit(0, false);
        physicsBody.SetCollisionMaskBit(0, false);

        //But still collide with giants
        physicsBody.SetCollisionLayerBit(2, true);

        //And still get picked up by the giant areas
        physicsBody.SetCollisionMaskBit(31, true);

        Vector3 position = (blockPos + new Vector3(0, 5, 0)) * Block.SIZE + new Vector3(0, 5, 0); //the plus 5 to make it actually seen

        physicsBody.SetTranslation(position);

        physicsBody.AddChild(collisionShape);

        physicsBodies[blockPos] = physicsBody;
        plants.AddChild(physicsBody);

        return(true);
    }