All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bukkit.material.Vine Maven / Gradle / Ivy

package org.bukkit.material;

import org.bukkit.Material;
import org.bukkit.block.BlockFace;

import java.util.Arrays;
import java.util.EnumSet;

/**
 * Represents a vine
 */
public class Vine extends MaterialData {
  private static final int VINE_NORTH = 0x4;
  private static final int VINE_EAST = 0x8;
  private static final int VINE_WEST = 0x2;
  private static final int VINE_SOUTH = 0x1;
  EnumSet possibleFaces = EnumSet.of(BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST);

  public Vine() {
    super(Material.VINE);
  }

  /**
   * @param type the raw type id
   * @param data the raw data value
   * @deprecated Magic value
   */
  @Deprecated
  public Vine(int type, byte data) {
    super(type, data);
  }

  /**
   * @param data the raw data value
   * @deprecated Magic value
   */
  @Deprecated
  public Vine(byte data) {
    super(Material.VINE, data);
  }

  public Vine(BlockFace... faces) {
    this(EnumSet.copyOf(Arrays.asList(faces)));
  }

  public Vine(EnumSet faces) {
    this((byte) 0);
    faces.retainAll(possibleFaces);

    byte data = 0;

    if (faces.contains(BlockFace.WEST)) {
      data |= VINE_WEST;
    }

    if (faces.contains(BlockFace.NORTH)) {
      data |= VINE_NORTH;
    }

    if (faces.contains(BlockFace.SOUTH)) {
      data |= VINE_SOUTH;
    }

    if (faces.contains(BlockFace.EAST)) {
      data |= VINE_EAST;
    }

    setData(data);
  }

  /**
   * Check if the vine is attached to the specified face of an adjacent
   * block. You can check two faces at once by passing e.g. {@link
   * BlockFace#NORTH_EAST}.
   *
   * @param face The face to check.
   * @return Whether it is attached to that face.
   */
  public boolean isOnFace(BlockFace face) {
    switch (face) {
      case WEST:
        return (getData() & VINE_WEST) == VINE_WEST;
      case NORTH:
        return (getData() & VINE_NORTH) == VINE_NORTH;
      case SOUTH:
        return (getData() & VINE_SOUTH) == VINE_SOUTH;
      case EAST:
        return (getData() & VINE_EAST) == VINE_EAST;
      case NORTH_EAST:
        return isOnFace(BlockFace.EAST) && isOnFace(BlockFace.NORTH);
      case NORTH_WEST:
        return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.NORTH);
      case SOUTH_EAST:
        return isOnFace(BlockFace.EAST) && isOnFace(BlockFace.SOUTH);
      case SOUTH_WEST:
        return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.SOUTH);
      case UP: // It's impossible to be accurate with this since it's contextual
        return true;
      default:
        return false;
    }
  }

  /**
   * Attach the vine to the specified face of an adjacent block.
   *
   * @param face The face to attach.
   */
  public void putOnFace(BlockFace face) {
    switch (face) {
      case WEST:
        setData((byte) (getData() | VINE_WEST));
        break;
      case NORTH:
        setData((byte) (getData() | VINE_NORTH));
        break;
      case SOUTH:
        setData((byte) (getData() | VINE_SOUTH));
        break;
      case EAST:
        setData((byte) (getData() | VINE_EAST));
        break;
      case NORTH_WEST:
        putOnFace(BlockFace.WEST);
        putOnFace(BlockFace.NORTH);
        break;
      case SOUTH_WEST:
        putOnFace(BlockFace.WEST);
        putOnFace(BlockFace.SOUTH);
        break;
      case NORTH_EAST:
        putOnFace(BlockFace.EAST);
        putOnFace(BlockFace.NORTH);
        break;
      case SOUTH_EAST:
        putOnFace(BlockFace.EAST);
        putOnFace(BlockFace.SOUTH);
        break;
      case UP:
        break;
      default:
        throw new IllegalArgumentException("Vines can't go on face " + face);
    }
  }

  /**
   * Detach the vine from the specified face of an adjacent block.
   *
   * @param face The face to detach.
   */
  public void removeFromFace(BlockFace face) {
    switch (face) {
      case WEST:
        setData((byte) (getData() & ~VINE_WEST));
        break;
      case NORTH:
        setData((byte) (getData() & ~VINE_NORTH));
        break;
      case SOUTH:
        setData((byte) (getData() & ~VINE_SOUTH));
        break;
      case EAST:
        setData((byte) (getData() & ~VINE_EAST));
        break;
      case NORTH_WEST:
        removeFromFace(BlockFace.WEST);
        removeFromFace(BlockFace.NORTH);
        break;
      case SOUTH_WEST:
        removeFromFace(BlockFace.WEST);
        removeFromFace(BlockFace.SOUTH);
        break;
      case NORTH_EAST:
        removeFromFace(BlockFace.EAST);
        removeFromFace(BlockFace.NORTH);
        break;
      case SOUTH_EAST:
        removeFromFace(BlockFace.EAST);
        removeFromFace(BlockFace.SOUTH);
        break;
      case UP:
        break;
      default:
        throw new IllegalArgumentException("Vines can't go on face " + face);
    }
  }

  @Override
  public String toString() {
    return "VINE";
  }

  @Override
  public Vine clone() {
    return (Vine) super.clone();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy