@Override
  public void placeBlock(
      GlowPlayer player,
      GlowBlockState state,
      BlockFace face,
      ItemStack holding,
      Vector clickedLoc) {
    super.placeBlock(player, state, face, holding, clickedLoc);

    MaterialData data = state.getData();
    if (data instanceof Ladder) {
      if (face != BlockFace.DOWN
          && face != BlockFace.UP
          && isTargetOccluding(state, face.getOppositeFace())) {
        ((Ladder) data).setFacingDirection(face.getOppositeFace());
      } else {
        if (isTargetOccluding(state, BlockFace.SOUTH)) {
          ((Ladder) data).setFacingDirection(BlockFace.SOUTH);
        } else if (isTargetOccluding(state, BlockFace.WEST)) {
          ((Ladder) data).setFacingDirection(BlockFace.WEST);
        } else if (isTargetOccluding(state, BlockFace.NORTH)) {
          ((Ladder) data).setFacingDirection(BlockFace.NORTH);
        } else if (isTargetOccluding(state, BlockFace.EAST)) {
          ((Ladder) data).setFacingDirection(BlockFace.EAST);
        } else {
          return;
        }
      }

      state.setData(data);
    } else {
      warnMaterialData(Ladder.class, data);
    }
  }
  @Override
  public void placeBlock(
      GlowPlayer player,
      GlowBlockState state,
      BlockFace face,
      ItemStack holding,
      Vector clickedLoc) {
    super.placeBlock(player, state, face, holding, clickedLoc);

    MaterialData data = state.getData();
    if (data instanceof Vine) {
      if (face == BlockFace.DOWN || face == BlockFace.UP) {
        return;
      } else {
        ((Vine) data).putOnFace(face.getOppositeFace());
      }
      state.setData(data);
    } else {
      warnMaterialData(Vine.class, data);
    }
  }