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 usunięciem gracza z arraylisty (timer).


babciaaaa

Rekomendowane odpowiedzi

Opublikowano

Czesc. potrzebuje pomocy, chodzi mi oto ze nie moge usunac gracza z arraylisty. wszystko pieknie dziala gdy wywoluje usuniecie gracza za pomoca komendy lub w innym miejscu niz timer, kiedys o tym czytalem ze nie mozna usunac gracza z listy poczas trawania takiego timeru, czy jest jakis sposob aby to rozwiazac?

 

    public void gra_odliczanie(){
            
        minecart_odliczanie = 0;
        
        gra_timer = Bukkit.getScheduler().runTaskTimer(Main.getInst(), new Runnable(){
            public void run(){
                                
                if(zatrzymany == true)
                    gra_timer.cancel();            
                else
                {
                    if(minecart_odliczanie == 0){
                        gra_postaw_minecarts();
                    }
                    if(minecart_odliczanie >= minecart_odliczanie_max){
                        minecart_odliczanie = -1;
                        
                        gra_sprawdz_stan();
                    }
                }
                minecart_odliczanie++;
                Bukkit.broadcastMessage("czas: " + minecart_odliczanie);
            }
        },0, 20);
    }
    
    public void gra_sprawdz_stan(){        
        for(Player p : udzial)
        {
            if(!p.isInsideVehicle()){
                udzial.remove(p);
            }
        }
        gra_usun_minecarts();
    }
Opublikowano

to ma dzialac na takiej zasadzie, gdy timer dochodzi do 12, sprawdza stan gry czyli kazdy gracz ktory jest w minigrze a nie jest w wagonie[minecart] zostaje automatycznie usuniety z arraylisty [ odpada ]. blad jest taki ze wywala tylko 1 gracza i timer sie resetuje, gdy usunolem udzial.remove(p)[usuwanie gracza z arraylisty] i zamienilem to na boradcast z wiadomoscia kto odpadl, wszystko wtedy dziala.

screen z logami:
http://www113.zippyshare.com/i/NkbstUEN/41229/Bez%C2%A0tytu%C5%82u.png

Opublikowano

em, dlaczego niby nie można modyfikować arraylist w schedulerach?

 

 

 

			ArrayList<Player> players = new ArrayList<>();
			players.add(player);

			for(Player player1 : players)
			{
				player.sendMessage(player1.getName());
			}

			new BukkitRunnable()
			{
				@Override
				public void run()
				{
					players.remove(player);

					for(Player player1 : players)
					{
						player.sendMessage(player1.getName());
					}

					player.sendMessage("empty - magic!");
				}
			}.runTaskLater(this, 20);

 

na przyszłość - nazwy zmiennych, procedur itp powinno się nazywać po angielsku, najlepiej w notacji camelCase

https://pl.wikipedia.org/wiki/CamelCase
//edit kod będzie działać, ale ma memory leaka i nie powinno przechowywać się całego obiektu playera w kolekcjach, a samo modyfikowanie kolekcji w taskach bez synchronizacji jest niebezpieczne

dzięki @OtekPlay

Opublikowano

 

em, dlaczego niby nie można modyfikować arraylist w schedulerach?

 

 

 

			ArrayList<Player> players = new ArrayList<>();
			players.add(player);

			for(Player player1 : players)
			{
				player.sendMessage(player1.getName());
			}

			new BukkitRunnable()
			{
				@Override
				public void run()
				{
					players.remove(player);

					for(Player player1 : players)
					{
						player.sendMessage(player1.getName());
					}

					player.sendMessage("empty - magic!");
				}
			}.runTaskLater(this, 20);

 

 

 

na przyszłość - nazwy zmiennych, procedur itp powinno się nazywać po angielsku, najlepiej w notacji camelCase

https://pl.wikipedia.org/wiki/CamelCase

 

Ziomek co Ty ćpiesz, kto CI napisał, że nie można edytować listy w sch... ?

 

A co do nazw metod itp. Miał grzesio odpowiedzieć. :)

Nie rozumiem tego, każdy pisze jak mu sie tylko podoba :)

 

@topic

Dalej czekam na te listy 

Opublikowano

em, dlaczego niby nie można modyfikować arraylist w schedulerach?

 

 

 

			ArrayList<Player> players = new ArrayList<>();
			players.add(player);

			for(Player player1 : players)
			{
				player.sendMessage(player1.getName());
			}

			new BukkitRunnable()
			{
				@Override
				public void run()
				{
					players.remove(player);

					for(Player player1 : players)
					{
						player.sendMessage(player1.getName());
					}

					player.sendMessage("empty - magic!");
				}
			}.runTaskLater(this, 20);

 

na przyszłość - nazwy zmiennych, procedur itp powinno się nazywać po angielsku, najlepiej w notacji camelCase

https://pl.wikipedia.org/wiki/CamelCase
//edit kod będzie działać, ale ma memory leaka i nie powinno przechowywać się całego obiektu playera w kolekcjach, a samo modyfikowanie zmiennych w taskach bez synchronizacji jest niebezpieczne

dzięki @OtekPlay

 

 

 

Powtarzacie głupie rady zasłyszane w randomowych miejscach nie rozumiejąc ich znaczenia.

 

1. Typowych kolekcji typ ArrayList, HashMap, HashSet i wiele innych, nie można edytować jeśli właśnie je iterujemy (np pętla for-each), wtedy wywalają właśnie CME.

2. Podobnie sprawa wygląda jak edytujemy je z kilku wątków, ale tutaj tak właściwe jest random, bo możemy używać jakiegoś programu i 10 lat i nigdy nie dostać errora, bo nigdy nie zdarzyło się by 2 wątki na raz wykonywały przeszkadzające sobie operacje.

3. zwykłe taski wykonują się w tym samym wątku co reszta kodu, więc nie ma tu problemu. (Tylko async taski moga coś namieszać)

4. memoryleak to nie magiczny teletubiś który powstaje po dodaniu gracza do kolekcji, chodzi tu o to że ludzie dodają gracza do jakiejś kolekcji, i go tam zostawiają, jak kolekcja zniknie za 1 sekundę, bo już task się wykona i lista nie jest nigdzie przekazywana -> wszystko jest ok. Ale jak to ma się wykonać za kilka minut/godzin czy dopiero jak gracz coś zrobi, to wtedy albo bezpiecznie i równie wydajnie trzymamy UUID, albo w PlayerQuitEvent musimy mieć też dostęp do tej listy i wywalać gracza.

Są też WeakReferences ale zazwyczaj ich używanie jest zbędne.

EDIT: bo chodzi o to ze gracz wyjdzie z serwera, i zamiast jego obiekt razem z eq, statami etc byl wywalony z pamieci, to ty go trzymasz.

1438614356923701010629.png

 

Opublikowano

@Riveilli

 

 

Czytaj uwaznie co Ci pisalem,

 

Edytowac "zmienne" mozesz, ale lecac po liscie, nie mozesz jej edytowac ;)

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...