Помогите Свои крафты не в главном классе.

Написал его там же, где был и крафт, ошибок не выдает, но и крафт не работает.

JavaScript:
    @EventHandler
    public void dropStick(BlockBreakEvent e) {
        Player p = e.getPlayer();
        Random r = new Random();
       
        if(e.getBlock().getType() == Material.LOG && p.getItemInHand().getType() == Material.CLAY_BALL) {
            if(r.nextInt(100) <= 25) {
               
                ItemStack stick = new ItemStack(Material.STICK);
                ItemMeta stickMeta = stick.getItemMeta();
                List<String> lore = new ArrayList<String>();
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "С помощью гнилых обрубков можно сделать");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "сделать гнилые материалы для верстака.");
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                stickMeta.setLore(lore);
                stickMeta.setDisplayName(ChatColor.GOLD + ChatColor.BOLD.toString() + "Гнилые деревянные обрубки");
                stick.setItemMeta(stickMeta);
               
                e.getBlock().getWorld().dropItem(e.getBlock().getLocation(), stick);
               
                MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я обломал гнилой деревянный обрубок");
               
                if (stick.getItemMeta() != null && stick.getItemMeta().getDisplayName() != null) {
                    if (stick.getItemMeta().getDisplayName().equals("Гнилые деревянные обрубки")) {
                       
                        ItemStack planks = new ItemStack(Material.WOOD, 1);
                        ShapedRecipe planksRecipe = new ShapedRecipe(planks);
                        planksRecipe.shape("%%%","%%%","%%%");
                        planksRecipe.setIngredient('%', Material.STICK);
                       
                        Bukkit.getServer().addRecipe(planksRecipe);
                    }
                }
            }
        }
    }
 
Я думаю это:
if(stick.getItemMeta().getDisplayName().equals("Гнилые деревянные обрубки")){
Не проходит проверку.
 
Убрал это условие, но все равно не работает. Может это опять же из-за моей криворукости, ведь я поставил bukkit.getServer().addRecipe(planksRecipe) в класс, где хранятся только евенты, не в главном классе?
Опять же, вот чуток поправленый евент.
JavaScript:
    @EventHandler
    public void dropStick(BlockBreakEvent e) {
        Player p = e.getPlayer();
        Random r = new Random();
       
        if(e.getBlock().getType() == Material.LOG && p.getItemInHand().getType() == Material.CLAY_BALL) {
            if(r.nextInt(100) <= 25) {
               
                ItemStack stick = new ItemStack(Material.STICK);
                ItemMeta stickMeta = stick.getItemMeta();
                List<String> lore = new ArrayList<String>();
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "С помощью гнилых обрубков можно сделать");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "сделать гнилые материалы для верстака.");
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                stickMeta.setLore(lore);
                stickMeta.setDisplayName(ChatColor.GOLD + ChatColor.BOLD.toString() + "Гнилые деревянные обрубки");
                stick.setItemMeta(stickMeta);
               
                e.getBlock().getWorld().dropItem(e.getBlock().getLocation(), stick);
               
                MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я обломал гнилой деревянный обрубок");
               
                if (stick.getItemMeta() != null && stick.getItemMeta().getDisplayName() != null) {
                    if (stick.getItemMeta().getDisplayName().equals("§6§lГнилые деревянные обрубки")) {
                       
                        ItemStack planks = new ItemStack(Material.WOOD, 1);
                        ShapedRecipe planksRecipe = new ShapedRecipe(planks);
                        planksRecipe.shape("*","*","*");
                        planksRecipe.setIngredient('*', Material.STICK, 9);
                       
                        Bukkit.getServer().addRecipe(planksRecipe);
                    }
                }
            }
        }
    }
 
JavaScript:
                ItemStack planks = new ItemStack(Material.WOOD, 1);
                ItemStack stick = new ItemStack(Material.STICK, 1);
                ItemMeta im = stick.getItemMeta();
                im.setDisplayName("§6§lГнилые деревянные обрубки");
                List<String> lore = new ArrayList<String>();
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "С помощью гнилых обрубков можно сделать");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "сделать гнилые материалы для верстака.");
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                im.setLore(lore);
                stick.setItemMeta(im);

                 ShapedRecipe planksRecipe = new ShapedRecipe(planks);
                 planksRecipe.shape("*","*","*");
                 planksRecipe.setIngredient('*', new MaterialData(Material.STICK, stick.getData().getData()));
                      
                 Bukkit.getServer().addRecipe(planksRecipe);
