GasGas

Mitglied
Nov. 2, 2017
11

Chat Component API

Ein kleines Tutorial wie man mit der Bungeecord Chat API Nachrichten baut und versendet.

Basics

KeybindComponent, SelectorComponent, ScoreComponent, TextComponent, und TranslatableComponent sind die verschieden Komponenten welche von der Bungeecord API uns zur Verfügung gestellt werden. Die einfachste Klassen ist die TextComponent. Alle die oben genannten Klassen sind Unterklassen des BaseComponent.

Ist die ein einfachste Art Nachrichten zu senden.

Um ein Textcomonent zu erstellen:
Java:
 TextComponent nachricht = new TextComponent("Hallo Nexuscube");
Wird angezeigt als "Hallo Nexuscube".

TranslatableComponent wird benutzt, um Nachrichten auf Client Side zu übersetzen. Das hat dem Vorteil das die Nachricht bei Jeden Spieler in seiner Sprache angezeigt wird, welche der Spieler in Minecraft eigestellt hat.

Java:
TranslatableComponent nachricht = new TranslatableComponent("disconnect.kicked");
p.spigot().sendMessage(nachricht);
Wird bei mir als "Wurde aus dem Spiel geworfen" angezeigt.

TODO: Blöke, items und Commands, eigentlich sollten alle TranslationKeys funktionieren, doch ich habe es nicht hinbekommen.

Der KeybindComponent wird benutzt, um dem Spieler zu zeigen welche taste er für welche Funktion gebindet hat.

Java:
KeybindComponent keybindKomponent = new KeybindComponent("key.drop");
p.spigot().sendMessage(keybindKomponent);
Wird bei mir als "q" angezeigt.

Alle möglichen Keybind könnt ihr im Interface Keybinds.java im Package package net.md_5.bungee.api.chatnachsehen.

Hier sind die wichtigsten Keybinds:
Java:
String JUMP = "key.jump";
String SNEAK = "key.sneak";
String SPRINT = "key.sprint";
String LEFT = "key.left";
String RIGHT = "key.right";
String BACK = "key.back";
String FORWARD = "key.forward";

TODO: Add ScoreComponent, SelectorComponent (keine Dokumentation gefunden)


Die Nachricht senden

Um die Nachricht an einen Spieler zu senden kann man folgenden benutzen:

Initialisieren des Komponenten:​

Java:
BaseComponent komponent = ...

Die Nachricht mittels Bungeecord senden:​

Java:
player.sendMessage(komponent);

Die Nachricht mittels Spigot senden:​

Java:
player.spigot().sendMessage(komponent);


Farbe und Styling

Die Nachrichten kann man mit Farbe und Styling ganz individuell gestalten. Styling Möglichkeiten sind: Bold, Italic, Underline, Strikethrough, Obfuscate, and Insertion.

Dazu ein einfaches Beispiel:


Java:
TextComponent nachricht = new TextComponent("Hello Nexuscube");
nachricht.setColor(net.md_5.bungee.api.ChatColor.GREEN);
nachricht.setBold(true);
Würde man diesen TextComponent einem Spieler zusenden würde er "Hallo Nexuscube" bekommen.


Events

Mit der Chat API kann man zwei verschiedene Events mit der Nachricht "mitsenden".
  • HoverEvent: Kann zusätzliche Informationen anzeigen
  • Clickevent: Wir ausgeführt, wenn man auf die Nachricht klickt

Das HoverEvent:

Java:
TextComponent nachricht = new TextComponent("Click me");
nachricht.setColor(ChatColor.BLUE);
nachricht.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("Das ist eine Hover Event")));
wird angezeigt als "Click me" (Wenn man mit der Maus drüber fährt, dann kommt "Das ist eine Hover Event").

Das ClickEvent:

Das ClickEvent kann in verschiedenen Formen angewendet werden, mittels verschiedenen Actions:

Java:
OPEN_URL, /*Öffnet eine URL*/
RUN_COMMAND, /*Ein Minecraft Command wird ausgeführt*/
SUGGEST_COMMAND, /*Ein Minecraft wird vorgeschlagen*/
CHANGE_PAGE, /*Die seite eines Offenen Buches wird gewechselt*/
COPY_TO_CLIPBOARD; /*Das angegebene Argument wird in die Zwischenablage kopiert*/
OPEN_FILE /*Kann nicht benutzt werden*/

Das am meisten verwendete Event ist das RUN_COMMAND Event:

Java:
TextComponent nachricht = new TextComponent("Click me");
nachricht.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/help"));

Bei Klicken wird der Befehlt /help ausgeführt.

Die ComponentBuilder API

Für den schnellen und simplen Zusammenbau von Nachrichten kann man die ComponentBuilder API benutzen. Der ComponentBuilder ist ein verkettbares Objekt.

