Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 23 июн 2016.

  1. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Написал его там же, где был и крафт, ошибок не выдает, но и крафт не работает.

    Код:
        @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);
                        }
                    }
                }
            }
        }
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Я думаю это:
    if(stick.getItemMeta().getDisplayName().equals("Гнилые деревянные обрубки")){
    Не проходит проверку.
     
  4. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Убрал это условие, но все равно не работает. Может это опять же из-за моей криворукости, ведь я поставил bukkit.getServer().addRecipe(planksRecipe) в класс, где хранятся только евенты, не в главном классе?[DOUBLEPOST=1466701590,1466701495][/DOUBLEPOST]Опять же, вот чуток поправленый евент.
    Код:
        @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);
                        }
                    }
                }
            }
        }
     
  5. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Неа, не крафтится, пробовал и обычные палки, и измененные палки
     
  6. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Правильно. Просто заполняю весь верстак палками....ИЛи я облажался?
     
  7. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Все работает, но крафт проходит даже с обычными палками
     
  8. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Насколько я знаю PrepareItemCraftEvent (или как-то так) не Cancellable..
    (P.S. АХТУНГ: Могу нести дичь)
     
  9. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Крафт добавляется 1 раз! Не нужно его добавлять каждый раз при эвенте. В ingredient можно добавить готовый ItemStack.(вроде).
     
  10. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Вы там NPE не ловите? А кто будет проверять имеет ли item itemmet'у, displayname, прежде чем сравнивать его с чем-либо?
     
  11. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Сдохни.
    Если у тебя более 4к активных классов - тогда да, хорошо - будет потребление оперативки чуть чуть меньше.
    В основном классе плагина сделай статическую финальную переменную со своей палкой, после в листенерах можешь просто копировать итемстак без повторной сборки предмета.
     
  12. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Попробую, звучит убедительно
     
  13. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Статики - плохо, инстанс главного класса - плохо, вся джава - либо плохо либо костыли..
     
  14. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Привыкай.
     
  15. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    [​IMG]
     
  16. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Да не слушай их. Книг больше по java читай и всё. Если всё нормально организовать, зная, что будет, если сделаешь "так" или "так", то всё нормально будет.
     
  17. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Статики не есть плохо, просто нужно понимать, когда применять.
    В его случае можно использовать статический финальный ItemStack:
    Код:
    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() .
     

Поделиться этой страницей