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