Minecraft Plugin Spieler aus Config laden

07/18/2016 14:33 kleinkiiko#1
Falls es im falschen Berreich ist bitte verschieben^^

Hay,
ich bin momentan dran ein Plugin zu schreiben und nun würde ich gerne Spieler in eine config file eintragen lassen und mir dann per Befehl ausgeben lassen z.b so:

Unser Admin Team:
Spieler1
Spieler2
Spieler3

usw

Halt das sie alle untereinander stehen. Ich bekomme es aber nur hin das sie nebeneinander stehen. ( Kenne mich mit Config files noch nicht so aus )
Hier mal mein Code zum ausgeben:

Java-Quellcode
Code:
cs.sendMessage("§cAdmin§8: " + this.plugin.getConfig().getString("Admins.Admin") + "\n ");
so werden sie nur hintereinander angezeigt obwohl ich das \n gemacht habe. Momentan füge ich die Spieler per Hand in die Config ein aber man kann das doch bestimmt auch per Command machen oder?

Würde mich über eine Antwort freuen :)

Wie gesagt kenne ich mich mit config files noch nicht wirklich aus :D
07/18/2016 14:48 .Scy#2
was ist cs für ein objekt? und der quellcode zu SendMessage wäre auch nicht verkehrt, vlt. kann sendMessage garnicht mit "\n" umgehen.

was du sonst auch noch machen kannst wäre die ganzen namen in einer ArrayList<String> speichern und dann über eine for-each schleife über die ArrayList iterieren und cs.sendMessage einfach jedesmal aufrufen.
07/18/2016 14:54 kleinkiiko#3
Habe für den Player cs genommen ( Um ihn "anzusprechen" ) anstelle von cs könnte man auch p nehmen.
SendMessage kann mit /n umgehen da ich es an einer andere Stelle auch gemacht habe.
SendMessage ist von Bukkit bzw Spigot ja von haus aus drin^^
07/18/2016 15:07 .Scy#4
wenn du mehrere zeilen mit sendMessage ausgeben willst, dann musst du ein String-array reingeben.
also z.b.:
Code:
String[] = new String[5];
String[0] = "§cAdmin§8:";
String[1] = "Admin1";
...
cs.sendMessage(temp);
ansonsten musst du über eine ArrayList iterieren und halt pro eintrag in der ArrayList 1x sendMessage aufrufen.
07/18/2016 15:12 kleinkiiko#5
Wenn ich das über ein String mache kann ich dann einfach in der config z.b die namen eintragen udn diese werden dann untereinander angezeigt?
07/18/2016 15:22 .Scy#6
hier mal eine möglichkeit wie du aus einer datei ein String-array machst:
Code:
package de;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;

public class Users {
	public ArrayList<String> temp;
	
	public Users(){
		temp = new ArrayList<String>();
		temp.add("§cAdmin§8: ");
	}
	
	public void get(String req) {
		String line;
		try {
		if(req == null){
			return;
		}
		File file = new File(req);
		LineNumberReader reader = new LineNumberReader(new FileReader(file));
		
		while((line = reader.readLine())!= null){
			temp.add(line);
		}
		reader.close();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}
	}
	
	public void wrapper(){
		String[] users = new String[temp.size()];
		int counter = 0;
		for(String a : temp){
			users[counter] = a;
			counter++;
		}
		
	}
}
die ArrayList kannst du von überall erreichen und im wrapper ist der code um aus der ArrayList ein String-Array zu "zaubern".

dein aufruf würde also ungefähr so aussehen:
Code:
private Users asd = new Users();
asd.get("HIERDATEIPFAD EINGEBEN");
String[] users = new String[asd.temp.size()];
		int counter = 0;
		for(String a : asd.temp){
			users[counter] = a;
			counter++;
		}
cs.sendMessage(users);
es sollte so funktionieren.

Edit: ich hab's jetzt als eigene Class gemacht, müsstest also ne Users.class hinzufügen zu dem projekt oder du nimmst dir nur die methoden und packst das ganze einfach direkt über den cs.sendMessage aufruf.

edit2: hatte noch nen kleinen fehler drinnen
07/18/2016 15:26 kleinkiiko#7
Ok danke werde ich mir gleich mal anschauen :)
07/18/2016 16:27 0xFADED#8
Ich weiß nicht wie diese Admin-Liste als String bei dir aussieht.
Falls die Admins z.B. durch Kommas oder andere Zeichen getrennt sind, kannst du Lambda-Magie benutzen um die auszugeben.

Code:
import java.util.Arrays;

public class AdminList {
  public static void main(String[] args) {
     String admins = "0xfaded,.Scy,kleinkiiko";
    
     cs.sendMessage("Die Admins sind:");
     Arrays.stream(admins.split(",")).forEach(cs::sendMessage);
  }
}
07/18/2016 16:31 kleinkiiko#9
Würde halt gerne so haben das die Admins in einer Config datei stehen und dort ausgelesen werden . So das die dann Ingame Untereinander stehen so in etwa:

Unsere Admins:
0xfaded
Scy
kleinkiiko

So soll es aussehen.
07/18/2016 16:37 .Scy#10
Quote:
Originally Posted by kleinkiiko View Post
Würde halt gerne so haben das die Admins in einer Config datei stehen und dort ausgelesen werden . So das die dann Ingame Untereinander stehen so in etwa:

Unsere Admins:
0xfaded
Scy
kleinkiiko

So soll es aussehen.
genau das tut mein code

musst natürlich die datei auch genau so formatieren:
0xfaded
Scy
kleinkiiko
asd
qwe
eewq
...

