geforkt von Mirrors/Velocity
Ursprung
cab6919a46
Commit
46e34ddb7f
@ -32,6 +32,7 @@ import com.velocitypowered.proxy.console.VelocityConsole;
|
|||||||
import com.velocitypowered.proxy.network.ConnectionManager;
|
import com.velocitypowered.proxy.network.ConnectionManager;
|
||||||
import com.velocitypowered.proxy.plugin.VelocityEventManager;
|
import com.velocitypowered.proxy.plugin.VelocityEventManager;
|
||||||
import com.velocitypowered.proxy.plugin.VelocityPluginManager;
|
import com.velocitypowered.proxy.plugin.VelocityPluginManager;
|
||||||
|
import com.velocitypowered.proxy.protocol.ProtocolUtils;
|
||||||
import com.velocitypowered.proxy.protocol.packet.Chat;
|
import com.velocitypowered.proxy.protocol.packet.Chat;
|
||||||
import com.velocitypowered.proxy.protocol.util.FaviconSerializer;
|
import com.velocitypowered.proxy.protocol.util.FaviconSerializer;
|
||||||
import com.velocitypowered.proxy.protocol.util.GameProfileSerializer;
|
import com.velocitypowered.proxy.protocol.util.GameProfileSerializer;
|
||||||
@ -91,13 +92,14 @@ public class VelocityServer implements ProxyServer, ForwardingAudience {
|
|||||||
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
||||||
.registerTypeHierarchyAdapter(GameProfile.class, new GameProfileSerializer())
|
.registerTypeHierarchyAdapter(GameProfile.class, new GameProfileSerializer())
|
||||||
.create();
|
.create();
|
||||||
private static final Gson PRE_1_16_PING_SERIALIZER = GsonComponentSerializer
|
private static final Gson PRE_1_16_PING_SERIALIZER = ProtocolUtils
|
||||||
.colorDownsamplingGson()
|
.getJsonChatSerializer(ProtocolVersion.MINECRAFT_1_15_2)
|
||||||
.serializer()
|
.serializer()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
||||||
.create();
|
.create();
|
||||||
private static final Gson POST_1_16_PING_SERIALIZER = GsonComponentSerializer.gson()
|
private static final Gson POST_1_16_PING_SERIALIZER = ProtocolUtils
|
||||||
|
.getJsonChatSerializer(ProtocolVersion.MINECRAFT_1_16)
|
||||||
.serializer()
|
.serializer()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
.registerTypeHierarchyAdapter(Favicon.class, new FaviconSerializer())
|
||||||
|
@ -3,10 +3,10 @@ package com.velocitypowered.proxy.protocol;
|
|||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.velocitypowered.proxy.protocol.util.NettyPreconditions.checkFrame;
|
import static com.velocitypowered.proxy.protocol.util.NettyPreconditions.checkFrame;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import com.velocitypowered.api.network.ProtocolVersion;
|
import com.velocitypowered.api.network.ProtocolVersion;
|
||||||
import com.velocitypowered.api.util.GameProfile;
|
import com.velocitypowered.api.util.GameProfile;
|
||||||
import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder;
|
import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder;
|
||||||
|
import com.velocitypowered.proxy.protocol.util.VelocityLegacyHoverEventSerializer;
|
||||||
import com.velocitypowered.proxy.util.except.QuietDecoderException;
|
import com.velocitypowered.proxy.util.except.QuietDecoderException;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.ByteBufInputStream;
|
import io.netty.buffer.ByteBufInputStream;
|
||||||
@ -28,6 +28,18 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
|||||||
|
|
||||||
public enum ProtocolUtils {
|
public enum ProtocolUtils {
|
||||||
;
|
;
|
||||||
|
|
||||||
|
private static final GsonComponentSerializer PRE_1_16_SERIALIZER =
|
||||||
|
GsonComponentSerializer.builder()
|
||||||
|
.downsampleColors()
|
||||||
|
.emitLegacyHoverEvent()
|
||||||
|
.legacyHoverEventSerializer(VelocityLegacyHoverEventSerializer.INSTANCE)
|
||||||
|
.build();
|
||||||
|
private static final GsonComponentSerializer MODERN_SERIALIZER =
|
||||||
|
GsonComponentSerializer.builder()
|
||||||
|
.legacyHoverEventSerializer(VelocityLegacyHoverEventSerializer.INSTANCE)
|
||||||
|
.build();
|
||||||
|
|
||||||
private static final int DEFAULT_MAX_STRING_SIZE = 65536; // 64KiB
|
private static final int DEFAULT_MAX_STRING_SIZE = 65536; // 64KiB
|
||||||
private static final QuietDecoderException BAD_VARINT_CACHED =
|
private static final QuietDecoderException BAD_VARINT_CACHED =
|
||||||
new QuietDecoderException("Bad varint decoded");
|
new QuietDecoderException("Bad varint decoded");
|
||||||
@ -468,9 +480,9 @@ public enum ProtocolUtils {
|
|||||||
*/
|
*/
|
||||||
public static GsonComponentSerializer getJsonChatSerializer(ProtocolVersion version) {
|
public static GsonComponentSerializer getJsonChatSerializer(ProtocolVersion version) {
|
||||||
if (version.compareTo(ProtocolVersion.MINECRAFT_1_16) >= 0) {
|
if (version.compareTo(ProtocolVersion.MINECRAFT_1_16) >= 0) {
|
||||||
return GsonComponentSerializer.gson();
|
return MODERN_SERIALIZER;
|
||||||
}
|
}
|
||||||
return GsonComponentSerializer.colorDownsamplingGson();
|
return PRE_1_16_SERIALIZER;
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Direction {
|
public enum Direction {
|
||||||
|
@ -0,0 +1,96 @@
|
|||||||
|
package com.velocitypowered.proxy.protocol.util;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.UUID;
|
||||||
|
import net.kyori.adventure.key.Key;
|
||||||
|
import net.kyori.adventure.nbt.CompoundBinaryTag;
|
||||||
|
import net.kyori.adventure.nbt.TagStringIO;
|
||||||
|
import net.kyori.adventure.nbt.api.BinaryTagHolder;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.TextComponent;
|
||||||
|
import net.kyori.adventure.text.event.HoverEvent;
|
||||||
|
import net.kyori.adventure.text.event.HoverEvent.ShowEntity;
|
||||||
|
import net.kyori.adventure.text.event.HoverEvent.ShowItem;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.LegacyHoverEventSerializer;
|
||||||
|
import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer;
|
||||||
|
import net.kyori.adventure.util.Codec.Decoder;
|
||||||
|
import net.kyori.adventure.util.Codec.Encoder;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of {@link LegacyHoverEventSerializer} that implements the interface in the
|
||||||
|
* most literal, albeit "incompatible" way possible.
|
||||||
|
*/
|
||||||
|
public class VelocityLegacyHoverEventSerializer implements LegacyHoverEventSerializer {
|
||||||
|
|
||||||
|
public static final LegacyHoverEventSerializer INSTANCE =
|
||||||
|
new VelocityLegacyHoverEventSerializer();
|
||||||
|
|
||||||
|
private VelocityLegacyHoverEventSerializer() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Key legacyIdToFakeKey(byte id) {
|
||||||
|
return Key.of("velocity", "legacy_hover/id_" + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HoverEvent.@NonNull ShowItem deserializeShowItem(@NonNull Component input)
|
||||||
|
throws IOException {
|
||||||
|
String snbt = PlainComponentSerializer.plain().serialize(input);
|
||||||
|
CompoundBinaryTag item = TagStringIO.get().asCompound(snbt);
|
||||||
|
|
||||||
|
Key key;
|
||||||
|
String idIfString = item.getString("id", "");
|
||||||
|
if (idIfString.isEmpty()) {
|
||||||
|
key = legacyIdToFakeKey(item.getByte("id"));
|
||||||
|
} else {
|
||||||
|
key = Key.of(idIfString);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte count = item.getByte("Count", (byte) 1);
|
||||||
|
return new ShowItem(key, count, BinaryTagHolder.of(snbt));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HoverEvent.@NonNull ShowEntity deserializeShowEntity(@NonNull Component input,
|
||||||
|
Decoder<Component, String, ? extends RuntimeException> componentDecoder) throws IOException {
|
||||||
|
String snbt = PlainComponentSerializer.plain().serialize(input);
|
||||||
|
CompoundBinaryTag item = TagStringIO.get().asCompound(snbt);
|
||||||
|
return new ShowEntity(Key.of(item.getString("type")),
|
||||||
|
UUID.fromString(item.getString("id")),
|
||||||
|
componentDecoder.decode(item.getString("name")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull Component serializeShowItem(HoverEvent.@NonNull ShowItem input)
|
||||||
|
throws IOException {
|
||||||
|
final CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder()
|
||||||
|
.putByte("Count", (byte) input.count());
|
||||||
|
|
||||||
|
String keyAsString = input.item().asString();
|
||||||
|
if (keyAsString.startsWith("velocity:legacy_hover/id_")) {
|
||||||
|
builder.putByte("id", Byte.parseByte(keyAsString
|
||||||
|
.substring("velocity:legacy_hover/id_".length())));
|
||||||
|
} else {
|
||||||
|
builder.putString("id", keyAsString);
|
||||||
|
}
|
||||||
|
if (input.nbt() != null) {
|
||||||
|
builder.put("tag", TagStringIO.get().asCompound(input.nbt().string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return TextComponent.of(TagStringIO.get().asString(builder.build()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull Component serializeShowEntity(HoverEvent.@NonNull ShowEntity input,
|
||||||
|
Encoder<Component, String, ? extends RuntimeException> componentEncoder) throws IOException {
|
||||||
|
CompoundBinaryTag.Builder tag = CompoundBinaryTag.builder()
|
||||||
|
.putString("id", input.id().toString())
|
||||||
|
.putString("type", input.type().asString());
|
||||||
|
if (input.name() != null) {
|
||||||
|
tag.putString("name", componentEncoder.encode(input.name()));
|
||||||
|
}
|
||||||
|
return TextComponent.of(TagStringIO.get().asString(tag.build()));
|
||||||
|
}
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren