我使用的是Spigot API 1.8.6,我将bukkit放在标题中,因为它们几乎完全相同。
我有一个配置选择,可以从配置中获取项ID以及它们的值。项目ID转换为材料。然而,正在跳过173和42,它们是铁块和煤块。这就是我所拥有的:
for(String key : plugin.getConfig().getConfigurationSection("sellall"+ranks).getKeys(false))
{
int id = Integer.valueOf(key);
Material material = Material.getMaterial(id);
}
然后,我检查玩家的库存材料,找到每个项目ID BESIDES 42和173,铁块和煤块的材料。我的问题是为什么他们会跳过它们,我该如何解决它。
这是我尝试过的,因为它们被跳过了我试过这个:
String f = key;
Material mat = Material.getMaterial(f.toUpperCase());
if(mat == Material.IRON_BLOCK||mat == Material.COAL_BLOCK)
{
// continue with code like the else
}
else
{
// same code as if they are iron block or coal block
}
然而,这样做也会跳过它们。
注意:我尝试过多个版本的插头
最后的问题:为什么Bukkit / Spigot API会跳过铁块和煤块,但不会跳过其他所有内容,我该如何解决?
答案 0 :(得分:1)
我认为这里的问题都与项目ID有关。
查看Material.getMaterial(int)
的Javadoc:
已过时。魔术值
This post解释了什么是神奇的价值:
魔术值是不能清楚地展示它们代表什么的值,例如,物品ID。他们已经弃用了这些,因为我的世界变化很容易破坏ID系统,他们希望人们使用当前存在的bukkit API Enum等价物。例如,使用Material类型而不是block id。
然后你应该使用Material.getMaterial(String)
代替。
您的第一次尝试无效,因为key
是一个数字。
您必须保存枚举常量(使用Enum.name()
)。
FileConfiguration config; // ...
ConfigurationSection path = config.getConfigurationSection("sellall" + ranks);
Material key = Material.IRON_BLOCK;
Object value; // ...
path.set(key.name(), value);
for (String key : path.getKeys(false)) {
Material material = Material.getMaterial(key);
}