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

Помогите Код не видит ники из yml?

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

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

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

    Баллы:
    76
    Краткая суть проблемы на 2-х скринах в конце темы!!!!!!!


    Название немного непонятное, т. к. я не знаю, как её лучше назвать. Суть проблемы в чём: писал я анти-чит, точнее голосовой бан. (сказал, что игрок читер, ещё несколько игроков так же сказали - игрок забанен. Не надо говорить про "асечки".) Как всё должно работать: игрок пишет /cheat ник 2игрока, 2 игрок заносится в базу (пока что на yml, временно.) и тот, кто на него репорт кидал. Так же заносится в ArrayList. Если игрок 2 раз попытается кинуть репорт - не должно получаться. Но что мы видим на самом деле: всё работает нормально, при перезапуске в лист игроки добавляются нормально, но вот есть проблема: игроки могут повторно кидать репорт. При чём все старые почему-то становятся невидимыми! Сделал очень много тестовых сообщений... Не понимаю, почему оно так происходит. Вот код самой команды, которая кидает репорт:
    Код:
    public class cheat implements CommandExecutor {
        ArrayList<String> pclist = main.pclist;
        ArrayList<ArrayList<String>> pcll = main.pcll;
        @SuppressWarnings("unused")
        private main plugin;
        public cheat(main plugin) {
            this.plugin = plugin;
        }
    
        @Override
        public boolean onCommand(CommandSender send, Command command, String label, String[] args) {
            if(args.length == 0){
                send.sendMessage(ChatColor.YELLOW + "На кого вы хотите сделать донос? " + ChatColor.AQUA + "/cheat НИК");
                return true;
            }
            if(args.length >= 2){
                send.sendMessage(ChatColor.YELLOW + "Если вы нашли много читеров, доносите о них по одному. " + ChatColor.AQUA + "/cheat НИК");
                return true;
            }
            String name = args[0];
            Player p = Bukkit.getPlayerExact(name);
            if(p==null){send.sendMessage(ChatColor.YELLOW + "Этот игрок не в сети/не существует/не на этом сервере(миниигре).");return true;}
            if(name.equalsIgnoreCase(send.getName())){send.sendMessage(ChatColor.RED + "Вы хотите донести на самого себя?");return true;}
            if(p!=null){
                for(int i=0;i<pclist.size();i++){
                    send.sendMessage("pclist:"+pclist.get(i));
                }
                for(int i=0;i<pcll.size();i++){
                    send.sendMessage("pcll:"+pcll.get(i));
                }
                send.sendMessage("p:"+p);
                for(int i=0;i<pclist.size();i++){
                    send.sendMessage(i+" scanned");
                    if(pclist.get(i) == p.getName()){
                        send.sendMessage("founded!");
                        p.sendMessage("Ты уже в базе");
                        for(int a=0;a<pcll.get(i).size();a++){
                            if(pcll.get(i).get(a) == send.getName()){
                                send.sendMessage(ChatColor.RED + "Вы уже делали донос на этого игрока. Если вы будете делать слишком много доносов, вас забанят, а доносы будут отклонены.");
                                return true;
                            }
                        }
                        send.sendMessage(ChatColor.YELLOW + "Вы успешно отправили донос на игрока " + ChatColor.RED + "" + p.getName() + ", который уже числится в базе подозреваемых читеров. За ним будет вестись повышенная слежка.");
                        p.sendMessage(ChatColor.YELLOW + "" + send.getName() + ChatColor.RED + " Подозревает вас в читах. " + ChatColor.DARK_RED + "Возможность обвинить игрока в лже-доносе невозможна для вас." + send.getName());
                        pcll.get(i).add(send.getName());
                        return true;
                    }
                }
                send.sendMessage(ChatColor.YELLOW + "Вы успешно отправили донос на игрока " + ChatColor.RED + "" + p.getName() + ".");
                p.sendMessage(ChatColor.YELLOW + "" + send.getName() + ChatColor.RED + " Подозревает вас в читах. Если вы не являетесь читером, обвините этого игрока в лже-доносе. " + ChatColor.YELLOW + "/fake " + send.getName());
                pclist.add(p.getName());
                ArrayList<String> who = new ArrayList<String>();
                who.add(send.getName());
                pcll.add(who);
            }
            return true;
        }
    
    }
    Вот код из гл. класса, где происходят все действия с yml.
    Код:
    onEnable(){
    saveDefaultConfig();
            for (String b : getConfig().getConfigurationSection("Cheaters").getKeys(false)) {
                pclist.add(getConfig().getString("Cheaters." + b + ".player"));
                ArrayList<String> pc = new ArrayList<String>();
                for(int i=0;i<20;i++){
                    if(getConfig().getString("Cheaters." + b + ".reportby" + i) != null){
                        pc.add(getConfig().getString("Cheaters." + b + ".reportby" + i));
                    }
                }
                pcll.add(pc);
            }
            saveConfig();
        }
    onDisable(){
    for (int i=0;i<pclist.size();i++) {
                getConfig().set("Cheaters."+i+".player", pclist.get(i));
                for(int a=0;a<pcll.get(i).size();a++){
                    getConfig().set("Cheaters."+i+".reportby"+a, pcll.get(i).get(a));
                }
                saveConfig();
        }
    }
    Вот вывод в чате от 1 раз команды
    Вот вывод после 2 попытки
    Я надеюсь, что не взорвал никому мозг...
     
  2. HunterGaming

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

    Баллы:
    96
    Имя в Minecraft:
    sqdFendy
    В коде написан коммент, прочитай его
     
  3. HunterGaming

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

    Баллы:
    96
    Имя в Minecraft:
    sqdFendy
    И вообще строки сравниваются методами equals и equalsIgnoreCase, никогда не сравнивай их ==
     
  4. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Честно нифига не понял, мне легче новый код написать
     
  5. Автор темы
    pro100koder

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

    Баллы:
    76
    Н-да, тут вина моих старых школо-модов, когда я нифига не умел делать, и делал всё по гайдикам с ютуба... Вот тут по привычке проглядел, и поставил "==", хотя, если присмотреться, то в коде я уже использовал equlasIgnoreCase(), но тут забыл.
     

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