package tc.oc.commons.bukkit.util;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
public abstract class Materials {
/**
* Is the given {@link Material} a block that collides with entities?
*
* Note that this is not always 100% correct. There are a few blocks for which
* solidness depends on state, such as fence gates.
*/
public static boolean isColliding(Material material) {
if(material == null) {
return false;
}
switch(material) {
// Missing from Bukkit
case CARPET:
case WATER_LILY:
return true;
// Incorrectly included by Bukkit
case SIGN_POST:
case WALL_SIGN:
case WOOD_PLATE:
case STONE_PLATE:
case IRON_PLATE:
case GOLD_PLATE:
case STANDING_BANNER:
case WALL_BANNER:
return false;
default:
return material.isSolid();
}
}
public static boolean isColliding(MaterialData material) {
return isColliding(material.getItemType());
}
public static boolean isColliding(BlockState block) {
return isColliding(block.getMaterial());
}
/**
* Does the given {@link Material} support falling blocks placed on top of it?
*
* This only counts when the gravity block is placed directly on top of the given material,
* not when it is already falling and lands on the material.
*/
public static boolean canSupportBlocks(Material material) {
if(material == null || !material.isBlock() || isLiquid(material)) return false;
switch(material) {
case AIR:
case FIRE:
return false;
}
return true;
}
public static boolean isWater(Material material) {
return material == Material.WATER || material == Material.STATIONARY_WATER;
}
public static boolean isWater(MaterialData material) {
return isWater(material.getItemType());
}
public static boolean isWater(Location location) {
return isWater(location.getBlock().getType());
}
public static boolean isWater(BlockState block) {
return isWater(block.getMaterial());
}
public static boolean isLava(Material material) {
return material == Material.LAVA || material == Material.STATIONARY_LAVA;
}
public static boolean isLava(MaterialData material) {
return isLava(material.getItemType());
}
public static boolean isLava(Location location) {
return isLava(location.getBlock().getType());
}
public static boolean isLava(BlockState block) {
return isLava(block.getMaterial());
}
public static boolean isLiquid(Material material) {
return isWater(material) || isLava(material);
}
public static boolean isClimbable(Material material) {
return material == Material.LADDER || material == Material.VINE;
}
public static boolean isClimbable(Location location) {
return isClimbable(location.getBlock().getType());
}
public static boolean isBucket(ItemStack bucket) {
return isBucket(bucket.getType());
}
public static boolean isBucket(Material bucket) {
return bucket == Material.BUCKET || bucket == Material.LAVA_BUCKET || bucket == Material.WATER_BUCKET || bucket == Material.MILK_BUCKET;
}
public static boolean isSign(Material material) {
return material == Material.SIGN_POST || material == Material.WALL_SIGN;
}
public static boolean isChest(Material material) {
return material == Material.CHEST || material == Material.TRAPPED_CHEST;
}
public static Material materialInBucket(ItemStack bucket) {
return materialInBucket(bucket.getType());
}
public static Material materialInBucket(Material bucket) {
switch(bucket) {
case BUCKET:
case MILK_BUCKET:
return Material.AIR;
case LAVA_BUCKET: return Material.LAVA;
case WATER_BUCKET: return Material.WATER;
default: throw new IllegalArgumentException(bucket + " is not a bucket");
}
}
public static Material materialAt(Location location) {
Block block = location.getBlock();
return block == null ? Material.AIR : block.getType();
}
}