From 327558c0035139aff66f98f41b87e30fb1bd2ad2 Mon Sep 17 00:00:00 2001 From: Kieran Wallbanks Date: Wed, 10 Mar 2021 16:13:27 +0000 Subject: [PATCH] begin bringing packets back to use components --- .../server/advancements/Advancement.java | 5 +- .../notifications/NotificationCenter.java | 6 +- .../adventure/AdventurePacketConvertor.java | 5 - .../server/adventure/BossBarManager.java | 36 +++- .../server/adventure/Localizable.java | 10 ++ .../adventure/LocalizablePacketSender.java | 158 ++++++++++++++++++ .../adventure/SerializationManager.java | 132 ++++++--------- .../net/minestom/server/bossbar/BarColor.java | 6 +- .../minestom/server/bossbar/BarDivision.java | 6 +- .../net/minestom/server/bossbar/BossBar.java | 10 +- .../net/minestom/server/entity/Player.java | 30 ++-- .../server/item/metadata/WrittenBookMeta.java | 12 +- .../server/network/ConnectionManager.java | 17 +- .../client/handshake/HandshakePacket.java | 4 +- .../login/LoginPluginResponsePacket.java | 2 +- .../packet/client/login/LoginStartPacket.java | 4 +- .../server/login/LoginDisconnectPacket.java | 11 +- .../server/play/AdvancementsPacket.java | 19 +-- .../packet/server/play/BossBarPacket.java | 37 ++-- .../packet/server/play/ChatMessagePacket.java | 19 +-- .../packet/server/play/CombatEventPacket.java | 13 +- .../packet/server/play/DisconnectPacket.java | 18 +- .../packet/server/play/MapDataPacket.java | 14 +- .../packet/server/play/PlayerInfoPacket.java | 27 +-- .../play/PlayerListHeaderAndFooterPacket.java | 27 +-- .../play/ScoreboardObjectivePacket.java | 12 +- .../packet/server/play/TabCompletePacket.java | 11 +- .../packet/server/play/TeamsPacket.java | 34 +--- .../packet/server/play/TitlePacket.java | 14 +- .../server/scoreboard/Scoreboard.java | 3 +- .../net/minestom/server/scoreboard/Team.java | 12 +- .../server/utils/binary/BinaryWriter.java | 10 ++ 32 files changed, 399 insertions(+), 325 deletions(-) create mode 100644 src/main/java/net/minestom/server/adventure/LocalizablePacketSender.java diff --git a/src/main/java/net/minestom/server/advancements/Advancement.java b/src/main/java/net/minestom/server/advancements/Advancement.java index 9b10a074c..d16c1a449 100644 --- a/src/main/java/net/minestom/server/advancements/Advancement.java +++ b/src/main/java/net/minestom/server/advancements/Advancement.java @@ -1,7 +1,6 @@ package net.minestom.server.advancements; import net.kyori.adventure.text.Component; -import net.minestom.server.MinecraftServer; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; import net.minestom.server.item.ItemStack; @@ -375,8 +374,8 @@ public class Advancement { AdvancementsPacket.DisplayData displayData = new AdvancementsPacket.DisplayData(); displayData.x = x; displayData.y = y; - displayData.title = MinecraftServer.getSerializationManager().serialize(title); - displayData.description = MinecraftServer.getSerializationManager().serialize(description); + displayData.title = title; + displayData.description = description; displayData.icon = icon; displayData.frameType = frameType; displayData.flags = getFlags(); diff --git a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java b/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java index 836221493..57f597d3d 100644 --- a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java +++ b/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java @@ -1,6 +1,6 @@ package net.minestom.server.advancements.notifications; -import net.minestom.server.MinecraftServer; +import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; import net.minestom.server.network.packet.server.play.AdvancementsPacket; import net.minestom.server.network.player.PlayerConnection; @@ -82,9 +82,9 @@ public class NotificationCenter { // Setup display data for the advancement AdvancementsPacket.DisplayData displayData = new AdvancementsPacket.DisplayData(); { - displayData.title = MinecraftServer.getSerializationManager().serialize(notification.getTitle()); + displayData.title = notification.getTitle(); // Description is required, but never shown/seen so, small Easter egg. - displayData.description = "Articdive was here. #Minestom"; + displayData.description = Component.text("Articdive was here. #Minestom"); displayData.icon = notification.getIcon(); displayData.frameType = notification.getFrameType(); displayData.flags = 0x6; diff --git a/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java b/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java index 8377ab9be..24cf7c819 100644 --- a/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java +++ b/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java @@ -2,15 +2,10 @@ package net.minestom.server.adventure; import net.kyori.adventure.audience.MessageType; import net.kyori.adventure.bossbar.BossBar; -import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.Arrays; import java.util.Collection; -import java.util.Map; -import java.util.stream.Collectors; /** * Utility methods to convert adventure enums to their packet values. diff --git a/src/main/java/net/minestom/server/adventure/BossBarManager.java b/src/main/java/net/minestom/server/adventure/BossBarManager.java index 8a1c780e2..a1574b2bc 100644 --- a/src/main/java/net/minestom/server/adventure/BossBarManager.java +++ b/src/main/java/net/minestom/server/adventure/BossBarManager.java @@ -47,7 +47,10 @@ public class BossBarManager implements BossBar.Listener { Holder holder = this.getOrCreateHandler(bar); if (holder.players.add(player.getUuid())) { - player.getPlayerConnection().sendPacket(holder.createAddPacket()); + BossBarPacket packet = holder.createAddPacket(); + packet.title = MinecraftServer.getSerializationManager().prepare(packet.title, player); + + player.getPlayerConnection().sendPacket(packet); } } /** @@ -105,12 +108,27 @@ public class BossBarManager implements BossBar.Listener { private void updatePlayers(BossBarPacket packet, Set players) { Iterator iterator = players.iterator(); + // check if we need to translate the bossbar + Component rawTitle = packet.title; + boolean translate = false; + if (packet.action == UPDATE_TITLE || packet.action == ADD) { + Component rootTitle = MinecraftServer.getSerializationManager().prepare(rawTitle, MinecraftServer.getSerializationManager().getDefaultLocale()); + + if (!rawTitle.equals(rootTitle)) { + translate = true; + } + } + while (iterator.hasNext()) { Player player = MinecraftServer.getConnectionManager().getPlayer(iterator.next()); if (player == null) { iterator.remove(); } else { + if (translate) { + packet.title = MinecraftServer.getSerializationManager().prepare(rawTitle, player); + } + player.getPlayerConnection().sendPacket(packet); } } @@ -165,9 +183,9 @@ public class BossBarManager implements BossBar.Listener { @NotNull BossBarPacket createAddPacket() { return this.createGenericPacket(ADD, packet -> { - packet.title = MinecraftServer.getSerializationManager().serialize(bar.name()); - packet.color = AdventurePacketConvertor.getBossBarColorValue(bar.color()); - packet.division = AdventurePacketConvertor.getBossBarOverlayValue(bar.overlay()); + packet.title = bar.name(); + packet.color = bar.color(); + packet.overlay = bar.overlay(); packet.health = bar.progress(); packet.flags = AdventurePacketConvertor.getBossBarFlagValue(bar.flags()); }); @@ -179,13 +197,13 @@ public class BossBarManager implements BossBar.Listener { @NotNull BossBarPacket createColorUpdate(@NotNull Color color) { return this.createGenericPacket(UPDATE_STYLE, packet -> { - packet.color = color.ordinal(); - packet.division = AdventurePacketConvertor.getBossBarOverlayValue(bar.overlay()); + packet.color = color; + packet.overlay = bar.overlay(); }); } @NotNull BossBarPacket createTitleUpdate(@NotNull Component title) { - return this.createGenericPacket(UPDATE_TITLE, packet -> packet.title = MinecraftServer.getSerializationManager().serialize(title)); + return this.createGenericPacket(UPDATE_TITLE, packet -> packet.title = title); } @NotNull BossBarPacket createFlagsUpdate() { @@ -198,8 +216,8 @@ public class BossBarManager implements BossBar.Listener { @NotNull BossBarPacket createOverlayUpdate(@NotNull Overlay overlay) { return this.createGenericPacket(UPDATE_STYLE, packet -> { - packet.division = AdventurePacketConvertor.getBossBarOverlayValue(overlay); - packet.color = AdventurePacketConvertor.getBossBarColorValue(bar.color()); + packet.overlay = overlay; + packet.color = bar.color(); }); } diff --git a/src/main/java/net/minestom/server/adventure/Localizable.java b/src/main/java/net/minestom/server/adventure/Localizable.java index d854823ae..27612db54 100644 --- a/src/main/java/net/minestom/server/adventure/Localizable.java +++ b/src/main/java/net/minestom/server/adventure/Localizable.java @@ -1,5 +1,6 @@ package net.minestom.server.adventure; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; @@ -9,6 +10,15 @@ import java.util.Locale; */ public interface Localizable { + /** + * Gets a localizable that returns {@code null} for all calls to {@link #getLocale()}. + * + * @return the empty localizable + */ + static @NotNull Localizable empty() { + return SerializationManager.NULL_LOCALIZABLE; + } + /** * Gets the locale. * diff --git a/src/main/java/net/minestom/server/adventure/LocalizablePacketSender.java b/src/main/java/net/minestom/server/adventure/LocalizablePacketSender.java new file mode 100644 index 000000000..4abf4808a --- /dev/null +++ b/src/main/java/net/minestom/server/adventure/LocalizablePacketSender.java @@ -0,0 +1,158 @@ +package net.minestom.server.adventure; + +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.Title; +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.Player; +import net.minestom.server.network.packet.server.play.ChatMessagePacket; +import net.minestom.server.network.packet.server.play.PlayerListHeaderAndFooterPacket; +import net.minestom.server.network.packet.server.play.TitlePacket; +import net.minestom.server.utils.PacketUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +/** + * Utility class for sending packets with translatable components. All functions in this + * class will send grouped packets if the components do not contain any translatable + * components. In the case that they do, the components are translated and send individually. + */ +public class LocalizablePacketSender { + + /** + * Sends a title to many players, sending it as a grouped packet if it does not + * contain translatable elements. + * + * @param players the players + * @param title the title + */ + public static void sendGroupedTitle(@NotNull Collection players, @NotNull Title title) { + Component preparedTitle = MinecraftServer.getSerializationManager().prepare(title.title(), MinecraftServer.getSerializationManager().getDefaultLocale()), + preparedSubtitle = MinecraftServer.getSerializationManager().prepare(title.subtitle(), MinecraftServer.getSerializationManager().getDefaultLocale()); + Collection rootPacket = TitlePacket.of(Title.title(preparedTitle, preparedSubtitle, title.times())); + + if (title.title().equals(preparedTitle) && title.subtitle().equals(preparedSubtitle)) { + for (TitlePacket packet : rootPacket) { + PacketUtils.sendGroupedPacket(players, packet); + } + } else { + for (Player player : players) { + Collection packets; + + if (player.getLocale() == null) { + packets = rootPacket; + } else { + packets = TitlePacket.of(Title.title(MinecraftServer.getSerializationManager().prepare(title.title(), player), + MinecraftServer.getSerializationManager().prepare(title.subtitle(), player), title.times())); + } + + for (TitlePacket packet : packets) { + player.getPlayerConnection().sendPacket(packet); + } + } + } + } + + /** + * Sends an action bar to many players, sending it as a grouped packet if it does not + * contain translatable elements. + * + * @param players the players + * @param component the component + */ + public static void sendGroupedActionBar(@NotNull Collection players, @NotNull Component component) { + Component preparedComponent = MinecraftServer.getSerializationManager().prepare(component, MinecraftServer.getSerializationManager().getDefaultLocale()); + TitlePacket rootPacket = new TitlePacket(TitlePacket.Action.SET_ACTION_BAR, preparedComponent); + + if (component.equals(preparedComponent)) { + PacketUtils.sendGroupedPacket(players, rootPacket); + } else { + for (Player player : players) { + TitlePacket packet; + + if (player.getLocale() == null) { + packet = rootPacket; + } else { + packet = new TitlePacket(TitlePacket.Action.SET_ACTION_BAR, MinecraftServer.getSerializationManager().prepare(component, player)); + } + + player.getPlayerConnection().sendPacket(packet); + } + } + } + + /** + * Sends a player list to many players, sending it as a grouped packet if it does not + * contain translatable elements. + * + * @param players the players + * @param header the header + * @param footer the footer + */ + public static void sendGroupedPlayerList(@NotNull Collection players, @Nullable Component header, @Nullable Component footer) { + // empty check first + if (header == null) { + header = Component.empty(); + } + + if (footer == null) { + footer = Component.empty(); + } + + // now back to the packets + Component preparedHeader = MinecraftServer.getSerializationManager().prepare(header, MinecraftServer.getSerializationManager().getDefaultLocale()), + preparedFooter = MinecraftServer.getSerializationManager().prepare(footer, MinecraftServer.getSerializationManager().getDefaultLocale()); + PlayerListHeaderAndFooterPacket rootPacket = new PlayerListHeaderAndFooterPacket(preparedHeader, preparedFooter); + + if (header.equals(preparedHeader) && footer.equals(preparedFooter)) { + PacketUtils.sendGroupedPacket(players, rootPacket); + } else { + for (Player player : players) { + PlayerListHeaderAndFooterPacket packet; + + if (player.getLocale() == null) { + packet = rootPacket; + } else { + packet = new PlayerListHeaderAndFooterPacket(MinecraftServer.getSerializationManager().prepare(header, player), + MinecraftServer.getSerializationManager().prepare(footer, player)); + } + + player.getPlayerConnection().sendPacket(packet); + } + } + } + + /** + * Sends a message to many players, sending it as a grouped packet if it does not + * contain translatable elements. + * + * @param players the players + * @param source the source of the message + * @param message the message + * @param messageType the type of the message + */ + public static void sendGroupedMessage(@NotNull Collection players, @NotNull Identity source, @NotNull Component message, @NotNull MessageType messageType) { + ChatMessagePacket.Position position = ChatMessagePacket.Position.fromMessageType(messageType); + Component preparedMessage = MinecraftServer.getSerializationManager().prepare(message, MinecraftServer.getSerializationManager().getDefaultLocale()); + ChatMessagePacket rootPacket = new ChatMessagePacket(preparedMessage, position, source.uuid()); + + if (message.equals(preparedMessage)) { + PacketUtils.sendGroupedPacket(players, rootPacket); + } else { + for (Player player : players) { + ChatMessagePacket packet; + + if (player.getLocale() == null) { + packet = rootPacket; + } else { + packet = new ChatMessagePacket(MinecraftServer.getSerializationManager().prepare(message, player), position, source.uuid()); + } + + player.getPlayerConnection().sendPacket(packet); + } + } + } +} diff --git a/src/main/java/net/minestom/server/adventure/SerializationManager.java b/src/main/java/net/minestom/server/adventure/SerializationManager.java index ecc87ff07..e171cda88 100644 --- a/src/main/java/net/minestom/server/adventure/SerializationManager.java +++ b/src/main/java/net/minestom/server/adventure/SerializationManager.java @@ -6,14 +6,10 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.translation.TranslationRegistry; import net.kyori.adventure.translation.Translator; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Locale; import java.util.Objects; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Function; /** @@ -22,11 +18,7 @@ import java.util.function.Function; * class can be used to change the way text is serialized. For example, a pre-JSON * implementation of Minestom could change this to the plain component serializer. *

- * This manager also provides the ability to wrap the serializer in a renderer that - * performs operations on each component before the final serialization. This can be - * done using {@link #addRenderer(Function)} and {@link #removeRenderer(Function)}. - *

- * Finally, this manager also performs translation on all messages and the {@code serialize} + * This manager also performs translation on all messages and the {@code serialize} * method should be used when converting {@link Component}s into strings. This allows for * messages with {@link TranslatableComponent} to be automatically translated into the locale * of specific players, or other elements which implement {@link Localizable}. To add your @@ -34,12 +26,13 @@ import java.util.function.Function; * {@link TranslationRegistry} or your own implementation of {@link Translator}. */ public class SerializationManager { - private final Set> renderers = new CopyOnWriteArraySet<>(); + protected static final Localizable NULL_LOCALIZABLE = () -> null; + private Function serializer = component -> GsonComponentSerializer.gson().serialize(component); private Locale defaultLocale = Locale.US; /** - * Gets the root serializer that is used to convert Components into Strings. + * Gets the root serializer that is used to convert components into strings. * * @return the serializer */ @@ -48,8 +41,7 @@ public class SerializationManager { } /** - * Sets the root serializer that is used to convert Components into Strings. This - * method does not replace any existing renderers set with {@link #addRenderer(Function)}. + * Sets the root serializer that is used to convert components into strings. * * @param serializer the serializer */ @@ -58,9 +50,9 @@ public class SerializationManager { } /** - * Gets the default locale used to translate {@link TranslatableComponent} if - * serialized using {@link #serialize(Component)} or when {@link #serialize(Component, Localizable)} - * is used but no translation is found. Note that this is just shorthand for + * Gets the default locale used to translate {@link TranslatableComponent} if, when + * {@link #prepare(Component, Localizable)} is called with a localizable that + * does not have a locale. * * @return the default locale */ @@ -69,9 +61,9 @@ public class SerializationManager { } /** - * Sets the default locale used to translate {@link TranslatableComponent} if - * serialized using {@link #serialize(Component)} or when {@link #serialize(Component, Localizable)} - * is used but no translation is found. + * Sets the default locale used to translate {@link TranslatableComponent} if, when + * {@link #prepare(Component, Localizable)} is called with a localizable that + * does not have a locale. * * @param defaultLocale the new default locale */ @@ -79,33 +71,6 @@ public class SerializationManager { this.defaultLocale = defaultLocale; } - /** - * Adds a renderer that will be applied to each serializer. The order in which - * each renderer will be applied is arbitrary. If you want control over the order - * of renderers, create a multi-function using {@link Function#andThen(Function)}. - * - * @param renderer the renderer - */ - public void addRenderer(@NotNull Function renderer) { - this.renderers.add(renderer); - } - - /** - * Removes a renderer. - * - * @param renderer the renderer - */ - public void removeRenderer(@NotNull Function renderer) { - this.renderers.remove(renderer); - } - - /** - * Removes all current renderers. - */ - public void clearRenderers() { - this.renderers.clear(); - } - /** * Gets the global translator object used by this manager. This is just shorthand for * {@link GlobalTranslator#get()}. @@ -117,62 +82,63 @@ public class SerializationManager { } /** - * Serializes a component into a String using the current serializer. Any registered - * renderers are applied first, followed by the global translator. Finally, the - * serializer set with {@link #setSerializer(Function)} is used to convert the - * component into a String. + * Prepares a component for serialization. This runs the component through the + * translator for the localizable's locale. * * @param component the component + * @param localizable the localizable * - * @return the serialized string + * @return the prepared component */ - @Contract("null -> null; !null -> !null") - public String serialize(@Nullable Component component) { - return this.serialize(component, this.defaultLocale); + public @NotNull Component prepare(@NotNull Component component, @NotNull Localizable localizable) { + return GlobalTranslator.renderer().render(component, Objects.requireNonNullElse(localizable.getLocale(), this.getDefaultLocale())); } /** - * Serializes a component into a String using the current serializer. Any registered - * renderers are applied first, followed by the global translator. Finally, the - * serializer set with {@link #setSerializer(Function)} is used to convert the - * component into a String. + * Prepares a component for serialization. This runs the component through the + * translator for the locale. * * @param component the component - * @param localizable a localizable object used to translate components + * @param locale the locale * - * @return the serialized string + * @return the prepared component */ - @Contract("null, _ -> null; !null, _ -> !null") - public String serialize(@Nullable Component component, @NotNull Localizable localizable) { - return this.serialize(component, Objects.requireNonNullElse(localizable.getLocale(), this.defaultLocale)); + public @NotNull Component prepare(@NotNull Component component, @NotNull Locale locale) { + return GlobalTranslator.renderer().render(component, locale); } /** - * Serializes a component into a String using the current serializer. Any registered - * renderers are applied first, followed by the global translator. Finally, the - * serializer set with {@link #setSerializer(Function)} is used to convert the - * component into a String. + * Serializes a component into a string using {@link #getSerializer()}. * * @param component the component - * @param locale the locale used to translate components * * @return the serialized string */ - @Contract("null, _ -> null; !null, _ -> !null") - public String serialize(@Nullable Component component, @NotNull Locale locale) { - if (component == null) { - return null; - } - - // apply renderers - for (Function renderer : this.renderers) { - component = renderer.apply(component); - } - - // apply translation - component = GlobalTranslator.render(component, locale); - - // apply serialisation + public @NotNull String serialize(@NotNull Component component) { return this.serializer.apply(component); } + + /** + * Prepares and then serializes a component. + * + * @param component the component + * @param localizable the localisable + * + * @return the string + */ + public String prepareAndSerialize(@NotNull Component component, @NotNull Localizable localizable) { + return this.prepareAndSerialize(component, Objects.requireNonNullElse(localizable.getLocale(), this.getDefaultLocale())); + } + + /** + * Prepares and then serializes a component. + * + * @param component the component + * @param locale the locale + * + * @return the string + */ + public String prepareAndSerialize(@NotNull Component component, @NotNull Locale locale) { + return this.serialize(this.prepare(component, locale)); + } } diff --git a/src/main/java/net/minestom/server/bossbar/BarColor.java b/src/main/java/net/minestom/server/bossbar/BarColor.java index c9f5a7e08..9173782ea 100644 --- a/src/main/java/net/minestom/server/bossbar/BarColor.java +++ b/src/main/java/net/minestom/server/bossbar/BarColor.java @@ -12,5 +12,9 @@ public enum BarColor { GREEN, YELLOW, PURPLE, - WHITE + WHITE; + + public net.kyori.adventure.bossbar.BossBar.Color asAdventureColor() { + return net.kyori.adventure.bossbar.BossBar.Color.valueOf(this.name()); + } } diff --git a/src/main/java/net/minestom/server/bossbar/BarDivision.java b/src/main/java/net/minestom/server/bossbar/BarDivision.java index 9b79bbe51..54f9fe79f 100644 --- a/src/main/java/net/minestom/server/bossbar/BarDivision.java +++ b/src/main/java/net/minestom/server/bossbar/BarDivision.java @@ -11,5 +11,9 @@ public enum BarDivision { SEGMENT_6, SEGMENT_10, SEGMENT_12, - SEGMENT_20 + SEGMENT_20; + + public net.kyori.adventure.bossbar.BossBar.Overlay asAdventureOverlay() { + return net.kyori.adventure.bossbar.BossBar.Overlay.values()[this.ordinal()]; + } } diff --git a/src/main/java/net/minestom/server/bossbar/BossBar.java b/src/main/java/net/minestom/server/bossbar/BossBar.java index cd129d227..b2a043989 100644 --- a/src/main/java/net/minestom/server/bossbar/BossBar.java +++ b/src/main/java/net/minestom/server/bossbar/BossBar.java @@ -252,10 +252,10 @@ public class BossBar implements Viewable { BossBarPacket bossBarPacket = new BossBarPacket(); bossBarPacket.uuid = uuid; bossBarPacket.action = BossBarPacket.Action.ADD; - bossBarPacket.title = title.toString(); + bossBarPacket.title = title.asComponent(); bossBarPacket.health = progress; - bossBarPacket.color = color.ordinal(); - bossBarPacket.division = division.ordinal(); + bossBarPacket.color = color.asAdventureColor(); + bossBarPacket.overlay = division.asAdventureOverlay(); bossBarPacket.flags = flags; player.getPlayerConnection().sendPacket(bossBarPacket); } @@ -278,7 +278,7 @@ public class BossBar implements Viewable { BossBarPacket bossBarPacket = new BossBarPacket(); bossBarPacket.uuid = uuid; bossBarPacket.action = BossBarPacket.Action.UPDATE_TITLE; - bossBarPacket.title = title.toString(); + bossBarPacket.title = title.asComponent(); sendPacketToViewers(bossBarPacket); } @@ -294,7 +294,7 @@ public class BossBar implements Viewable { BossBarPacket bossBarPacket = new BossBarPacket(); bossBarPacket.uuid = uuid; bossBarPacket.action = BossBarPacket.Action.UPDATE_STYLE; - bossBarPacket.color = color.ordinal(); + bossBarPacket.color = color.asAdventureColor(); sendPacketToViewers(bossBarPacket); } } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 61a17117e..0010b4e29 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -20,7 +20,6 @@ import net.minestom.server.chat.ChatParser; import net.minestom.server.attribute.Attributes; import net.minestom.server.chat.ColoredText; import net.minestom.server.chat.JsonMessage; -import net.minestom.server.chat.RichMessage; import net.minestom.server.collision.BoundingBox; import net.minestom.server.command.CommandManager; import net.minestom.server.command.CommandSender; @@ -507,7 +506,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { // #buildDeathScreenText can return null, check here if (deathText != null) { - CombatEventPacket deathPacket = CombatEventPacket.death(this, null, MinecraftServer.getSerializationManager().serialize(deathText, this)); + CombatEventPacket deathPacket = CombatEventPacket.death(this, null, MinecraftServer.getSerializationManager().prepare(deathText, this)); playerConnection.sendPacket(deathPacket); } @@ -805,7 +804,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { @Override public void sendMessage(@NotNull Identity source, @NotNull Component message, @NotNull MessageType type) { - ChatMessagePacket chatMessagePacket = new ChatMessagePacket(MinecraftServer.getSerializationManager().serialize(message, this), ChatMessagePacket.Position.fromMessageType(type), source.uuid()); + ChatMessagePacket chatMessagePacket = new ChatMessagePacket(MinecraftServer.getSerializationManager().prepare(message, this), ChatMessagePacket.Position.fromMessageType(type), source.uuid()); playerConnection.sendPacket(chatMessagePacket); } @@ -1008,9 +1007,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable { @Override public void sendPlayerListHeaderAndFooter(@NotNull Component header, @NotNull Component footer) { - PlayerListHeaderAndFooterPacket packet = new PlayerListHeaderAndFooterPacket(); - packet.header = MinecraftServer.getSerializationManager().serialize(header, this); - packet.footer = MinecraftServer.getSerializationManager().serialize(footer, this); + PlayerListHeaderAndFooterPacket packet + = new PlayerListHeaderAndFooterPacket(MinecraftServer.getSerializationManager().prepare(header, this), MinecraftServer.getSerializationManager().prepare(footer, this)); playerConnection.sendPacket(packet); } @@ -1025,7 +1023,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { */ @Deprecated private void sendTitle(@NotNull JsonMessage text, @NotNull TitlePacket.Action action) { - TitlePacket titlePacket = new TitlePacket(action, text.toString()); + TitlePacket titlePacket = new TitlePacket(action, text.asComponent()); playerConnection.sendPacket(titlePacket); } @@ -1084,14 +1082,18 @@ public class Player extends LivingEntity implements CommandSender, Localizable { @Override public void showTitle(@NotNull Title title) { - for (TitlePacket titlePacket : TitlePacket.of(title)) { + Component preparedTitle = MinecraftServer.getSerializationManager().prepare(title.title(), this), + preparedSubtitle = MinecraftServer.getSerializationManager().prepare(title.subtitle(), this); + Collection packet = TitlePacket.of(Title.title(preparedTitle, preparedSubtitle, title.times())); + + for (TitlePacket titlePacket : packet) { playerConnection.sendPacket(titlePacket); } } @Override public void sendActionBar(@NotNull Component message) { - TitlePacket titlePacket = new TitlePacket(TitlePacket.Action.SET_ACTION_BAR, MinecraftServer.getSerializationManager().serialize(message, this)); + TitlePacket titlePacket = new TitlePacket(TitlePacket.Action.SET_ACTION_BAR, MinecraftServer.getSerializationManager().prepare(message, this)); playerConnection.sendPacket(titlePacket); } @@ -1175,7 +1177,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { public void openBook(@NotNull Book book) { // make the book ItemStack writtenBook = new ItemStack(Material.WRITTEN_BOOK, (byte) 1); - writtenBook.setItemMeta(WrittenBookMeta.fromAdventure(book)); + writtenBook.setItemMeta(WrittenBookMeta.fromAdventure(book, this)); // Set book in offhand SetSlotPacket setBookPacket = new SetSlotPacket(); @@ -1341,7 +1343,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { this.displayName = displayName; PlayerInfoPacket infoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_DISPLAY_NAME); - infoPacket.playerInfos.add(new PlayerInfoPacket.UpdateDisplayName(getUuid(), MinecraftServer.getSerializationManager().serialize(displayName))); + infoPacket.playerInfos.add(new PlayerInfoPacket.UpdateDisplayName(getUuid(), displayName)); sendPacketToViewersAndSelf(infoPacket); } @@ -1920,9 +1922,9 @@ public class Player extends LivingEntity implements CommandSender, Localizable { // Packet type depends on the current player connection state final ServerPacket disconnectPacket; if (connectionState == ConnectionState.LOGIN) { - disconnectPacket = new LoginDisconnectPacket(MinecraftServer.getSerializationManager().serialize(component, this)); + disconnectPacket = new LoginDisconnectPacket(MinecraftServer.getSerializationManager().prepare(component, this)); } else { - disconnectPacket = new DisconnectPacket(MinecraftServer.getSerializationManager().serialize(component, this)); + disconnectPacket = new DisconnectPacket(MinecraftServer.getSerializationManager().prepare(component, this)); } if (playerConnection instanceof NettyPlayerConnection) { @@ -2547,7 +2549,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable { PlayerInfoPacket.AddPlayer addPlayer = new PlayerInfoPacket.AddPlayer(getUuid(), getUsername(), getGameMode(), getLatency()); - addPlayer.displayName = MinecraftServer.getSerializationManager().serialize(displayName); + addPlayer.displayName = displayName; // Skin support if (skin != null) { diff --git a/src/main/java/net/minestom/server/item/metadata/WrittenBookMeta.java b/src/main/java/net/minestom/server/item/metadata/WrittenBookMeta.java index 2fc0b4201..b160bd59d 100644 --- a/src/main/java/net/minestom/server/item/metadata/WrittenBookMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/WrittenBookMeta.java @@ -3,9 +3,7 @@ package net.minestom.server.item.metadata; import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; -import net.minestom.server.chat.ChatParser; -import net.minestom.server.chat.ColoredText; -import net.minestom.server.chat.JsonMessage; +import net.minestom.server.adventure.Localizable; import org.jetbrains.annotations.NotNull; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTList; @@ -202,15 +200,17 @@ public class WrittenBookMeta extends ItemMeta { * resolved and the generation will default to {@link WrittenBookGeneration#ORIGINAL}. * * @param book the book + * @param localizable who the book is for * * @return the meta */ - public static @NotNull WrittenBookMeta fromAdventure(@NotNull Book book) { + public static @NotNull WrittenBookMeta fromAdventure(@NotNull Book book, @NotNull Localizable localizable) { + // make the book WrittenBookMeta meta = new WrittenBookMeta(); meta.resolved = false; meta.generation = WrittenBookGeneration.ORIGINAL; - meta.author = MinecraftServer.getSerializationManager().serialize(book.author()); - meta.title = MinecraftServer.getSerializationManager().serialize(book.title()); + meta.author = MinecraftServer.getSerializationManager().prepareAndSerialize(book.author(), localizable); + meta.title = MinecraftServer.getSerializationManager().prepareAndSerialize(book.title(), localizable); meta.pages = new ArrayList<>(); for (Component page : book.pages()) { diff --git a/src/main/java/net/minestom/server/network/ConnectionManager.java b/src/main/java/net/minestom/server/network/ConnectionManager.java index 997bf173c..6c715fd37 100644 --- a/src/main/java/net/minestom/server/network/ConnectionManager.java +++ b/src/main/java/net/minestom/server/network/ConnectionManager.java @@ -4,9 +4,11 @@ import io.netty.channel.Channel; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.ForwardingAudience; import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identity; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.minestom.server.MinecraftServer; +import net.minestom.server.adventure.LocalizablePacketSender; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; import net.minestom.server.entity.fakeplayer.FakePlayer; @@ -17,12 +19,10 @@ import net.minestom.server.listener.manager.ClientPacketConsumer; import net.minestom.server.listener.manager.ServerPacketConsumer; import net.minestom.server.network.packet.client.login.LoginStartPacket; import net.minestom.server.network.packet.server.login.LoginSuccessPacket; -import net.minestom.server.network.packet.server.play.ChatMessagePacket; import net.minestom.server.network.packet.server.play.DisconnectPacket; import net.minestom.server.network.packet.server.play.KeepAlivePacket; import net.minestom.server.network.player.NettyPlayerConnection; import net.minestom.server.network.player.PlayerConnection; -import net.minestom.server.utils.PacketUtils; import net.minestom.server.utils.async.AsyncUtils; import net.minestom.server.utils.callback.validator.PlayerValidator; import net.minestom.server.utils.validate.Check; @@ -156,7 +156,7 @@ public final class ConnectionManager implements ForwardingAudience { if (!recipients.isEmpty()) { final String jsonText = jsonMessage.toString(); - broadcastJson(jsonText, recipients); + LocalizablePacketSender.sendGroupedMessage(recipients, Identity.nil(), jsonMessage.asComponent(), MessageType.CHAT); } } @@ -168,13 +168,7 @@ public final class ConnectionManager implements ForwardingAudience { */ @Deprecated public void broadcastMessage(@NotNull JsonMessage jsonMessage) { - broadcastMessage(jsonMessage, null); - } - - private void broadcastJson(@NotNull String json, @NotNull Collection recipients) { - ChatMessagePacket chatMessagePacket = new ChatMessagePacket(json, ChatMessagePacket.Position.SYSTEM_MESSAGE); - - PacketUtils.sendGroupedPacket(recipients, chatMessagePacket); + this.sendMessage(jsonMessage); } private Collection getRecipients(@Nullable PlayerValidator condition) { @@ -491,10 +485,11 @@ public final class ConnectionManager implements ForwardingAudience { * Shutdowns the connection manager by kicking all the currently connected players. */ public void shutdown() { - DisconnectPacket disconnectPacket = new DisconnectPacket(MinecraftServer.getSerializationManager().serialize(shutdownText)); + DisconnectPacket disconnectPacket = new DisconnectPacket(shutdownText); for (Player player : getOnlinePlayers()) { final PlayerConnection playerConnection = player.getPlayerConnection(); if (playerConnection instanceof NettyPlayerConnection) { + disconnectPacket.message = MinecraftServer.getSerializationManager().prepare(disconnectPacket.message, player); final NettyPlayerConnection nettyPlayerConnection = (NettyPlayerConnection) playerConnection; final Channel channel = nettyPlayerConnection.getChannel(); channel.writeAndFlush(disconnectPacket); diff --git a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java index a0441b745..f91716839 100644 --- a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java @@ -70,7 +70,7 @@ public class HandshakePacket implements ClientPreplayPacket { nettyPlayerConnection.UNSAFE_setBungeeSkin(playerSkin); } else { - nettyPlayerConnection.sendPacket(new LoginDisconnectPacket(MinecraftServer.getSerializationManager().serialize(INVALID_BUNGEE_FORWARDING))); + nettyPlayerConnection.sendPacket(new LoginDisconnectPacket(INVALID_BUNGEE_FORWARDING)); nettyPlayerConnection.disconnect(); return; } @@ -94,7 +94,7 @@ public class HandshakePacket implements ClientPreplayPacket { } } else { // Incorrect client version - connection.sendPacket(new LoginDisconnectPacket(MinecraftServer.getSerializationManager().serialize(INVALID_VERSION_TEXT))); + connection.sendPacket(new LoginDisconnectPacket(INVALID_VERSION_TEXT)); connection.disconnect(); } break; diff --git a/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java b/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java index abe4a74e5..ab922299c 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java @@ -80,7 +80,7 @@ public class LoginPluginResponsePacket implements ClientPreplayPacket { Player player = CONNECTION_MANAGER.startPlayState(connection, uuid, username, true); player.setSkin(playerSkin); } else { - LoginDisconnectPacket disconnectPacket = new LoginDisconnectPacket(MinecraftServer.getSerializationManager().serialize(INVALID_PROXY_RESPONSE)); + LoginDisconnectPacket disconnectPacket = new LoginDisconnectPacket(INVALID_PROXY_RESPONSE); nettyPlayerConnection.sendPacket(disconnectPacket); } diff --git a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java index 01fc88b5f..25000c288 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java @@ -3,8 +3,6 @@ package net.minestom.server.network.packet.client.login; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.minestom.server.MinecraftServer; -import net.minestom.server.chat.ChatColor; -import net.minestom.server.chat.ColoredText; import net.minestom.server.entity.Player; import net.minestom.server.extras.MojangAuth; import net.minestom.server.extras.bungee.BungeeCordProxy; @@ -74,7 +72,7 @@ public class LoginStartPacket implements ClientPreplayPacket { if (MojangAuth.isEnabled() && isNettyClient) { // Mojang auth if (CONNECTION_MANAGER.getPlayer(username) != null) { - connection.sendPacket(new LoginDisconnectPacket(MinecraftServer.getSerializationManager().serialize(ALREADY_CONNECTED))); + connection.sendPacket(new LoginDisconnectPacket(ALREADY_CONNECTED)); connection.disconnect(); return; } diff --git a/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java index 5c9b05b23..06e12369e 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.login; +import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -8,23 +9,23 @@ import org.jetbrains.annotations.NotNull; public class LoginDisconnectPacket implements ServerPacket { - private final String kickMessage; // JSON text + private final Component kickMessage; // JSON text - public LoginDisconnectPacket(@NotNull String kickMessage) { + public LoginDisconnectPacket(@NotNull Component kickMessage) { this.kickMessage = kickMessage; } /** - * @deprecated Use {@link #LoginDisconnectPacket(String)} + * @deprecated Use {@link #LoginDisconnectPacket(Component)} */ @Deprecated public LoginDisconnectPacket(@NotNull JsonMessage jsonKickMessage) { - this(jsonKickMessage.toString()); + this(jsonKickMessage.asComponent()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(kickMessage); + writer.writeComponent(kickMessage); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java index f8f950692..f6f8f963c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java @@ -1,7 +1,7 @@ package net.minestom.server.network.packet.server.play; +import net.kyori.adventure.text.Component; import net.minestom.server.advancements.FrameType; -import net.minestom.server.chat.JsonMessage; import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -84,8 +84,8 @@ public class AdvancementsPacket implements ServerPacket { } public static class DisplayData implements Writeable { - public String title; // Only text - public String description; // Only text + public Component title; // Only text + public Component description; // Only text public ItemStack icon; public FrameType frameType; public int flags; @@ -93,19 +93,10 @@ public class AdvancementsPacket implements ServerPacket { public float x; public float y; - /** - * @deprecated Use {@link #title} - */ - public @Deprecated JsonMessage titleJson; // Only text - /** - * @deprecated Use {@link #description} - */ - public @Deprecated JsonMessage descriptionJson; // Only text - @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(titleJson != null ? titleJson.toString() : title); - writer.writeSizedString(descriptionJson != null ? descriptionJson.toString() : description); + writer.writeComponent(title); + writer.writeComponent(description); writer.writeItemStack(icon); writer.writeVarInt(frameType.ordinal()); writer.writeInt(flags); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java index a80b7724e..47e4d266a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java @@ -1,8 +1,8 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.bossbar.BarColor; -import net.minestom.server.bossbar.BarDivision; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.Component; +import net.minestom.server.adventure.AdventurePacketConvertor; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; @@ -15,25 +15,12 @@ public class BossBarPacket implements ServerPacket { public UUID uuid; public Action action; - public String title; // Only text + public Component title; // Only text public float health; - public int color; - public int division; + public BossBar.Color color; + public BossBar.Overlay overlay; public byte flags; - /** - * @deprecated Use {@link #title} - */ - public @Deprecated JsonMessage titleJson; - /** - * @deprecated Use {@link #color} - */ - public @Deprecated BarColor colorOld; - /** - * @deprecated Use {@link #division} - */ - public @Deprecated BarDivision divisionOld; - @Override public void write(@NotNull BinaryWriter writer) { writer.writeUuid(uuid); @@ -41,10 +28,10 @@ public class BossBarPacket implements ServerPacket { switch (action) { case ADD: - writer.writeSizedString(titleJson != null ? titleJson.toString() : title); + writer.writeComponent(title); writer.writeFloat(health); - writer.writeVarInt(colorOld != null ? colorOld.ordinal() : color); - writer.writeVarInt(divisionOld != null ? divisionOld.ordinal() : division); + writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); + writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); writer.writeByte(flags); break; case REMOVE: @@ -54,11 +41,11 @@ public class BossBarPacket implements ServerPacket { writer.writeFloat(health); break; case UPDATE_TITLE: - writer.writeSizedString(titleJson != null ? titleJson.toString() : title); + writer.writeComponent(title); break; case UPDATE_STYLE: - writer.writeVarInt(colorOld != null ? colorOld.ordinal() : color); - writer.writeVarInt(divisionOld != null ? divisionOld.ordinal() : division); + writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); + writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); break; case UPDATE_FLAGS: writer.writeByte(flags); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java index 56f84edc9..6eb2e559f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java @@ -1,7 +1,7 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.audience.MessageType; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.text.Component; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; @@ -16,28 +16,23 @@ import java.util.UUID; public class ChatMessagePacket implements ServerPacket { private static final UUID NULL_UUID = new UUID(0, 0); - public String message; + public Component message; public Position position; public UUID uuid; - /** - * @deprecated Use {@link #message} - */ - public @Deprecated JsonMessage jsonMessage; - - public ChatMessagePacket(String jsonMessage, Position position, UUID uuid) { - this.message = jsonMessage; + public ChatMessagePacket(Component message, Position position, UUID uuid) { + this.message = message; this.position = position; this.uuid = uuid; } - public ChatMessagePacket(String jsonMessage, Position position) { - this(jsonMessage, position, NULL_UUID); + public ChatMessagePacket(Component message, Position position) { + this(message, position, NULL_UUID); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(jsonMessage != null ? jsonMessage.toString() : message); + writer.writeComponent(message); writer.writeByte((byte) position.ordinal()); writer.writeUuid(uuid); } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/CombatEventPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/CombatEventPacket.java index 5e39bf60f..fb54ad4da 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/CombatEventPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/CombatEventPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play; +import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; @@ -8,8 +9,6 @@ import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -import java.util.Optional; - /** * Packet sent during combat to a {@link Player}. * Only death is supported for the moment (other events are ignored anyway as of 1.15.2) @@ -20,7 +19,7 @@ public class CombatEventPacket implements ServerPacket { private int duration; private int opponent; private int playerID; - private String deathMessage; + private Component deathMessage; private CombatEventPacket() { } @@ -40,14 +39,14 @@ public class CombatEventPacket implements ServerPacket { } /** - * @deprecated Use {@link #death(Player, Entity, String)} + * @deprecated Use {@link #death(Player, Entity, Component)} */ @Deprecated public static CombatEventPacket death(Player player, Entity killer, JsonMessage message) { - return death(player, killer, message.toString()); + return death(player, killer, message.asComponent()); } - public static CombatEventPacket death(Player player, Entity killer, String message) { + public static CombatEventPacket death(Player player, Entity killer, Component message) { CombatEventPacket packet = new CombatEventPacket(); packet.type = EventType.DEATH; packet.playerID = player.getEntityId(); @@ -72,7 +71,7 @@ public class CombatEventPacket implements ServerPacket { case DEATH: writer.writeVarInt(playerID); writer.writeInt(opponent); - writer.writeSizedString(deathMessage); + writer.writeComponent(deathMessage); break; } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java index 8d8293b47..4426e16ea 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play; +import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -7,32 +8,27 @@ import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; public class DisconnectPacket implements ServerPacket { - public String message; + public Component message; /** - * @deprecated Use {@link #message} - */ - @Deprecated public JsonMessage messageJson; - - /** - * Creates a new disconnect packet with a given string. + * Creates a new disconnect packet with a given message. * @param message the message */ - public DisconnectPacket(@NotNull String message) { + public DisconnectPacket(@NotNull Component message) { this.message = message; } /** - * @deprecated Use {@link #DisconnectPacket(String)} + * @deprecated Use {@link #DisconnectPacket(Component)} */ @Deprecated public DisconnectPacket(@NotNull JsonMessage message){ - this(message.toString()); + this(message.asComponent()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(messageJson != null ? messageJson.toString() : message); + writer.writeComponent(message); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java index a1ff4560d..446b96d34 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java @@ -1,6 +1,6 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.text.Component; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; @@ -63,13 +63,7 @@ public class MapDataPacket implements ServerPacket { public int type; public byte x, z; public byte direction; - public String displayName; - - /** - * @deprecated Use {@link #displayName} - */ - @Deprecated - public JsonMessage displayNameJson; // Only text + public Component displayName; private void write(BinaryWriter writer) { writer.writeVarInt(type); @@ -77,10 +71,10 @@ public class MapDataPacket implements ServerPacket { writer.writeByte(z); writer.writeByte(direction); - final boolean hasDisplayName = displayName != null || displayNameJson != null; + final boolean hasDisplayName = displayName != null; writer.writeBoolean(hasDisplayName); if (hasDisplayName) { - writer.writeSizedString(displayNameJson != null ? displayNameJson.toString() : displayName); + writer.writeComponent(displayName); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java index 0587bf88f..4d0a9b0ec 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play; +import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.GameMode; import net.minestom.server.network.packet.server.ServerPacket; @@ -75,12 +76,7 @@ public class PlayerInfoPacket implements ServerPacket { public List properties; public GameMode gameMode; public int ping; - public String displayName; - - /** - * @deprecated Use {@link #displayName} - */ - @Deprecated public JsonMessage displayNameJson; // Only text + public Component displayName; public AddPlayer(UUID uuid, String name, GameMode gameMode, int ping) { super(uuid); @@ -100,10 +96,10 @@ public class PlayerInfoPacket implements ServerPacket { writer.writeVarInt(gameMode.getId()); writer.writeVarInt(ping); - final boolean hasDisplayName = displayName != null || displayNameJson != null; + final boolean hasDisplayName = displayName != null; writer.writeBoolean(hasDisplayName); if (hasDisplayName) - writer.writeSizedString(displayNameJson != null ? displayNameJson.toString() : displayName); + writer.writeComponent(displayName); } public static class Property { @@ -166,22 +162,17 @@ public class PlayerInfoPacket implements ServerPacket { public static class UpdateDisplayName extends PlayerInfo { - public String displayName; + public Component displayName; /** - * @deprecated Use {@link #displayName} - */ - @Deprecated public JsonMessage displayNameJson; // Only text - - /** - * @deprecated Use {@link #UpdateDisplayName(UUID, String)} + * @deprecated Use {@link #UpdateDisplayName(UUID, Component)} */ @Deprecated public UpdateDisplayName(UUID uuid, JsonMessage displayName) { - this(uuid, displayName.toString()); + this(uuid, displayName.asComponent()); } - public UpdateDisplayName(UUID uuid, String displayName) { + public UpdateDisplayName(UUID uuid, Component displayName) { super(uuid); this.displayName = displayName; } @@ -191,7 +182,7 @@ public class PlayerInfoPacket implements ServerPacket { final boolean hasDisplayName = displayName != null; writer.writeBoolean(hasDisplayName); if (hasDisplayName) - writer.writeSizedString(displayNameJson != null ? displayNameJson.toString() : displayName); + writer.writeComponent(displayName); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java index b5889aa7f..ae86538a1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java @@ -1,36 +1,27 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; -import net.minestom.server.chat.JsonMessage; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Objects; public class PlayerListHeaderAndFooterPacket implements ServerPacket { - private static final String EMPTY_COMPONENT = GsonComponentSerializer.gson().serialize(Component.empty()); + public Component header; + public Component footer; - public String header; - public String footer; - - /** - * @deprecated Use {@link #header} - */ - @Deprecated public JsonMessage headerJson; - - /** - @deprecated Use {@link #footer} - */ - @Deprecated public JsonMessage footerJson; + public PlayerListHeaderAndFooterPacket(@Nullable Component header, @Nullable Component footer) { + this.header = header; + this.footer = footer; + } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(headerJson != null ? headerJson.toString() : Objects.requireNonNullElse(header, EMPTY_COMPONENT)); - writer.writeSizedString(footerJson != null ? footerJson.toString() : Objects.requireNonNullElse(footer, EMPTY_COMPONENT)); + writer.writeComponent(Objects.requireNonNullElse(header, Component.empty())); + writer.writeComponent(Objects.requireNonNullElse(footer, Component.empty())); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java index 7866bde00..756e475ab 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java @@ -1,6 +1,6 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.text.Component; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; @@ -21,25 +21,19 @@ public class ScoreboardObjectivePacket implements ServerPacket { /** * The text to be displayed for the score */ - public String objectiveValue; // Only text + public Component objectiveValue; // Only text /** * The type how the score is displayed */ public Type type; - /** - * @deprecated Use {@link #objectiveValue} - */ - @Deprecated - public JsonMessage objectiveValueJson; - @Override public void write(@NotNull BinaryWriter writer) { writer.writeSizedString(objectiveName); writer.writeByte(mode); if (mode == 0 || mode == 2) { - writer.writeSizedString(objectiveValueJson != null ? objectiveValueJson.toString() : objectiveValue); + writer.writeComponent(objectiveValue); writer.writeVarInt(type.ordinal()); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java index 8b7a7d2d6..e78b1dadd 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java @@ -1,6 +1,6 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.text.Component; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryWriter; @@ -24,7 +24,7 @@ public class TabCompletePacket implements ServerPacket { writer.writeSizedString(match.match); writer.writeBoolean(match.hasTooltip); if (match.hasTooltip) - writer.writeSizedString(match.tooltipJson != null ? match.tooltipJson.toString() : match.tooltip); + writer.writeComponent(match.tooltip); } } @@ -36,12 +36,7 @@ public class TabCompletePacket implements ServerPacket { public static class Match { public String match; public boolean hasTooltip; - public String tooltip; - - /** - * @deprecated Use {@link #tooltip} - */ - @Deprecated public String tooltipJson; + public Component tooltip; } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java index 6e861c8d1..af698abb1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java @@ -1,6 +1,6 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.chat.JsonMessage; +import net.kyori.adventure.text.Component; import net.minestom.server.color.TeamColor; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -24,7 +24,7 @@ public class TeamsPacket implements ServerPacket { /** * The display name for the team */ - public String teamDisplayName; + public Component teamDisplayName; /** * The friendly flags to */ @@ -44,34 +44,16 @@ public class TeamsPacket implements ServerPacket { /** * The prefix of the team */ - public String teamPrefix; + public Component teamPrefix; /** * The suffix of the team */ - public String teamSuffix; + public Component teamSuffix; /** * An array with all entities in the team */ public String[] entities; - - /** - * @deprecated Use {@link #teamColor} - */ - @Deprecated public int teamColorOld = -1; - /** - * @deprecated Use {@link #teamDisplayName} - */ - @Deprecated public JsonMessage teamDisplayNameJson; - /** - @deprecated Use {@link #teamPrefix} - */ - @Deprecated public JsonMessage teamPrefixJson; - /** - @deprecated Use {@link #teamSuffix} - */ - @Deprecated public JsonMessage teamSuffixJson; - /** * Writes data into the {@link BinaryWriter} * @@ -85,13 +67,13 @@ public class TeamsPacket implements ServerPacket { switch (action) { case CREATE_TEAM: case UPDATE_TEAM_INFO: - writer.writeSizedString(this.teamDisplayNameJson != null ? this.teamDisplayNameJson.toString() : this.teamDisplayName); + writer.writeComponent(this.teamDisplayName); writer.writeByte(this.friendlyFlags); writer.writeSizedString(this.nameTagVisibility.getIdentifier()); writer.writeSizedString(this.collisionRule.getIdentifier()); - writer.writeVarInt(this.teamColorOld != -1 ? this.teamColorOld : this.teamColor.getId()); - writer.writeSizedString(this.teamPrefixJson != null ? this.teamPrefixJson.toString() : this.teamPrefix); - writer.writeSizedString(this.teamSuffixJson != null ? this.teamSuffixJson.toString() : this.teamSuffix); + writer.writeVarInt(this.teamColor.getId()); + writer.writeComponent(this.teamPrefix); + writer.writeComponent(this.teamSuffix); break; case REMOVE_TEAM: diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TitlePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TitlePacket.java index 262423b8b..675ec785b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TitlePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TitlePacket.java @@ -1,7 +1,7 @@ package net.minestom.server.network.packet.server.play; +import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; -import net.minestom.server.MinecraftServer; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.TickUtils; @@ -19,21 +19,21 @@ public class TitlePacket implements ServerPacket { public Action action; - public String payload; + public Component payload; public int fadeIn; public int stay; public int fadeOut; /** - * Constructs a new title packet from an action that can take a string argument. + * Constructs a new title packet from an action that can take a component argument. * * @param action the action * @param payload the payload * @throws IllegalArgumentException if the action is not {@link Action#SET_TITLE}, * {@link Action#SET_SUBTITLE} or {@link Action#SET_ACTION_BAR} */ - public TitlePacket(@NotNull Action action, @NotNull String payload) { + public TitlePacket(@NotNull Action action, @NotNull Component payload) { Validate.isTrue(action == SET_TITLE || action == SET_SUBTITLE || action == SET_ACTION_BAR, "Invalid action type"); this.action = action; this.payload = payload; @@ -72,7 +72,7 @@ public class TitlePacket implements ServerPacket { case SET_TITLE: case SET_SUBTITLE: case SET_ACTION_BAR: - writer.writeSizedString(payload); + writer.writeComponent(payload); break; case SET_TIMES_AND_DISPLAY: writer.writeInt(fadeIn); @@ -109,8 +109,8 @@ public class TitlePacket implements ServerPacket { List packets = new ArrayList<>(4); // base packets - packets.add(new TitlePacket(SET_TITLE, MinecraftServer.getSerializationManager().serialize(title.title()))); - packets.add(new TitlePacket(SET_SUBTITLE, MinecraftServer.getSerializationManager().serialize(title.subtitle()))); + packets.add(new TitlePacket(SET_TITLE, title.title())); + packets.add(new TitlePacket(SET_SUBTITLE, title.subtitle())); // times packet Title.Times times = title.times(); diff --git a/src/main/java/net/minestom/server/scoreboard/Scoreboard.java b/src/main/java/net/minestom/server/scoreboard/Scoreboard.java index 5f3c85afc..e16825a72 100644 --- a/src/main/java/net/minestom/server/scoreboard/Scoreboard.java +++ b/src/main/java/net/minestom/server/scoreboard/Scoreboard.java @@ -3,7 +3,6 @@ package net.minestom.server.scoreboard; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.ForwardingAudience; import net.kyori.adventure.text.Component; -import net.minestom.server.MinecraftServer; import net.minestom.server.Viewable; import net.minestom.server.entity.Player; import net.minestom.server.network.packet.server.play.DisplayScoreboardPacket; @@ -42,7 +41,7 @@ public interface Scoreboard extends Viewable, ForwardingAudience { final ScoreboardObjectivePacket packet = new ScoreboardObjectivePacket(); packet.objectiveName = this.getObjectiveName(); packet.mode = 0; // Create Scoreboard - packet.objectiveValue = MinecraftServer.getSerializationManager().serialize(value); + packet.objectiveValue = value; packet.type = type; return packet; diff --git a/src/main/java/net/minestom/server/scoreboard/Team.java b/src/main/java/net/minestom/server/scoreboard/Team.java index 18c412e2d..39c478e4f 100644 --- a/src/main/java/net/minestom/server/scoreboard/Team.java +++ b/src/main/java/net/minestom/server/scoreboard/Team.java @@ -409,13 +409,13 @@ public class Team implements ForwardingAudience { TeamsPacket teamsCreationPacket = new TeamsPacket(); teamsCreationPacket.teamName = teamName; teamsCreationPacket.action = TeamsPacket.Action.CREATE_TEAM; - teamsCreationPacket.teamDisplayName = MinecraftServer.getSerializationManager().serialize(this.teamDisplayName); + teamsCreationPacket.teamDisplayName = this.teamDisplayName; teamsCreationPacket.friendlyFlags = this.friendlyFlags; teamsCreationPacket.nameTagVisibility = this.nameTagVisibility; teamsCreationPacket.collisionRule = this.collisionRule; teamsCreationPacket.teamColor = this.teamColor; - teamsCreationPacket.teamPrefix = MinecraftServer.getSerializationManager().serialize(this.prefix); - teamsCreationPacket.teamSuffix = MinecraftServer.getSerializationManager().serialize(this.suffix); + teamsCreationPacket.teamPrefix = this.prefix; + teamsCreationPacket.teamSuffix = this.suffix; teamsCreationPacket.entities = this.members.toArray(new String[0]); return teamsCreationPacket; @@ -562,13 +562,13 @@ public class Team implements ForwardingAudience { final TeamsPacket updatePacket = new TeamsPacket(); updatePacket.teamName = this.teamName; updatePacket.action = TeamsPacket.Action.UPDATE_TEAM_INFO; - updatePacket.teamDisplayName = MinecraftServer.getSerializationManager().serialize(this.teamDisplayName); + updatePacket.teamDisplayName = this.teamDisplayName; updatePacket.friendlyFlags = this.friendlyFlags; updatePacket.nameTagVisibility = this.nameTagVisibility; updatePacket.collisionRule = this.collisionRule; updatePacket.teamColor = this.teamColor; - updatePacket.teamPrefix = MinecraftServer.getSerializationManager().serialize(this.prefix); - updatePacket.teamSuffix = MinecraftServer.getSerializationManager().serialize(this.suffix); + updatePacket.teamPrefix = this.prefix; + updatePacket.teamSuffix = this.suffix; PacketUtils.sendGroupedPacket(MinecraftServer.getConnectionManager().getOnlinePlayers(), updatePacket); } diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java index b7f1c430f..84a27d4ff 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java @@ -2,6 +2,7 @@ package net.minestom.server.utils.binary; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.BlockPosition; @@ -61,6 +62,15 @@ public class BinaryWriter extends OutputStream { this.buffer = Unpooled.buffer(); } + /** + * Writes a component to the buffer as a sized string. + * + * @param component the component + */ + public void writeComponent(Component component) { + this.writeSizedString(MinecraftServer.getSerializationManager().serialize(component)); + } + /** * Writes a single boolean to the buffer. *