• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

PlugIn AsyncPlayerChatEvent Formatierungsfehler

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Einen wunderschönen,

Ich habe in meinen Plugin ein AsyncPlayerChatEvent definiert, um einen Lokalen Chat im Umkreis von 15 Blöcken zu haben.
Dabei ist eine HoverMessage eingebaut um den RP Namen des Spielers anzuzeigen.
Funktioniert soweit, allerdings wird ab der zweiten Zeile die Formatierung entfernt und die Message in §f und nicht mehr in §7 angezeigt.

Java:
TextComponent MSG = new TextComponent();
MSG.setText(PlayerAPI.getRangColor(p) + PlayerAPI.getRangPrefix(p) + " §8× §7" + p.getName() + " §7sagt §8» §7" + message);
MSG.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(PlayerAPI.getRangColor(p) + p.getName() + " §8× §3" + PlayerAPI.getRPName(p)).create()));
near.spigot().sendMessage(MSG);

Screenshot_2.png


Ich hoffe ich finde hier Hilfe. Danke im Vorraus! :)
 

LoganBwDE

Miner
Registriert
26 November 2014
Beiträge
192
Diamanten
315
Minecraft
LoganBwDE
Hallöle,

schon versucht dies über mehrere TextComponents zu lösen?

Code:
TextComponent mainMsg = new TextComponent();
//Hier dein Content

TextComponent msgContent = new TextComponent();
world.setColor( net.md_5.bungee.api.ChatColor.DARK_RED ); //Deine bevorzugte Farbe
//Hier dein Content

mainMsg.addExtra(mainMsg);
 

Scrayos

Vorarbeiter
Registriert
11 Februar 2012
Beiträge
296
Alter
29
Diamanten
338
Minecraft
Scrayos
Das ChatComponent-System von BungeeCord (das Spigot ebenfalls benutzt) wird einfach nicht mit Legacy-Color-Codes (§2, §l, etc.) verwendet. Genau um von diesen willkürlichen Codes weg zu kommen, wurde der JSON-basierte Chat ja von Mojang eingeführt.

Am elegantesten ließe sich dein Problem hier mit einem ComponentBuilder lösen, den hast du ja auch schon korrekterweise für die Hover-Message verwendet, dort aber ebenfalls mit den Legacy-Color-Codes. Du musst dafür allerdings deine Methode PlayerAPI#getRangColor(Player) insoweit abändern, dass sie keinen String mehr zurückgibt, sondern eine ChatColor, falls sie das nicht bereits tut. Anschließend wäre der Code wie folgt:

Java:
        BaseComponent[] hoverMsg = new ComponentBuilder()
            .append(p.getName()).color(PlayerAPI.getRangColor(p))
            .append(" × ").color(ChatColor.DARK_GRAY)
            .append(PlayerAPI.getRPName(p)).color(ChatColor.DARK_AQUA)

        BaseComponent[] mainMsg = new ComponentBuilder()
            .append(PlayerAPI.getRangPrefix(p)).color(PlayerAPI.getRangColor(p))
            .append(" × ").color(ChatColor.DARK_GRAY)
            .append(p.getName()).color(ChatColor.GRAY).event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverMsg))
            .append(" sagt ", ComponentBuilder.FormatRetention.NONE).color(ChatColor.GRAY)
            .append("» ").color(ChatColor.DARK_GRAY)
            .append(message).color(ChatColor.GRAY)
            .create();

        near.spigot().sendMessage(MSG);

Diese Schreibweise mit dem leeren Konstruktor für new ComponentBuilder() bevorzuge ich aus Gründen der Übersichtlichkeit und weil ich lieber alle Teile der Nachricht auf gleicher Ebene habe. Da der leere Konstruktor aber erst mit Minecraft 1.15 (oder 1.14?) hinzugefügt wurde, kann es sein, dass dir diese Schreibweise nicht zur Verfügung steht. In diesem Fall müsstest du einfach das Parameter des jeweils ersten Append-Aufrufs in den Konstruktor schreiben, und diesen Append entsprechend entfernen.

Wie bei dem Code recht anschaulich zu erkennen ist, werden hier mehrere Komponenten aneinander gehängt und mit Formatierungen versehen. Die Formatierungen wirken sich normalerweise auch auf alle nachfolgenden Komponenten aus; werden also still vererbt. Da ich aber mal davon ausgegangen bin, dass du den Hover-Text nur auf dem Spielernamen haben möchtest, muss dieses Verhalten anuliert werden. Das geht entweder durch #event((HoverEvent) null) auf das Folge-Element oder eben wie gezeigt durch einen Append mit ComponentBuilder.FormatRetention.NONE.

Mehr Informationen zu dem ChatComponent-System kannst du übrigens in dem entsprechenden Wiki-Artikel auf SpigotMC finden: https://www.spigotmc.org/wiki/the-chat-component-api/


EDIT: Huch, ich habe erst gerade gemerkt, dass das Thema schon etwas älter ist. Aber vielleicht hilft es ja einmal jemand anderem weiter, MCSEU ist ja gut über die einschlägigen Suchmaschinen zu finden und es wird sicherlich noch einmal jemand dieses Problem haben. :)
 
Oben