2016-08-27 4 views
0

Я очень новичок в плагине minecraft, развивающемся в процессе обучения. Я работаю над тюремным плагином и создаю метод, который должен позволить игроку узнать, полна ли их инвентарь. Это не работает, и я не могу понять, почему. Код:Как узнать, заполнен ли инвентарь игроков - Minecraft

public void invFull(Player p) { 
     if (p.getInventory().contains(Material.AIR)) { 

     } else { 
      p.sendMessage(ChatColor.DARK_RED + "Your inventory is full!"); 
     } 
    } 
} 

Я также создал еще один метод, возвращающий логическое значение. Это также не работает. Код:

public boolean invFull(Player p) {   
     if (p.getInventory().contains(Material.AIR)) { 
      return false; 
     } else { 
      return true; 
     }   
} 
+0

Как насчет этого не работает? – Li357

+0

@ AndrewL.Когда я экспортирую плагин в папку плагинов и перезагружаю сервер. Это просто не работает. ни одно сообщение не показывает, когда это необходимо. – MrSanfrinsisco

+0

Как вы используете метод? Используйте как: 'if (invFull (insert_player)) {// делаем материал, заполнен} else {// не заполнен}' – Li357

ответ

1

Я думаю, вопрос в том, что игрок инвентаризации не может содержать Material.AIR. Попробуйте следующее:

public boolean invFull(Player p) {   
    return p.getInventory().firstEmpty() == -1;   
} 

В настоящее время я не уверен на 100%, если это firstEmpty() потерпит неудачу, если слот броня пуста, но я могу в данный момент не проверить это. Если это так, то другой вариант будет:

public boolean invFull(Player p) {   
    return !Arrays.asList(p.getInventory().getStorageContents()).contains(null);   
} 
+0

Чтобы понять, почему 'contains (Material.AIR)' не работает, слоты инвентаря имеют тип 'ItemStack', тогда как' Material.AIR' имеет несовместимый тип 'Material'. То есть инвентарь будет * никогда * содержать 'Material.AIR' (или любой другой' Material'!) – Draco18s

+0

Это просто неправда. PlayerInventory содержит (как вы сказали ItemStacks), поэтому вы правы. PlayerInventory реализует интерфейс инвентаризации, который предоставляет этот метод, который перегружен для многих разных параметров. Таким образом, существует метод ['contains (Material)'] (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/Inventory.html#contains (org.bukkit.Material)), который проверяет каждый ItemStack, если его Материал имеет предоставленный Тип. Но Material.AIR никогда не будет в инвентаре игроков, вместо этого нет ItemStacks -> null в пустом слоте Inventory. – Mit0x2

+0

Это верно только при использовании Bukkit, что не является общепринятым, и ни один из респондентов никогда не упоминал об использовании. – Draco18s

Смежные вопросы