Войти или зарегистрироваться

Помогите Данные не записываются в конфиг + эвент не работает

  • Автор темы Автор темы Tildik
  • Дата начала Дата начала

Tildik

Участник
Баллы
31
У меня есть плагин, который при съедании еды с определенным названием выдает эффект, который указан в конфиге для еды с этим названием
Проблема: данные не записываются в конфиг + во время съедания еды с определенным эффектом ничего не происходит
------------Эвент---------------------
Код:
public class events implements Listener {
    public void onInteract(PlayerInteractEvent e) {
        if(e.getAction() != Action.RIGHT_CLICK_AIR && e.getAction() != Action.RIGHT_CLICK_BLOCK) return;
        int num_config = Integer.parseInt(Main.getInstance().getConfig().getString("settings.count"));
        int num = 1;
        String effect = "none", durability = "none", sila = "none", name = "none";
        ItemStack itemStack = e.getItem();
        ItemMeta itemMeta = itemStack.getItemMeta();
        while(num > num_config) {
            String path = "eats." + num + ".name";
            if (Main.getInstance().getConfig().getString(path).equalsIgnoreCase(itemMeta.getDisplayName())) {

                effect = Main.getInstance().getConfig().getString("eats." + num + ".effect");
                durability = Main.getInstance().getConfig().getString("eats." + num + ".durability");
                sila = Main.getInstance().getConfig().getString("eats." + num + ".sila");
                name = Main.getInstance().getConfig().getString("eats." + num + ".name");
            }
            else{
                num++;
            }

        }
        if (effect.equalsIgnoreCase("none")) {
            return;
        }
        else {
            Player p = e.getPlayer();
            e.setCancelled(true);
            onRemoveItem(p);
            int sila1 = 1, durability1 = 15;
            try{
                durability = Main.getInstance().getConfig().getString("eats." + num + ".durability");
                sila = Main.getInstance().getConfig().getString("eats." + num + ".sila");
                sila1 = Integer.parseInt(sila);
                durability1 = Integer.parseInt(durability);
            }
            catch(NumberFormatException exception) {
                p.sendMessage("Продолжительность и сила указаны неверно!");
            }
            effect = Main.getInstance().getConfig().getString("eats." + num + ".effect");
            giveEffect(p, effect, durability1, sila1);
        }
    }
    private void onRemoveItem(Player p)
    {
        ItemStack item = p.getInventory().getItemInMainHand();
        item.setAmount(item.getAmount() - 1);
        p.getInventory().setItemInMainHand(item);
    }
    private void giveEffect(Player p, String effect, int durability, int sila) {
        if (effect.equalsIgnoreCase("POISON")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.POISON, durability, sila));
        }
        else if (effect.equalsIgnoreCase("SPEED")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, durability, sila));
        }
        else if (effect.equalsIgnoreCase("REGENERATION")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, durability, sila));
        }
        else if (effect.equalsIgnoreCase("BLINDNESS")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, durability, sila));
        }
        else if (effect.equalsIgnoreCase("NIGHT_VISION")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, durability, sila));
        }
        else if (effect.equalsIgnoreCase("HUNGER")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, durability, sila));
        }
        else if (effect.equalsIgnoreCase("GLOWING")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING, durability, sila));
        }
        else if (effect.equalsIgnoreCase("SATURATION")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, durability, sila));
        }
        else if (effect.equalsIgnoreCase("LEVITATION")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION, durability, sila));
        }
        else if (effect.equalsIgnoreCase("HEALTH_BOOST")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, durability, sila));
        }
        else if (effect.equalsIgnoreCase("INVISIBILITY")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, durability, sila));
        }
        else if (effect.equalsIgnoreCase("ABSORPTION")) {
            p.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, durability, sila));
        }



    }
}
----------Команда/Запись данных в конфиг---------------

Код:
public class EffectEat implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player player = (Player) sender;
        ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
        if(args.length == 0){
            player.sendMessage(ChatColor.RED + Main.getInstance().getConfig().getString("messages.noRequiredArgument"));
            return true;
        }
        else {
            if(itemInMainHand.getType() != Material.AIR) {
                try {
                    int a, b, c;
                    a = Integer.parseInt(args[1]);
                    a = Integer.parseInt(args[2]);

                } catch (NumberFormatException e) {
                    player.sendMessage(ChatColor.RED + Main.getInstance().getConfig().getString("message.NumberFormatException"));
                }
                ItemStack itemStack = player.getInventory().getItemInMainHand();
                int num_config = Integer.parseInt(Main.getInstance().getConfig().getString("settings.count"));
                num_config++;

                Main.getInstance().getConfig().set("settings.count", num_config);
                ItemMeta itemMeta = itemStack.getItemMeta();
                String name = itemMeta.getDisplayName();
                String path1 = "eats." + num_config + ".name";
                String path2 = "eats." + num_config + ".effect";
                String path3 = "eats." + num_config + ".durability";
                String path4 = "eats." + num_config + ".sila";

                Main.getInstance().getConfig().set(path1, name);
                Main.getInstance().getConfig().set(path2, args[0]);
                Main.getInstance().getConfig().set(path3, args[1]);
                Main.getInstance().getConfig().set(path4, args[2]);

                player.sendMessage(ChatColor.GREEN + Main.getInstance().getConfig().getString("messages.success"));

            }
            else{
                player.sendMessage(ChatColor.RED + Main.getInstance().getConfig().getString("messages.MaterialAIR"));
            }
        }

    return true;
    }
}
---------Конфиг---------------

