_SmileCraft_ 20 Opublikowano 13 marca 2018 Udostępnij Opublikowano 13 marca 2018 Witam. Piszę obecnie tak dla zabawy plugin na gildie, taki mały i prosty. Chcę w nim stworzyć top10 graczy, lecz mam z tym problem bo zapisuję wszystkich graczy do jednego pliku: Schemat: Nick: Kile/Śmierci/Punkty Players: smileDev: 0/0/1000 test: 0/0/1000 testXD: 0/0/1000 Obecnie mogę wyświetlić tylko np: punkty, ale tylko dla danego gracza w taki sposób: public static int getKills(final Player p) { if (playerExists(p)) { String[] kills = Players.getPlayers().getString("Players." + p.getName()).split("/"); return Integer.parseInt(kills[0]); } else { return 0; } } public static int getDeaths(final Player p) { if (playerExists(p)) { String[] deaths = Players.getPlayers().getString("Players." + p.getName()).split("/"); return Integer.parseInt(deaths[1]); } else { return 0; } } public static int getPoints(final Player p) { if (playerExists(p)) { String[] points = Players.getPlayers().getString("Players." + p.getName()).split("/"); return Integer.parseInt(points[2]); } else { return 0; } } Do tego daję całą klasę z tworzeniem pliku Players.yml import java.io.*; import org.bukkit.configuration.file.*; public class Players { private static YamlConfiguration players; private static File pla = new File("plugins" + File.separator + "scGuilds", "players.yml"); public static void createFile() { if (!pla.exists()) { try { pla.createNewFile(); } catch (Exception e) { e.printStackTrace(); } players = YamlConfiguration.loadConfiguration(pla); Players.loadPlayers(); } } public static void loadPlayers() { FileConfiguration fc = Players.getPlayers(); if (!fc.contains("Players")) { fc.set("Players", ""); try { players.save(pla); } catch (IOException e) { e.printStackTrace(); } } } public static void saveFile() { try { players.save(pla); } catch (IOException e) { e.printStackTrace(); } } public static YamlConfiguration getPlayers(){ return players; } } Z góry dziękuję za pomoc. I tak wiem że lepiej napisać to obiektami ale to jest tylko mały projekt dla zabawy Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/ Udostępnij na innych stronach Więcej opcji udostępniania...
0 TheMolkaPL 345 Opublikowano 13 marca 2018 Udostępnij Opublikowano 13 marca 2018 Zapis wszystkich graczy w jednym pliku to nie jest dobry pomysł. Wraz ze wzrostem ilości graczy rośnie plik, a co za tym idzie czas odczytu pliku, zużycie przy tym procesora no i pamięci. Każdy gracz powinien mieć swój indywidualny plik na podstawie swojego UUID (bo gracz zmieni nick i wszystko straci). Folder pluginu pobiera się z głównej klasy metodą getDataFolder() (albo jakoś tak). Wracając do tematu to musisz odnaleźć kto ma najwięcej punktów. Musisz zrobić pętlę i sprawdzić gracza po graczu. Nastepnie każdego dodać do np mapy Map<UUID, Integer> z comparatorem, który sortuje po wartości. _SmileCraft_ 1 Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-171842 Udostępnij na innych stronach Więcej opcji udostępniania...
0 _SmileCraft_ 20 Opublikowano 13 marca 2018 Autor Udostępnij Opublikowano 13 marca 2018 (edytowane) Tak wiem że zapis wszystkich graczy w jednym pliku do zły pomysł wręcz bardzo zły, ale robię to z nudów. A co do tematu, można spróbować z tą mapą i comparatorem Edytowane 13 marca 2018 przez _SmileCraft_ Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-171843 Udostępnij na innych stronach Więcej opcji udostępniania...
0 GotoFinal 195 Opublikowano 13 marca 2018 Udostępnij Opublikowano 13 marca 2018 6 minut temu, TheMolkaPL napisał: Zapis wszystkich graczy w jednym pliku to nie jest dobry pomysł. Wraz ze wzrostem ilości graczy rośnie plik, a co za tym idzie czas odczytu pliku, zużycie przy tym procesora no i pamięci. Każdy gracz powinien mieć swój indywidualny plik na podstawie swojego UUID (bo gracz zmieni nick i wszystko straci). Folder pluginu pobiera się z głównej klasy metodą getDataFolder() (albo jakoś tak). Wracając do tematu to musisz odnaleźć kto ma najwięcej punktów. Musisz zrobić pętlę i sprawdzić gracza po graczu. Nastepnie każdego dodać do np mapy Map<UUID, Integer> z comparatorem, który sortuje po wartości. @_SmileCraft_ No tak właściwie to jest szybsze jest w jednym pliku kiedy chcesz robić topkę. Ogólnie to baza danych byłaby tutaj dobrym rozwiązaniem, ale można też plikami, tylko właśnie jest trudniej zrobić to optymalnie, bo wczytywanie wszystkich plików potrwa, trzeba to robić jak essentials, w async tasku wczytywać wszystkich graczy i układać topkę, a potem albo ją bezpośrednio aktualizować, albo co kilka minut wczytywać od nowa... od biedy może to być nawet SQLite czyli baza danych w pliku. Chyba ze chce sie ładować dane wszystkich graczy - tych danych zazwyczaj nie ma jakoś super dużo, więc to nie jest problem, ale jednak może nim być jak ilośc danych wzrośnie - ale wtedy można podzielić dane na te ładowane zawsze i te dopiero przy wejściu. Dodatkowo nie widze sensu zapisu w stringu x/y/z, rozdziel to na osobne pola: gracz: punkty: costam: costam: Do tego nie robi się tego tak: new File("plugins" + File.separator + "scGuilds", "players.yml"); jest specjalna metoda plugin.getDataFolder() i wtedy można new File(plugin.getDataFolder(), "players.yml"); Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-171844 Udostępnij na innych stronach Więcej opcji udostępniania...
0 yooniks 347 Opublikowano 14 marca 2018 Udostępnij Opublikowano 14 marca 2018 Jeśli chodzi o topki to możesz użyć treemap lub comparatora. Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-171955 Udostępnij na innych stronach Więcej opcji udostępniania...
0 Nieaktywny Opublikowano 14 marca 2018 Udostępnij Opublikowano 14 marca 2018 (edytowane) 12 godzin temu, yooniks napisał: Jeśli chodzi o topki to możesz użyć treemap lub comparatora. TreeMapa sortuje po kluczu. Jeśli kilku graczy będzie miało taką samą liczbę zabójstw, czy czegokolwiek innego, to TreeMapa użyje ostatniego dodanego, a nie wszystkich. Edytowane 14 marca 2018 przez Nieaktywny Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-172038 Udostępnij na innych stronach Więcej opcji udostępniania...
0 GotoFinal 195 Opublikowano 14 marca 2018 Udostępnij Opublikowano 14 marca 2018 1 godzinę temu, Jaqobb napisał: TreeMapa sortuje po kluczu. Jeśli kilku graczy będzie miało taką samą liczbę zabójstw, czy czegokolwiek innego, to TreeMapa użyje ostatniego dodanego, a nie wszystkich. tak, ale warto pamiętać że można to obejść i zrobić też mapę sortowaną po wartości - a komparator można zrobić tak by w razie identycznej ilości punktów np porównywało inne dane, w ostateczności nawet wartość UUID gracza - dzięki czemu nie będzie duplikatów kluczy. yooniks 1 Odnośnik do komentarza https://skript.pl/temat/26037-top10-graczy-z-pliku/#findComment-172063 Udostępnij na innych stronach Więcej opcji udostępniania...
Pytanie
_SmileCraft_ 20
Witam. Piszę obecnie tak dla zabawy plugin na gildie, taki mały i prosty. Chcę w nim stworzyć top10 graczy, lecz mam z tym problem bo zapisuję wszystkich graczy do jednego pliku:
Schemat: Nick: Kile/Śmierci/Punkty Players: smileDev: 0/0/1000 test: 0/0/1000 testXD: 0/0/1000Obecnie mogę wyświetlić tylko np: punkty, ale tylko dla danego gracza w taki sposób:
Do tego daję całą klasę z tworzeniem pliku Players.yml
Z góry dziękuję za pomoc. I tak wiem że lepiej napisać to obiektami ale to jest tylko mały projekt dla zabawy
Odnośnik do komentarza
https://skript.pl/temat/26037-top10-graczy-z-pliku/Udostępnij na innych stronach
6 odpowiedzi na to pytanie
Rekomendowane odpowiedzi