diff --git a/Core/pom.xml b/Core/pom.xml index 16b72fd..6a5becc 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -13,6 +13,13 @@ jar PandaLib-Core + + + + sonatype-oss-snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + @@ -21,6 +28,19 @@ ${bungeecord.version} compile + + + net.kyori + adventure-api + 4.7.0 + + + net.kyori + adventure-platform-bungeecord + 4.0.0-SNAPSHOT + + + io.github.classgraph classgraph diff --git a/Core/src/main/java/fr/pandacube/lib/core/chat/Chat.java b/Core/src/main/java/fr/pandacube/lib/core/chat/Chat.java index 8d91f41..e3c13a8 100644 --- a/Core/src/main/java/fr/pandacube/lib/core/chat/Chat.java +++ b/Core/src/main/java/fr/pandacube/lib/core/chat/Chat.java @@ -1,39 +1,53 @@ package fr.pandacube.lib.core.chat; import java.awt.Color; -import java.util.UUID; +import java.util.Objects; import java.util.function.Supplier; +import java.util.function.UnaryOperator; +import org.checkerframework.checker.nullness.qual.NonNull; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.event.HoverEventSource; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.format.TextDecoration.State; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.ItemTag; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Entity; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; -public abstract class Chat extends ChatStatic { +public abstract class Chat extends ChatStatic implements HoverEventSource, ComponentLike { - protected BaseComponent component; + protected Component component; protected boolean console = false; - public Chat(BaseComponent c) { + public Chat(Component c) { + Objects.requireNonNull(c, "Provided component must not be null"); component = c; } public BaseComponent get() { + return toBungee(component); + } + + + public Component getAdv() { return component; } public BaseComponent[] getAsArray() { - return new BaseComponent[] { component }; + return toBungeeArray(component); } public String getLegacyText() { - return component.toLegacyText(); + return LegacyComponentSerializer.legacySection().serializeOr(component, ""); } @@ -41,30 +55,30 @@ public abstract class Chat extends ChatStatic { + public Chat then(BaseComponent subComponent) { - // here are some optimizations to avoid unnecessary component nesting - if (subComponent instanceof TextComponent) { - TextComponent txtComp = (TextComponent) subComponent; - if (!txtComp.hasFormatting() && (txtComp.getText() == null || txtComp.getText().isEmpty())) { + return then(toAdventure(subComponent)); + } + public Chat then(Chat comp) { + return then(comp.getAdv()); + } + public Chat then(BaseComponent[] components) { + return then(toAdventure(components)); + } + public Chat then(Component comp) { + if (comp instanceof TextComponent) { + TextComponent txtComp = (TextComponent) comp; + if (!txtComp.hasStyling() && (txtComp.content() == null || txtComp.content().isEmpty())) { // no need to add the provided component to the current component. // but eventual child component must be added - if (txtComp.getExtra() != null) { - for (BaseComponent child : txtComp.getExtra()) + if (txtComp.children() != null && !txtComp.children().isEmpty()) { + for (Component child : txtComp.children()) then(child); } return this; } } - component.addExtra(subComponent); - return this; - } - public Chat then(Chat comp) { return then(comp.get()); } - public Chat then(BaseComponent[] components) { - if (components != null) { - for (BaseComponent c : components) { - then(c); - } - } + component.append(comp); return this; } @@ -82,7 +96,7 @@ public abstract class Chat extends ChatStatic { public Chat thenPlayerName(String legacyText) { return then(playerNameText(legacyText)); } - public Chat thenNewLine() { return thenText("\n"); } + public Chat thenNewLine() { return then(Component.newline()); } public Chat thenLegacyText(Object legacyText) { return then(legacyText(legacyText)); } @@ -90,7 +104,7 @@ public abstract class Chat extends ChatStatic { public Chat thenKeyBind(String key) { return then(keybind(key)); } - public Chat thenScore(String name, String objective, String value) { return then(score(name, objective, value)); } + public Chat thenScore(String name, String objective) { return then(score(name, objective)); } @@ -191,13 +205,14 @@ public abstract class Chat extends ChatStatic { public static class FormatableChat extends Chat { - public FormatableChat(BaseComponent c) { + public FormatableChat(Component c) { super(c); } public FormatableChat console(boolean c) { console = c; return this; } - - public FormatableChat color(ChatColor c) { component.setColor(c); return this; } + + public FormatableChat color(TextColor c) { component.color(c); return this; } + public FormatableChat color(ChatColor c) { return color(TextColor.color(c.getColor().getRGB())); } public FormatableChat color(Color c) { return color(ChatColor.of(c)); } public FormatableChat color(String c) { return color(ChatColor.of(c)); } @@ -224,63 +239,52 @@ public abstract class Chat extends ChatStatic { public FormatableChat dataColor() { return color(config.dataColor); } public FormatableChat decorationColor() { return color(config.decorationColor); } - public FormatableChat font(String f) { component.setFont(f); return this; } + private FormatableChat setStyle(UnaryOperator