diff --git a/api/build.gradle.kts b/api/build.gradle.kts index c6e35abcac..6c99ac61e0 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -61,8 +61,7 @@ tasks { "https://guava.dev/releases/${libs.guava.get().version}/api/docs/", "https://google.github.io/guice/api-docs/${libs.guice.get().version}/javadoc/", "https://docs.oracle.com/en/java/javase/17/docs/api/", - //"https://jd.advntr.dev/api/${libs.adventure.bom.get().version}/", - "https://jd.advntr.dev/api/4.14.0/", + "https://jd.advntr.dev/api/${libs.adventure.bom.get().version}/", "https://javadoc.io/doc/com.github.ben-manes.caffeine/caffeine" ) diff --git a/api/src/main/java/com/velocitypowered/api/proxy/player/ResourcePackInfo.java b/api/src/main/java/com/velocitypowered/api/proxy/player/ResourcePackInfo.java index 6c3d44591f..d805aa0c61 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/player/ResourcePackInfo.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/player/ResourcePackInfo.java @@ -8,13 +8,16 @@ package com.velocitypowered.api.proxy.player; import java.util.UUID; +import net.kyori.adventure.resource.ResourcePackInfoLike; +import net.kyori.adventure.resource.ResourcePackRequestLike; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.Nullable; /** * Represents the information for a resource pack to apply that can be sent to the client. */ -public interface ResourcePackInfo { +@Deprecated +public interface ResourcePackInfo extends ResourcePackRequestLike { /** * Gets the id of this resource-pack. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 07f96fdbdb..fbee359c3f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,8 +11,7 @@ shadow = "com.github.johnrengelman.shadow:8.1.0" spotless = "com.diffplug.spotless:6.12.0" [libraries] -# See JD links in velocity-apo when moving to non-snapshot versions -adventure-bom = "net.kyori:adventure-bom:4.15.0-SNAPSHOT" +adventure-bom = "net.kyori:adventure-bom:4.15.0" adventure-facet = "net.kyori:adventure-platform-facet:4.3.0" asm = "org.ow2.asm:asm:9.5" asynchttpclient = "org.asynchttpclient:async-http-client:2.12.3" diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java index 5bd49bd9e2..494dd01fb4 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java @@ -45,7 +45,6 @@ import com.velocitypowered.api.proxy.crypto.KeyIdentifiable; import com.velocitypowered.api.proxy.messages.ChannelIdentifier; import com.velocitypowered.api.proxy.player.PlayerSettings; -import com.velocitypowered.api.proxy.player.ResourcePackInfo; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.util.GameProfile; import com.velocitypowered.api.util.ModInfo; @@ -64,6 +63,7 @@ import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter; import com.velocitypowered.proxy.protocol.packet.KeepAlive; import com.velocitypowered.proxy.protocol.packet.PluginMessage; +import com.velocitypowered.proxy.protocol.packet.RemoveResourcePack; import com.velocitypowered.proxy.protocol.packet.ResourcePackRequest; import com.velocitypowered.proxy.protocol.packet.chat.ChatQueue; import com.velocitypowered.proxy.protocol.packet.chat.ChatType; @@ -83,6 +83,7 @@ import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; @@ -101,6 +102,7 @@ import net.kyori.adventure.platform.facet.FacetPointers; import net.kyori.adventure.platform.facet.FacetPointers.Type; import net.kyori.adventure.pointer.Pointers; +import net.kyori.adventure.resource.ResourcePackInfo; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -151,7 +153,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player, private final CompletableFuture teardownFuture = new CompletableFuture<>(); private @MonotonicNonNull List serversToTry = null; private @MonotonicNonNull Boolean previousResourceResponse; - private final Queue outstandingResourcePacks = new ArrayDeque<>(); + private final Queue outstandingResourcePacks = new ArrayDeque<>(); private @Nullable ResourcePackInfo pendingResourcePack; private @Nullable ResourcePackInfo appliedResourcePack; private final @NotNull Pointers pointers = @@ -519,6 +521,31 @@ public void showBossBar(@NonNull BossBar bar) { } } + @Override + public void sendResourcePacks(net.kyori.adventure.resource.@NotNull ResourcePackRequest request) { + if (this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) { + Preconditions.checkNotNull(request, "request"); + for (final ResourcePackInfo pack : request.packs()) { + this.queueResourcePack(pack); + } + } + } + + @Override + public void removeResourcePacks(@NotNull UUID id, @NotNull UUID @NotNull ... others) { + this.connection.write(new RemoveResourcePack(id)); + for (final UUID other : others) { + this.connection.write(new RemoveResourcePack(other)); + } + // TODO: change attributes + } + + @Override + public void clearResourcePacks() { + this.connection.write(new RemoveResourcePack(null)); + // TODO: change attributes + } + @Override public ConnectionRequestBuilder createConnectionRequest(RegisteredServer server) { return new ConnectionRequestBuilderImpl(server, this.connectedServer); @@ -966,26 +993,24 @@ public void sendResourcePack(String url, byte[] hash) { } @Override - public void sendResourcePackOffer(ResourcePackInfo packInfo) { - if (this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) { - Preconditions.checkNotNull(packInfo, "packInfo"); - queueResourcePack(packInfo); - } + public void sendResourcePackOffer(com.velocitypowered.api.proxy.player.ResourcePackInfo packInfo) { + Preconditions.checkNotNull(packInfo, "packInfo"); + this.sendResourcePacks(packInfo.asResourcePackRequest()); } /** * Queues a resource-pack for sending to the player and sends it immediately if the queue is * empty. */ - public void queueResourcePack(ResourcePackInfo info) { - outstandingResourcePacks.add(info); + public void queueResourcePack(net.kyori.adventure.resource.ResourcePackRequest request) { + outstandingResourcePacks.add(request); if (outstandingResourcePacks.size() == 1) { tickResourcePackQueue(); } } private void tickResourcePackQueue() { - ResourcePackInfo queued = outstandingResourcePacks.peek(); + net.kyori.adventure.resource.ResourcePackRequest queued = outstandingResourcePacks.peek(); if (queued != null) { // Check if the player declined a resource pack once already @@ -994,7 +1019,7 @@ private void tickResourcePackQueue() { // Unless its 1.17+ and forced it will come back denied anyway while (!outstandingResourcePacks.isEmpty()) { queued = outstandingResourcePacks.peek(); - if (queued.getShouldForce() && getProtocolVersion() + if (queued.required() && getProtocolVersion() .compareTo(ProtocolVersion.MINECRAFT_1_17) >= 0) { break; } @@ -1015,9 +1040,9 @@ private void tickResourcePackQueue() { } else { request.setHash(""); } - request.setRequired(queued.getShouldForce()); - request.setPrompt(queued.getPrompt() == null ? null : - new ComponentHolder(getProtocolVersion(), queued.getPrompt())); + request.setRequired(queued.required()); + request.setPrompt(queued.prompt() == null ? null : + new ComponentHolder(getProtocolVersion(), queued.prompt())); connection.write(request); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/player/VelocityResourcePackInfo.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/player/VelocityResourcePackInfo.java index 26a46c1b42..ab1e0041d8 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/player/VelocityResourcePackInfo.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/player/VelocityResourcePackInfo.java @@ -19,10 +19,14 @@ import com.google.common.base.Preconditions; import com.velocitypowered.api.proxy.player.ResourcePackInfo; +import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.UUID; +import net.kyori.adventure.resource.ResourcePackRequest; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.NotNull; /** * Implements {@link ResourcePackInfo}. @@ -105,6 +109,19 @@ public Builder asBuilder(String newUrl) { .setPrompt(prompt); } + @Override + public @NotNull ResourcePackRequest asResourcePackRequest() { + return ResourcePackRequest.resourcePackRequest() + .packs(net.kyori.adventure.resource.ResourcePackInfo.resourcePackInfo() + .id(this.id) + .uri(URI.create(this.url)) + .hash(Arrays.toString(this.hash)) + .build()) + .required(this.shouldForce) + .prompt(this.prompt) + .build(); + } + /** * Implements the builder for {@link ResourcePackInfo} instances. */