Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem z Timerem (Bukkit scheduler)


Querko

Rekomendowane odpowiedzi

Opublikowano
		    		taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInst(), new Runnable(){
		    			public int timer2 = 0;
						public void run(){
		    				if(timer.containsKey(p.getName())){
		    					
		    		            timer2++;
		    				}
		    				
		    			}
		    		}, 0L, 20L);
		    		timer.put(p.getName(), taskID);
		    }
	    }
       if(cmd.getName().equalsIgnoreCase("jakitimer"){
       p.sendMessage("Twoj timer: + timer2 + " sekund"); // Tu jest error, nie mogę pobrać wartości timer2
       }

Witam, mam problem z timerem.

Chciałbym aby każdy gracz miał innego timera, jak dodałem na samej górze kodu int timer2 to jak 2 gracz wystartował z timerem to zaczęło naliczać 2x tyle. 

Rozwiązanie tego znalazłem, ale nie działa to w komendzie "jakitimer"

Dodam jeszcze że mam taką hashmapke

private Map<String, Integer> timer = new HashMap<String, Integer>();

(Bez hejtów plisss dopiero się uczę javy ://)

 

@MarcinWieczorek@Entify@gotofinal @oldis @TheMajster

Opublikowano

nie przeczytalem kodu, ale na dole widze jeden blad

       p.sendMessage("Twoj timer: + timer2 + " sekund");

powinno byc

p.sendMessage("Twoj timer: " + timer2 + " sekund");

 

pss, kradniecie kodu to nie uczenie sie ;/

 

 

JAVA <3

 

Opublikowano
9 minut temu, Entify napisał:

nie przeczytalem kodu, ale na dole widze jeden blad


       p.sendMessage("Twoj timer: + timer2 + " sekund");

powinno byc


p.sendMessage("Twoj timer: "+timer2+" blabla"

 

pss, kradniecie kodu to nie uczenie sie ;/

Znaczy nie kradne ale ok..

Dobrze jest tak jak napisałem bo tak jak ty napisałeś to będzie się wyświetlało Twoj timer: +timer2+ 

 

@Editt

Tak mam jak teraz napisałeś, tak w sumie miałem, ale i tak jest error

Opublikowano
4 minuty temu, HAMMERxPL napisał:

"@oldis @TheMajster" xD 

Możesz stworzyć obiekt Timer, gdzie będziesz miał id taska i czas, a przy runnable będziesz aktualizował czas.

 

ehh mpc laguje xD 

Jak ma mniej więcej wyglądać

Opublikowano
1 godzinę temu, Querko napisał:

		    		taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInst(), new Runnable(){
		    			public int timer2 = 0;
						public void run(){
		    				if(timer.containsKey(p.getName())){
		    					
		    		            timer2++;
		    				}
		    				
		    			}
		    		}, 0L, 20L);
		    		timer.put(p.getName(), taskID);
		    }
	    }
       if(cmd.getName().equalsIgnoreCase("jakitimer"){
       p.sendMessage("Twoj timer: + timer2 + " sekund"); // Tu jest error, nie mogę pobrać wartości timer2
       }

Witam, mam problem z timerem.

Chciałbym aby każdy gracz miał innego timera, jak dodałem na samej górze kodu int timer2 to jak 2 gracz wystartował z timerem to zaczęło naliczać 2x tyle. 

Rozwiązanie tego znalazłem, ale nie działa to w komendzie "jakitimer"

Dodam jeszcze że mam taką hashmapke


private Map<String, Integer> timer = new HashMap<String, Integer>();

(Bez hejtów plisss dopiero się uczę javy ://)

 

@MarcinWieczorek@Entify@gotofinal @oldis @TheMajster

Mogłbyś bardziej opisac co chcesz osiagnać, jeśli dobrze to opiszesz to ci wtedy będe mógł pomóc, nie pisz tylko no że chce do hashmapy coś tylko np chce zrobić system cooldownów etc :)

Opublikowano
4 minuty temu, ToNapewnoNieJaAMożeJednakJa napisał:

Mogłbyś bardziej opisac co chcesz osiagnać, jeśli dobrze to opiszesz to ci wtedy będe mógł pomóc, nie pisz tylko no że chce do hashmapy coś tylko np chce zrobić system cooldownów etc :)

Potrzebuje tego do parkouru.

Jeśli gracz kliknie ja tabliczke to zaczyna odliczać mu czas

@Edit

To z tą tabliczką mam zrobione, ale z czasem, niestety nie ;/

Opublikowano
26 minut temu, Querko napisał:

Potrzebuje tego do parkouru.

Jeśli gracz kliknie ja tabliczke to zaczyna odliczać mu czas

@Edit

To z tą tabliczką mam zrobione, ale z czasem, niestety nie ;/

ok to tak

1. WeakHashMap<Uuid,Long> nazwa = new WeakHashMap<>();

2. robisz ASYNC taska, async by nie obciażać głównego wątku a że tam tylko bęziesz sendMsg robił to nie będzie problemu z synchronizacją

3. w tasku robisz

for(Map.Entry<Uuid,Long> entry : nazwa.entrySet()){
     i teraz

    long ms = System.currentTimeMilis() - entry.getValue();

   Player player = Bukkit.getPlayer(entry.getKey());

   player.sendMessage("Twoj czas to: " + ms);
}

mniej więcej dodawanie to poprostu

nazwa.put(uuid_gracza,System.current....);

mniej więcej coś takiego powinno ci zadziałać, jak nie zadziała to napisz bład to pomoge

Opublikowano

z tego co ja się orientuje korzystanie z bukkit Api w async jest niebezpieczne i teoretycznie nie powinno się z tego korzystać. jest jednak sposób aby to obejść , mns/pakiety . choć samo getOnlinePlayers powinno być bezpieczne bo korzysta z synchronizedCollection, lecz wysyłanie wiadomości , no nie wiem zagwozdka, niby jest niebezpieczne bo gracz może wyjść w trakcie ale jakie będą tego skutki :? kto wie?

1. WeakHashMap<Uuid,Long> nazwa = new WeakHashMap<>();

nie jest najlepszym wyjściem, i tam będzie potrzeba korzystania z systemu który ewentualnie wyczyści mapę, ewentualnie użyć jako klucza Player z tym że nie wiem jak się to ma do equals oraz też w niektórych przypadkach może się okazać że mapa będzie rosła w nieskończoność.

 

..nie wiem czy warto dawać to do async, jeśli ma być to tylko wysyłanie wiadomości.

 

ja bym to uczynił trochę inaczej , gdy gracz dołącza do parkuru go rozpocznie , zostaje po prostu dodany do listy oraz zostaje zapisany czas dołączenia, listę przeczesuje task co 0,5 sec który odświeża graczowi jego aktualny czas. i tyle z filozofii, i raczej zrobił bym to w sync, natomiast jeśli nie to oparł bym odświeżanie czasu na pakietach ( większa dokładność w czasie nie ma większego znaczenia bo jest to tylko poglądowe)

Opublikowano
32 minuty temu, damianq20 napisał:

z tego co ja się orientuje korzystanie z bukkit Api w async jest niebezpieczne i teoretycznie nie powinno się z tego korzystać. jest jednak sposób aby to obejść , mns/pakiety . choć samo getOnlinePlayers powinno być bezpieczne bo korzysta z synchronizedCollection, lecz wysyłanie wiadomości , no nie wiem zagwozdka, niby jest niebezpieczne bo gracz może wyjść w trakcie ale jakie będą tego skutki :? kto wie?

1. WeakHashMap<Uuid,Long> nazwa = new WeakHashMap<>();

nie jest najlepszym wyjściem, i tam będzie potrzeba korzystania z systemu który ewentualnie wyczyści mapę, ewentualnie użyć jako klucza Player z tym że nie wiem jak się to ma do equals oraz też w niektórych przypadkach może się okazać że mapa będzie rosła w nieskończoność.

 

..nie wiem czy warto dawać to do async, jeśli ma być to tylko wysyłanie wiadomości.

 

ja bym to uczynił trochę inaczej , gdy gracz dołącza do parkuru go rozpocznie , zostaje po prostu dodany do listy oraz zostaje zapisany czas dołączenia, listę przeczesuje task co 0,5 sec który odświeża graczowi jego aktualny czas. i tyle z filozofii, i raczej zrobił bym to w sync, natomiast jeśli nie to oparł bym odświeżanie czasu na pakietach ( większa dokładność w czasie nie ma większego znaczenia bo jest to tylko poglądowe)

1. yyyy po to chyba zrobili asyncTask by go używac? jedynie co tam robisz to jest wysyłanie wiadomość więc nie będzie problemów
2. WeakHashMap dlatego bo przy wyjśćiu gracza z serwera powinno usunać go z mapy automatycznie bo gc zniszczy obiekt gracza jeśli faktycznie przy wyjściu gracza nie zostanie to wyczyszczone(wystarczy że to sprawdzi)
to zamiast for each może zrobić iterator który będzie sprawdzał: Player player = Bukkit.getPlayer(entry.getKey());

 if(player == null || !player.isOnline()){

   iterator.remove();

continue;

i po problemie

a co do tego czemu w asyns z prostej przyczyny, watpie ze bedzie tam tylko wysylala wiadomosc pewnie zrobic scorebord czy cos a to juz jak dla mnie lepiej w async odswiezać i tyle.

"gdy gracz dołącza do parkuru go rozpocznie , zostaje po prostu dodany do listy oraz zostaje zapisany czas dołączenia" zamiast listy zrobiłem hashmape i napisales tak naprawde dokładnie to co ja tylko na hashmapie.

Opublikowano

tak i to jest ta różnica , weakHashMap nie jest zła ale wystarczy jeden plugin który przechowa obiekt klucz i lipa, zaczyna się zbieranie wartości w mapie , lepszym wyjściem jest skorzystanie z całego obiektu Player jako klucza (nie wiem tylko jak wygląda metoda equals, i to jest jedyny problem) ,jednak najbezpieczniej jest zrobić task który co jakiś czas sprawdza wielkości map i ewentualnie ją/je czyści.

mapa w tym wypadku wydaje mi się zbędna, bo za każdym razem gdy coś chcesz na niej wykonać (poza iteracją po wartościach) przeszukujesz tablice o wymiarze przynajmniej 16(chyba), (mapa zawsze jest większa od ilości obiektów) i tutaj jest podstawowa przewaga list dodatkowo lista jest kolekcją uporządkowaną. gdy nie masz zamiaru puszczać 100 graczy na ten parkur to nie ma sensu bawienia się w mapy . szczególnie że pewnie będziemy chcieli często przelatywać iteratorem po kolekcji.

 

Async jak i sync jest zrobiony po to aby go używać ...Async , do ciężkich obliczeń które mogły by zawiesić działanie głównego wątka serwera. samo wysyłanie wiadomości nie należy do ciężkich obliczeń ( chyba że planujesz wysłać setki wiadomości do 100 graczy w tym samym czasie). a masz pewność że nie wywali jakiego błędu bo gracz sobie wyszedł z serwera.

 

Opublikowano
36 minut temu, damianq20 napisał:

tak i to jest ta różnica , weakHashMap nie jest zła ale wystarczy jeden plugin który przechowa obiekt klucz i lipa, zaczyna się zbieranie wartości w mapie , lepszym wyjściem jest skorzystanie z całego obiektu Player jako klucza (nie wiem tylko jak wygląda metoda equals, i to jest jedyny problem) ,jednak najbezpieczniej jest zrobić task który co jakiś czas sprawdza wielkości map i ewentualnie ją/je czyści.

mapa w tym wypadku wydaje mi się zbędna, bo za każdym razem gdy coś chcesz na niej wykonać (poza iteracją po wartościach) przeszukujesz tablice o wymiarze przynajmniej 16(chyba), (mapa zawsze jest większa od ilości obiektów) i tutaj jest podstawowa przewaga list dodatkowo lista jest kolekcją uporządkowaną. gdy nie masz zamiaru puszczać 100 graczy na ten parkur to nie ma sensu bawienia się w mapy . szczególnie że pewnie będziemy chcieli często przelatywać iteratorem po kolekcji.

 

Async jak i sync jest zrobiony po to aby go używać ...Async , do ciężkich obliczeń które mogły by zawiesić działanie głównego wątka serwera. samo wysyłanie wiadomości nie należy do ciężkich obliczeń ( chyba że planujesz wysłać setki wiadomości do 100 graczy w tym samym czasie). a masz pewność że nie wywali jakiego błędu bo gracz sobie wyszedł z serwera.

 

Co do WeakHashMapy to tak jak w jakimś pluginie nie wyczysci mapy to bedzie leak, nie trzyma sie obiektu Player tutaj na forum osoba ładnie powiedziała czemu (https://bukkit.org/threads/the-thing-with-storing-a-player-object.132057/) co do wydajności HashMapy czy listy nie wypowiem się nigdy nie sprawdzałem, używałem tego co było mi wygodniej i tyle

A co do tego async to tak jak pisałem na 99,99% nie będzie tam tylko wysyłał wiadomość w tym tasku tylko pewnie jakieś scoreboard odświezał/bossbary czy inne duperele które powinno się robić w async :) 

Opublikowano
2 godziny temu, Querko napisał:

To będzie wydajne? Bo planuje na sewerze od 50 do max 130 graczy. I jeszcze jedno, bo nie chce żeby player.sendmessage było w tasku tylko gdy gracz wpisze komendę to mu wyskakuje jaki ma czas. W tasku będzie barapi które będzie liczyło mu czas

 

@Edit

Bo chcę zrobić że jeżeli gracz ukończy parkour to pisze mu w jakim czasie

 

@Edit2 

Zrobiłem tak jak pisałeś, i mam takie: http://imgur.com/a/5EB3l

 

pokaż kod jak to zrobiles, zapewne jebles sie przy czytaniu wartości z hashmapy 

Opublikowano
Dnia 24.06.2017 o 15:27, ToNapewnoNieJaAMożeJednakJa napisał:

pokaż kod jak to zrobiles, zapewne jebles sie przy czytaniu wartości z hashmapy 

 

xyz

 

Na barapi nie patrz, i tak narazie nie działa

Opublikowano
zamiast teg:						
	p.sendMessage("Ukonczyles parkour Easy 2" + nazwa.get(p.getUniqueId())); // Tu ma byc czas w sek.

dajesz to:

 

							    long ms = System.currentTimeMillis() - nazwa.get(p.getUniqueId());

p.sendMessage("Ukonczyles parkour Easy 2" + ms);

gdzie ms to milisekndu wiec dzielisz przez 1000 i masz sekundy

 

Opublikowano
6 minut temu, ToNapewnoNieJaAMożeJednakJa napisał:

zamiast teg:						
	p.sendMessage("Ukonczyles parkour Easy 2" + nazwa.get(p.getUniqueId())); // Tu ma byc czas w sek.

dajesz to:

 


							    long ms = System.currentTimeMillis() - nazwa.get(p.getUniqueId());

p.sendMessage("Ukonczyles parkour Easy 2" + ms);

gdzie ms to milisekndu wiec dzielisz przez 1000 i masz sekundy

 

 

Jak dzieliłem to przez 1000 to miałem wartość na minisie




			
		
Opublikowano
5 minut temu, Querko napisał:

Jak dzieliłem to przez 1000 to miałem wartość na minisie


long ms = System.currentTimeMillis() / 1000 - nazwa.get(p.getUniqueId());

ehh naucz sie może podstaw javy za nim bęziesz coś chciał napisać bo ci ch*j z tego wyjdzie

jak wrzucasz do mapy

		    		nazwa.put(p.getUniqueId(), System.currentTimeMillis());

do wrzucasz mili sekundy z tym co napisales

masz podzielic przez różnice czyli (System... - nazwa)/1000;

Opublikowano
Dnia 24.06.2017 o 16:44, ToNapewnoNieJaAMożeJednakJa napisał:

ehh naucz sie może podstaw javy za nim bęziesz coś chciał napisać bo ci ch*j z tego wyjdzie

jak wrzucasz do mapy


		    		nazwa.put(p.getUniqueId(), System.currentTimeMillis());

do wrzucasz mili sekundy z tym co napisales

masz podzielic przez różnice czyli (System... - nazwa)/1000;

xyz

 

 

Opublikowano
3 godziny temu, ToNapewnoNieJaAMożeJednakJa napisał:

no bo odpaliles taska co 


		    		}, 0L, 20L); 

1sekunde więc jest możliwość przeskoku odpal do 0.5 sekundy i nie będzie problemu.

W sumie dalej to samo, ale przy końcowym wyniku dobrze pokazuje. Jeszcze jedno. Odpaliłem 2 taska i czas zaczął liczyć się podwójnie, poprostu gdy 2 playerem kliknąłem na tabliczke

Opublikowano
Dnia 24.06.2017 o 23:06, __AHA__ napisał:

Pokaz ten swoj obecny 'kod' bo z fusów to nikt ci nie powie co jest źle

 

xyz

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...