[Minecraft] Wie kann ich mit HashMap folgendes ausgeben lassen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hab jetzt deine Frage absolut nicht im geringsten verstanden, aber

Aber da wird ja beim eingeben vom 1. & 2. Wert immer nur der 2. Wert ausgegeben.

kann es sein, dass du nicht weißt, dass eine ArrayList mit 0 und nicht mit 1 anfängt? Wie gesagt hab deine Frage nicht gecheckt.

Woher ich das weiß:Hobby – Ich spiele seit der Version 1.7 Minecraft.
verreisterNutzer  16.10.2020, 00:42

Ich weiß, dass sie mit 0 Anfängt, deswegen habe ich im Code auch noch

} else if (args.length == 0 || args.length == 3) {

drin...

0
CyCodeDE  16.10.2020, 00:52
@verreisterNutzer

Auch nach dreimaligem durchlesen deiner Frage checke ich nicht was du tun willst.

Wenn du einfach die Argumente abfragen willst, fragst du erst nach der Länge ab mit

args#length

und dann fragst du halt die einzelnen Argumente ab also

args[0], args[1] usw.

Wenn du also bitte nocheinmal erklären würdest was du willst, könnte ich dir auch helfen.

0
verreisterNutzer  16.10.2020, 01:45
@CyCodeDE

OK tut mir Leid, ich bin schon den ganzen Tag etwas verwirrt.

Ich schick den Code hier einmal rein und versuche es nochmal zu erklären xD

@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		Player p = (Player) sender;
		if (cmd.getName().equalsIgnoreCase("loc")) {
			if (sender instanceof Player) {
				if (PermissionsEx.getUser(p).inGroup("Owner") || PermissionsEx.getUser(p).inGroup("Vice")) {
					if (args.length == 1) {
						if (args[0].equalsIgnoreCase("world")) {
							p.sendMessage("§l§7[§aAltes Zuahuse§7]\n§fX:§7-1015 §fY:§764 §fZ:§7-387");
						} else if (args[0].equalsIgnoreCase("nhome")) {
							p.sendMessage("§l§7[§aNeues Zuahuse§7]\n§fX:§7 -3244 §fY:§768 §fZ:§7-3394");
						} else if (args[0].equalsIgnoreCase("end")) {
							p.sendMessage("§l§7[§5Endportal§7]\n§fX:§7 -1061 §fY:§768 §fZ:§7-13");
						} else if (args[0].equalsIgnoreCase("other")) {
							p.sendMessage("§cNicht verfügbar");
						} else {
							p.sendMessage("§bBenutze: §f/loc §a<ohome, nhome, end, other>");
						}
					} else if (args.length == 2) {
						if (args[1].equalsIgnoreCase("deinemama")) {
							p.sendMessage("funzt");
						}
					} else if (args.length == 0 || args.length == 3) {
						p.sendMessage("§bBenutze: §f/loc §a<ohome, nhome, end, other>");
					}
				} else {
					p.sendMessage(main.noperm);
				}
			} else {
				Bukkit.getServer().getConsoleSender().sendMessage("§cDu musst ein Spieler sein!");
			}
		}
		return false;
}

Es passiert Folgendes:

man kann /loc <bla> <bla> machen. Jedoch will ich aber, dass der 2. Wert nur genutzt werden kann, wenn der 1. Wert beispielsweise "world" ist.

Also ich darf nur

/loc world end
/loc world ANDERES //falls was dazu kommt
/loc nether portal
/loc nether ANDERES //falls was dazu kommt
/loc end portal
/loc end ANDERES //falls was dazu kommt

Also der 1. Wert ist für die Welt bestimmt, für die die Locations gespeichert sind. Der 2. Wert ist unterschiedlich zu dem 1. Wert. Weil wenn ich zum Beispiel /loc world portal und /loc nether portal habe, soll für den jeweiligen Command etwas anderes kommen. Ich hoffe, jetzt kann man es verstehen. Ich wüsste jetzt auch nicht, wie ich es besser erklären soll xD 😅

