package net.t7seven7t.util;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.ItemType;
import org.bukkit.Bukkit;
import org.bukkit.CoalType;
import org.bukkit.DyeColor;
import org.bukkit.GrassSpecies;
import org.bukkit.Material;
import org.bukkit.SandstoneType;
import org.bukkit.TreeSpecies;
import org.bukkit.entity.EntityType;
import org.bukkit.material.Coal;
import org.bukkit.material.Leaves;
import org.bukkit.material.LongGrass;
import org.bukkit.material.MaterialData;
import org.bukkit.material.Sandstone;
import org.bukkit.material.SpawnEgg;
import org.bukkit.material.Tree;
import org.bukkit.material.WoodenStep;
import org.bukkit.material.Wool;
import java.util.function.Function;
import static org.bukkit.Material.matchMaterial;
/**
* Utility class for converting Strings to MaterialData objects
*/
public class MaterialDataUtil {
private static final WorldEdit worldedit;
static {
if (Bukkit.getPluginManager().isPluginEnabled("WorldEdit")) {
worldedit = WorldEdit.getInstance();
} else {
worldedit = null;
}
}
public static MaterialData getMaterialData(String identifier) {
final String[] split = identifier.replaceAll("\\s+", "_").split("\\W");
// TODO: Add additional material/name database like essentials/worldedit have
Material material = matchMaterial(split[0]);
if (material == null) {
// try worldedit
material = getWEMaterial(split[0]);
if (material == null) return null;
}
if (split.length == 1) {
return new MaterialData(material);
}
try {
final byte rawData = Byte.parseByte(split[1]);
return new MaterialData(material, rawData);
} catch (NumberFormatException e) {
// ignore
}
switch (material) {
case LEAVES:
return getMaterialData(material, Leaves::new, TreeSpecies.class, split[1]);
case COAL:
return getMaterialData(material, Coal::new, CoalType.class, split[1]);
case LONG_GRASS:
return getMaterialData(material, LongGrass::new, GrassSpecies.class, split[1]);
case SANDSTONE:
return getMaterialData(material, Sandstone::new, SandstoneType.class, split[1]);
case MONSTER_EGG:
return getMaterialData(material, SpawnEgg::new, EntityType.class, split[1]);
case LOG:
return getMaterialData(material, Tree::new, TreeSpecies.class, split[1]);
case WOOD_STEP:
return getMaterialData(material, WoodenStep::new, TreeSpecies.class, split[1]);
case WOOL:
return getMaterialData(material, Wool::new, DyeColor.class, split[1]);
// TODO: Add Dye here when Spigot finally accepts my PR to match other MaterialData types
default:
// Couldn't find additional data for this material
return new MaterialData(material);
}
}
private static <V extends Enum<V>> MaterialData getMaterialData(Material material,
Function<V, MaterialData> factory,
Class<V> enumClass, String id) {
final V result = EnumUtil.matchEnumValue(enumClass, id);
return result == null ? new MaterialData(material) : factory.apply(result);
}
private static Material getWEMaterial(String identifier) {
if (worldedit == null) return null;
final ItemType type = ItemType.lookup(identifier);
return type == null ? null : Material.getMaterial(type.getID());
}
}