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

Помогите Почему выдаёт false?

  • Автор темы Автор темы JayRoon
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

JayRoon

Участник
Заблокирован
Пользователь
Баллы
31
Имя в Minecraft
Krongss_FUR
Добрый день/вечер/Доброе утро, суть такова... Почему-то выдаёт false у метода isBan, хотел написать код на варны, но что-то пошло не так, вот код:

Код:
    public long timesToUnban(Player bannedplr) {
        long times = 10;
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        if(banplrs.contains(bannedplr) == false || data1.containsKey(bannedplr) == false || data2.containsKey(bannedplr) == false) {
            System.out.println("!");
            return 100;
        }
        else if(banplrs.contains(bannedplr) == true && data1.containsKey(bannedplr) == true && data2.containsKey(bannedplr) == true) {
        long datatounban = (long) data1.get(bannedplr);
        datatounban = datatounban + (long) data2.get(bannedplr);
        long timestoUnBan = 0;
        long datatoban = (long) data1.get(bannedplr);
        if(datatoban >= datatounban && isBan(bannedplr) == false) {
            return 0;
        } else if(datatoban < datatounban && isBan(bannedplr) == true) {
            timestoUnBan = datatounban - (long) data1.get(bannedplr);
            timestoUnBan = TimeUnit.MILLISECONDS.toSeconds(timestoUnBan);
            return timestoUnBan;
        }
        
    }
        return 1003244;
    }
    
    
    public long TimesToBAN(Player banned, int number) {
        long seconds = 500;   

        if(number == 1) {
          long toban = Long.valueOf(30).longValue();
          seconds = TimeUnit.SECONDS.toMillis(toban);
          System.out.println("TimesToBan" + seconds);
          return seconds;
          
        } else if(number == 2) {
            long toban = Long.valueOf(60).longValue();
              seconds = TimeUnit.SECONDS.toMillis(toban);
              System.out.println("TimesToBan" + seconds);
              return seconds;
            } else if(number == 3) {
                long toban = Long.valueOf(90).longValue();
                  seconds = TimeUnit.SECONDS.toMillis(toban);
                  System.out.println("TimesToBan" + seconds);
                  return seconds;
                } else if(number == 4) {
                    long toban = Long.valueOf(130).longValue();
                      seconds = TimeUnit.SECONDS.toMillis(toban);
                      System.out.println("TimesToBan" + seconds);
                      return seconds;
                    }
        System.out.println("TimesToBan" + seconds);
        return seconds;
    }
    
    public int NumbersToBanPlr(Player plr) {
        int number = 1;
        HashMap numberlist = plugin.NumbersToBANNED;
        if(numberlist.containsKey(plr) == true) {
            number = (int) numberlist.get(plr);
            return number;
        } else if(numberlist.containsKey(plr) == false) {
            return number;
        }
        return number;
    }
    
    public boolean isBan(Player bannedplr) {
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        long timestoUnBan = 0;
       if(banplrs.contains(bannedplr) == true && data1.containsKey(bannedplr) == true && data2.containsKey(bannedplr) == true) {
            long datatounban = (long) data2.get(bannedplr);
            long datatoban = (long) data1.get(bannedplr);
        if(datatoban >= datatounban) {
            banplrs.remove(bannedplr);
            data1.remove(bannedplr);
            data2.remove(bannedplr);
            return false;
        } else if(datatoban < datatounban) {
            return true;
        }
        } else if(banplrs.contains(bannedplr) == false && data2.containsKey(bannedplr) == false && data1.containsKey(bannedplr) == false) {
            System.out.println("pochemy?!?!");
            
            return false;
        }
        return false;
        
    }
    
    public void giveWarn(CommandSender staff, Player plr) {
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        HashMap numberstoban = plugin.NumbersToBANNED;
        if(isBan(plr) == true) {
            staff.sendMessage("Этот игрок уже имеет наказание за читы!");
        } else if(isBan(plr) == false) {
            banplrs.add(plr);
            long currenttime = System.currentTimeMillis();
            System.out.println("CurrentTimeMillis = " + currenttime);
            data1.put(plr, currenttime);
            int numbertoban = NumbersToBanPlr(plr);
            long millistoban = TimesToBAN(plr, numbertoban);
            System.out.println("TimesMILLIS TO BAN = " + millistoban);
            millistoban = currenttime + millistoban;
            System.out.println("BIG TO UNBAN TIME: " + millistoban);
            data2.put(plr, millistoban);
            long time = timesToUnban(plr);
            System.out.println(time);
            if(numberstoban.containsKey(plr) == true) {
                numberstoban.replace(plr, (int) numberstoban.get(plr) + 1);
            } else if(numberstoban.containsKey(plr) == false) {
                numberstoban.put(plr, 1);
            }
            System.out.println(banplrs.toString());
            System.out.println(data1.toString());
            System.out.println(data2.toString());
            plr.kickPlayer("Вы забанены за читы на " + time + " Секунд");
            staff.sendMessage("Вы выдали наказание игроку " + ChatColor.RED + plr.getName().toString() + ChatColor.WHITE + " За читы.");
        }
    }
 
