2015-07-02 30 views
1

我使用的是Spigot API 1.8.6,我在标题中放了bukkit,因为它们几乎完全一样。Bukkit API为什么不能识别这些块

我有一个配置选项,可以从配置中获取项目id以及它们的值。项目id被转换成材料。然而,铁块和煤块中的173个和42个正在被跳过。这是我有:

for(String key : plugin.getConfig().getConfigurationSection("sellall"+ranks).getKeys(false)) 
{ 
    int id = Integer.valueOf(key); 
    Material material = Material.getMaterial(id); 
} 

我再检查玩家的库存材料,这些材料被发现每一个项目编号除了 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 /插口API跳过铁块和煤块,而不是跳过一切,我将如何解决?

+0

我试图扫描玩家的库存煤和铁矿石块(总是检测/发现他们)和'Material.getMaterial(41)'和'Material.getMaterial(173)'返回正确的材料。我使用Craftbukkit以及Spigot版本1.8.3和1.8.7。你的代码中的其他内容可能会导致此问题吗? –

回答

1

我认为这里的问题都是关于物品ID的。

看的Javadoc Material.getMaterial(int)

已过时。魔法值

This post解释了什么是魔法值是:

魔法值是不清楚地表明他们所代表,例如,项目ID是什么值。他们不赞成这些,因为我的世界的变化很容易破坏ID系统,他们希望人们使用当前存在的bukkit API Enum等价物。例如,使用材料类型而不是块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); 
} 
相关问题