Java:
player.sendMessage(new ComponentBuilder("Hallo ")
    .color(net.md_5.bungee.api.ChatColor.RED).bold(true).append("Nexuscube")
    .color(net.md_5.bungee.api.ChatColor.DARK_RED).append("!")
    .color(net.md_5.bungee.api.ChatColor.RED).create());

wird angezeigt als: "Hallo Nexuscube!"


Häufige Fehler

  • Das Erstellen einer direkten Instanz von BaseComponent funktioniert nicht (z. B. player.sendMessage(new BaseComponent(){};). Verwenden daher eine unter Basics genannten Komponenten.
  • Die Verwendung der alten Farbcodes mit Komponenten (zB player.sendMessage(new TextComponent(net.md_5.bungee.api.ChatColor.RED + ":-("));) kann clientseitige Probleme verursachen.
  • Führe die Legacy-Text Methode immer über TextComponent.fromLegacyText() aus.


Ich hoffe ich konnte euch einen guten Einblick in das Thema geben.
Jeder der etwas zu diesem Thema weiß oder ergänzen möchte ist aufgefordert das auch zu tun ^^.


 
Zuletzt bearbeitet:
  • Like
Reaktionen: Taminoful und petomka

petomka

Curator
Donator
Nov. 1, 2017
6
Hallo,

Ein guter Beitrag der den grundlegenden Umgang mit den Bungee-ChatComponents einfach erklärt. Ich habe aber ein paar Verbesserungsvorschläge (auch für künftige Beiträge), wie du die umsetzt ist natürlich dir überlassen:
  • Bitte entscheide dich in deinem Beitrag ob du deutsche oder (besser!) englische Variablennamen benutzt. Das hat natürlich keinen Einfluss auf den eigentlichen Inhalt, aber auf die Ästhetik :smile:
  • Bei verketteten Aufrufen die sich über mehrere Zeilen ziehen (wie bei Builder-Pattern üblich) sieht es auch besser formatiert aus, wenn die nachfolgenden Zeilen einmal weiter eingerückt sind.
  • Vermeide am besten (wenn nicht zur Vermeidung von Mehrdeutigkeiten) exakte ("fully qualified", FQ) Klassennamen. Das macht den Code meistens unübersichtlicher.
  • Beim Vorstellen eines Enums gerne auch direkt an der Stelle das zugehörige Enum verlinken.
Die Dokumentation zum SelectorComponent findest du übrigens ganz einfach, wenn du in den JavaDocs von BungeeCord-Chat selbst danach suchst. Am einfachsten findest du solche Klassen in den bekannten Subklassen der Basisklasse, in diesem fall BaseComponent, die du ja bereits vorgestellt hast.

Für Paper gilt diese Variante für ChatComponents übrigens nicht (mehr), obwohl sie da natürlich auch noch funktioniert. Dort gibt es eine neuere Version der Components (Adventure: Adventure — Adventure 4.7.0 documentation (kyori.net)). Diese funktionieren im Prinzip recht ähnlich, es gibt aber ein paar Unterschiede, ggf. stelle ich diese in einem eigenem Beitrag vor. Theoretisch kann man Kyori auch mit Spigot verwenden, ist aber etwas umständlicher.

Gruß,
petomka
 
  • Like
Reaktionen: GasGas und Taminoful

GasGas

Mitglied
Nov. 2, 2017
11
Danke für deine konstruktiven Verbesserungsvorschläge,

ich habe den Beitrag dadurch nochmals überarbeiten. 😀

Auf den JavaDoc zu den ScoreComponent und SelectorComponent bin ich bei meiner Recherche zu diesen Thema gestoßen, doch bei meinen Tests hab ich keinen Output bekommen. Vielleicht weiß du wie man diese Korrekt verwendet?

Ich habe auch keine Erklärung zum TranslatableComponent, wieso bei mir hier in der Testphase nicht alle TranslationKeys einwandfrei funktioniert haben.

Java:
TranslatableComponent component = new TranslatableComponent("item.shovelIron.name");
p.spigot().sendMessage(component);

Bei mir wird dort nur "item.shovelIron.name" ausgegeben.


lg
 

petomka

Curator
Donator
Nov. 1, 2017
6
Hallo,

Ich habe das mit dem SelectorComponent aus deinem TODO so verstanden, als ob du das im JavaDoc nicht gefunden hättest. Verwendung hatte ich für die beiden bisher noch nicht, daher kann ich dir da nichts zu sagen.

Soweit mir bekannt ist benötigen die TranslatableComponents die Werte der NamespacedKeys. Für ein Item kannst du dafür den Key des dazugehörigen Materials mit Material#getKey verwenden. Die Methode toString() sollte dir dabei den für den Konstruktor des Components notwendigen Key liefern.
Sollte das nicht funktionieren, kannst du mal einen Language-Key aus der Liste hier ausprobieren: Minecraft language codes (unlocalized names)

Gruß,
petomka
 
  • Like
Reaktionen: GasGas

Users who are viewing this thema