2015-07-02 32 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); 
} 
相關問題