Bukkit & Bungee Plugin Channel

Sep 12, 2017
Bukkit & Bungee Plugin Channel
  • Bitte beachte, dass dieser Thread nur für Kommunikation Bukkit<->Bungee ist (bzw. Bukkit<->Bukkit)


    Hier wird nun erklärt, wie man den Pluginchannel mit BungeeCord benutzt. Dieser Channel erlaubt es, zwischen Bukkit und BungeeCord sowie zwischen mehreren Bukkit Instanzen hinweg zu kommunizieren.


    Was ist eine Plugin Message?(top)

    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)

    (Plugin Message Packet Description)


    BungeeCord Plugin Channel?(top)

    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:

    Code (Java):
    public class MyPlugin extends JavaPlugin implements PluginMessageListener {
        @Override
        public void onEnable() {
            this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
            this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
        }
     
        public static String serverName; // Beispiel: GetServer Subchannel
     
        @Override
        public void onBungeeMessageReceived(String channel, Player player, byte[] message) {
            if (!channel.equals("BungeeCord")) {
                return;
            }
     
            DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
            String subchannel = in.readUTF();
            if (subchannel.equals("SomeSubChannel")) {
                // Codebeispiel unten
            } else if (subchannel.equals("SomeOtherSubChannel")) {
                // Anderer Subchannel
            } else if (subchannel.equals("GetServer")) {
                // Beispiel: GetServer subchannel
                serverName = in.readUTF();
            }
        }
    }
    Das Senden von Plugin Messages erfolgt so:
    Code (Java):
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(b);
     
    out.writeUTF("subchannel");
    out.writeUTF("AnArgument");
     
     
    // Wenn der Spieler wichtig ist:
    Player p = Bukkit.getPlayer("someplayer");
    // Irgendein Spieler
    Player p = Bukkit.getOnlinePlayers()[0];
     
    p.sendPluginMessage(plugin, "BungeeCord", b.toByteArray());

    BungeeCord's SubChannel Informationen :(top)

    Connect(top)

    Verbindet einen Spieler zu dem spezifiziertem Server.

    Argumente
    Name des Servers zu dem verbunden werden soll.

    Empfänger
    Den Spieler den du verschieben willst

    Beispiel
    Code (Java):
    out.writeUTF("Connect");
    out.writeUTF("pvp");
    Antwort
    Keine


    ConnectOther(top)

    Verbindet einen anderen Spieler zu einem bestimmtem Server

    Argumente

    Name des Spielers
    Name des Servers

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("ConnectOther");
    out.writeUTF("roblabla");
    out.writeUTF("pvp");
    Antwort
    Keine


    IP(top)

    Gibt dir reale IP eines Spielers zurück.

    Argumente
    Keine

    Empfänger
    Der Spieler dessen IP du haben willst

    Beispiel
    Code (Java):
    out.writeUTF("IP");
    Antwort
    Code (Java):
    String ip = in.readUTF();
    int port = in.readInt();

    PlayerCount(top)

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

    Argumente
    Der Name des Server oder "ALL" für alle.

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("PlayerCount");
    out.writeUTF("pvp");
    Antwort
    Code (Java):
    String server = in.readUTF(); // Name des Servers, so wie in den Argumenten
    int playercount = in.readInt();

    PlayerList(top)

    Gibt eine Spielerliste von einem bestimmtem Server oder die aller Server zurück.

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

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("PlayerList");
    out.writeUTF("pvp");
    Response
    Code (Java):
    String server = in.readUTF(); // Name des Servers, gleich wie in den Argumenten
    String[] playerList = in.readUTF().split(", ");

    GetServers(top)

    Gibt eine Liste an eingetragenen Servern zurück (config.yml)

    Argumente
    Keine

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("GetServers");
    Antwort
    Code (Java):
    String[] serverList = in.readUTF().split(", ");

    Message(top)

    Sendet eine Chatnachricht an einen Spieler

    Argumente
    Der Name des Spielers.
    Die Nachricht zum Senden.

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("Message");
    out.writeUTF("roblabla");
    out.writeUTF(ChatColor.RED + "Glückwunsch, du hast gerade 1€ gewonnen!");
    Antwort
    Keine


    GetServer(top)

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

    Argumente
    Keine

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("GetServer");
    Antwort
    Code (Java):
    String servername = in.readUTF();

    Forward(top)

    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.

    Empfänger
    Egal

    Beispiel
    Code (Java):
    out.writeUTF("Forward");
    out.writeUTF("ALL");
    out.writeUTF("MyChannel"); // Subchannel
     
    ByteArrayOutputStream msgbytes = new ByteArrayOutputStream();
    DataOutputStream msgout = new DataOutputStream(msgbytes);
    msgout.writeUTF("Some kind of data here"); // Deine Pluginnachricht
    msgout.writeShort(123);
     
    out.writeShort(msgbytes.toByteArray().length);
    out.write(msgbytes.toByteArray());
    Antwort
    Code (Java):
    String subChannel = in.readUTF();
    short len = in.readShort();
    byte[] msgbytes = new byte[len];
    in.readFully(msgbytes);
     
    DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes));
    String somedata = msgin.readUTF(); // Lese die Informationen genauso wie du sie geschrieben hast
    short somenumber = msgin.readShort();
  • Loading...
  • Loading...