package net.glowstone.block;
import net.glowstone.GlowChunk;
import net.glowstone.GlowWorld;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.material.MaterialData;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import java.util.List;
/**
* Represents a state a block could be in as well as any tile entities.
*/
public class GlowBlockState implements BlockState {
private final GlowWorld world;
private final GlowChunk chunk;
private final int x;
private final int y;
private final int z;
private final byte light;
protected int type;
protected MaterialData data;
public GlowBlockState(GlowBlock block) {
world = block.getWorld();
x = block.getX();
y = block.getY();
z = block.getZ();
type = block.getTypeId();
light = block.getLightLevel();
chunk = block.getChunk();
makeData(block.getData());
}
////////////////////////////////////////////////////////////////////////////
// Basics
@Override
public GlowWorld getWorld() {
return world;
}
@Override
public GlowChunk getChunk() {
return chunk;
}
@Override
public GlowBlock getBlock() {
return world.getBlockAt(x, y, z);
}
@Override
public int getX() {
return x;
}
@Override
public int getY() {
return y;
}
@Override
public int getZ() {
return z;
}
@Override
public Location getLocation() {
return getBlock().getLocation();
}
@Override
public Location getLocation(Location loc) {
return getBlock().getLocation(loc);
}
////////////////////////////////////////////////////////////////////////////
// Type and data
@Override
public final Material getType() {
return Material.getMaterial(type);
}
@Override
public final void setType(Material type) {
setTypeId(type.getId());
}
@Override
public final int getTypeId() {
return type;
}
@Override
public final boolean setTypeId(int type) {
this.type = type;
makeData((byte) 0);
return true;
}
@Override
public final MaterialData getData() {
return data;
}
@Override
public final void setData(MaterialData data) {
this.data = data;
}
@Override
public final byte getRawData() {
return getData().getData();
}
@Override
public final void setRawData(byte data) {
getData().setData(data);
}
@Override
public final byte getLightLevel() {
return light;
}
////////////////////////////////////////////////////////////////////////////
// Update
@Override
public final boolean update() {
return update(false, true);
}
@Override
public final boolean update(boolean force) {
return update(force, true);
}
@Override
public boolean update(boolean force, boolean applyPhysics) {
Block block = getBlock();
return (block.getTypeId() == type || force) && block.setTypeIdAndData(type, getRawData(), applyPhysics);
}
////////////////////////////////////////////////////////////////////////////
// Internals
private void makeData(byte data) {
Material mat = Material.getMaterial(type);
if (mat == null) {
this.data = new MaterialData(type, data);
} else {
this.data = mat.getNewData(data);
}
}
////////////////////////////////////////////////////////////////////////////
// Metadata
@Override
public void setMetadata(String metadataKey, MetadataValue newMetadataValue) {
getBlock().setMetadata(metadataKey, newMetadataValue);
}
@Override
public List<MetadataValue> getMetadata(String metadataKey) {
return getBlock().getMetadata(metadataKey);
}
@Override
public boolean hasMetadata(String metadataKey) {
return getBlock().hasMetadata(metadataKey);
}
@Override
public void removeMetadata(String metadataKey, Plugin owningPlugin) {
getBlock().removeMetadata(metadataKey, owningPlugin);
}
}