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

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());
    }
  }
}
Куда костылей с рефлексией чтобы быть независимым от версии только потому что кто-то идиот.
 
Последнее редактирование:
Я искал эту ошибку месяца, я трижды переписал функцию получения списка активных игроков, я проверил её несколько раз, я таскал 100гиговый бэкап сервера несколько раз по сети чтобы отдебагать это всё. И обнаружить что это ошибка в ядре. У меня баттхерт, держите меня семеро, а то сейчас на форум польются потоки ненависти.
 
Не ну чо, всё правильно... По идее, "test" и "TEST" и должны быть одним и тем же игроком, так во всех нормальных онлайн-играх. Другое дело что и регистрация игроков, отличающихся друг от друга только регистрами, тогда должна быть запрещена...
 
С лаунчером не может быть такой проблему, у меня просто не авторизует с неправильным регистром :).
 
С лаунчером не может быть такой проблему, у меня просто не авторизует с неправильным регистром :).
А у меня плагином. И то со старых времён пару дупликатов осталось.
А толку?

Я ж не могу всем юзерам моего плагина совать плагин ограничивающий регистр и советовать чистить дупликаты, меня просто не поймут. В итоге приходится решать проблему которой не должно было бы быть, если бы баккит не натворил херни.
 
КТТС. Надо ещё одну хрень поправить с автоочисткой пермишенов. А также протестировать это всё.

Если срочно надо, используй дев билды.
 
А у меня плагином. И то со старых времён пару дупликатов осталось.
А толку?

Я ж не могу всем юзерам моего плагина совать плагин ограничивающий регистр и советовать чистить дупликаты, меня просто не поймут. В итоге приходится решать проблему которой не должно было бы быть, если бы баккит не натворил херни.
Ну чому же "ограничивать регистр"? В плагине регистрации прописать String.toLowerCase() и сравнивать с остальными никами тоже в нижнем регистре )
 
Ну чому же "ограничивать регистр"? В плагине регистрации прописать String.toLowerCase() и сравнивать с остальными никами тоже в нижнем регистре )
И как я тогда узнаю под каким ником зашёл игрок изначально?
Мне надо остановить генерацию файлов Test.dat и test.dat, а для этого надо фильтровать игрока в PlayerLoginEvent.
Я это и сделал, итого можно зайти только под регистром под которым зашёл в первый раз.
 
И как я тогда узнаю под каким ником зашёл игрок изначально?
Мне надо остановить генерацию файлов Test.dat и test.dat, а для этого надо фильтровать игрока в PlayerLoginEvent.
Я это и сделал, итого можно зайти только под регистром под которым зашёл в первый раз.
Тащемта я то же самое написал
 
Назад
Верх