Skocz do zawartości
  • 0

Zapisywanie statystyk gracza w hashmapie


Pytanie

Hej, chciałem zrobić plugin na statystyki gracza wraz z zapisem do bazy danych MySQL. Projekt wyglądał tak: Gracz wykonuje jakąś akcję, która jest nasłuchiwana przez plugin, np. kopie jakąś rudę, plugin sprawdza jaka to ruda i dodaje + 1 do obecnej wartości. Używam enuma do identyfikacji śledzonych statystyk. Wydaję mi się, że bezpośrednie zapytania do MySQL z prośbą o UPDATE mogą być nieco obciążające dla serwera kiedy jest np. 50 graczy, toteż postawiłem na hashmapy. Kiedy gracz wychodzi z serwera, wykonuje się funkcja "przelecenia" przez enum i zapisanie statystyk do bazy MySQL. Oprócz tego planuje autosave tych statystyk(10-20 min). Mój bezpośredni problem dotyczy hashmapy. Aby uniknąć tworzenia hashmap dla każdej wartości enuma(chyba, że faktycznie powinienem, nie jestem pewien, ale podzielcie się opiniami), postanowiłem stworzyć nową klase SaveMapValue w której utworzyłem po prostu

public SaveMapValue(Player v1, DataSaved v2){}

Gdzie DataSaved to wspomniany enum. Dzięki temu tworzę Hashmapę HashMap<SaveMapValue, Integer> i ustawiam wartość saveMap.put(new SaveMapValue(p, datasaved), 0). To działa. Problem jest kiedy chce odczytać tę wartość lub ją zmienić. Taka funkcja: 

    public static void IncrementPlayerData(Player p, DataSaved ds, Integer i){
        SaveMapValue smv = new SaveMapValue(p, ds);
        int value = saveMap.get(smv) + i;
        saveMap.replace(smv, value);
    }

wywala wtedy mi NullPointerException: 

 

Byłbym wdzięczny za wszystkie rady!

Edytowane przez CookieMonster85
Odnośnik do komentarza
https://skript.pl/temat/42408-zapisywanie-statystyk-gracza-w-hashmapie/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Za każdym razem tworzysz nową instancje obiektu więc w mapie nie znajduje takiego klucza co powoduje, że get zwraca ci null. Próbujesz wykonać jakąś operację na tym nullu i wywala ci NullPointerException.

Edytowane przez Peridot
Odnośnik do komentarza
https://skript.pl/temat/42408-zapisywanie-statystyk-gracza-w-hashmapie/#findComment-265883
Udostępnij na innych stronach

  • 0

Tak właśnie myślałem, że może być to problemem, ale jak to w takim razie obejść? Powinienem stworzyć kolejną hashmapę przechowującą ten obiekt? To najlepszy sposób? Czy też masz może jakiś inny pomysł?

Edytowane przez CookieMonster85
Odnośnik do komentarza
https://skript.pl/temat/42408-zapisywanie-statystyk-gracza-w-hashmapie/#findComment-265891
Udostępnij na innych stronach

  • 0
    private final Map<UUID, Map<Material, Integer>> oreCountMap = new HashMap<>();
    public void incrementPlayerData(final Player p, final Material m, final int c){
        final Map<Material, Integer> oreMap;
        if(!oreCountMap.containsKey(p.getUniqueId())){
            oreMap = oreCountMap.put(p.getUniqueId(), new HashMap<>());
        }else{
            oreMap = oreCountMap.get(p.getUniqueId());
        }
        if(oreMap.containsKey(m)){
            oreMap.replace(m, oreMap.get(m)+c);
        }else{
            oreMap.put(m, c);
        }
        oreCountMap.replace(p.getUniqueId(), oreMap);
    }
    public int getPlayerMinedOres(final Player p, final Material m){
        if(!oreCountMap.containsKey(p.getUniqueId())) return 0;
        return oreCountMap.get(p.getUniqueId()).getOrDefault(m, 0);
    }

Nie testowane, przechowuje ilość wykopanych materiałów (z eventu blockbreak możesz wziąć z twojwykopanyblok.getType())

Możesz tez zmienić Material na dowolną klasę jaką chcesz przechowywać.

Edytowane przez szymonjjay
Odnośnik do komentarza
https://skript.pl/temat/42408-zapisywanie-statystyk-gracza-w-hashmapie/#findComment-265892
Udostępnij na innych stronach

  • 0

Dzięki bardzo, zdecydowanie mi to pomogło(zapomniałem kompletnie o zagnieżdżaniu map 😳)

 

problem rozwiązany

Edytowane przez CookieMonster85
Odnośnik do komentarza
https://skript.pl/temat/42408-zapisywanie-statystyk-gracza-w-hashmapie/#findComment-265893
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...