Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben?
Das ist absolut kein Thema - daher kommen diese Hinweise. Auch wenn diese teilweise kurz ausfallen: Das bitte nicht als Unhöflich oder Abwerten ansehen. Das liegt einfach nur daran, dass es sich z.B. bei mir nur um kurze Pausen handelt und daher nur so kurze Antworten entstehen. Du bist herzlich willkommen und wir helfen gerne weiter. (Erst Recht, wenn so Hinweise direkt aufgenommen und umgesetzt werden, wie z.B. die Verwendung der Code Tags )
Da bezüglich B) noch keine Rückmeldung gekommen ist: Hat das so ausgereicht um durch eigene Recherche weiter zu kommen oder brauchst Du dies ausführlicher? (Es ist kein Problem, da nachzufragen oder mehr einzufordern! Manchmal sind Antworten unverständlich oder so... Daher nicht zögern, wenn es nicht weiter hilft.)
Das einfach mal als eine Antwort mit etwas mehr Text
Da bezüglich B) noch keine Rückmeldung gekommen ist: Hat das so ausgereicht um durch eigene Recherche weiter zu kommen oder brauchst Du dies ausführlicher? (Es ist kein Problem, da nachzufragen oder mehr einzufordern! Manchmal sind Antworten unverständlich oder so... Daher nicht zögern, wenn es nicht weiter hilft.)
Nun hab ich die ID des Players zur ArrayList hinzugefügt, aber das erhoffte ergebnis funktioniert noch nicht...
Kannst du hier irgendwo einen Fehler erkennen?
Java:
public class ChatListener implements Listener {
public List<UUID> admin = new ArrayList<>();
public List<UUID> moderator = new ArrayList<>();
public List<UUID> supporter = new ArrayList<>();
public List<UUID> builder = new ArrayList<>();
public List<UUID> youtuber = new ArrayList<>();
public List<UUID> premium = new ArrayList<>();
public List<UUID> spieler = new ArrayList<>();
@EventHandler
public void onChatEvent(AsyncPlayerChatEvent e) {
Player player = (Player)e.getPlayer();
UUID id = (UUID)player.getUniqueId();
String message = (String)e.getMessage();
if(admin.contains(id)) {
Bukkit.broadcastMessage("§c§l[Admin] §r" + player + message);
}else if(moderator.contains(id)) {
Bukkit.broadcastMessage("§1[Moderator] §r" + player + message);
}else if(supporter.contains(id)) {
Bukkit.broadcastMessage("§2[Supporter] §r" + player + message);
}else if(builder.contains(id)) {
Bukkit.broadcastMessage("§3[Builder] §r" + player + message);
}else if(youtuber.contains(id)) {
Bukkit.broadcastMessage("§5[Youtuber] §r" + player + message);
}else if(premium.contains(id)) {
Bukkit.broadcastMessage("§6[Premium] §r" + player + message);
}else {
Bukkit.broadcastMessage("§r[Spieler] §r" + player + message);
}
e.setCancelled(true);
}
}
Da möchte ich einmal kurz einhaken, dann das mag zwar technisch funktionieren in Deinem Fall, aber das ist so nicht wirklich sinnvoll.
Damit hast Du die Aussage: RankCommand ist ein ChatListener. Aber das ist ggf. nicht wirklich so richtig.
Ich kenne Deinen genauen Code nicht, daher ist es schwer, dir da eine konkrete Lösung zu geben. Aber auf den ersten Blick sieht es so aus, also ob Du da eine Art Userverwaltung hast. Daher wäre da eine eigene Klasse denkbar: UserManagement und diese Klasse hat dann die List<UUID> drin.
Auf diese Listen gibst Du aber keinen direkten Zugriff sondern statt dessen gehst Du hin und erstellst dann Methoden, die den Zugriff erledigen.
Also sowas wie
Java:
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
public boolean isAdmin(final Player player) {
admin.contains(player.getUniqueId());
}
Deine Klassen RankCommand und ChatListener kennen dann die Instanz vom UserManagement. Die hätten dann also sowas:
Java:
private UserManagement userManagement;
public void setUserManagement(final UserManagement userManagement) {
this.userManagement = userManagement;
}
// Und dann in einer Methode der Klasse
userManagement.isAdmin(somePlayer);
// oder
userManagement.addAdmin(somePlayer);
Wichtig ist aber, dass Du bei der Erstellung der Instanzen jeweils das UserManagement setzt. Also Du erstellst eine Instanz von UserManagement und die gibst Du dann an die Instanzen der anderen Klassen...
Und das Problem, das Du Du ggf. in Deinem Post hattest:
Du hast zwei Instanzen gehabt: einmal vom ChatListener und einmal vom RankCommand. Damit hattest Du zwei Mal die ganzen Listen. Wenn Du also bei RankCommand einen Player in einer Liste hinzugefügt hast, dann ist der User bei dem ChatListener nicht enthalten.
Da möchte ich einmal kurz einhaken, dann das mag zwar technisch funktionieren in Deinem Fall, aber das ist so nicht wirklich sinnvoll.
Damit hast Du die Aussage: RankCommand ist ein ChatListener. Aber das ist ggf. nicht wirklich so richtig.
Ich kenne Deinen genauen Code nicht, daher ist es schwer, dir da eine konkrete Lösung zu geben. Aber auf den ersten Blick sieht es so aus, also ob Du da eine Art Userverwaltung hast. Daher wäre da eine eigene Klasse denkbar: UserManagement und diese Klasse hat dann die List<UUID> drin.
Auf diese Listen gibst Du aber keinen direkten Zugriff sondern statt dessen gehst Du hin und erstellst dann Methoden, die den Zugriff erledigen.
Also sowas wie
Java:
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
public boolean isAdmin(final Player player) {
admin.contains(player.getUniqueId());
}
Deine Klassen RankCommand und ChatListener kennen dann die Instanz vom UserManagement. Die hätten dann also sowas:
Java:
private UserManagement userManagement;
public void setUserManagement(final UserManagement userManagement) {
this.userManagement = userManagement;
}
// Und dann in einer Methode der Klasse
userManagement.isAdmin(somePlayer);
// oder
userManagement.addAdmin(somePlayer);
Wichtig ist aber, dass Du bei der Erstellung der Instanzen jeweils das UserManagement setzt. Also Du erstellst eine Instanz von UserManagement und die gibst Du dann an die Instanzen der anderen Klassen...
Und das Problem, das Du Du ggf. in Deinem Post hattest:
Du hast zwei Instanzen gehabt: einmal vom ChatListener und einmal vom RankCommand. Damit hattest Du zwei Mal die ganzen Listen. Wenn Du also bei RankCommand einen Player in einer Liste hinzugefügt hast, dann ist der User bei dem ChatListener nicht enthalten.
Hi, ich verstehe technisch leider nur die Hälfte von dem was du geschrieben hast 😅
ich hänge einfach mal den kompletten Code beider Klassen an. wichtig ist nur dass man die UUIDs des Spieler speichert, nicht den Namen, weil wenn er sonst seinen Namen ändert ist im Chat sein Rang weg..
mit den 2 Listen könntest du recht haben...
mein erster Fehler war, dass der Listener nicht in der Main registriert war.
jetzt funktioniert zwar der Spieler prefix, aber wenn ich meine UUID in RankCommand in eine Liste gebe, so merkt der ChatListener das tatsächlich nicht...
public List<UUID> admin = new ArrayList<>();
public List<UUID> moderator = new ArrayList<>();
public List<UUID> supporter = new ArrayList<>();
public List<UUID> builder = new ArrayList<>();
public List<UUID> youtuber = new ArrayList<>();
public List<UUID> premium = new ArrayList<>();
public List<UUID> spieler = new ArrayList<>();
@EventHandler
public void onChatEvent(AsyncPlayerChatEvent e) {
String player = (String)e.getPlayer().getName();
Player player1 = (Player)e.getPlayer();
UUID id = (UUID)player1.getUniqueId();
String message = (String)e.getMessage();
if(admin.contains(id)) {
Bukkit.broadcastMessage("§c§l[Admin] §r" + player + message);
}else if(moderator.contains(id)) {
Bukkit.broadcastMessage("§1[Moderator] §r" + player + message);
}else if(supporter.contains(id)) {
Bukkit.broadcastMessage("§2[Supporter] §r" + player + message);
}else if(builder.contains(id)) {
Bukkit.broadcastMessage("§3[Builder] §r" + player + message);
}else if(youtuber.contains(id)) {
Bukkit.broadcastMessage("§5[Youtuber] §r" + player + message);
}else if(premium.contains(id)) {
Bukkit.broadcastMessage("§6[Premium] §r" + player + message);
}else {
Bukkit.broadcastMessage("§r[Spieler] §r" + player + message);
}
e.setCancelled(true);
} else
player.sendMessage("§6[Essentials] §4§lDazu hast du keine Rechte!");
} else {
sender.sendMessage("Diesen Command können nur Spieler nutzen!");
}
return false;
}
Ich habe mal im Editor (also ohne jede Kontrolle durch einen Compiler - Tippfehler sind also möglich) paar Dinge geändert.
Aber das sind nur Auszüge!
Also als erstes habe ich ein UserManagement gebaut:
Java:
package de.jonny_2k12.chatsystemjonny.listeners;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.bukkit.entity.Player;
public class UserManagement {
private List<UUID> admin = new ArrayList<>();
private List<UUID> moderator = new ArrayList<>();
private List<UUID> supporter = new ArrayList<>();
private List<UUID> builder = new ArrayList<>();
private List<UUID> youtuber = new ArrayList<>();
private List<UUID> premium = new ArrayList<>();
private List<UUID> spieler = new ArrayList<>();
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
public boolean isAdmin(final Player player) {
return admin.contains(player.getUniqueId());
}
public void removeAdmin(final Player player) {
if(admin.contains(player.getUniqueId()) {
admin.remove(player.getUniqueId());
}
}
// Die anderen Methoden so aufbauen wie die für Admin!
}
Wichtig ist: So wie ich die Methoden für Admin geschrieben habe, kannst Du 1:1 die Methoden für die anderen Listen schreiben.
Also einfach die Methoden kopieren und dann [aA]dmin durch z.B. [mM]oderator ersetzen.
Dann habe ich den anderen Klassen ein UserManagement gegeben und das wird im Konstruktor mit übergeben.
Und dann im Code wird dann auf userManagement zugegriffen. Da beim remove die Prüfung enthalten ist, muss die im RankController nicht mehr stattfinden. So Du das als feste Regel haben willst, kannst Du das Entfernen sogar in das UserManagement rein nehmen:
Java:
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
removeSupporter(player);
remove.....(player);
remove.....(player);
...
}
Dann würden die remove Aufrufe nach dem addAdmin und so entfallen...
RankCommand würde dann (Ausschnitt):
[CODE lang="java" highlight="3,5,6,22-26"]
public class RankCommand extends ChatListener implements CommandExecutor {
private UserManagement userManagement;
public RankCommand(final Main plugin, final UserManagement userManagement) {
this.userManagement = userManagement;
plugin.getCommand("rank").setExecutor(this);
plugin.getCommand("rank").setDescription("/rank <Rang> <Player>");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(sender instanceof Player) {
Player player = (Player) sender;
if(player.hasPermission("chat.rank")) {
if(args.length == 0) {
player.sendMessage("§6[Essentials] §4Bitte benutze §6/rank <Rang> <Player>§4!");
} else if(args.length == 2) {
Player target = Bukkit.getPlayer(args[1]);
if(target != null) {
String rang = args[0];
if(rang.equals("Admin")) {
userManagement.addAdmin(target);
userManagement.removeModerator(target);
userManagement.removeSupporter(target);
// Ab hier müsstest du weiter anpassen ...
[/CODE]
Und der ChatListener:
[CODE lang="java" highlight="3, 5-7, 16-21"]
public class ChatListener implements Listener {
private UserManagement userManagement;
public ChatListener(final UserManagement userManagement) {
this.userManagement = userManagement;
}
@EventHandler
public void onChatEvent(AsyncPlayerChatEvent e) {
String player = (String)e.getPlayer().getName();
Player player1 = (Player)e.getPlayer();
UUID id = (UUID)player1.getUniqueId();
String message = (String)e.getMessage();
if(userManagement.isAdmin(player1)) {
Bukkit.broadcastMessage("§c§l[Admin] §r" + player + message);
}else if(userManagement.isModerator(player1)) {
Bukkit.broadcastMessage("§1[Moderator] §r" + player + message);
// Ab hier selbst ändern ...
[/CODE]
Und die Main muss natürlich auch angepasst werden, denn da erstellen wir das UserManagement einmalig und übergeben es bei den Konstuktoren der anderen beiden Klassen:
[CODE lang="java" highlight="5,8,10"]
public class Main extends JavaPlugin{
@Override
public void onEnable() {
UserManagement userManagement = new UserManagement();
Bukkit.getServer().getPluginManager().registerEvents(new JoinListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new QuitListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new ChatListener(userManagement), this);
new RankCommand(this, userManagement);
}
}[/CODE]
Das wäre dann mein Vorschlag etwas ausführlicher.
Edit: Die markierten Zeilen waren verschoben - er hatte eine Leerzeile am Anfang im Editor drin, die er wohl entfernt hat und dadurch gab es die Verschiebung ... wurde behoben...
Ich habe mal im Editor (also ohne jede Kontrolle durch einen Compiler - Tippfehler sind also möglich) paar Dinge geändert.
Aber das sind nur Auszüge!
Also als erstes habe ich ein UserManagement gebaut:
Java:
package de.jonny_2k12.chatsystemjonny.listeners;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.bukkit.entity.Player;
public class UserManagement {
private List<UUID> admin = new ArrayList<>();
private List<UUID> moderator = new ArrayList<>();
private List<UUID> supporter = new ArrayList<>();
private List<UUID> builder = new ArrayList<>();
private List<UUID> youtuber = new ArrayList<>();
private List<UUID> premium = new ArrayList<>();
private List<UUID> spieler = new ArrayList<>();
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
public boolean isAdmin(final Player player) {
return admin.contains(player.getUniqueId());
}
public void removeAdmin(final Player player) {
if(admin.contains(player.getUniqueId()) {
admin.remove(player.getUniqueId());
}
}
// Die anderen Methoden so aufbauen wie die für Admin!
}
Wichtig ist: So wie ich die Methoden für Admin geschrieben habe, kannst Du 1:1 die Methoden für die anderen Listen schreiben.
Also einfach die Methoden kopieren und dann [aA]dmin durch z.B. [mM]oderator ersetzen.
Dann habe ich den anderen Klassen ein UserManagement gegeben und das wird im Konstruktor mit übergeben.
Und dann im Code wird dann auf userManagement zugegriffen. Da beim remove die Prüfung enthalten ist, muss die im RankController nicht mehr stattfinden. So Du das als feste Regel haben willst, kannst Du das Entfernen sogar in das UserManagement rein nehmen:
Java:
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
removeSupporter(player);
remove.....(player);
remove.....(player);
...
}
Dann würden die remove Aufrufe nach dem addAdmin und so entfallen...
RankCommand würde dann (Ausschnitt):
[CODE lang="java" highlight="3,5,6,22-26"]
public class RankCommand extends ChatListener implements CommandExecutor {
private UserManagement userManagement;
public RankCommand(final Main plugin, final UserManagement userManagement) {
this.userManagement = userManagement;
plugin.getCommand("rank").setExecutor(this);
plugin.getCommand("rank").setDescription("/rank <Rang> <Player>");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(sender instanceof Player) {
Player player = (Player) sender;
if(player.hasPermission("chat.rank")) {
if(args.length == 0) {
player.sendMessage("§6[Essentials] §4Bitte benutze §6/rank <Rang> <Player>§4!");
} else if(args.length == 2) {
Player target = Bukkit.getPlayer(args[1]);
if(target != null) {
String rang = args[0];
if(rang.equals("Admin")) {
userManagement.addAdmin(target);
userManagement.removeModerator(target);
userManagement.removeSupporter(target);
// Ab hier müsstest du weiter anpassen ...
[/CODE]
Und der ChatListener:
[CODE lang="java" highlight="3, 5-7, 16-21"]
public class ChatListener implements Listener {
private UserManagement userManagement;
public ChatListener(final UserManagement userManagement) {
this.userManagement = userManagement;
}
@EventHandler
public void onChatEvent(AsyncPlayerChatEvent e) {
String player = (String)e.getPlayer().getName();
Player player1 = (Player)e.getPlayer();
UUID id = (UUID)player1.getUniqueId();
String message = (String)e.getMessage();
if(userManagement.isAdmin(player1)) {
Bukkit.broadcastMessage("§c§l[Admin] §r" + player + message);
}else if(userManagement.isModerator(player1)) {
Bukkit.broadcastMessage("§1[Moderator] §r" + player + message);
// Ab hier selbst ändern ...
[/CODE]
Und die Main muss natürlich auch angepasst werden, denn da erstellen wir das UserManagement einmalig und übergeben es bei den Konstuktoren der anderen beiden Klassen:
[CODE lang="java" highlight="5,8,10"]
public class Main extends JavaPlugin{
@Override
public void onEnable() {
UserManagement userManagement = new UserManagement();
Bukkit.getServer().getPluginManager().registerEvents(new JoinListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new QuitListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new ChatListener(userManagement), this);
new RankCommand(this, userManagement);
}
}[/CODE]
Das wäre dann mein Vorschlag etwas ausführlicher.
Edit: Die markierten Zeilen waren verschoben - er hatte eine Leerzeile am Anfang im Editor drin, die er wohl entfernt hat und dadurch gab es die Verschiebung ... wurde behoben...
ok, danke, problem wäre dann glaube ich im UserManager, dass er ja bei player.getUniqueID() nicht nimmt, da es ja noch keine Variable mit dem Spieler player gibt...
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
Diese Methode erwartet also, dass ihm eine Player Instanz übergeben wird.
Das ist also vergleichbar mit Jemand schickt Dich ein Auto Kaufen und gibt Dir das Geld mit.
Du musst also selbst gar kein geld haben. Das Geld wird dir ja mitgegeben.
So ist es auch hier: Der UserManager muss keine Player kennen. Er nimmt diese ja entgegen und arbeitet dann nur mit der Instanz, die er bekommen hat...
public void addAdmin(final Player player) {
admin.add(player.getUniqueId());
}
Diese Methode erwartet also, dass ihm eine Player Instanz übergeben wird.
Das ist also vergleichbar mit Jemand schickt Dich ein Auto Kaufen und gibt Dir das Geld mit.
Du musst also selbst gar kein geld haben. Das Geld wird dir ja mitgegeben.
So ist es auch hier: Der UserManager muss keine Player kennen. Er nimmt diese ja entgegen und arbeitet dann nur mit der Instanz, die er bekommen hat...
Nein, das ist falsch. Hast Du das u groß geschrieben? Dass muss klein geschrieben sein:
userManagement ist die Instanzvariable, die wir hinzugefügt haben.
UserManagement ist die Klasse, die wir erstellt haben.
Nein, das ist falsch. Hast Du das u groß geschrieben? Dass muss klein geschrieben sein:
userManagement ist die Instanzvariable, die wir hinzugefügt haben.
UserManagement ist die Klasse, die wir erstellt haben.
UserManagement userManagement = new UserManagement();
vergessen?
Diese Zeile deklariert eine neue Variable userManagement vom Typ UserManagement und erzeugt eine neue Instanz von UserManagement und weist diese dann der Variablen zu.
Und ich hatte vergessen: die Klasse RankCommand erbt natürlich nicht mehr von ChatListener. Diese Anpassung hatte ich in dem Code nicht drin...
Java:
public class RankCommand implements CommandExecutor {
UserManagement userManagement = new UserManagement();
vergessen?
Diese Zeile deklariert eine neue Variable userManagement vom Typ UserManagement und erzeugt eine neue Instanz von UserManagement und weist diese dann der Variablen zu.
Und ich hatte vergessen: die Klasse RankCommand erbt natürlich nicht mehr von ChatListener. Diese Anpassung hatte ich in dem Code nicht drin...
Java:
public class RankCommand implements CommandExecutor {
UserManagement userManagement = new UserManagement();
vergessen?
Diese Zeile deklariert eine neue Variable userManagement vom Typ UserManagement und erzeugt eine neue Instanz von UserManagement und weist diese dann der Variablen zu.
Und ich hatte vergessen: die Klasse RankCommand erbt natürlich nicht mehr von ChatListener. Diese Anpassung hatte ich in dem Code nicht drin...
Java:
public class RankCommand implements CommandExecutor {