@Override
  /** Updates the blocks bounds based on its current state. Args: world, x, y, z */
  public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
    if (!rayTracing) {

      TEBase TE = getTileEntity(blockAccess, x, y, z);

      if (TE != null) {

        int slopeID = TE.getData();
        Slope slope = Slope.slopesList[slopeID];

        switch (slope.getPrimaryType()) {
          case PRISM:
          case PRISM_1P:
          case PRISM_2P:
          case PRISM_3P:
          case PRISM_4P:
            if (slope.isPositive) {
              setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
            } else {
              setBlockBounds(0.0F, 0.5F, 0.0F, 1.0F, 1.0F, 1.0F);
            }
            break;
          default:
            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
            break;
        }
      }
    }
  }
  @Override
  /** Returns whether sides share faces based on sloping property and face shape. */
  protected boolean shareFaces(
      TEBase TE_adj, TEBase TE_src, ForgeDirection side_adj, ForgeDirection side_src) {
    if (TE_adj.getBlockType() == this) {

      Slope slope_src = Slope.slopesList[TE_src.getData()];
      Slope slope_adj = Slope.slopesList[TE_adj.getData()];

      if (!slope_adj.hasSide(side_adj)) {
        return false;
      } else if (slope_src.getFaceBias(side_src) == slope_adj.getFaceBias(side_adj)) {
        return true;
      } else {
        return false;
      }
    }

    return super.shareFaces(TE_adj, TE_src, side_adj, side_src);
  }