/**
  * Test if something solid/ground-like collides within the given margin above the height of the
  * player.
  *
  * @param marginAboveHeight
  * @return
  */
 public boolean isHeadObstructed(double marginAboveHeight) {
   return BlockProperties.collides(
       blockCache,
       x - width,
       y + eyeHeight,
       z - width,
       x + width,
       y + eyeHeight + marginAboveHeight,
       z + width,
       BlockProperties.F_GROUND | BlockProperties.F_SOLID);
 }
 /**
  * Check if solid blocks hit the box.
  *
  * @param xzMargin
  * @param yMargin
  * @return
  */
 public boolean isNextToGround(final double xzMargin, final double yMargin) {
   // TODO: Adjust to check block flags ?
   return BlockProperties.collides(
       blockCache,
       minX - xzMargin,
       minY - yMargin,
       minZ - xzMargin,
       maxX + xzMargin,
       maxY + yMargin,
       maxZ + xzMargin,
       BlockProperties.F_GROUND);
 }
 /**
  * Checks if the player is in water.
  *
  * @return true, if the player is in water
  */
 public boolean isInWater() {
   if (inWater == null) {
     if (blockFlags != null && (blockFlags.longValue() & BlockProperties.F_WATER) == 0) {
       inWater = false;
       return false;
     }
     // TODO: ...
     //          final double dX = -0.001D;
     //          final double dY = -0.40000000596046448D - 0.001D;
     //          final double dZ = dX;
     //          inWater = BlockProperties.collides(blockCache, minX - dX, minY - dY, minZ - dZ,
     // maxX + dX, maxY + dY, maxZ + dZ, BlockProperties.F_WATER);
     inWater =
         BlockProperties.collides(
             blockCache, minX, minY, minZ, maxX, maxY, maxZ, BlockProperties.F_WATER);
   }
   return inWater;
 }
 /**
  * Checks if the player is in lava.
  *
  * @return true, if the player is in lava
  */
 public boolean isInLava() {
   if (inLava == null) {
     if (blockFlags != null && (blockFlags.longValue() & BlockProperties.F_LAVA) == 0) {
       inLava = false;
       return false;
     }
     // TODO: ...
     //          final double dX = -0.10000000149011612D;
     //          final double dY = -0.40000000596046448D;
     //          final double dZ = dX;
     //          inLava = BlockProperties.collides(blockCache, minX - dX, minY - dY, minZ - dZ,
     // maxX + dX, maxY + dY, maxZ + dZ, BlockProperties.F_LAVA);
     inLava =
         BlockProperties.collides(
             blockCache, minX, minY, minZ, maxX, maxY, maxZ, BlockProperties.F_LAVA);
   }
   return inLava;
 }
 /**
  * Checks if the player is in water.
  *
  * @return true, if the player is in water
  */
 public boolean isInWater() {
   if (inWater == null) {
     final double dX = -0.001D;
     final double dY = -0.40000000596046448D - 0.001D;
     final double dZ = -0.001D;
     inWater =
         BlockProperties.collides(
             getBlockAccess(),
             minX - dX,
             minY - dY,
             minZ - dZ,
             maxX + dX,
             maxY + dY,
             maxZ + dZ,
             BlockProperties.F_WATER);
   }
   return inWater;
 }
 /**
  * Checks if the player is in lava.
  *
  * @return true, if the player is in lava
  */
 public boolean isInLava() {
   if (inLava == null) {
     final double dX = -0.10000000149011612D;
     final double dY = -0.40000000596046448D;
     final double dZ = dX;
     inLava =
         BlockProperties.collides(
             getBlockAccess(),
             minX - dX,
             minY - dY,
             minZ - dZ,
             maxX + dX,
             maxY + dY,
             maxZ + dZ,
             BlockProperties.F_LAVA);
   }
   return inLava;
 }
 /**
  * Checks if the player is above stairs.
  *
  * @return true, if the player above on stairs
  */
 public boolean isAboveStairs() {
   if (aboveStairs == null) {
     // aboveStairs =
     // BlockProperties.isStairs(getTypeIdBelow().intValue());
     // TODO: maybe distinguish upside down stairs and normal stairs !
     final double diff = getWidth() + 0.001;
     aboveStairs =
         BlockProperties.collides(
             getBlockAccess(),
             x - diff,
             y + 0.25,
             z - diff,
             x + diff,
             y - 1.0,
             z + diff,
             BlockProperties.F_STAIRS);
   }
   return aboveStairs;
 }
 /**
  * Checks if the player is above stairs.
  *
  * @return true, if the player above on stairs
  */
 public boolean isAboveStairs() {
   if (aboveStairs == null) {
     if (blockFlags != null && (blockFlags.longValue() & BlockProperties.F_STAIRS) == 0) {
       aboveStairs = false;
       return false;
     }
     // TODO: Distinguish based on actual height off .0 ?
     // TODO: diff still needed ?
     final double diff = 0; // 0.001;
     aboveStairs =
         BlockProperties.collides(
             blockCache,
             minX - diff,
             minY - 1.0,
             minZ - diff,
             maxX + diff,
             minY + 0.25,
             maxZ + diff,
             BlockProperties.F_STAIRS);
   }
   return aboveStairs;
 }