From cd8b5c534607cc59fd93425795741d106fde398f Mon Sep 17 00:00:00 2001 From: Moulberry Date: Fri, 10 May 2024 02:34:28 +0800 Subject: [PATCH] Attempt to support ViaVersion on the proxy by looking up player version from the data version --- .../java/com/moulberry/axiom/AxiomPaper.java | 16 ++++---- .../axiom/packet/HelloPacketListener.java | 39 ++++++++++++------- .../axiom/viaversion/ViaVersionHelper.java | 4 +- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/moulberry/axiom/AxiomPaper.java b/src/main/java/com/moulberry/axiom/AxiomPaper.java index 6c782c6..ad423ed 100644 --- a/src/main/java/com/moulberry/axiom/AxiomPaper.java +++ b/src/main/java/com/moulberry/axiom/AxiomPaper.java @@ -9,7 +9,6 @@ import com.moulberry.axiom.event.AxiomModifyWorldEvent; import com.moulberry.axiom.integration.plotsquared.PlotSquaredIntegration; import com.moulberry.axiom.packet.*; import com.moulberry.axiom.world_properties.server.ServerWorldPropertiesRegistry; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.papermc.paper.event.player.PlayerFailMoveEvent; @@ -17,13 +16,11 @@ import io.papermc.paper.event.world.WorldGameRuleChangeEvent; import io.papermc.paper.network.ChannelInitializeListener; import io.papermc.paper.network.ChannelInitializeListenerHolder; import net.kyori.adventure.key.Key; +import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; import net.minecraft.core.IdMapper; import net.minecraft.network.*; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.DiscardedPayload; import net.minecraft.network.protocol.game.GameProtocols; import net.minecraft.network.protocol.game.ServerGamePacketListener; @@ -45,7 +42,6 @@ import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.paper.PaperCommandManager; import org.jetbrains.annotations.Nullable; -import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -60,7 +56,7 @@ public class AxiomPaper extends JavaPlugin implements Listener { public final Map playerBlockBufferRateLimiters = new ConcurrentHashMap<>(); public final Map playerRestrictions = new ConcurrentHashMap<>(); public final Map> playerBlockRegistry = new ConcurrentHashMap<>(); - public final Set mismatchedDataVersionUsingViaVersion = Collections.newSetFromMap(new ConcurrentHashMap<>()); + public final Map playerProtocolVersion = new ConcurrentHashMap<>(); public Configuration configuration; public IdMapper allowedBlockRegistry = null; @@ -273,7 +269,7 @@ public class AxiomPaper extends JavaPlugin implements Listener { playerBlockBufferRateLimiters.keySet().retainAll(stillActiveAxiomPlayers); playerRestrictions.keySet().retainAll(stillActiveAxiomPlayers); playerBlockRegistry.keySet().retainAll(stillActiveAxiomPlayers); - mismatchedDataVersionUsingViaVersion.retainAll(stillActiveAxiomPlayers); + playerProtocolVersion.keySet().retainAll(stillActiveAxiomPlayers); }, 20, 20); boolean sendMarkers = configuration.getBoolean("send-markers"); @@ -317,7 +313,11 @@ public class AxiomPaper extends JavaPlugin implements Listener { } public boolean isMismatchedDataVersion(UUID uuid) { - return this.mismatchedDataVersionUsingViaVersion.contains(uuid); + return this.playerProtocolVersion.containsKey(uuid); + } + + public int getProtocolVersionFor(UUID uuid) { + return this.playerProtocolVersion.getOrDefault(uuid, SharedConstants.getProtocolVersion()); } public IdMapper getBlockRegistry(UUID uuid) { diff --git a/src/main/java/com/moulberry/axiom/packet/HelloPacketListener.java b/src/main/java/com/moulberry/axiom/packet/HelloPacketListener.java index 0bdfcac..9d52748 100644 --- a/src/main/java/com/moulberry/axiom/packet/HelloPacketListener.java +++ b/src/main/java/com/moulberry/axiom/packet/HelloPacketListener.java @@ -9,18 +9,12 @@ import com.moulberry.axiom.persistence.UUIDDataType; import com.moulberry.axiom.viaversion.ViaVersionHelper; import com.moulberry.axiom.world_properties.server.ServerWorldPropertiesRegistry; import com.viaversion.viaversion.api.Via; -import com.viaversion.viaversion.api.data.*; -import com.viaversion.viaversion.api.protocol.ProtocolPathEntry; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; -import com.viaversion.viaversion.api.type.ByteBufReader; -import com.viaversion.viaversion.api.type.Type; -import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; import io.netty.buffer.Unpooled; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.SharedConstants; import net.minecraft.core.IdMapper; -import net.minecraft.nbt.NbtIo; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.MinecraftServer; @@ -38,7 +32,6 @@ import org.bukkit.plugin.messaging.PluginMessageListener; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Set; import java.util.UUID; public class HelloPacketListener implements PluginMessageListener { @@ -73,19 +66,39 @@ public class HelloPacketListener implements PluginMessageListener { String incompatibleDataVersion = plugin.configuration.getString("incompatible-data-version"); if (incompatibleDataVersion == null) incompatibleDataVersion = "warn"; - if (!Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { - Component text = Component.text("Axiom: Incompatible data version detected (client " + dataVersion + - ", server " + serverDataVersion + ")"); + Component incompatibleWarning = Component.text("Axiom: Incompatible data version detected (client " + dataVersion + + ", server " + serverDataVersion + ")"); + if (!Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { if (incompatibleDataVersion.equals("warn")) { - player.sendMessage(text.color(NamedTextColor.RED)); + player.sendMessage(incompatibleWarning.color(NamedTextColor.RED)); return; } else if (!incompatibleDataVersion.equals("ignore")) { - player.kick(text); + player.kick(incompatibleWarning); return; } } else { int playerVersion = Via.getAPI().getPlayerVersion(player.getUniqueId()); + if (playerVersion == SharedConstants.getProtocolVersion()) { + // Likely using via on the proxy, try to get protocol version from data version + if (dataVersion < 3337) { + player.sendMessage(incompatibleWarning.color(NamedTextColor.RED)); + return; + } else if (dataVersion == 3337) { + playerVersion = 762; // 1.19.4 + } else if (dataVersion <= 3465) { + playerVersion = 763; // 1.20.1 + } else if (dataVersion <= 3578) { + playerVersion = 764; // 1.20.2 + } else if (dataVersion <= 3700) { + playerVersion = 765; // 1.20.3 / 1.20.4 + } else if (dataVersion <= 3837) { + playerVersion = 766; // 1.20.3 / 1.20.4 + } else { + player.sendMessage(incompatibleWarning.color(NamedTextColor.RED)); + return; + } + } IdMapper mapper; try { @@ -105,7 +118,7 @@ public class HelloPacketListener implements PluginMessageListener { } this.plugin.playerBlockRegistry.put(player.getUniqueId(), mapper); - this.plugin.mismatchedDataVersionUsingViaVersion.add(player.getUniqueId()); + this.plugin.playerProtocolVersion.put(player.getUniqueId(), playerVersion); Component text = Component.text("Axiom: Warning, client and server versions don't match. " + "Axiom will try to use ViaVersion conversions, but this process may cause problems"); diff --git a/src/main/java/com/moulberry/axiom/viaversion/ViaVersionHelper.java b/src/main/java/com/moulberry/axiom/viaversion/ViaVersionHelper.java index cfd0685..896d313 100644 --- a/src/main/java/com/moulberry/axiom/viaversion/ViaVersionHelper.java +++ b/src/main/java/com/moulberry/axiom/viaversion/ViaVersionHelper.java @@ -96,7 +96,7 @@ public class ViaVersionHelper { private static final int UNNAMED_COMPOUND_TAG_CHANGE_VERSION = 764; // 1.20.2 public static void skipTagViaVersion(FriendlyByteBuf friendlyByteBuf, Player player) throws Exception { - skipTagViaVersion(friendlyByteBuf, Via.getAPI().getPlayerVersion(player.getUniqueId())); + skipTagViaVersion(friendlyByteBuf, AxiomPaper.PLUGIN.getProtocolVersionFor(player.getUniqueId())); } public static void skipTagViaVersion(FriendlyByteBuf friendlyByteBuf, int playerVersion) throws Exception { @@ -104,7 +104,7 @@ public class ViaVersionHelper { } public static CompoundTag readTagViaVersion(FriendlyByteBuf friendlyByteBuf, Player player) throws Exception { - return readTagViaVersion(friendlyByteBuf, Via.getAPI().getPlayerVersion(player.getUniqueId())); + return readTagViaVersion(friendlyByteBuf, AxiomPaper.PLUGIN.getProtocolVersionFor(player.getUniqueId())); } public static CompoundTag readTagViaVersion(FriendlyByteBuf friendlyByteBuf, int playerVersion) throws Exception {