Добрый день/вечер/Доброе утро, суть такова... Почему-то выдаёт false у метода isBan, хотел написать код на варны, но что-то пошло не так, вот код:

Код:
    public long timesToUnban(Player bannedplr) {
        long times = 10;
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        if(banplrs.contains(bannedplr) == false || data1.containsKey(bannedplr) == false || data2.containsKey(bannedplr) == false) {
            System.out.println("!");
            return 100;
        }
        else if(banplrs.contains(bannedplr) == true && data1.containsKey(bannedplr) == true && data2.containsKey(bannedplr) == true) {
        long datatounban = (long) data1.get(bannedplr);
        datatounban = datatounban + (long) data2.get(bannedplr);
        long timestoUnBan = 0;
        long datatoban = (long) data1.get(bannedplr);
        if(datatoban >= datatounban && isBan(bannedplr) == false) {
            return 0;
        } else if(datatoban < datatounban && isBan(bannedplr) == true) {
            timestoUnBan = datatounban - (long) data1.get(bannedplr);
            timestoUnBan = TimeUnit.MILLISECONDS.toSeconds(timestoUnBan);
            return timestoUnBan;
        }
       
    }
        return 1003244;
    }
   
   
    public long TimesToBAN(Player banned, int number) {
        long seconds = 500;  

        if(number == 1) {
          long toban = Long.valueOf(30).longValue();
          seconds = TimeUnit.SECONDS.toMillis(toban);
          System.out.println("TimesToBan" + seconds);
          return seconds;
         
        } else if(number == 2) {
            long toban = Long.valueOf(60).longValue();
              seconds = TimeUnit.SECONDS.toMillis(toban);
              System.out.println("TimesToBan" + seconds);
              return seconds;
            } else if(number == 3) {
                long toban = Long.valueOf(90).longValue();
                  seconds = TimeUnit.SECONDS.toMillis(toban);
                  System.out.println("TimesToBan" + seconds);
                  return seconds;
                } else if(number == 4) {
                    long toban = Long.valueOf(130).longValue();
                      seconds = TimeUnit.SECONDS.toMillis(toban);
                      System.out.println("TimesToBan" + seconds);
                      return seconds;
                    }
        System.out.println("TimesToBan" + seconds);
        return seconds;
    }
   
    public int NumbersToBanPlr(Player plr) {
        int number = 1;
        HashMap numberlist = plugin.NumbersToBANNED;
        if(numberlist.containsKey(plr) == true) {
            number = (int) numberlist.get(plr);
            return number;
        } else if(numberlist.containsKey(plr) == false) {
            return number;
        }
        return number;
    }
   
    public boolean isBan(Player bannedplr) {
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        long timestoUnBan = 0;
       if(banplrs.contains(bannedplr) == true && data1.containsKey(bannedplr) == true && data2.containsKey(bannedplr) == true) {
            long datatounban = (long) data2.get(bannedplr);
            long datatoban = (long) data1.get(bannedplr);
        if(datatoban >= datatounban) {
            banplrs.remove(bannedplr);
            data1.remove(bannedplr);
            data2.remove(bannedplr);
            return false;
        } else if(datatoban < datatounban) {
            return true;
        }
        } else if(banplrs.contains(bannedplr) == false && data2.containsKey(bannedplr) == false && data1.containsKey(bannedplr) == false) {
            System.out.println("pochemy?!?!");
           
            return false;
        }
        return false;
       
    }
   
    public void giveWarn(CommandSender staff, Player plr) {
        HashSet banplrs = plugin.banlist;
        HashMap data1 = plugin.dataToBan;
        HashMap data2 = plugin.dataToTimeInBan;
        HashMap numberstoban = plugin.NumbersToBANNED;
        if(isBan(plr) == true) {
            staff.sendMessage("Этот игрок уже имеет наказание за читы!");
        } else if(isBan(plr) == false) {
            banplrs.add(plr);
            long currenttime = System.currentTimeMillis();
            System.out.println("CurrentTimeMillis = " + currenttime);
            data1.put(plr, currenttime);
            int numbertoban = NumbersToBanPlr(plr);
            long millistoban = TimesToBAN(plr, numbertoban);
            System.out.println("TimesMILLIS TO BAN = " + millistoban);
            millistoban = currenttime + millistoban;
            System.out.println("BIG TO UNBAN TIME: " + millistoban);
            data2.put(plr, millistoban);
            long time = timesToUnban(plr);
            System.out.println(time);
            if(numberstoban.containsKey(plr) == true) {
                numberstoban.replace(plr, (int) numberstoban.get(plr) + 1);
            } else if(numberstoban.containsKey(plr) == false) {
                numberstoban.put(plr, 1);
            }
            System.out.println(banplrs.toString());
            System.out.println(data1.toString());
            System.out.println(data2.toString());
            plr.kickPlayer("Вы забанены за читы на " + time + " Секунд");
            staff.sendMessage("Вы выдали наказание игроку " + ChatColor.RED + plr.getName().toString() + ChatColor.WHITE + " За читы.");
        }
    }
