Bukkit/Spigot & Bungee Plugin Channel

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • Hier wird erklärt, wie man den Pluginchannel mit BungeeCord benutzt. Dieser Channel erlaubt es, zwischen Bukkit/Spigot und BungeeCord sowie zwischen mehreren Bukkit/Spigot Instanzen hinweg zu kommunizieren.
    Bitte beachte, dass dieser Thread nur für die Kommunikation zwischen Bukkit/Spigot<->Bungee ist (bzw. Bukkit/Spigot<->Bukkit/Spigot).





    Inhalt

    Was ist eine Plugin Message?

    Was ist der BungeeCord Plugin Channel?

    BungeeCord’s SubChannel Informationen

    • Connect
    • ConnectOther
    • IP
    • PlayerCount
    • PlayerList
    • GetServers
    • Message
    • GetServer
    • Forward
    Antworten vom BungeeCord-Server verarbeiten


    Was ist eine Plugin Message?
    Ursprünglich wurde das System von Mojang entwickelt, damit Serverplugins
    Informationen zu Clientmods senden kann. Davor hätten die Entwickler
    zusätzliche Packets definieren müssen, was allerdings durch den damit
    inkompatiblen Minecraft Client nicht möglich war. Als Lösung dafür wurde
    das "CustemMessagePacket" implementiert.

    Das Gerüst einer Plugin Message sieht so aus:
    1) Der Name des "channels" (in BungeeCord "tag")
    2) Die Größe der Nachricht (short)
    3) Die Nachricht (byte array)

    Was ist der BungeeCord Plugin Channel?
    Zuerst die Information: BungeeCords Nachrichten werden mit Data(In/Out)putStreams organisiert.

    Bevor man den Plugin Channel nutzt, muss man ihn "anmelden" ("Hey
    Bungee, ich möcht diesen Channel nutzen!"). Zusätzlich muss Bukkit
    gesagt werden, in welcher Methode eingegangene Nachrichten gemeldet
    werden sollen. Das könnte dann inetwa so aussehen:

    Java-Quellcode

    1. public class MainClass extends JavaPlugin implements PluginMessageListener {
    2. @Override
    3. public void onEnable() {
    4. this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
    5. this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
    6. }
    7. public static String serverName; // Beispiel: GetServer Subchannel
    8. @Override
    9. public void onBungeeMessageReceived(String channel, Player player, byte[] message) {
    10. if (!channel.equals("BungeeCord")) {
    11. return;
    12. }
    13. DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
    14. String subchannel = in.readUTF();
    15. if (subchannel.equals("SomeSubChannel")) {
    16. // Codebeispiel unten
    17. } else if (subchannel.equals("SomeOtherSubChannel")) {
    18. // Anderer Subchannel
    19. } else if (subchannel.equals("GetServer")) {
    20. // Beispiel: GetServer subchannel
    21. serverName = in.readUTF();
    22. }
    23. }
    24. }
    Alles anzeigen
    Das senden von Plugin Messages erfolgt so:

    Java-Quellcode

    1. ByteArrayOutputStream b = new ByteArrayOutputStream();
    2. DataOutputStream out = new DataOutputStream(b);
    3. out.writeUTF("subchannel");
    4. out.writeUTF("AnArgument");
    5. Player p = Bukkit.getPlayer("player");
    6. p.sendPluginMessage(plugin, "BungeeCord", b.toByteArray());

    BungeeCord's SubChannel Informationen
    Connect
    Verbindet einen Spieler zu dem angegebendem Server

    Argumente
    Name des Servers zu dem der Spieler verbunden werden soll

    Beispiel

    Java-Quellcode

    1. out.writeUTF("Connect");
    2. out.writeUTF("pvp");
    In diesem Falle würde der Spieler zu dem Server "pvp" verbunden

    ConnectOther
    Verbindet einen anderen Spieler zu dem angegebenem Server

    Argumente
    Name des Spielers der zu dem angegebenem Server verbunden werden soll
    Name des Server zu dem der angegebene Spieler verbunden werden soll

    Beispiel

    Java-Quellcode

    1. out.writeUTF("ConnectOther");
    2. out.writeUTF("roblabla");
    3. out.writeUTF("pvp");
    In diesem falle würde der Spieler "roblabla" zu dem Server "pvp" verbinden

    IP
    Gibt dir die IP eines Spielers zurück

    Argumente
    Keine

    Empfänger
    Der Spieler dessen IP du haben willst

    Beispiel

    Java-Quellcode

    1. out.writeUTF("IP");
    Antwort

    Java-Quellcode

    1. String ip = in.readUTF();
    2. int port = in.readInt();

    PlayerCount
    Gibt die Anzahl aller Spieler oder die Anzahl der Spieler auf einem Server zurück

    Argumente
    Der name des Servers oder "ALL" für die gesamte Anzahl

    Beispiel

    Java-Quellcode

    1. out.writeUTF("PlayerCount");
    2. out.writeUTF("pvp");
    PlayerList
    Gibt eine Spielerliste von einem bestimmtem Server oder die aller zurück

    Argumente
    Der Servername oder "ALL" für eine Globale Liste

    Beispiel

    Java-Quellcode

    1. out.writeUTF("PlayerList");
    2. out.writeUTF("pvp");
    Antwort

    Java-Quellcode

    1. String server = in.readUTF(); // Name des Servers, gleich wie in den Argumenten
    2. String[] playerList = in.readUTF().split(", ");

    GetServers

    Gibt eine Liste an eingetragenen Servern zurück

    Beispiel

    Java-Quellcode

    1. out.writeUTF("GetServers");
    Antwort

    Java-Quellcode

    1. String[] serverList = in.readUTF().split(", ");

    Message
    Sendet eine Chatnachricht an einen Spieler

    Argumente
    Der Name des Spielers.
    Die Nachricht zum senden.

    Beispiel

    Java-Quellcode

    1. out.writeUTF("Message");
    2. out.writeUTF("roblabla");
    3. out.writeUTF(ChatColor.RED + "Glückwunsch, du hast gerade 1€ gewonnen!");

    GetServer
    Gibt den eigenen Servernamen zurück, wie er in der config.yml definiert ist

    Beispiel

    Java-Quellcode

    1. out.writeUTF("GetServer");
    Antwort

    Java-Quellcode

    1. String servername = in.readUTF();

    Forward
    Sendet eine Plugin Message zu einem Server.

    Argumente
    Server als Ziel, oder "ALL" für alle Server.
    Den Subchannel in dem gesendet werden soll.
    Die Größe des Plugin Message Arrays (short)
    Ein byte Array mit der Nachricht

    Beispiel

    Java-Quellcode

    1. out.writeUTF("Forward");
    2. out.writeUTF("ALL");
    3. out.writeUTF("MyChannel"); // Subchannel
    4. ByteArrayOutputStream msgbytes = new ByteArrayOutputStream();
    5. DataOutputStream msgout = new DataOutputStream(msgbytes);
    6. msgout.writeUTF("Some kind of data here"); // Deine Pluginnachricht
    7. msgout.writeShort(123);
    8. out.writeShort(msgbytes.toByteArray().length);
    9. out.write(msgbytes.toByteArray());
    Antwort

    Java-Quellcode

    1. String subChannel = in.readUTF();
    2. short len = in.readShort();
    3. byte[] msgbytes = new byte[len];
    4. in.readFully(msgbytes);
    5. DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes));
    6. String somedata = msgin.readUTF(); // Lese die Informationen genauso wie du sie geschrieben hast
    7. short somenumber = msgin.readShort();

    Antworten vom BungeeCord-Server verarbeiten
    Achtung: hierfür muss auf dem Target-Server sein Spieler online sein

    Hier erkläre ich wie du die Antworten vom Bungee verarbeiten kannnst
    In meinem fall möchte ich die Spieleranzahl vom Server "lobby" abfragen
    dafür müssen wir erstmal eine Message an den Bungee senden.

    Um eine BungeeCord Nachricht senden zu können und auch welche vom BungeeCord
    erhalten zu können regestrieren wir unser Plugin einmal am BungeeCord in der onEnable()
    von unserem Plugin

    Java-Quellcode

    1. this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
    2. this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new MessageListener(this));

    So nun Brauchen wir unsere MessageListener Klasse die ich oben schon übergen habe.

    Java-Quellcode: MessageListener

    1. public class MessageListener implements PluginMessageListener {
    2. private MainClass plugin;
    3. public MessageListener(MainClass plugin) {
    4. this.plugin = plugin;
    5. }
    6. @Override
    7. public void onPluginMessageReceived(String channel, Player player, byte[] data) {
    8. if (!channel.equals("BungeeCord")) {
    9. return;
    10. }
    11. DataInputStream di = new DataInputStream(new ByteArrayInputStream(data));
    12. }
    13. }
    Alles anzeigen
    Dort arbeiten wir gleich weiter!

    Schauen wir uns erstmal an wie wir unsere Message senden
    dazu oben einmal unter PlayerCount nachsehen wie wir die Nachricht senden müssen.

    Also schicken wir unsere Nachricht ab.

    Java-Quellcode

    1. ByteArrayOutputStream b = new ByteArrayOutputStream();
    2. DataOutputStream out = new DataOutputStream(b);
    3. try {
    4. out.writeUTF("PlayerCount");
    5. out.writeUTF("lobby");
    6. } catch (IOException e) {
    7. e.printStackTrace();
    8. }
    9. p.sendPluginMessage(this, "BungeeCord", b.toByteArray());

    Jetzt schauen wir dort einmal unter Antwort dort steht diese Zeile

    Java-Quellcode

    1. String server = in.readUTF(); // Name des Servers, so wie in den Argumenten
    2. int playercount = in.readInt(); // Spieleranzahl
    Somit wissen wir wie unsere Nachricht bei uns im MessageListener ankommt
    und können diese verarbeiten.

    Dazu fügen wir diesen Code in die onPluginMessageReceived Methode

    Java-Quellcode: MessageListener

    1. ....
    2. try {
    3. String sub = di.readUTF();
    4. if (sub.equalsIgnoreCase("PlayerCount")) {
    5. player.sendMessage(di.readUTF() + " " + di.readInt());
    6. }
    7. } catch (IOException e) {
    8. e.printStackTrace();
    9. }
    Somit überprüfen wir ob die Message die dort ankommt im richtigen SubChannel ist wie angefragt
    und senden dann dem Player der die Message geschickt hat die Message mit dem Servernamen und der Spieleranzahl.

    Bei mir hat es ca 3 Ticks gedauert bis der Bukkit/Spigot Server eine Antwort vom BungeeCord bekommen hat
    allerdings kann dieser Wert sehr schwankend sein.

    Falls noch irgendwo sich Fehler eingeschlichen haben, könnt ihr mir jederzeit bescheid geben.
    Für Fragen und Verbesserungsvorschläge habe ich immer ein Ohr offen.

    Quellen: spigotmc.org

    832 mal gelesen

Kommentare 5

  • adagi. -

    Vielen Dank! ;)

  • Gamerstyle -

    Was mich jetzt noch interessieren würde wäre wie man die Antworten die der Bungeecord sendet lesen kann um dann auch damit arbeiten zu können? Weil so wie du es jetzt gemacht hast steht es auch fast identisch auf spigotmc.org

    • Semikolon -

      Danke für deine Rückmeldung ich werde das die Tage noch hinzufügen

    • FluuxyTv -

      Das mit dem Antworten ist allerdings auch schon in der SpigotMC-Wiki erklärt.

    • Semikolon -

      Ich habe das ganze mit dem verarbeiten der Antwort hinzugefügt