mit meinem beispiel wird halt am anfang auch "§cAdmin§8: " als erstes ausgegeben, was das tut weiß ich nicht, aber bei dir stand dies am anfang.

wenn du die datei erstellen willst durch ingame-nachrichten(wie du an die nachricht selbst kommst musst du selbst gucken), geht das auch relativ einfach.
07/18/2016 16:51 kleinkiiko#11
Egal wo ich den unteren Code einfüge bekomme ich immer den Error:

Code:
Description	Resource	Path	Location	Type
Syntax error on token ";", { expected after this token	Users.java	/kAdmin/src/de/kleinkiko/kAdmin line 48	Java Problem
Syntax error on token ".", @ expected after this token	Users.java	/kAdmin/src/de/kleinkiko/kAdmin line 46	Java Problem
Syntax error, insert ")" to complete MethodDeclaration	Users.java	/kAdmin/src/de/kleinkiko/kAdmin line 46	Java Problem
Syntax error, insert "Identifier (" to complete MethodHeaderName	Users.java	/kAdmin/src/de/kleinkiko/kAdmin	line 46	Java Problem
Syntax error, insert "SimpleName" to complete QualifiedName	Users.java	/kAdmin/src/de/kleinkiko/kAdmin	line 46	Java Problem
Zeile 46:
Code:
asd.get("kAdmin.Admins");
Zeile 48:
Code:
int counter = 0;
Habe es grade in der Klasse Users drin wo auch der obere Code drin steht.
Pastebin der ganzen Klasse:
[Only registered and activated users can see links. Click Here To Register...]
07/18/2016 18:20 .Scy#12
so kannst du den code nicht ausführen.

dort wo du diese zeile eingefügt hattest:
Code:
cs.sendMessage("§cAdmin§8: " + this.plugin.getConfig().getString("Admins.Admin") + "\n ");
musst du folgendes hinschreiben anstelle von dem aufruf:
Code:
Users asd = new Users();
asd.get("HIERDATEIPFAD EINGEBEN");
String[] users = new String[asd.temp.size()];
		int counter = 0;
		for(String a : asd.temp){
			users[counter] = a;
			counter++;
		}
cs.sendMessage(users);
du kannst den code nicht einfach in die Users.class packen.

nachtrag:
falls du es in einer methode schreibst, dann musst du das private vor Users asd entfernen(siehe oben).
07/18/2016 19:25 kleinkiiko#13
Habe es jetzt so gemacht wie du gesagt hast. Der Obere Code ( Lange ) ist in der Users.class und der kleinere ist dort wo du gesagt hast.

Nun bekomme ich folgenden Fehler wenn ich den Befehl nutze:

Code:
[19:21:16] [Server thread/INFO]: kleinkiko issued server command: /alist
[19:21:16] [Server thread/WARN]: java.io.FileNotFoundException: kAdmin.Admin (Das System kann die angegebene Datei nicht finden)
[19:21:16] [Server thread/WARN]: 	at java.io.FileInputStream.open0(Native Method)
[19:21:16] [Server thread/WARN]: 	at java.io.FileInputStream.open(Unknown Source)
[19:21:16] [Server thread/WARN]: 	at java.io.FileInputStream.<init>(Unknown Source)
[19:21:16] [Server thread/WARN]: 	at java.io.FileReader.<init>(Unknown Source)
[19:21:16] [Server thread/WARN]: 	at de.kleinkiko.kAdmin.Users.get(Users.java:24)
[19:21:16] [Server thread/WARN]: 	at de.kleinkiko.kAdmin.alist.onCommand(alist.java:25)
[19:21:16] [Server thread/WARN]: 	at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[19:21:16] [Server thread/WARN]: 	at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[19:21:16] [Server thread/WARN]: 	at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchCommand(CraftServer.java:646)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.PlayerConnection.handleCommand(PlayerConnection.java:1351)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1186)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[19:21:16] [Server thread/WARN]: 	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[19:21:16] [Server thread/WARN]: 	at java.util.concurrent.FutureTask.run(Unknown Source)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:737)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:399)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:673)
[19:21:16] [Server thread/WARN]: 	at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:572)
[19:21:16] [Server thread/WARN]: 	at java.lang.Thread.run(Unknown Source)
Die Datei befindet sich eigentlich in dem Plugin Ordner dann in kAdmin und dort ist die Datei Admin bzw die Config
07/18/2016 19:32 .Scy#14
mit dem dateipfad ist so ne sache, ich weiß nicht wo die datei in der du den code untergebracht hast aus geführt wird, du könntest also einfach zu der datei Admin gehen und dir den dateipfad angucken, also den kompletten, unter windows würde es so aussehen:
c:\Users\Irgend\was\Plugin\kaAdmin\admin

unter einem unix system eher so:
/Plugin/kAdmin/admin

oder du nimmst den relativen pfad:
Plugin/kAdmin/admin

versuch einfach mal letzteres
07/18/2016 19:59 kleinkiiko#15
Mit dem Pfad ging es: plugins/kAdmin/config.yml

Vielen dank euch alle das ihr mit mir so viel geduld hattet^^

//EDIT:
Sobald ich den Server nun reloade wird die config überschrieben und dort steht nur der Standart drin den ich vorher in der Main klasse angegeben hab.

Habe ihn so angegeben in der Main klasse bei public void onEnable:

Code:
this.getConfig().addDefault("kAdmin.Admins", "kleinkiko");
	   this.getConfig().options().copyDefaults(true);
	   this.saveConfig();