Код:
settings:
  count: 1
# Переменную выше изменять нельзя! Его изменяет сам плагин
messages:
  MaterialAIR: 'Зачем мне выдавать эффект воздуху. ВОЗЬМИ ПРЕДМЕТ В РУКУ!'
  noRequiredArgument: 'Не хватает какого то из аргументов! Правильное использование команды: /effecteat <название эффекта на англ.> <длительность> <сила>'
  NumberFormatException: 'Я не смог преобразовать некоторые аргументы в числа! Правильное использование команды: /effecteat <название эффекта на англ.> <длительность> <сила>'
  success: 'Успех!'

eats:
  1:
    name: 'Тест'
    effect: 'POISON'
    durability: 10
    sila: 10
 
1) Листенер зарегистрировал?
2) Нету аннотации @EventHandler над методом слушателя
3) сохранение дефолтного конфига - Plugin.saveConfig()
 
Всё равно не работает, данные не записываются, эффект не выдается, когда ем еду

Ну для начала, вместо PlayerInteractEvent, лучше юзать PlayerItemConsumeEvent(Название может немножко отличаться), насколько я помню, он работает и в случае еды.

Во вторых, чисто совет, но проверять и делать кучу ветвлений для if не нужно. (Ниже укажу пример варианта по проще.)
Код:
PotionEffectType type = PotionEffectType.getByName(effectData[0]);
 if(type == null) //Если такого эффекта нет

В третьих, проверь через System.out.println или сообщениями, попадаешь ли ты вообще в свой метод giveEffect, возможно где-то срабатывает проверка и тебя до него не пускает.

цикл, если начнётся, то будет длиться бесконечно, дальнейший из него выход или продолжение выполнения кода не будет. А так же условие сработает только если у тебя числа в конфиге начинаются от 2. при num = 1 и num_config = 1 он даже не начнётся.
Код:
while(num > num_config) {
            String path = "eats." + num + ".name";
            if (Main.getInstance().getConfig().getString(path).equalsIgnoreCase(itemMeta.getDisplayName())) {

                effect = Main.getInstance().getConfig().getString("eats." + num + ".effect");
                durability = Main.getInstance().getConfig().getString("eats." + num + ".durability");
                sila = Main.getInstance().getConfig().getString("eats." + num + ".sila");
                name = Main.getInstance().getConfig().getString("eats." + num + ".name");
            }
            else{
                num++;
            }

        }
Вообще что ты пытался сделать этим циклом? Если перебрать значения в секции конфига, то делать это лучше так:

Код:
ConfigurationSection eats = Main ... .getConfig().getConfigurationSection("eats");

for(String key : eats.getKeys(false)) {
  //key - ключ в конфиге (Вместо твоего num)
}
 
upload_2022-11-8_20-1-42.png

Cпагетти заказывали?
 
Не по теме, но можешь заменить проверку на каждый тип эффектов всего на две строчки:
PotionEffectType effectType = PotionEffectType.getByName(effect.toUpperCase());
p.addPotionEffect(new PotionEffect(effectType, durability, sila));
 
Последнее редактирование:
Ответ изумительный, по стопам alexandrage?) :bad:
Нет, ну а что ещё тут сказать можно? Дебажить он не пытался, на каком моменте код перестаёт работать тоже не знает. Мы же не экстрасенсы, чтобы силой мысли это узнать
 
Если человек новенький в java, то нет ничего удивительного. Ещё скажи что ты никогда за все время которое ты кодишь, не делал так -_-
не надо такое защищать, за это надо бить палками и кидаться какашками в человека, чтобы он так не делал
 
не надо такое защищать, за это надо бить палками и кидаться какашками в человека, чтобы он так не делал

Не нравиться мне такой подход. И люди которые его используют. Получается если я что-то сделал не так как лучше, значит меня надо засирать? Или что? Я считаю что надо просто указать, как лучше, что я и сделал собственно. А не кидаться в него чем-либо или дубасить его

А если уж и кидаться и дубасить, то указать в чем ошибка. А не так, как сделал ты.
 
А плагин вообще запускается?
 
Назад
Верх