0
CyCodeDE  16.10.2020, 03:40
@verreisterNutzer

Du machst einfach zwei geschachtelte If abfragen.

Einmal für die Welt

if(args[0].equalsignorecase("world")) { //hier fragst du die Welt ab
 if(args[1].equalsignorecase("portal") { //hier fragst du den Ort in der Welt ab
  //Führ aus was du willst

if(args[0].equalsignorecase("nether")) { //hier fragst du die Welt ab
 if(args[1].equalsignorecase("portal") { //hier fragst du den Ort in der Welt ab
  //Blablaa

Das machst du einfach für jeden Ort und jede Welt. Es gibt sicher einen besseren Weg, aber mir fällt um die Zeit keiner ein.

0
verreisterNutzer  16.10.2020, 13:19
@CyCodeDE

Das hatte ich auch schonmal versucht, aber anscheinend habe ich nen Fehler gehabt. Ich probier es einfach nochmal. Schließlich funktionierte etwas mal, nur weil ich es nochmal von vorne geschrieben habe lol

0
verreisterNutzer  17.10.2020, 14:13
@CyCodeDE

Ich denke dir! Ich habe mal wieder 1&2 vertauscht und alles neu geschrieben. Und schwups.. es funktioniert. Jetzt noch ein paar Feinheiten machen😁

1

Es gibe verschiedene Arten von Maps. HashMap ist eine davon. Prinzipiell funktionieen die alle gleich.

Und zwar kannst du da drin Key/Value-Paare speichern:

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("farbe", "rot");
hashMap.put("form", "eckig");

Anmerkung: "farbe" und "form" sind die Keys. "rot" und "eckig" sind die damit verknüpften Values.

und auch wieder abrufen:

System.out.println(hashMap.get("farbe")); //="rot"

Dabei müssen sowohl für den Key als auch Value nicht zwingend Strings sein. Es kann auch Integer oder irgendeine andere Klasse sein. Je nachdem, was du brauchst. Was jeweils verwendet wird, gibst du in den eckigen Klammern an.

Wenn es bei deinem /loc darum geht, den zweiten Parameter mit dem ersten zu verknüpfen, ist HashMap vllt das richtige (wir kennen die Umstände drumherum nicht). Aber nicht als <String, ArrayList>, da beide Befehlsparameter Strings sind. Also <String, String>

In dem Fall dort, wo der eingegebene Befehl geparst (eingelesen) wird, also:

hashMap.put(parameter1, parameter2);

Und dann beim Abrufen an anderer Stelle im Code z.B.:

hashMap.get("world") //gibt dir nach Eingabe deiner 3 Befehle "end" zurück

Die HashMap selbst solltest du als Instanzvariable in der Klasse deklarieren, wo das ganze passiert, und im Konstruktor initialisieren, dmait sie auch zur Verfügung steht.

Aber Vorsicht:

Vor dem Verarbeiten des Befehls musst du den Befehl auf korrekte Eingabe prüfen:

  • Sind beide Parameter angegeben worden?
  • Sind beide Parameter gültig?

Wenn beides ja: In der HahMap speichern, wenn fehlerhaft: Fehlermeldung zum User und nichts speichern.

Und beim Wiederabrufen mit hashMap.get mit null als Rückgabe rechnen, falls zuvor noch nicht mit dem /loc-Befehl dem jeweilige Key ein Value zurückgegeben wurde.

Im Fall von ungültig oder null musst du dann entsprechend reagieren. Entweder den Vorgang abbrechen und Meldung zum User, dass nichts da ist, oder den Vorgang mit einem Standardwert fortsetzen (je nachdem, was in deinem Fall geeignet ist).

Ebenfalls musst beim Abrufen erneut überprüfen, ob der Value immer noch gültig ist (das kann sich zwischenzeitig geändert haben!).