так попробуй, ток не в евенте
Неа, не крафтится, пробовал и обычные палки, и измененные палки
 
Правильно. Просто заполняю весь верстак палками....ИЛи я облажался?
 
Все работает, но крафт проходит даже с обычными палками
 
ну зато

DevFlo%20YaoMing2_zpsqlpy9enq.png

а так хз, попробуй отловить евент крафта и отменять, если у палок название/лор другое
Насколько я знаю PrepareItemCraftEvent (или как-то так) не Cancellable..
(P.S. АХТУНГ: Могу нести дичь)
 
Крафт добавляется 1 раз! Не нужно его добавлять каждый раз при эвенте. В ingredient можно добавить готовый ItemStack.(вроде).
 
Вы там NPE не ловите? А кто будет проверять имеет ли item itemmet'у, displayname, прежде чем сравнивать его с чем-либо?
 
Создаешь статик инстанс плагина в мейн классе,
Сдохни.
Инстанс главного класса - хорошо
Если у тебя более 4к активных классов - тогда да, хорошо - будет потребление оперативки чуть чуть меньше.
Убрал это условие, но все равно не работает. Может это опять же из-за моей криворукости, ведь я поставил bukkit.getServer().addRecipe(planksRecipe) в класс, где хранятся только евенты, не в главном классе?
Опять же, вот чуток поправленый евент.
JavaScript:
    @EventHandler
    public void dropStick(BlockBreakEvent e) {
        Player p = e.getPlayer();
        Random r = new Random();
      
        if(e.getBlock().getType() == Material.LOG && p.getItemInHand().getType() == Material.CLAY_BALL) {
            if(r.nextInt(100) <= 25) {
              
                ItemStack stick = new ItemStack(Material.STICK);
                ItemMeta stickMeta = stick.getItemMeta();
                List<String> lore = new ArrayList<String>();
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "С помощью гнилых обрубков можно сделать");
                lore.add(ChatColor.RED + ChatColor.BOLD.toString() + "сделать гнилые материалы для верстака.");
                lore.add(ChatColor.GREEN+ "------------------------------------------------");
                stickMeta.setLore(lore);
                stickMeta.setDisplayName(ChatColor.GOLD + ChatColor.BOLD.toString() + "Гнилые деревянные обрубки");
                stick.setItemMeta(stickMeta);
              
                e.getBlock().getWorld().dropItem(e.getBlock().getLocation(), stick);
              
                MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я обломал гнилой деревянный обрубок");
              
                if (stick.getItemMeta() != null && stick.getItemMeta().getDisplayName() != null) {
                    if (stick.getItemMeta().getDisplayName().equals("§6§lГнилые деревянные обрубки")) {
                      
                        ItemStack planks = new ItemStack(Material.WOOD, 1);
                        ShapedRecipe planksRecipe = new ShapedRecipe(planks);
                        planksRecipe.shape("*","*","*");
                        planksRecipe.setIngredient('*', Material.STICK, 9);
                      
                        Bukkit.getServer().addRecipe(planksRecipe);
                    }
                }
            }
        }
    }
В основном классе плагина сделай статическую финальную переменную со своей палкой, после в листенерах можешь просто копировать итемстак без повторной сборки предмета.
 
Сдохни.
Если у тебя более 4к активных классов - тогда да, хорошо - будет потребление оперативки чуть чуть меньше.

В основном классе плагина сделай статическую финальную переменную со своей палкой, после в листенерах можешь просто копировать итемстак без повторной сборки предмета.
Попробую, звучит убедительно
 
Статики - плохо, инстанс главного класса - плохо, вся джава - либо плохо либо костыли..
Да не слушай их. Книг больше по java читай и всё. Если всё нормально организовать, зная, что будет, если сделаешь "так" или "так", то всё нормально будет.
 
Статики не есть плохо, просто нужно понимать, когда применять.
В его случае можно использовать статический финальный ItemStack:
Java:
public static final ItemStack DECAYED_STICK;
static {
    DECAYED_STICK = new ItemStack(Material.STICK);
    ItemMeta im = DECAYED_STICK.getItemMeta();
    im.setDisplayName("§6§lГнилые деревянные обрубки");
    im.setLore(Arrays.asList(new String[]{
        "§a------------------------------------------------",
        "§c§lС помощью гнилых обрубков можно сделать",
        "§c§lсделать гнилые материалы для верстака",
        "§a------------------------------------------------"
    }));
    DECAYED_STICK.setItemMeta(im);
}

Ну и потом можно его использовать при помощи DECAYED_STICK.clone() .
 
Назад
Верх