Проверял в всех 3 мапах игрок находится.
 
Чтобы найти ошибку в коде - нужно сначала привести его в порядок.
Мои рекомендации к коду, которые позволят тебе гораздо быстрее обнаруживать проблемы:

1) У тебя в инстансе plugin поле NumbersToBANNED. Называй поля с маленькой буквы, чтобы не путать их с классами

2) Вместо data1 и data2 указывай более человеческие имена, чтобы было проще читать код

3) Вместо long toban = Long.valueOf(30).longValue() можно писать просто long toban = 30, в некоторых случаях может потребоваться указывать L на конце, то есть 30L

4) У HashSet и HashMap не указаны generic-типы. Указывай, чтобы не путаться, и чтобы IDE имела возможность подсказывать тебе проблемные места. Пример: HashSet<Player> или HashMap<Player, Long>
Благодаря этому тебе и не придётся кастовать объекты, полученные из мапы, а значит код станет чище и читабельней

5) Обращай внимание на предупреждения IDE. У тебя весь код в варнах, так быть не должно. Тебя не просто так предупреждают о косяках. Так, например поле timestoUnBan из метода isBan у тебя не используется вовсе

6) Вместо if(banplrs.contains(bannedplr) == true) можно просто писать if(banplrs.contains(bannedplr)). Это особой роли не играет, но на будущее будешь знать. Просто чуть улучшает читабельность

7) У тебя имеется конструкция вида:
if (datatoban >= datatounban) {
...
} else if (datatoban < datatounban) {
...
}
В данном случае в else не требуется указывать условие, потому что и так понятно, что оно будет выполнено, если выполнится первый if


А теперь самый важный пункт, который напрямую связан с твоим вопросом, однако не отвечает на него "в лоб".

8) Для проверки состояния бана у тебя аж три разных поля:
plugin.banlist, plugin.dataToBan, plugin.dataToTimeInBan
И при любых операциях с банами тебе нужно манипуляровать сразу тремя. Если забудешь где-то использовать одно - как раз будешь ловить странные ошибки. Похоже, что в isBan ты столкнулся как раз с последствиями этой проблемы. В banlist запись есть, а в dataToBan и dataToTimeInBan записи отсутствуют. Тщательно проверь это.
Проверял в всех 3 мапах игрок находится.
Если действительно так - значит выполняется return false, который находится внутри условия
datatoban >= datatounban. В любом случае, тебе проблему определить гораздо проще, чем человеку с форума - у тебя на руках полноценное приложение, которое ты можешь запускать и дебажить самостоятельно. Так, например, ты можешь вывести в консоль все необходимые переменные, чтобы понять, какие значения у тебя сравниваются между собой, и какое условие приводит к возвращению false методом.

В любом случае, для упрощения всей этой ситуации будет разумно сделать собственный класс BanInfo со всей необходимой информацией о бане игрока. И в итоге у тебя вместо трёх полей останется лишь одно:
Map<Player, BanInfo> allBans = new HashMap<>();

Это основы ООП, которые тебе в любом случае предстоит изучить, если ты собираешься писать стабильные и функциональные плагины
 
Последнее редактирование:
Чтобы найти ошибку в коде - нужно сначала привести его в порядок.
Мои рекомендации к коду, которые позволят тебе гораздо быстрее обнаруживать проблемы:

1) У тебя в инстансе plugin поле NumbersToBANNED. Называй поля с маленькой буквы, чтобы не путать их с классами

2) Вместо data1 и data2 указывай более человеческие имена, чтобы было проще читать код

