From b297626892e560a929d33331b1436124e9adce18 Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sat, 8 Jun 2024 14:13:38 +0100 Subject: [PATCH] Fix ViaVersion compatibility (as via fixed injector) --- .../util/viaversion/ViaVersionAccessor.java | 3 + .../viaversion/ViaVersionAccessorImpl.java | 62 ++++++++++++------- .../util/viaversion/ViaVersionUtil.java | 27 +------- 3 files changed, 43 insertions(+), 49 deletions(-) diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessor.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessor.java index 01e6f6cd83..7007c050b1 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessor.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessor.java @@ -18,12 +18,15 @@ package io.github.retrooper.packetevents.sponge.util.viaversion; +import com.github.retrooper.packetevents.protocol.player.User; import org.spongepowered.api.entity.living.player.server.ServerPlayer; public interface ViaVersionAccessor { int getProtocolVersion(ServerPlayer player); + int getProtocolVersion(User user); + Class getUserConnectionClass(); Class getSpongeDecodeHandlerClass(); diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessorImpl.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessorImpl.java index 981cddaf5a..763a35a92b 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessorImpl.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionAccessorImpl.java @@ -1,36 +1,52 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package io.github.retrooper.packetevents.sponge.util.viaversion; +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.reflection.Reflection; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.sponge.handlers.SpongeDecodeHandler; -import com.viaversion.viaversion.sponge.handlers.SpongeEncodeHandler; +import io.netty.channel.Channel; import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import java.lang.reflect.Field; + public class ViaVersionAccessorImpl implements ViaVersionAccessor { + private static final Class ENCODE_HANDLER; + private static final Class DECODE_HANDLER; + + static { + try { + ENCODE_HANDLER = Class.forName("com.viaversion.sponge.handlers.SpongeEncodeHandler"); + DECODE_HANDLER = Class.forName("com.viaversion.sponge.handlers.SpongeDecodeHandler"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private static Field CONNECTION_FIELD; + @Override public int getProtocolVersion(ServerPlayer player) { return Via.getAPI().getPlayerVersion(player); } + @Override + public int getProtocolVersion(User user) { + try { + Object viaEncoder = ((Channel) user.getChannel()).pipeline().get("via-encoder"); + if (CONNECTION_FIELD == null) { + CONNECTION_FIELD = Reflection.getField(viaEncoder.getClass(), "info"); + } + UserConnection connection = (UserConnection) CONNECTION_FIELD.get(viaEncoder); + return connection.getProtocolInfo().getProtocolVersion(); + } + catch (IllegalAccessException e) { + PacketEvents.getAPI().getLogManager().warn("Unable to grab ViaVersion client version for player!"); + return -1; + } + } + @Override public Class getUserConnectionClass() { return UserConnection.class; @@ -38,11 +54,11 @@ public Class getUserConnectionClass() { @Override public Class getSpongeDecodeHandlerClass() { - return SpongeDecodeHandler.class; + return DECODE_HANDLER; } @Override public Class getSpongeEncodeHandlerClass() { - return SpongeEncodeHandler.class; + return ENCODE_HANDLER; } -} +} \ No newline at end of file diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionUtil.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionUtil.java index 6a59cde760..e1c1ae091a 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionUtil.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/util/viaversion/ViaVersionUtil.java @@ -18,16 +18,10 @@ package io.github.retrooper.packetevents.sponge.util.viaversion; -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.netty.channel.ChannelHelper; import com.github.retrooper.packetevents.protocol.player.User; -import com.github.retrooper.packetevents.util.reflection.Reflection; -import io.netty.channel.Channel; import org.spongepowered.api.Sponge; import org.spongepowered.api.entity.living.player.server.ServerPlayer; -import java.util.Optional; - public class ViaVersionUtil { private static ViaState available = ViaState.UNKNOWN; private static ViaVersionAccessor viaVersionAccessor; @@ -65,26 +59,7 @@ public static ViaVersionAccessor getViaVersionAccessor() { } public static int getProtocolVersion(User user) { - try { - if (user.getUUID() != null) { - Optional player = Sponge.server().player(user.getUUID()); - if (player.isPresent()) { - int version = getProtocolVersion(player.get()); - // -1 means via hasn't gotten join event yet - if (version != -1) return version; - } - } - - System.out.println(ChannelHelper.pipelineHandlerNamesAsString(user.getChannel())); - Object viaEncoder = ((Channel) user.getChannel()).pipeline().get("encoder"); - Object connection = Reflection.getField(viaEncoder.getClass(), "connection").get(viaEncoder); - Object protocolInfo = Reflection.getField(connection.getClass(), "protocolInfo").get(connection); - return (int) Reflection.getField(protocolInfo.getClass(), "protocolVersion").get(protocolInfo); - } catch (Exception e) { - PacketEvents.getAPI().getLogManager().warn("Unable to grab ViaVersion client version for player!"); - e.printStackTrace(); - return -1; - } + return getViaVersionAccessor().getProtocolVersion(user); } public static int getProtocolVersion(ServerPlayer player) {