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

Баккит какого хрена?

Тема в разделе "Обсуждение Minecraft", создана пользователем Shevchik, 29 ноя 2013.

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

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Итак в процессе поиска ошибки в моей системе автоочистки, которая сбоила в процессе поиска активных игроков, я напоролся на один интересный баг в бакките.
    Итак для того тчобы определить кто играл а кто нет я использовал нечто такое
    Код:
    for (OfflinePlayer player : Bukkit.getOfflinePlayers()) {
      if (System.currentTimeMillis() - player.getLastPlayed() < awaytime) {
        plactivecs.add(player.getName());
        plactivencs.add(player.getName().toLowerCase());
      }
    }
    А теперь проблема, вот она: Bukkit.getOfflinePlayers(), которая внутри использует getOfflinePlayer(), который с багом.
    В случае наличия файла игрока с разными регистрами она возвращала только один.
    То есть имея файлы игрока Test.dat и test.dat оно возвращало только один из них, что приводило к казусам когда игрок test не играет давно, а игрок Test играет каждый день. В итоге обоих вытирало к херам и их регионы.
    Спасибо тебе баккит за попытку сделать чтобы функция getOfflinePlayer (она вызывается внутри Bukkit.getOfflinePlayers(ник)) была независима от регистра ника, но мне нахер такое не надо.

    Итого пришлось писать вот такой костыль чтобы всё работало
    Код:
    Server server = Bukkit.getServer();
    Class<?> craftofflineplayer = Bukkit.getOfflinePlayer("fakeautopurgeplayer").getClass();
    Constructor<?> ctor = craftofflineplayer.getDeclaredConstructor(server.getClass(),String.class);
    ctor.setAccessible(true);
    File playersdir = new File(Bukkit.getWorlds().get(0).getWorldFolder(),"players");
    for (String file : playersdir.list()) {
      if (file.endsWith(".dat")) {
        String nickname = file.substring(0, file.length() - 4);
        OfflinePlayer offplayer = (OfflinePlayer) ctor.newInstance(server,nickname);
        if (System.currentTimeMillis() - offplayer.getLastPlayed() < awaytime) {
          plactivecs.add(offplayer.getName());
          plactivencs.add(offplayer.getName().toLowerCase());
        }
      }
    }
    
    Куда костылей с рефлексией чтобы быть независимым от версии только потому что кто-то идиот.
     
    Последнее редактирование: 2 дек 2013
    AlexGL, FirePoint, DeD_Kopatel и 2 другим нравится это.
  2. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Я искал эту ошибку месяца, я трижды переписал функцию получения списка активных игроков, я проверил её несколько раз, я таскал 100гиговый бэкап сервера несколько раз по сети чтобы отдебагать это всё. И обнаружить что это ошибка в ядре. У меня баттхерт, держите меня семеро, а то сейчас на форум польются потоки ненависти.
     
  3. Den-Xs

    Den-Xs Старожил Пользователь

    Баллы:
    103
    Skype:
    denis_314
    Не ну чо, всё правильно... По идее, "test" и "TEST" и должны быть одним и тем же игроком, так во всех нормальных онлайн-играх. Другое дело что и регистрация игроков, отличающихся друг от друга только регистрами, тогда должна быть запрещена...
     
  4. alexandrage

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

    Баллы:
    173
    С лаунчером не может быть такой проблему, у меня просто не авторизует с неправильным регистром :).
     
  5. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    А у меня плагином. И то со старых времён пару дупликатов осталось.
    А толку?

    Я ж не могу всем юзерам моего плагина совать плагин ограничивающий регистр и советовать чистить дупликаты, меня просто не поймут. В итоге приходится решать проблему которой не должно было бы быть, если бы баккит не натворил херни.
     
    DeD_Kopatel нравится это.
  6. MySt1k

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

    Баллы:
    173
    СВЕРШИЛОСЬ!!!!

    Когда выйдет новая версия плагина?
     
  7. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    КТТС. Надо ещё одну хрень поправить с автоочисткой пермишенов. А также протестировать это всё.

    Если срочно надо, используй дев билды.
     
  8. Den-Xs

    Den-Xs Старожил Пользователь

    Баллы:
    103
    Skype:
    denis_314
    Ну чому же "ограничивать регистр"? В плагине регистрации прописать String.toLowerCase() и сравнивать с остальными никами тоже в нижнем регистре )
     
  9. MySt1k

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

    Баллы:
    173
    Ок. Спасибо.
     
  10. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    И как я тогда узнаю под каким ником зашёл игрок изначально?
    Мне надо остановить генерацию файлов Test.dat и test.dat, а для этого надо фильтровать игрока в PlayerLoginEvent.
    Я это и сделал, итого можно зайти только под регистром под которым зашёл в первый раз.
     
  11. Den-Xs

    Den-Xs Старожил Пользователь

    Баллы:
    103
    Skype:
    denis_314
    Тащемта я то же самое написал
     

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