Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Обсуждение Minecraft' started by Shevchik, Nov 29, 2013.

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

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

    Trophy Points:
    173
    Имя в Minecraft:
    _Shevchik_
    Итак в процессе поиска ошибки в моей системе автоочистки, которая сбоила в процессе поиска активных игроков, я напоролся на один интересный баг в бакките.
    Итак для того тчобы определить кто играл а кто нет я использовал нечто такое
    Code:
    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(ник)) была независима от регистра ника, но мне нахер такое не надо.

    Итого пришлось писать вот такой костыль чтобы всё работало
    Code:
    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());
        }
      }
    }
    
    Куда костылей с рефлексией чтобы быть независимым от версии только потому что кто-то идиот.
     
    Last edited: Dec 2, 2013
  2. Хостинг MineCraft
    <
  3. Автор темы
    Shevchik

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

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

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

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

    alexandrage Администратор

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

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

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

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

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

    Trophy Points:
    173
    СВЕРШИЛОСЬ!!!!

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

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

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

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

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

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

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

    Trophy Points:
    173
    Ок. Спасибо.
     
  11. Автор темы
    Shevchik

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

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

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

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

Share This Page