Помогите Не работает ивент PrepareItemCraft

thematdev

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
thematdev
PHP:
@SuppressWarnings("unused")
    @EventHandler
    public void CraftCheck(PrepareItemCraftEvent e ) {
        ItemStack item = new ItemStack(Material.EYE_OF_ENDER);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&6Хилер"));
        List<String> lore = new ArrayList<String>();
        lore.add(ChatColor.DARK_PURPLE + "Будет лечить Вас от всех ран в течении 5 секунд!");
        lore.add(ChatColor.AQUA + "Использовать на ПКМ!");
        meta.setLore(lore);
        item.setItemMeta(meta);
        ShapedRecipe shapedCraft = new ShapedRecipe(item);
        ItemStack item1 = new ItemStack(Material.SAND);
        ItemStack item2 = new ItemStack(Material.SAND);
        ItemStack item3 = new ItemStack(Material.SAND);
        ItemStack item4 = new ItemStack(Material.SAND);
        ItemStack item5 = new ItemStack(Material.SAND);
        ItemStack item6 = new ItemStack(Material.SAND);
        ItemStack item7 = new ItemStack(Material.SAND);
        ItemStack item8 = new ItemStack(Material.SAND);
        ItemStack item9 = new ItemStack(Material.SAND);
        ItemStack item10 = new ItemStack(Material.POTION, 1, (short)8197);
        ItemStack item11 = new ItemStack(Material.ENDER_PEARL);
        //Item defining
        
        
        Map<Character,ItemStack> ingredients = shapedCraft.getIngredientMap();
        for (String shape:shapedCraft.getShape()) {
            item1 = ingredients.get(shape.charAt(0));
            item2 = ingredients.get(shape.charAt(1));
            item3 = ingredients.get(shape.charAt(2));
            item4 = ingredients.get(shape.charAt(3));
            item5 = ingredients.get(shape.charAt(4));
            item6 = ingredients.get(shape.charAt(5));
            item7 = ingredients.get(shape.charAt(6));
            item8 = ingredients.get(shape.charAt(7));
            item9 = ingredients.get(shape.charAt(8));
                }
        if (item1.equals(item10) && item3.equals(item10) && item7.equals(item10) && item9.equals(item10) && item5.equals(item11)) {
            e.getInventory().setResult(item);
            }

    }
Ну вот разобрался с кастомными стаками, теперь хочу сделать этот крафт. Из главного класса убрал старый рецепт(дабы не перехватывал ивент) написал код. И почему-то не работает...
Заранее благодарен за помощь :3
Мур-мур
 
Offtopic:
i

