package net.glowstone.block;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.InputStreamReader;
import java.util.EnumMap;
import java.util.Map;
import java.util.Set;
public class BuiltinMaterialValueManager implements MaterialValueManager {
private final Map<Material, BuiltinValueCollection> values;
private BuiltinValueCollection defaultValue;
public BuiltinMaterialValueManager() {
values = new EnumMap<>(Material.class);
YamlConfiguration builtinValues = YamlConfiguration.loadConfiguration(
new InputStreamReader(getClass().getClassLoader().getResourceAsStream("builtin/materialValues.yml")));
this.defaultValue = new BuiltinValueCollection(builtinValues.getConfigurationSection("default"));
registerBuiltins(builtinValues);
}
private void registerBuiltins(ConfigurationSection mainSection) {
ConfigurationSection valuesSection = mainSection.getConfigurationSection("values");
Set<String> materials = valuesSection.getKeys(false);
for (String strMaterial : materials) {
Material material = Material.matchMaterial(strMaterial);
if (material == null) {
throw new RuntimeException("Invalid builtin/materialValues.yml: Couldn't found material: " + strMaterial);
}
ConfigurationSection materialSection = valuesSection.getConfigurationSection(strMaterial);
values.put(material, new BuiltinValueCollection(materialSection));
}
}
@Override
public ValueCollection getValues(Material material) {
if (values.containsKey(material))
return values.get(material);
return defaultValue;
}
private final class BuiltinValueCollection implements ValueCollection {
private final ConfigurationSection section;
BuiltinValueCollection(ConfigurationSection section) {
this.section = section;
}
private Object get(String name) {
Object got = section.get(name);
if (got == null)
return defaultValue.get(name);
return got;
}
@Override
public float getHardness() {
float hardness = ((Number) get("hardness")).floatValue();
return hardness == -1 ? Float.MAX_VALUE : hardness;
}
@Override
public float getBlastResistance() {
return ((Number) get("blastResistance")).floatValue();
}
@Override
public int getLightOpacity() {
return ((Number) get("lightOpacity")).intValue();
}
@Override
public int getFlameResistance() {
return ((Number) get("flameResistance")).intValue();
}
@Override
public int getFireResistance() {
return ((Number) get("fireResistance")).intValue();
}
}
}