package tc.oc.pgm.filters.query;
import javax.annotation.Nullable;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.material.MaterialData;
import org.bukkit.util.ImVector;
import tc.oc.pgm.PGM;
import tc.oc.pgm.match.Match;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* A block query is canonically defined by a {@link World} and a set of integer block coordinates.
* The other properties are created lazily, to gain a bit of efficiency when querying filters that
* don't check them.
*/
public class BlockQuery implements IBlockQuery {
private final World world;
private final Match match;
private final int x, y, z;
private @Nullable BlockState block;
private @Nullable Location location;
private @Nullable ImVector blockCenter;
private @Nullable MaterialData material;
protected BlockQuery(World world, int x, int y, int z, @Nullable BlockState block) {
this.world = checkNotNull(world);
this.match = PGM.getMatchManager().getMatch(world);
this.x = x;
this.y = y;
this.z = z;
this.block = block;
}
public BlockQuery(Block block) {
this(block.getWorld(), block.getX(), block.getY(), block.getZ(), null);
}
public BlockQuery(BlockState block) {
this(block.getWorld(), block.getX(), block.getY(), block.getZ(), block);
}
@Override
public Match getMatch() {
return match;
}
@Override
public BlockState getBlock() {
if(block == null) {
block = world.getBlockAt(x, y, z).getState();
}
return block;
}
@Override
public Location getLocation() {
if(location == null) {
location = new Location(world, x, y, z);
}
return location;
}
@Override
public ImVector blockCenter() {
if(blockCenter == null) {
blockCenter = ImVector.centerOf(x, y, z);
}
return blockCenter;
}
@Override
public MaterialData getMaterial() {
if(material == null) {
material = getBlock().getMaterialData();
}
return material;
}
}