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

Jak wysłać wiadomość wszystkim graczom z ArrayListy?


Wjiczek

Rekomendowane odpowiedzi

Opublikowano

Witam,

mam sobie listę:

private List<Player> naarenie = new ArrayList<Player>();

i chciałbym, aby do wszystkich graczy w liście wysłała się wiadomość (poniżej macie kod, który odpowiada za wysyłanie wiad.):

    @EventHandler
    public void onQuit(PlayerQuitEvent e){
        if(naarenie.contains(e.getPlayer())){
            naarenie.remove(e.getPlayer());
            int i;
            for(naarenie.size()){
                naarenie.get(i).sendMessage("§e§lS§6§lW §8» §7Gracz §e" + e.getPlayer() + " §7wyszedl z gry! §8(§e" + naarenie.size() + "§8/" + "§66§8)");
                i++;
            }
        }
    }

Próbowałem pętlą for, ale jak widać nie umiem się nią posługiwać xD

Proszę o pomoc :D

Opublikowano

Nie powinno być for(Player p : naarenie.size()){ ????­

Opublikowano

Nie powinno być for(Player p : naarenie.size()){ ????­

 

W pętli foreach po dwukropku ma być (jakaś) kolekcja, a nie integer.

    @EventHandler
    public void onQuit(PlayerQuitEvent e){
        if(naarenie.contains(e.getPlayer())){
            naarenie.remove(e.getPlayer());
            for (Player p : naarenie)
            {
                p.sendMessage("§e§lS§6§lW §8» §7Gracz §e" + e.getPlayer().getName() + " §7wyszedl z gry! §8(§e" + naarenie.size() + "§8/" + "§66§8)");
            }
        }
    }
Opublikowano

No niby działa, ale jak wychodzę z serwera to nic mi się nie wyświetla (drugie konto) i nie usuwa nicku z listy ;d

Opublikowano

Więc tak... Kiedy wychodzę z serwera pojawia się to: http://scr.hu/4nkd/gx65i
Kiedy wchodzę na serwer normalnie mg dołączyć poprzez cmd /join: http://scr.hu/4nkd/lg5ui
Kiedy próbuję znowu wpisać /join wyskakuje: http://scr.hu/4nkd/st356
Kiedy wychodzę i wchodzę na serwer mogę dalej wpisać /join mimo to, że jestem już na liście: http://scr.hu/4nkd/7fkdz
Cały kod:

	private List<Player> naarenie = new ArrayList<Player>();
	
	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
		if(cmd.getName().equalsIgnoreCase("join")){
			if(sender instanceof Player){
				if(!naarenie.contains(sender)){
					if(naarenie.size() < 6){
						naarenie.add(((Player) sender).getPlayer());
						int i;
						for(i = 0; i < naarenie.size(); i++){
							naarenie.get(i).sendMessage("§e§lS§6§lW §8» §7Gracz §e" + ((Player) sender).getPlayer().getName() + " §7dolaczyl do gry! §8(§e" + naarenie.size() + "§8/" + "§66§8)");
						}
						sender.sendMessage("Na arenie sa: " + naarenie);
					} else{
						sender.sendMessage("§e§lS§6§lW §8» §7Arena jest pelna! Sprobuj ponownie pozniej!");
					}
				} else{
					sender.sendMessage("§e§lS§6§lW §8» §7Juz jestes na arenie!");
				}
			} else{
				sender.sendMessage("§e§lS§6§lW §8» §7Nie ma cie na serwerze!");
			}
		}
		return false;
	}
	
	@EventHandler
	public void onQuit(PlayerQuitEvent e){
		System.out.println(naarenie);
		if(naarenie.contains(e.getPlayer())){
			naarenie.remove(e.getPlayer());
			int i;
			for(i = 0; i < naarenie.size(); i++){ <- Tutaj próbowałem zrobić to na parę sposobów 
				naarenie.get(i).sendMessage("§e§lS§6§lW §8» §7Gracz §e" + e.getPlayer().getName() + " §7wyszedl z gry! §8(§e" + naarenie.size() + "§8/" + "§66§8)");
			}
		}
	}
}
Opublikowano

Jak rejestrujesz event i komendę?

Możliwe że tworzysz dwie instancje tej klasy dlatego event widzi pustą listę, mimo to, że dodałeś się do areny.

TwojaKlasa jakasTamZmienna = new TwojaKlasa();

zarejestrujEvent(jakasTamZmienna);
zarejestrujKomende(jakasTamZmienna); 
// Dawno nie pisalem nic pod Bukkita i nie pamietam jakie tam byly metody do rejestracji 

Tak mniej-więcej powinna wyglądać rejestracja.

 

