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

org.bukkit.craftbukkit.block.CraftBlockState Maven / Gradle / Ivy

package org.bukkit.craftbukkit.block;

import net.minecraft.server.BlockPosition;
import net.minecraft.server.TileEntity;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.CraftChunk;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.material.MaterialData;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;

import java.util.List;

public class CraftBlockState implements BlockState {
  protected final byte light;
  private final CraftWorld world;
  private final CraftChunk chunk;
  private final int x;
  private final int y;
  private final int z;
  protected int type;
  protected MaterialData data;
  protected int flag;

  public CraftBlockState(final Block block) {
    this.world = (CraftWorld) block.getWorld();
    this.x = block.getX();
    this.y = block.getY();
    this.z = block.getZ();
    this.type = block.getTypeId();
    this.light = block.getLightLevel();
    this.chunk = (CraftChunk) block.getChunk();
    this.flag = 3;

    createData(block.getData());
  }

  public CraftBlockState(final Block block, int flag) {
    this(block);
    this.flag = flag;
  }

  public CraftBlockState(Material material) {
    world = null;
    type = material.getId();
    light = 0;
    chunk = null;
    x = y = z = 0;
  }

  public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z) {
    return new CraftBlockState(world.getWorld().getBlockAt(x, y, z));
  }

  public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z, int flag) {
    return new CraftBlockState(world.getWorld().getBlockAt(x, y, z), flag);
  }

  public World getWorld() {
    requirePlaced();
    return world;
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }

  public int getZ() {
    return z;
  }

  public Chunk getChunk() {
    requirePlaced();
    return chunk;
  }

  public MaterialData getData() {
    return data;
  }

  public void setData(final MaterialData data) {
    Material mat = getType();

    if ((mat == null) || (mat.getData() == null)) {
      this.data = data;
    } else {
      if ((data.getClass() == mat.getData()) || (data.getClass() == MaterialData.class)) {
        this.data = data;
      } else {
        throw new IllegalArgumentException("Provided data is not of type "
          + mat.getData().getName() + ", found " + data.getClass().getName());
      }
    }
  }

  public boolean setTypeId(final int type) {
    if (this.type != type) {
      this.type = type;

      createData((byte) 0);
    }
    return true;
  }

  public Material getType() {
    return Material.getMaterial(getTypeId());
  }

  public void setType(final Material type) {
    setTypeId(type.getId());
  }

  public int getFlag() {
    return flag;
  }

  public void setFlag(int flag) {
    this.flag = flag;
  }

  public int getTypeId() {
    return type;
  }

  public byte getLightLevel() {
    return light;
  }

  public Block getBlock() {
    requirePlaced();
    return world.getBlockAt(x, y, z);
  }

  public boolean update() {
    return update(false);
  }

  public boolean update(boolean force) {
    return update(force, true);
  }

  public boolean update(boolean force, boolean applyPhysics) {
    requirePlaced();
    Block block = getBlock();

    if (block.getType() != getType()) {
      if (!force) {
        return false;
      }
    }

    block.setTypeIdAndData(getTypeId(), getRawData(), applyPhysics);
    world.getHandle().notify(new BlockPosition(x, y, z));

    return true;
  }

  private void createData(final byte data) {
    Material mat = getType();
    if (mat == null || mat.getData() == null) {
      this.data = new MaterialData(type, data);
    } else {
      this.data = mat.getNewData(data);
    }
  }

  public byte getRawData() {
    return data.getData();
  }

  public void setRawData(byte data) {
    this.data.setData(data);
  }

  public Location getLocation() {
    return new Location(world, x, y, z);
  }

  public Location getLocation(Location loc) {
    if (loc != null) {
      loc.setWorld(world);
      loc.setX(x);
      loc.setY(y);
      loc.setZ(z);
      loc.setYaw(0);
      loc.setPitch(0);
    }

    return loc;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final CraftBlockState other = (CraftBlockState) obj;
    if (this.world != other.world && (this.world == null || !this.world.equals(other.world))) {
      return false;
    }
    if (this.x != other.x) {
      return false;
    }
    if (this.y != other.y) {
      return false;
    }
    if (this.z != other.z) {
      return false;
    }
    if (this.type != other.type) {
      return false;
    }
    return this.data == other.data || (this.data != null && this.data.equals(other.data));
  }

  @Override
  public int hashCode() {
    int hash = 7;
    hash = 73 * hash + (this.world != null ? this.world.hashCode() : 0);
    hash = 73 * hash + this.x;
    hash = 73 * hash + this.y;
    hash = 73 * hash + this.z;
    hash = 73 * hash + this.type;
    hash = 73 * hash + (this.data != null ? this.data.hashCode() : 0);
    return hash;
  }

  public TileEntity getTileEntity() {
    return null;
  }

  public void setMetadata(String metadataKey, MetadataValue newMetadataValue) {
    requirePlaced();
    chunk.getCraftWorld().getBlockMetadata().setMetadata(getBlock(), metadataKey, newMetadataValue);
  }

  public List getMetadata(String metadataKey) {
    requirePlaced();
    return chunk.getCraftWorld().getBlockMetadata().getMetadata(getBlock(), metadataKey);
  }

  public boolean hasMetadata(String metadataKey) {
    requirePlaced();
    return chunk.getCraftWorld().getBlockMetadata().hasMetadata(getBlock(), metadataKey);
  }

  public void removeMetadata(String metadataKey, Plugin owningPlugin) {
    requirePlaced();
    chunk.getCraftWorld().getBlockMetadata().removeMetadata(getBlock(), metadataKey, owningPlugin);
  }

  @Override
  public boolean isPlaced() {
    return world != null;
  }

  protected void requirePlaced() {
    if (!isPlaced()) {
      throw new IllegalStateException("The blockState must be placed to call this method");
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy