• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

ArrayList abfragen

gmb32

Kuhfänger
Registriert
17 Juni 2014
Beiträge
84
Diamanten
0
Hey,
ich möchte das wenn man einen Spieler tötet auf die Wanted liste Gesetz wird einer der die Permission hat kann diese abrufen und sehen wenn er suchen muss:
Registriert ist alles.
Javascript:
ArrayList<Player> polizei= new ArrayList<Player>();
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String arg2, String[] args) {
        Player p = (Player)sender;
        if(p.hasPermission("axt.polizei")) {
            if(args.length == 0) {
                p.sendMessage("§7[§???§7] /wanted list");
            } else if(args.length == 1) {
                if(polizei.isEmpty()) {
                    p.sendMessage("§7[§???§7] §cEs wird kein Spieler gesucht!");
                    return false;
                }
                int players = polizei.size();
                p.sendMessage("§7[§???§7] Es werden folgende Spieler gesucht:");
                p.sendMessage(""+players);
               
            } else {
                p.sendMessage("§7[§???§7] /wanted");
            }
        }else {
            p.sendMessage("§7[§???§7] §cKeine Berechtigung!");
        }
       
       
       
       
       
       
       
       
        return false;
    }

   
   
    @EventHandler
    public void onKill(PlayerDeathEvent e) {
        Player p = e.getEntity();
        Player killer = p.getKiller();
        if(polizei.contains(killer)) {
            return;
        }
        polizei.add(killer);
       
    }
}
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Hallo!
Ich habe mir mal erlaubt, deinen Code etwas um zu schreiben. Unter anderem folgendes:
  • die List ist nun ein Set, da keine Reihenfolge beachtet werden muss und kein Element doppelt vorkommen darf/können soll.
  • in diesem Set werden nun die Spielernamen und nicht die UUIDs gespeichert: der einzige wert der benötigt wird ist letztendlich auch nur der Spielername.
  • die for-Schleife konnte dank den Stream-Funktionen ersetzt werden. Die Namen werden nun quasi "automatisch" hintereinander geklatsch - schön ordentlich mit platzhalter und präfix :D
  • "final" operatoren; Diese zeigen nur an, dass die Variable nicht neu initialisiert werden kann.
Code:
import java.util.*;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;

public class CMDWANTED implements CommandExecutor, Listener {

    final Set<String> polizei = new HashSet<>();

    private static final String POLIZEI_PERMISSION = "axt.polizei";
    private static final String MESSAGE_FORMAT = "§7[§???§7] %s";

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String arg2, String[] args) {
        if (sender == null || args == null) return false;

        if (!(sender instanceof Player)) {
            Bukkit.getLogger().info("Only players can execute this command!");
            return false;
        }

        final Player player = (Player) sender;
        final int argsLength = args.length;

        if (player.hasPermission(CMDWANTED.POLIZEI_PERMISSION)) {
            if (argsLength == 0) {
                player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "/wanted list"));
            } else if (argsLength == 1) {
                if (this.polizei.isEmpty()) {
                    player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "§cEs wird kein Spieler gesucht!"));
                } else {
                    final String formattedNames = this.polizei.stream().collect(Collectors.joining("§7, ", "§e", ""));
                    player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "Es werden folgende Spieler gesucht:\n" + formattedNames));
                }
            } else {
                player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "/wanted"));
            }
        } else {
            player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "§cKeine Berechtigung!"));
        }

        return true;
    }


    @EventHandler
    public void onKill(PlayerDeathEvent e) {
        if (e == null || e.getEntity() == null || e.getEntity().getKiller() == null) return;

        final Player player = e.getEntity();
        final Player killer = player.getKiller();
        final String killerName = killer.getName();
        if (!this.polizei.contains(killerName)) {
            this.polizei.add(killerName);
        }

    }
}
Das funktioniert nicht, weil du zwei Klassen CMDWANTED erstellst, welche unterschiedliche ArrayLists haben.
Ich kann es nur nochmal erwähnen, das ist unbedingt zu beachten. Entweder man übergibt dasselbe Objekt an die Registrierung des Commands als auch an die des Listeners oder man legt die List (jetzt das Set) statisch, also auf Class Level Ebene an.

Frag gerne, falls du etwas an meinen Veränderungen nicht verstehst; dafür ist ein Forum da.

Besten Gruß,
Sandro
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Entweder man übergibt dasselbe Objekt an die Registrierung des Commands als auch an die des Listeners oder man legt die List (jetzt das Set) statisch, also auf Class Level Ebene an.
Hatte mich schon gewundert, wo es denn noch haken könnte...
Aber nunja, sowas passiert ja häufig, wenn die Leute nicht ihren ganzen Code posten wollen, "weil das ja schon richtig ist so" :D

Finde ich prima, dass du gleich eine vernünftig lesbare Version des Codes fertig gemacht hast für ihn! ;)
Persönlich täte ich aber noch die if-else Blöcke ein wenig runterkürzen mittels "if-not-return" statements, dann schaut's noch sauberer aus und ist auch leichter zu verändern später. Auch mit "final" täte ich etwas sparsamer umgehen, da kein wirklicher Bedarf da ist in dieser Situation.

die List ist nun ein Set, da keine Reihenfolge beachtet werden muss und kein Element doppelt vorkommen darf/können soll
Auch sollen Sets bessere bzw. schnellere contains() Methoden haben, als Lists.
Das fällt in diesen Dimensionen vermutlich nicht ins Gewicht, ist aber trotzdem ein guter Gedanke, auch für zukünftige Projekte, @gmb32.

Jetzt ist das nächste Problem es wird nur immer 1 Spieler angezeigt bei einen neuen Kill wird der neue Killer dort hingeschrieben.
Inwiefern? Ich kann dir da grade nicht ganz folgen...
Probiere mal bitte, ob das mit Sandros Code auch auftritt.
 
F

Figz

Guest
Hallo!
Ich habe mir mal erlaubt, deinen Code etwas um zu schreiben. Unter anderem folgendes:
  • die List ist nun ein Set, da keine Reihenfolge beachtet werden muss und kein Element doppelt vorkommen darf/können soll.
  • in diesem Set werden nun die Spielernamen und nicht die UUIDs gespeichert: der einzige wert der benötigt wird ist letztendlich auch nur der Spielername.
  • die for-Schleife konnte dank den Stream-Funktionen ersetzt werden. Die Namen werden nun quasi "automatisch" hintereinander geklatsch - schön ordentlich mit platzhalter und präfix :D
  • "final" operatoren; Diese zeigen nur an, dass die Variable nicht neu initialisiert werden kann.
Code:
import java.util.*;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;

public class CMDWANTED implements CommandExecutor, Listener {

    final Set<String> polizei = new HashSet<>();

    private static final String POLIZEI_PERMISSION = "axt.polizei";
    private static final String MESSAGE_FORMAT = "§7[§???§7] %s";

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String arg2, String[] args) {
        if (sender == null || args == null) return false;

        if (!(sender instanceof Player)) {
            Bukkit.getLogger().info("Only players can execute this command!");
            return false;
        }

        final Player player = (Player) sender;
        final int argsLength = args.length;

        if (player.hasPermission(CMDWANTED.POLIZEI_PERMISSION)) {
            if (argsLength == 0) {
                player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "/wanted list"));
            } else if (argsLength == 1) {
                if (this.polizei.isEmpty()) {
                    player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "§cEs wird kein Spieler gesucht!"));
                } else {
                    final String formattedNames = this.polizei.stream().collect(Collectors.joining("§7, ", "§e", ""));
                    player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "Es werden folgende Spieler gesucht:\n" + formattedNames));
                }
            } else {
                player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "/wanted"));
            }
        } else {
            player.sendMessage(String.format(CMDWANTED.MESSAGE_FORMAT, "§cKeine Berechtigung!"));
        }

        return true;
    }


    @EventHandler
    public void onKill(PlayerDeathEvent e) {
        if (e == null || e.getEntity() == null || e.getEntity().getKiller() == null) return;

        final Player player = e.getEntity();
        final Player killer = player.getKiller();
        final String killerName = killer.getName();
        if (!this.polizei.contains(killerName)) {
            this.polizei.add(killerName);
        }

    }
}

Ich kann es nur nochmal erwähnen, das ist unbedingt zu beachten. Entweder man übergibt dasselbe Objekt an die Registrierung des Commands als auch an die des Listeners oder man legt die List (jetzt das Set) statisch, also auf Class Level Ebene an.

Frag gerne, falls du etwas an meinen Veränderungen nicht verstehst; dafür ist ein Forum da.

Besten Gruß,
Sandro


Finde ich gut, dass du ihm anstatt nur den Code auch eine Erklärung dazu lieferst.

Dennoch würde ich diese Klasse in 3 Klassen unterteilen.

1. Klasse: CommandExecutor
2. Klasse: Listener
3. Klasse: statisch - Speichern der Polizeidaten und entsprechende Methoden um dort die Sachen zu speichern bzw. zu löschen.

Zum Folgenden, falls das nicht stimmt bitte unbedingt ausbessern, bin mir da gerade selbst unsicher!!!!!:

Da du in dem Set nun nur den Namen des Spielers speicherst, wird dieser nicht automatisch gelöscht, wenn der Spieler den Server verlässt.
(Wäre das anders, wenn du/er die Player Referenz speichern würdest/würde?).

Dementsprechend kannst du eine ListenerKlasse erstellen(z.B PolizeitListener), in der du die Events PlayerDeathEvent und PlayerQuitEvent registrierst und dort den gewünschten Code einfügst, der mit der Polizeit zu tun hat.
 

moinless

Schafhirte
Registriert
4 Oktober 2013
Beiträge
103
Diamanten
302
in diesem Set werden nun die Spielernamen und nicht die UUIDs gespeichert: der einzige wert der benötigt wird ist letztendlich auch nur der Spielername.

Jetzt ist die Frage, was passiert wenn ein Spieler den Server verlässt, sich umbenennt und dann wieder auf den Server kommt -> Er kann das System umgehen und ist nicht mehr "wanted".
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Jetzt ist die Frage, was passiert wenn ein Spieler den Server verlässt, sich umbenennt und dann wieder auf den Server kommt -> Er kann das System umgehen und ist nicht mehr "wanted".
Nunja, es kommt drauf an wo und wie das system eingesetzt wird. Da ich noch kein Anzeichen von Serialisierung oder persistenter Datenspeicherung in dem Code gesehen habe denke ich, dass das "wanted"- System für kurzfristige Events oder dergleichen gedacht ist.
Deine Schlussfolgerung ist richtig, jedoch ist die Grundfrage vorhanden, ob ein Spieler auf der Wanted Liste stehen soll, wenn er überhaupt nicht online ist. Je nach Spieleranzahl würden sich dort einige Namen ansammeln, was schnell unübersichtlich werden würde.

Dennoch würde ich diese Klasse in 3 Klassen unterteilen.

1. Klasse: CommandExecutor
2. Klasse: Listener
3. Klasse: statisch - Speichern der Polizeidaten und entsprechende Methoden um dort die Sachen zu speichern bzw. zu löschen.
Ich hätte dieses Problem persönlich auch lieber - einerseits zwecks der Objektorientierung, andererseits wegen der Übersichtlichkeit - in mehreren Klassen aufgeteilt, jedoch wollte ich den vorhandenen Code nicht komplett auseinanderreißen (Den Klassennamen hätte ich hier auch geändert :p).

Auch mit "final" täte ich etwas sparsamer umgehen, da kein wirklicher Bedarf da ist in dieser Situation.
Naja Bedarf ist relativ... :D Also ich habe mir einfach zwecks der Übersicht angewöhnt, dann final zu setzen, wenn ich in meinem folgenden Code davon ausgehe, dass sich diese Variable nicht (und schon gar nicht zu "null") verändert. Das ist vor allem praktisch, wenn man mit mehreren Leuten an einem Projekt programmiert. Ein fehlender "final" Operator ist dann für mich wie ein Dorn im Auge und erweckt den Sherlock in mir.

Besten Gruß,
Sandro
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
@PrimitiverTyp - final zu verwenden mag zwar hübsch sein, ist aber erfahrungsgemäß nicht mehr wirklich notwendig. Es mag zwar so sein, dass final-Variabeln sinnvoll sind, aber wie oft ändert man bestehende Variabeln ab, sodass diese null werden? Ich führe da eher eine neue Variable ein. Man sollte nie vergessen, dass hinter Java noch ein Compiler steht, der das ganze relativ gut zusammenkürzt. Unnötige Variabeln fliegen genau so raus wie finals reinfliegen ;)

Zum restlchen Thema:
@PrimitiverTyp hat bereits einen Stream verwendet, um den String aneinander zu binden. Bei diesem Stream kann man auch filtern, ob der Spieler überhaupt online ist. Das alles also ohne aufwendige for-Schleife, sondern eine Arbeit von 1-2 Codezeilen. Auch wenn Streams erst mit Java 8 hinzukamen und das gerade für Anfänger nicht all zu einfach ist, ist es durchaus sinnvoll, sich mit dieser Materie zu beschäftigen.

Und trotz allem: Da man nicht weiß, was später einmal mit dem Code passieren soll und man diesen Set vllt speichern möchte, wäre das Benutzen von UUIDs durchaus sinnvoll.
 
Oben