diff --git a/platform-facet/src/main/java/net/kyori/adventure/platform/facet/Facet.java b/platform-facet/src/main/java/net/kyori/adventure/platform/facet/Facet.java index 8696ccae..6910e405 100644 --- a/platform-facet/src/main/java/net/kyori/adventure/platform/facet/Facet.java +++ b/platform-facet/src/main/java/net/kyori/adventure/platform/facet/Facet.java @@ -149,6 +149,7 @@ default boolean isApplicable(final @NotNull V viewer) { */ interface Message extends Facet { int PROTOCOL_HEX_COLOR = 713; // Added 20w17a + String CLOSEST_RELEASE_VERSION_HEX_COLOR = "1.16"; // Added 20w17a int PROTOCOL_JSON = 5; // Added 14w02a /** @@ -243,6 +244,7 @@ interface ActionBar extends Message { */ interface Title extends Message { int PROTOCOL_ACTION_BAR = 310; // Added 16w40a + String CLOSEST_RELEASE_VERSION_ACTION_BAR = "1.11"; // Added 16w40a long MAX_SECONDS = Long.MAX_VALUE / 20; /** @@ -495,6 +497,7 @@ interface Book extends Message { */ interface BossBar extends net.kyori.adventure.bossbar.BossBar.Listener, Closeable { int PROTOCOL_BOSS_BAR = 356; // Added 18w05a + String CLOSEST_RELEASE_VERSION_BOSS_BAR = "1.13"; /** * A builder for boss bar facets. diff --git a/platform-viaversion/build.gradle b/platform-viaversion/build.gradle index d52e77a5..1617c7bf 100644 --- a/platform-viaversion/build.gradle +++ b/platform-viaversion/build.gradle @@ -1,5 +1,5 @@ dependencies { - compileOnlyApi 'com.viaversion:viaversion-api:4.3.0' + compileOnlyApi 'com.viaversion:viaversion-api:5.4.2' implementation project(':adventure-platform-facet') implementation("net.kyori:adventure-text-serializer-gson:${rootProject.adventure}") { exclude group: "com.google.code.gson" diff --git a/platform-viaversion/src/main/java/net/kyori/adventure/platform/viaversion/ViaFacet.java b/platform-viaversion/src/main/java/net/kyori/adventure/platform/viaversion/ViaFacet.java index 357baac5..efeac2f7 100644 --- a/platform-viaversion/src/main/java/net/kyori/adventure/platform/viaversion/ViaFacet.java +++ b/platform-viaversion/src/main/java/net/kyori/adventure/platform/viaversion/ViaFacet.java @@ -28,7 +28,8 @@ import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; -import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.libs.gson.JsonParser; import java.text.MessageFormat; @@ -46,20 +47,27 @@ import net.kyori.adventure.platform.facet.FacetBase; import net.kyori.adventure.platform.facet.Knob; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.json.JSONOptions; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static net.kyori.adventure.platform.facet.Knob.logError; import static net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.colorDownsamplingGson; -import static net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson; // Non-API @SuppressWarnings({"checkstyle:FilteringWriteTag", "checkstyle:MissingJavadocType", "checkstyle:MissingJavadocMethod"}) public class ViaFacet extends FacetBase implements Facet.Message { private static final String PACKAGE = "com.viaversion.viaversion"; - private static final int SUPPORTED_VIA_MAJOR_VERSION = 4; + private static final int SUPPORTED_VIA_MAJOR_VERSION = 5; private static final boolean SUPPORTED; + // The component will go through the ViaVersion pipeline starting from Minecraft 1.16 + private static final int VERSION_1_16 = 2526; // 20w16a + private static final GsonComponentSerializer GSON_SERIALIZER_1_16 = GsonComponentSerializer.builder() + .options(JSONOptions.byDataVersion().at(VERSION_1_16)) + .build(); + static { boolean supported = false; try { @@ -73,12 +81,14 @@ public class ViaFacet extends FacetBase implements Facet.Message connectionFunction; - private final int minProtocol; + private final ProtocolVersion hexColorProtocol; + private final ProtocolVersion minProtocol; - public ViaFacet(final @NotNull Class viewerClass, final @NotNull Function connectionFunction, final int minProtocol) { + public ViaFacet(final @NotNull Class viewerClass, final @NotNull Function connectionFunction, final String minProtocol) { super(viewerClass); this.connectionFunction = connectionFunction; - this.minProtocol = minProtocol; + this.hexColorProtocol = ProtocolVersion.getClosest(CLOSEST_RELEASE_VERSION_HEX_COLOR); + this.minProtocol = ProtocolVersion.getClosest(minProtocol); } @Override @@ -86,34 +96,34 @@ public boolean isSupported() { return super.isSupported() && SUPPORTED && this.connectionFunction != null - && this.minProtocol >= 0; + && this.minProtocol.isKnown(); } @Override public boolean isApplicable(final @NotNull V viewer) { return super.isApplicable(viewer) - && this.minProtocol > Via.getAPI().getServerVersion().lowestSupportedVersion() - && this.findProtocol(viewer) >= this.minProtocol; + && this.minProtocol.newerThan(Via.getAPI().getServerVersion().lowestSupportedProtocolVersion()) + && this.findProtocol(viewer).newerThanOrEqualTo(this.minProtocol); } public @Nullable UserConnection findConnection(final @NotNull V viewer) { return this.connectionFunction.apply(viewer); } - public int findProtocol(final @NotNull V viewer) { + public ProtocolVersion findProtocol(final @NotNull V viewer) { final UserConnection connection = this.findConnection(viewer); if (connection != null) { - return connection.getProtocolInfo().getProtocolVersion(); + return connection.getProtocolInfo().protocolVersion(); } - return -1; + return ProtocolVersion.unknown; } @NotNull @Override public String createMessage(final @NotNull V viewer, final @NotNull Component message) { - final int protocol = this.findProtocol(viewer); - if (protocol >= PROTOCOL_HEX_COLOR) { - return gson().serialize(message); + final ProtocolVersion protocol = this.findProtocol(viewer); + if (protocol.newerThanOrEqualTo(this.hexColorProtocol)) { + return GSON_SERIALIZER_1_16.serialize(message); } else { return colorDownsamplingGson().serialize(message); } @@ -125,11 +135,11 @@ public static class ProtocolBased extends ViaFacet { private final int packetId; @SuppressWarnings("unchecked") - protected ProtocolBased(final @NotNull String fromProtocol, final @NotNull String toProtocol, final int minProtocol, final @NotNull String packetName, final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { + protected ProtocolBased(final @NotNull String fromProtocol, final @NotNull String toProtocol, final @NotNull String packetsProtocol, final String minProtocol, final @NotNull String packetName, final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { super(viewerClass, connectionFunction, minProtocol); - final String protocolClassName = MessageFormat.format("{0}.protocols.protocol{1}to{2}.Protocol{1}To{2}", PACKAGE, fromProtocol, toProtocol); - final String packetClassName = MessageFormat.format("{0}.protocols.protocol{1}to{2}.ClientboundPackets{1}", PACKAGE, fromProtocol, toProtocol); + final String protocolClassName = MessageFormat.format("{0}.protocols.v{1}to{2}.Protocol{1}To{2}", PACKAGE, fromProtocol, toProtocol); + final String packetClassName = MessageFormat.format("{0}.protocols.v{1}to{2}.packet.ClientboundPackets{3}", PACKAGE, fromProtocol, toProtocol, packetsProtocol); Class> protocolClass = null; Class packetClass = null; @@ -180,15 +190,15 @@ public void sendPacket(final @NotNull PacketWrapper packet) { public static class Chat extends ProtocolBased implements ChatPacket { public Chat(final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - super("1_16", "1_15_2", PROTOCOL_HEX_COLOR, "CHAT_MESSAGE", viewerClass, connectionFunction); + super("1_15_2", "1_16", "1_16", CLOSEST_RELEASE_VERSION_HEX_COLOR, "CHAT", viewerClass, connectionFunction); } @Override public void sendMessage(final @NotNull V viewer, final @NotNull Identity source, final @NotNull String message, final @NotNull Object type) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.COMPONENT, this.parse(message)); - packet.write(Type.BYTE, this.createMessageType(type instanceof MessageType ? (MessageType) type : MessageType.SYSTEM)); - packet.write(Type.UUID, source.uuid()); + packet.write(Types.COMPONENT, this.parse(message)); + packet.write(Types.BYTE, this.createMessageType(type instanceof MessageType ? (MessageType) type : MessageType.SYSTEM)); + packet.write(Types.UUID, source.uuid()); this.sendPacket(packet); } } @@ -211,25 +221,21 @@ public void sendMessage(final @NotNull V viewer, final @NotNull String message) public static class ActionBarTitle extends ProtocolBased implements Facet.ActionBar { public ActionBarTitle(final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - super("1_11", "1_10", TitlePacket.PROTOCOL_ACTION_BAR, "TITLE", viewerClass, connectionFunction); + super("1_10", "1_11", "1_9_3", TitlePacket.CLOSEST_RELEASE_VERSION_ACTION_BAR, "SET_TITLES", viewerClass, connectionFunction); } @Override public void sendMessage(final @NotNull V viewer, final @NotNull String message) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.VAR_INT, TitlePacket.ACTION_ACTIONBAR); - packet.write(Type.COMPONENT, this.parse(message)); + packet.write(Types.VAR_INT, TitlePacket.ACTION_ACTIONBAR); + packet.write(Types.COMPONENT, this.parse(message)); this.sendPacket(packet); } } public static class Title extends ProtocolBased implements Facet.TitlePacket>, Consumer> { - protected Title(final @NotNull String fromProtocol, final @NotNull String toProtocol, final int minProtocol, final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - super(fromProtocol, toProtocol, minProtocol, "TITLE", viewerClass, connectionFunction); - } - public Title(final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - this("1_16", "1_15_2", PROTOCOL_HEX_COLOR, viewerClass, connectionFunction); + super("1_15_2", "1_16", "1_16", CLOSEST_RELEASE_VERSION_HEX_COLOR, "SET_TITLES", viewerClass, connectionFunction); } @Override @@ -240,26 +246,26 @@ public Title(final @NotNull Class viewerClass, final @NotNull Funct @Override public void contributeTitle(final @NotNull List> coll, final @NotNull String title) { coll.add(packet -> { - packet.write(Type.VAR_INT, ACTION_TITLE); - packet.write(Type.COMPONENT, this.parse(title)); + packet.write(Types.VAR_INT, ACTION_TITLE); + packet.write(Types.COMPONENT, this.parse(title)); }); } @Override public void contributeSubtitle(final @NotNull List> coll, final @NotNull String subtitle) { coll.add(packet -> { - packet.write(Type.VAR_INT, ACTION_SUBTITLE); - packet.write(Type.COMPONENT, this.parse(subtitle)); + packet.write(Types.VAR_INT, ACTION_SUBTITLE); + packet.write(Types.COMPONENT, this.parse(subtitle)); }); } @Override public void contributeTimes(final @NotNull List> coll, final int inTicks, final int stayTicks, final int outTicks) { coll.add(packet -> { - packet.write(Type.VAR_INT, ACTION_TIMES); - packet.write(Type.INT, inTicks); - packet.write(Type.INT, stayTicks); - packet.write(Type.INT, outTicks); + packet.write(Types.VAR_INT, ACTION_TIMES); + packet.write(Types.INT, inTicks); + packet.write(Types.INT, stayTicks); + packet.write(Types.INT, outTicks); }); } @@ -282,14 +288,14 @@ public void showTitle(final @NotNull V viewer, final @NotNull Consumer title) @Override public void clearTitle(final @NotNull V viewer) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.VAR_INT, ACTION_CLEAR); + packet.write(Types.VAR_INT, ACTION_CLEAR); this.sendPacket(packet); } @Override public void resetTitle(final @NotNull V viewer) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.VAR_INT, ACTION_RESET); + packet.write(Types.VAR_INT, ACTION_RESET); this.sendPacket(packet); } } @@ -303,30 +309,30 @@ public static final class BossBar extends ProtocolBased implements Facet.B private int overlay; private byte flags; - private BossBar(final @NotNull String fromProtocol, final @NotNull String toProtocol, final @NotNull Class viewerClass, final @NotNull Function connectionFunction, final Collection viewers) { - super(fromProtocol, toProtocol, PROTOCOL_BOSS_BAR, "BOSSBAR", viewerClass, connectionFunction); + private BossBar(final @NotNull String fromProtocol, final @NotNull String toProtocol, final @NotNull String packetsProtocol, final @NotNull Class viewerClass, final @NotNull Function connectionFunction, final Collection viewers) { + super(fromProtocol, toProtocol, packetsProtocol, CLOSEST_RELEASE_VERSION_BOSS_BAR, "BOSS_EVENT", viewerClass, connectionFunction); this.viewers = new CopyOnWriteArraySet<>(viewers); } public static class Builder extends ViaFacet implements Facet.BossBar.Builder> { public Builder(final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - super(viewerClass, connectionFunction, PROTOCOL_HEX_COLOR); + super(viewerClass, connectionFunction, CLOSEST_RELEASE_VERSION_HEX_COLOR); } @Override public Facet.@NotNull BossBar createBossBar(final @NotNull Collection viewer) { - return new ViaFacet.BossBar<>("1_16", "1_15_2", this.viewerClass, this::findConnection, viewer); + return new ViaFacet.BossBar<>("1_15_2", "1_16", "1_16", this.viewerClass, this::findConnection, viewer); } } public static class Builder1_9_To_1_15 extends ViaFacet implements Facet.BossBar.Builder> { public Builder1_9_To_1_15(final @NotNull Class viewerClass, final @NotNull Function connectionFunction) { - super(viewerClass, connectionFunction, PROTOCOL_BOSS_BAR); + super(viewerClass, connectionFunction, CLOSEST_RELEASE_VERSION_BOSS_BAR); } @Override public Facet.@NotNull BossBar createBossBar(final @NotNull Collection viewer) { - return new ViaFacet.BossBar<>("1_9", "1_8", this.viewerClass, this::findConnection, viewer); + return new ViaFacet.BossBar<>("1_8", "1_9", "1_9", this.viewerClass, this::findConnection, viewer); } } @@ -371,20 +377,20 @@ public void bossBarFlagsChanged(final net.kyori.adventure.bossbar.@NotNull BossB public void sendPacket(final @NotNull V viewer, final int action) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.UUID, this.id); - packet.write(Type.VAR_INT, action); + packet.write(Types.UUID, this.id); + packet.write(Types.VAR_INT, action); if (action == ACTION_ADD || action == ACTION_TITLE) { - packet.write(Type.COMPONENT, this.parse(this.title)); + packet.write(Types.COMPONENT, this.parse(this.title)); } if (action == ACTION_ADD || action == ACTION_HEALTH) { - packet.write(Type.FLOAT, this.health); + packet.write(Types.FLOAT, this.health); } if (action == ACTION_ADD || action == ACTION_STYLE) { - packet.write(Type.VAR_INT, this.color); - packet.write(Type.VAR_INT, this.overlay); + packet.write(Types.VAR_INT, this.color); + packet.write(Types.VAR_INT, this.overlay); } if (action == ACTION_ADD || action == ACTION_FLAG) { - packet.write(Type.BYTE, this.flags); + packet.write(Types.BYTE, this.flags); } this.sendPacket(packet); } @@ -425,14 +431,14 @@ public void close() { public static final class TabList extends ProtocolBased implements Facet.TabList { public TabList(final @NotNull Class viewerClass, final @NotNull Function userConnection) { - super("1_16", "1_15_2", PROTOCOL_HEX_COLOR, "TAB_LIST", viewerClass, userConnection); + super("1_15_2", "1_16", "1_16", CLOSEST_RELEASE_VERSION_HEX_COLOR, "TAB_LIST", viewerClass, userConnection); } @Override public void send(final V viewer, final @Nullable String header, final @Nullable String footer) { final PacketWrapper packet = this.createPacket(viewer); - packet.write(Type.COMPONENT, this.parse(header)); - packet.write(Type.COMPONENT, this.parse(footer)); + packet.write(Types.COMPONENT, this.parse(header)); + packet.write(Types.COMPONENT, this.parse(footer)); this.sendPacket(packet); } }