1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Ошибка в крафте из-за воздуха

Тема в разделе "Разработка плагинов для новичков", создана пользователем Energy warrior, 29 мар 2019.

Статус темы:
Закрыта.
  1. Автор темы
    Energy warrior

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

    Баллы:
    76
    Я переделал либу @alexandrage на крафты, чтобы вместо массивов юзать хэшкарту. Когда все предметы имеют обозначение и у них есть предмет всё нормально, но стоит мне только добавить воздух как мне начинает вылетать NPE. Что мне сделать чтобы это исправить. P.s на прежнюю версию я не хочу пересаживаться, ну или хотя бы узнаю в чём ошибка была.
    Код:
    public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
            Plugin plugin = Plugin.getPlugin();
            if (stack == null) {
                throw new IllegalArgumentException("Result cannot be null.");
            }
            ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
            rc.shape(shape);
            Craft cr = new Craft();
            cr.add(stack);
            ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
            String shape_string = shape[0]+shape[1]+shape[2];
            for (char c:shape_string.toCharArray()) {
                if(c == ' '){
                    cr.add(new ItemStack(Material.AIR));
                }
                cr.add(ingredients.get(c));
            }
            for (ItemStack itemStack : cr.stacks) {
                System.out.println(itemStack.getType());
            }
            Bukkit.getServer().addRecipe(rc);
            craft.put(rc.getKey().getKey(), cr);
        }
     
  2. Alexrage

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

    Баллы:
    76
    Имя в Minecraft:
    Egorka
    Нужно добавлять не air, а null
    Код:
    public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
            Plugin plugin = Plugin.getPlugin();
            if (stack == null) {
                throw new IllegalArgumentException("Result cannot be null.");
            }
            ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
            rc.shape(shape);
            Craft cr = new Craft();
            cr.add(stack);
            ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
            String shape_string = shape[0]+shape[1]+shape[2];
            for (char c:shape_string.toCharArray()) {
                if(c == ' '){
                    cr.add(new ItemStack(null));
                }
                cr.add(ingredients.get(c));
            }
            for (ItemStack itemStack : cr.stacks) {
                System.out.println(itemStack.getType());
            }
            Bukkit.getServer().addRecipe(rc);
            craft.put(rc.getKey().getKey(), cr);
     
  3. alexandrage

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

    Баллы:
    173
    Что то я не понял смысла в этом. Тупо загадил мой метод addRecipe 3мя циклами вместо одного, смысл?
     
    Последнее редактирование: 29 мар 2019
  4. Автор темы
    Energy warrior

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

    Баллы:
    76
    Смысл в том, что мне не удобно миллиард раз писать одно и тоже в массиве. А тут вставляешь карту пишешь расположение и усё. Ну и надо же учиться чемунить. А то если я буду изать либы, которые мне дали, не переделывая под себя, я и не научись ничему. Хз может я и наоборот усложнил. Ну тогда это носит чисто образовательный смысл.)
     
  5. Автор темы
    Energy warrior

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

    Баллы:
    76
    Код:
    Error occurred while enabling TestPlugin v0.1 (Is it up to date?)
    java.lang.IllegalArgumentException: Material cannot be null
            at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at org.*********ventory.ItemStack.<init>(ItemStack.java:69) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at org.*********ventory.ItemStack.<init>(ItemStack.java:57) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at org.*********ventory.ItemStack.<init>(ItemStack.java:45) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at org.*********ventory.ItemStack.<init>(ItemStack.java:35) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at ru.pack.plugin.utils.crafts.Recipe.addRecipe(Recipe.java:32) ~[?:?]
            at ru.pack.plugin.Plugin.registerCrafts(Plugin.java:70) ~[?:?]
            at ru.pack.plugin.Plugin.onEnable(Plugin.java:41) ~[?:?]
            at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:254) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
            at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot.jar:git-Spigot-f56e2e7-7fc66b2]
    UPD: После дебага выяснилось, что в итерации, когда встречается воздух, его добавляет а потом выбрасывает NPE
     
    Последнее редактирование: 30 мар 2019
  6. Автор темы
    Energy warrior

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

    Баллы:
    76
    Проблема решена! Оказалось что я во время цикла не после проверки на знак ' ' он не переходил к следующему символу, а выходил из проверки и пытался достать из хэшмапы этот символ. Нужно было просто дописать continue.
     
Статус темы:
Закрыта.

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