Итак, ты понимаешь, что этот код делает? Я тоже нет((
 
Offtopic:
i

Итак, ты понимаешь, что этот код делает? Я тоже нет((
Я понимаю. Получает что есть в верстаке, потом сверяет, и если правильно, то ставит результат!
 
Я понимаю. Получает что есть в верстаке, потом сверяет, и если правильно, то ставит результат!
Нуу, как бы это по мягче сказать. Ты инициализируешь все вещи во время КАЖДОГО выполнения евента, далее ты СОЗДАЕШЬ НОВЫЙ РЕЦЕПТ из которого В ЦИКЛЕ ДОСТАЕШЬ ВСЕ вещи, и потом ты что то сверяешь. Надежный план. Как швейцарские часы.
 
Нуу, как бы это по мягче сказать. Ты инициализируешь все вещи во время КАЖДОГО выполнения евента, далее ты СОЗДАЕШЬ НОВЫЙ РЕЦЕПТ из которого В ЦИКЛЕ ДОСТАЕШЬ ВСЕ вещи, и потом ты что то сверяешь. Надежный план. Как швейцарские часы.
Окей, щас переделаю. Но вопрос почему крафт не работает?
 
У тебя сейчас черти что... Можешь подождать немного и я сделаю тебе нормальный код(который будет работать на костылях. Ну а что ты хотел, если делал свой крафт) крафта.
 
У тебя сейчас черти что... Можешь подождать немного и я сделаю тебе нормальный код(который будет работать на костылях. Ну а что ты хотел, если делал свой крафт) крафта.
Спасибо, буду этим шаблоном пользоваться, ибо нужно очень много крафтов с кастомным стаками, абилками.
 
Короче...
Я сделал так:
Сам крафт.
Код:
public void onEnable() {
        ItemStack superItem = new ItemStack(Material.DIAMOND_SWORD, 1);
        ItemMeta i_meta = superItem.getItemMeta();
        i_meta.setDisplayName("§c§lДрагнир");
        i_meta.setLore(Arrays.asList(new String[] {
          "§cДрагнир §8- §7меч короля гномов §cФесса",
          "§7Говорят, что этот мечь",
          "§7король гномов выковал из своей кожи,",
          "§7которая по легендам была кожей дракона.",
          "",
          "§7Говорят, этот мечь невозможно сломать..." }));
        superItem.setItemMeta(i_meta);
        ShapedRecipe s_sword = new ShapedRecipe(superItem);
        s_sword.shape("-_-","_!_","-_-");
        s_sword.setIngredient('-', Material.ENCHANTMENT_TABLE);
        s_sword.setIngredient('_', Material.DIAMOND_BLOCK);
        s_sword.setIngredient('!', Material.DIAMOND_SWORD);
        getServer().addRecipe(s_sword);;
    }
Ивент проверки:
Код:
    @EventHandler
    public void onCraft(CraftItemEvent e) {
        CraftingInventory inv = e.getInventory();
        ItemStack result = inv.getResult();
        ItemMeta i_meta = result.getItemMeta();
        if(i_meta != null && i_meta.hasDisplayName() && i_meta.getDisplayName().equals("§c§lДрагнир")) {
            for(ItemStack item : inv.getContents()) {
                if(item != null && item.getType() == Material.DIAMOND_SWORD) {
                    if(item.getEnchantments().isEmpty()) {
                        e.setCancelled(true);
                        break;
                    }
                }
            }
        }
    }
Мне было лень делать нормально, но суть тут уловить можно.
Если меч не будет зачарован, то скрафтить предмет просто не получится.
Суть такова: Нужно проверять все предметы в инвентаре или по его ячейкам ну и сравнивать с нужными тебе предметами. Будь то меч с зачарованием или что-то в этом роде.
P.S. Если есть более адекватный способ, то прошу описать. Ибо мне было лень искать что-то другое, а потому сделал так.
P.S. @alexandrage может ты шаришь в этих крафтах. Можешь поправить меня, если я вдруг сделал не так или костылей перекинул.
 
Короче...
Я сделал так:
Сам крафт.
Код:
public void onEnable() {
        ItemStack superItem = new ItemStack(Material.DIAMOND_SWORD, 1);
        ItemMeta i_meta = superItem.getItemMeta();
        i_meta.setDisplayName("§c§lДрагнир");
        i_meta.setLore(Arrays.asList(new String[] {
          "§cДрагнир §8- §7меч короля гномов §cФесса",
          "§7Говорят, что этот мечь",
          "§7король гномов выковал из своей кожи,",
          "§7которая по легендам была кожей дракона.",
          "",
          "§7Говорят, этот мечь невозможно сломать..." }));
        superItem.setItemMeta(i_meta);
        ShapedRecipe s_sword = new ShapedRecipe(superItem);
        s_sword.shape("-_-","_!_","-_-");
        s_sword.setIngredient('-', Material.ENCHANTMENT_TABLE);
        s_sword.setIngredient('_', Material.DIAMOND_BLOCK);
        s_sword.setIngredient('!', Material.DIAMOND_SWORD);
        getServer().addRecipe(s_sword);;
    }
Ивент проверки:
Код:
    @EventHandler
    public void onCraft(CraftItemEvent e) {
        CraftingInventory inv = e.getInventory();
        ItemStack result = inv.getResult();
        ItemMeta i_meta = result.getItemMeta();
        if(i_meta != null && i_meta.hasDisplayName() && i_meta.getDisplayName().equals("§c§lДрагнир")) {
            for(ItemStack item : inv.getContents()) {
                if(item != null && item.getType() == Material.DIAMOND_SWORD) {
                    if(item.getEnchantments().isEmpty()) {
                        e.setCancelled(true);
                        break;
                    }
                }
            }
        }
    }
Мне было лень делать нормально, но суть тут уловить можно.
Если меч не будет зачарован, то скрафтить предмет просто не получится.
Суть такова: Нужно проверять все предметы в инвентаре или по его ячейкам ну и сравнивать с нужными тебе предметами. Будь то меч с зачарованием или что-то в этом роде.
P.S. Если есть более адекватный способ, то прошу описать. Ибо мне было лень искать что-то другое, а потому сделал так.
P.S. @alexandrage может ты шаришь в этих крафтах. Можешь поправить меня, если я вдруг сделал не так или костылей перекинул.
Спасибо, всё понял👍Благодарочка, здоровья, добра и счастья, тему закрывать не буду специально для @alexandrage
 
Не робит. Вот код:

PHP:
public static void craft() {
        ItemStack item = new ItemStack(Material.EYE_OF_ENDER);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&6Хилер"));
        List<String> lore = new ArrayList<String>();
        lore.add(ChatColor.DARK_PURPLE + "Будет лечить Вас от всех ран в течении 5 секунд!");
        lore.add(ChatColor.AQUA + "Использовать на ПКМ!");
        meta.setLore(lore);
        item.setItemMeta(meta);
        
        ShapedRecipe s = new ShapedRecipe(item);
        s.shape(new String[] {"A A", " B ", "A A"});
        s.setIngredient('A', Material.POTION);
        s.setIngredient('B', Material.ENDER_PEARL);
        Bukkit.getServer().addRecipe(s);
        
    }

PHP:
    @EventHandler
    public void CraftCheck(PrepareItemCraftEvent e ) {
        CraftingInventory inv = e.getInventory();
        ItemStack res = inv.getResult();
        ItemMeta res_meta = res.getItemMeta();
        if(res_meta.getLore() != null && res_meta.hasDisplayName() && res_meta.getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', "&6Хилер"))) {
            for (ItemStack item : inv.getContents()) {
                if(item != null && item.getType().equals(Material.POTION)) {
                    if(!item.equals(new ItemStack(Material.POTION, 1, (short)8197))) {
                        inv.setResult(new ItemStack(Material.AIR));
                        break;
                    }
                }
            }
        }
    }
Желаю добра тому кто поможет)
 
Не робит. Вот код:

PHP:
public static void craft() {
        ItemStack item = new ItemStack(Material.EYE_OF_ENDER);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&6Хилер"));
        List<String> lore = new ArrayList<String>();
        lore.add(ChatColor.DARK_PURPLE + "Будет лечить Вас от всех ран в течении 5 секунд!");
        lore.add(ChatColor.AQUA + "Использовать на ПКМ!");
        meta.setLore(lore);
        item.setItemMeta(meta);
       
        ShapedRecipe s = new ShapedRecipe(item);
        s.shape(new String[] {"A A", " B ", "A A"});
        s.setIngredient('A', Material.POTION);
        s.setIngredient('B', Material.ENDER_PEARL);
        Bukkit.getServer().addRecipe(s);
       
    }

PHP:
    @EventHandler
    public void CraftCheck(PrepareItemCraftEvent e ) {
        CraftingInventory inv = e.getInventory();
        ItemStack res = inv.getResult();
        ItemMeta res_meta = res.getItemMeta();
        if(res_meta.getLore() != null && res_meta.hasDisplayName() && res_meta.getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', "&6Хилер"))) {
            for (ItemStack item : inv.getContents()) {
                if(item != null && item.getType().equals(Material.POTION)) {
                    if(!item.equals(new ItemStack(Material.POTION, 1, (short)8197))) {
                        inv.setResult(new ItemStack(Material.AIR));
                        break;
                    }
                }
            }
        }
    }
Желаю добра тому кто поможет)
Я кинул рабочий калокод. Если не работает, то пробуй заново начать с моего кода.
 
public static void craft() {
ItemStack item = new ItemStack(Material.EYE_OF_ENDER);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&6Хилер"));
List<
String> lore = new ArrayList<String>();
lore.add(ChatColor.DARK_PURPLE + "Будет лечить Вас от всех ран в течении 5 секунд!");
lore.add(ChatColor.AQUA + "Использовать на ПКМ!");
meta.setLore(lore);
item.setItemMeta(meta);

ShapedRecipe s = new ShapedRecipe(item);
s.shape(new String[] {"A A", " B ", "A A"});
s.setIngredient('A', Material.POTION);
s.setIngredient('B', Material.ENDER_PEARL);
Bukkit.getServer().addRecipe(s);

}
Исходя из этого:

Код:
ItemStack itemA = ingredients.get('A');
ItemStack itemB = ingredients.get('B');
 
Я так понял с зельем не работает хоть ивент и поменял. Буду по другому значит делать.
 
Назад
Верх