A co do tego

				if(!naarenie.contains(sender)){

To sam nie wiem czemu nie działa xD Spróbuj może tak: if(!naarenie.contains((Player) sender)){ Wątpię, że to coś zmieni, ale zawsze warto spróbować :D

Opublikowano

@up Mój cały Main:

public class Main extends JavaPlugin{

	private static Main instance;
	
	@Override
	public void onEnable(){
		instance = this;
		Bukkit.getPluginManager().registerEvents(new Listeners(), this);
		getCommand("join").setExecutor(new Listeners());
	}
	public static Main getInst(){
		return instance;
	}
}

(Player)sender nic nie zmieniło ;d

Opublikowano

Nigdy nie trzymaj w kolekcjach obiektów graczy, tylko ich UUID, inaczej kolekcja i funkcjonalności z nią związane będą się bugować + doprowadzisz do leakmemory.

Opublikowano

Tak jak myślałem, robisz dwie instancje tej klasy, więc komenda i listener widzą różne listy.

public class Main extends JavaPlugin{

	private static Main instance;
	
	@Override
	public void onEnable(){
		instance = this;
                Listeners listeners = new Listeners();
		Bukkit.getPluginManager().registerEvents(listeners, this);
		getCommand("join").setExecutor(listeners);
	}
	public static Main getInst(){
		return instance;
	}
}

= = =

 

Obiekt gracza przed relogiem i po relogu nie jest tym samym obiektem.

 

Więc gdy (przez pierwszy błąd) usuwanie gracza z listy nie zadziałało, to po relogu mogłeś ponownie wejść na arenę bo .contains() wywalało false (bo to były dwie różne instancje, mimo to, że np. nick w nich był taki sam.)

 

Dlatego jak już napisał @Riveilli robienie List<Player> nie jest koniecznie dobrym pomysłem bo można wpaść w taką pułapkę xD

Opublikowano

Ok dzięki, tylko wtedy jak mam pobrać z UUID nick gracza?

@Riveilli tylko ja chcę pobrać z UUID nick gracza ;d

Bo teraz mam problem, bo mam errory w sendMessage

Opublikowano

Boże..

Błagam Cię co to jest? ;/

private List<Player> naarenie = new ArrayList<Player>();
	
	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
		if(cmd.getName().equalsIgnoreCase("join")){
			if(sender instanceof Player){
				if(!naarenie.contains(sender)){
					if(naarenie.size() < 6){
						naarenie.add(((Player) sender).getPlayer());
						int i;
						for(i = 0; i < naarenie.size(); i++){
							naarenie.get(i).sendMessage("§e§lS§6§lW §8» §7Gracz §e" + ((Player) sender).getPlayer().getName() + " §7dolaczyl do gry! §8(§e" + naarenie.size() + "§8/" + "§66§8)");
						}
						sender.sendMessage("Na arenie sa: " + naarenie);
					} else{
						sender.sendMessage("§e§lS§6§lW §8» §7Arena jest pelna! Sprobuj ponownie pozniej!");
					}
				} else{
					sender.sendMessage("§e§lS§6§lW §8» §7Juz jestes na arenie!");
				}
			} else{
				sender.sendMessage("§e§lS§6§lW §8» §7Nie ma cie na serwerze!");
			}
		}
		return false;
	}

WIĘKSZEGO WĘŻA Z TYCH IFÓW ZRÓB.

Nauczcie się ludzie błagam was, coś == null to wiadomość i return.. A nie coś != null a potem milion else za tym..

Tego nawet się czytać nie da.

 

Druga sprawa..

Zapisuj tylko UUID a potem twórz playera by mu wysłać wiadomość :_:.

 

Trzecia sprawa..

Zmienne po angielskuuuuuuuu.

 

@UP
Jaką array masz?

Nie piszesz tego przypadkiem pod niższą wersję gdzie były tylko nicki? ;-;

784091427630431250239.png

Regulamin sygnatur

Opublikowano

Pewnie masz jakiegoś starego Bukkita jak jeszcze nie było UUID.

 

1) Zaktualizuj Bukkita

lub

2) Wróć do zapisywania do Player (tylko pilnuj żeby nie robić wycieku pamięci, tzn. obsługuj wyjście gracza z serwera, wyrzucenie go komendą itp.)

 

Bo zapisywać bo Stringu to tak lamersko trochę, a z tego co widzę raczej nie dasz rady zrobić sobie własnego obiektu przedstawiającego gracza na arenie.

Opublikowano

@OldisPL

1. Dobrze, już zamieniam ;d

2. Zostawie to na razie na nicki

3. Zmienne po angielskuuuuuuuuuuuuu już zrobiłem

4. Już ustawiłem na nicki, potem przepiszę to na UUID ;d

 

@nieznany1234567

Wróciłem do zapisywania Player'a

 

Ogólnie chyba mogę uznać temat do zamknięcia, bo główny problem rozwiązany :D

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...