Формованный рецепт с конкретно названным предметом?

Я пытаюсь создать рецепт крафта с bukkit, и я хочу, чтобы рецепт принимал ТОЛЬКО кожаный шлем с названием «Лучший шлем». прямо сейчас у меня есть это:

public static ItemStack lvl2Head = new ItemStack(Material.LEATHER_HELMET, 1);
{
    //removed unnessecary information
    lvl2HeadMeta.setDisplayName("Better Helmet 2");
}  
public void lvl1ArmorHead() {
    ShapedRecipe recipe = new ShapedRecipe(lvl2Head);
    recipe.shape("AAA", "ABA", "AAA");
    recipe.setIngredient('A', Material.DIAMOND);
        //want it to check it under here in place of "LEATHER_HELMET"
    recipe.setIngredient('B', Material.LEATHER_HELMET); 
    this.getServer().addRecipe(recipe);
}

Есть ли способ сделать это? Я попытался поставить имя нового ItemStack вместо Material.LEATHER_HELMET, но он хочет MaterialData, а не ItemStack.

обновить

Я все еще могу вытащить предмет из верстака, используя обычный кожаный шлем, этот код создан с помощью jojodmo.

Основной класс:

public static ShapedRecipe lvl1ArmorHeadRecipe() {
    ShapedRecipe recipe = new ShapedRecipe(lvl1Head);
    recipe.shape("AAA", "ABA", "AAA");
    recipe.setIngredient('A', Material.DIAMOND);
    recipe.setIngredient('B', Material.LEATHER_HELMET);
    return recipe;
}
public void lvl1ArmorHead(){
    this.getServer().addRecipe(lvl1ArmorHeadRecipe());
}

Класс EventHandler:

@EventHandler
    public void craft(CraftItemEvent e){
        if(e.getInventory() instanceof CraftingInventory){
        CraftingInventory inv = (CraftingInventory) e.getInventory();
        if(inv.getSize() != 4 && e.getRecipe().equals(Main.lvl1ArmorHeadRecipe())){
            org.bukkit.inventory.ItemStack helm = inv.getMatrix()[5];
            if(helm.hasItemMeta()){
                if(helm.getItemMeta().getDisplayName().equals("Better Helmet")){
                    //done.
                } else{
                    e.setCancelled(true);
                }
            } else {
                e.setCancelled(true);
            }
        }
    }
}

Примечание. Это для Bukkit 1.7.2.


person Tony    schedule 08.06.2014    source источник
comment
Вы также должны отменить событие, если элемент не имеет метаданных.   -  person mezzodrinker    schedule 09.06.2014
comment
@ flashdrive2049 Спасибо, что указали на это, я добавил это, но, похоже, это все еще не исправляет :( Я не знаю, что я мог упустить.   -  person Tony    schedule 09.06.2014
comment
Возможно, слишком старый, но стоит ли перенести его в аркаду?   -  person php_coder_3809625    schedule 22.01.2016


Ответы (2)


Я делал это раньше, мне потребовалось так много времени, чтобы понять, как это сделать! Единственная проблема заключается в том, что результат все еще отображается, если вы используете обычный кожаный шлем, но он просто не позволяет вам убрать результат из таблицы крафта.

Вот как я это сделал:

public ShapedRecipie lvl1ArmorHeadRecipie(){
  ShapedRecipe recipe = new ShapedRecipe(lvl2Head);
  recipe.shape("AAA", "ABA", "AAA");
  recipe.setIngredient('A', Material.DIAMOND);
  recipe.setIngredient('B', Material.LEATHER_HELMET);
  return recipie;
}

public void lvl1ArmorHead(){
  this.getServer().addRecipe(lvl1ArmorHeadRecipie());
  //do everything in here normally
}

Далее используйте это. Убедитесь, что класс находится в implement Listener

@EventHandler
public void craft(CraftItemEvent e){
  if(e.getInventory() instanceof CraftingInventory){
    CraftingInventory inv = (CraftingInventory) e.getInventory();
    if(inv.getSize() != 4 && e.getRecipe().equals(lvl1ArmorHelmetRecipe())){
      ItemStack helm = inv.getMatrix()[4];//get the middle item in the bench, which is the helmet
      if(helm.hasItemMeta()){//make sure the helmet has item meta
        if(helm.getItemMeta().getDisplayName().equals("Better Helmet")){//make sure the helmet's display name is 'Better Helmet'
          //you're done! It works! Do something like tell the player "you have crafted better armor" or something here.
          return;
        }
      }
      //the return; above would have been called if the crafting had succeeded. When it got called, the remainder of this method would not run (this part will not be run if the crafting has succeeded)
      //send the player a message to make it more realistic here. For my wizardry server I use: 'One of thee items used was incorrect, and unbalanced the energy. The death block hath been destroyed'
      e.setCanceled(true);
      e.setResult(new ItemStack(Material.AIR));
    }
  }
}
person Jojodmo    schedule 08.06.2014
comment
Эй, я пытаюсь реализовать это и обнаружил, что в eclipse ItemStack helm хочет быть org.bukkit.inventory.ItemStack helm, не знаю почему, но когда я создаю рецепт сейчас.. и пытаюсь его вытащить.. он дает мне это o.O, это не отмена это (я создаю его с помощью простого кожаного шлема). Я имею в виду, что в коде все выглядит правильно, все это имеет логический смысл, но, похоже, на самом деле это не отменяет событие - я обновлю свой код выше. - person Tony; 09.06.2014
comment
@TonyBilby попробуйте вывести каждую строку в консоль (System.out.println("text")), чтобы вы могли видеть, что происходит, под ItemStack helm = inv.getMatrix()[5]; сделайте что-нибудь, например, напечатайте, что это за материал, под e.setCancelled(true); напечатайте что-то вроде отменено и т. д. . После этого попробуйте создать и посмотреть, какие сообщения будут напечатаны, таким образом, вы сможете увидеть, что происходит в коде. - person Jojodmo; 09.06.2014
comment
@TonyBilby Я только что заметил ошибку, helm = inv.getMatrix()[5]; должно было быть helm = inv.getMatrix()[4];. Кроме того, событие не было бы отменено, если бы в шлеме не было ItemMeta! (упс!). Я обновил код, теперь он должен работать идеально! - person Jojodmo; 12.06.2014
comment
Кроме того, вы можете посмотреть эту тему, которую я начал некоторое время назад на bukkit: forums.bukkit.org/threads/ - person Jojodmo; 12.06.2014

Посмотрите PrepareItemCraftEvent, я ответил на ваш вопрос на форумах bukkit, посмотрите мой пост: http://forums.bukkit.org/threads/resource-no-nms-make-custom-crafting-recipes-ingredients-obey-itemmeta-displayname-e-t-c.280482/

person RaNdOmNaME_    schedule 23.08.2014