3) Вместо long toban = Long.valueOf(30).longValue() можно писать просто long toban = 30, в некоторых случаях может потребоваться указывать L на конце, то есть 30L

4) У HashSet и HashMap не указаны generic-типы. Указывай, чтобы не путаться, и чтобы IDE имела возможность подсказывать тебе проблемные места. Пример: HashSet<Player> или HashMap<Player, Long>
Благодаря этому тебе и не придётся кастовать объекты, полученные из мапы, а значит код станет чище и читабельней

5) Обращай внимание на предупреждения IDE. У тебя весь код в варнах, так быть не должно. Тебя не просто так предупреждают о косяках. Так, например поле timestoUnBan из метода isBan у тебя не используется вовсе

6) Вместо if(banplrs.contains(bannedplr) == true) можно просто писать if(banplrs.contains(bannedplr)). Это особой роли не играет, но на будущее будешь знать. Просто чуть улучшает читабельность

7) У тебя имеется конструкция вида:
if (datatoban >= datatounban) {
...
} else if (datatoban < datatounban) {
...
}
В данном случае в else не требуется указывать условие, потому что и так понятно, что оно будет выполнено, если выполнится первый if


А теперь самый важный пункт, который напрямую связан с твоим вопросом, однако не отвечает на него "в лоб".

8) Для проверки состояния бана у тебя аж три разных поля:
plugin.banlist, plugin.dataToBan, plugin.dataToTimeInBan
И при любых операциях с банами тебе нужно манипуляровать сразу тремя. Если забудешь где-то использовать одно - как раз будешь ловить странные ошибки. Похоже, что в isBan ты столкнулся как раз с последствиями этой проблемы. В banlist запись есть, а в dataToBan и dataToTimeInBan записи отсутствуют. Тщательно проверь это.

Если действительно так - значит выполняется return false, который находится внутри условия
datatoban >= datatounban. В любом случае, тебе проблему определить гораздо проще, чем человеку с форума - у тебя на руках полноценное приложение, которое ты можешь запускать и дебажить самостоятельно. Так, например, ты можешь вывести в консоль все необходимые переменные, чтобы понять, какие значения у тебя сравниваются между собой, и какое условие приводит к возвращению false методом.

В любом случае, для упрощения всей этой ситуации будет разумно сделать собственный класс BanInfo со всей необходимой информацией о бане игрока. И в итоге у тебя вместо трёх полей останется лишь одно:
Map<Player, BanInfo> allBans = new HashMap<>();

Это основы ООП, которые тебе в любом случае предстоит изучить, если ты собираешься писать стабильные и функциональные плагины
ОГо, очень расширенный ответ, спасибо! Смотри, я вчера проверял во первых, во всех 3 мапах игрок есть, нооо основная проблема в том, что я убрал кик игрока после варна и добавил команду на проверку игрока на isBan, и получил что после выдачи бана игрок равняется true у этого значения, а после того как игрок выходит и заново заходит при прописке команды на проверку, игрок равняется - false у проверки на isBan
 
ОГо, очень расширенный ответ, спасибо! Смотри, я вчера проверял во первых, во всех 3 мапах игрок есть, нооо основная проблема в том, что я убрал кик игрока после варна и добавил команду на проверку игрока на isBan, и получил что после выдачи бана игрок равняется true у этого значения, а после того как игрок выходит и заново заходит при прописке команды на проверку, игрок равняется - false у проверки на isBan
Потому что при перезаходе объект игрока меняется, в таком случае лучше хранить UUID или имя в верхнем/нижнем регистре
 
ОГо, очень расширенный ответ, спасибо! Смотри, я вчера проверял во первых, во всех 3 мапах игрок есть, нооо основная проблема в том, что я убрал кик игрока после варна и добавил команду на проверку игрока на isBan, и получил что после выдачи бана игрок равняется true у этого значения, а после того как игрок выходит и заново заходит при прописке команды на проверку, игрок равняется - false у проверки на isBan
Выше человек верно сказал - при перезаходе на сервер объект Player совершенно другой. Если тебе нужно, чтобы система работала даже после перезахода - в качестве ключа нужно хранить либо UUID игрока player.getUniqueId(), либо его ник player.getName()
 
Выше человек верно сказал - при перезаходе на сервер объект Player совершенно другой. Если тебе нужно, чтобы система работала даже после перезахода - в качестве ключа нужно хранить либо UUID игрока player.getUniqueId(), либо его ник player.getName()
Лучше uuid, тогда проблема решена, всем спасибо.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх