Skocz do zawartości
  • 0
_SmileCraft_

Top10 Graczy z pliku

Pytanie

Użytkownik

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

Użytkownik
  • 0

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0

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 przez _SmileCraft_

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0
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");

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
  • 0
Nieaktywny   
Losowy awatar
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 przez Nieaktywny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0
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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Losowy awatar
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×