From 1fd8b3c4cb7ee65fa804c4418a042cded5945755 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 21:52:07 +0200 Subject: [PATCH] Add ClientVersionPacket --- .../packets/server/ClientVersionPacket.java | 39 +++++++++++++++++++ .../src/de/steamwar/core/Core.java | 5 --- .../src/de/steamwar/core/PlayerVersion.java | 34 +++++++--------- .../core/WorldEditRendererWrapper.java | 2 +- .../listeners/VersionAnnouncer.java | 16 ++++++-- 5 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java diff --git a/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java new file mode 100644 index 00000000..af0ba4ed --- /dev/null +++ b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java @@ -0,0 +1,39 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.network.packets.server; + +import de.steamwar.network.packets.NetworkPacket; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@EqualsAndHashCode(callSuper = true) +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ClientVersionPacket extends NetworkPacket { + private static final long serialVersionUID = 3686482311704273200L; + + private UUID player; + private int version; +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index bffe5025..568c3e48 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -35,7 +35,6 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.internal.Statement; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -53,10 +52,6 @@ public class Core extends JavaPlugin { return Reflection.MAJOR_VERSION; } - public static boolean isBedrockPlayer(Player player) { - return player.getName().startsWith("."); - } - private static JavaPlugin instance; public static JavaPlugin getInstance() { return instance; diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java index 8b73e9b4..512df0d3 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java @@ -19,47 +19,43 @@ package de.steamwar.core; -import com.google.gson.Gson; -import com.google.gson.JsonObject; +import de.steamwar.network.packets.PacketHandler; +import de.steamwar.network.packets.server.ClientVersionPacket; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.messaging.PluginMessageListener; import java.util.HashMap; import java.util.Map; +import java.util.UUID; -public class PlayerVersion implements PluginMessageListener, Listener { +public class PlayerVersion extends PacketHandler implements Listener { - private static final String PLAYER_VERSION_CHANNEL = "vv:proxy_details"; - private static final Gson GSON = new Gson(); - private static final Map playerVersions = new HashMap<>(); + private static final Map playerVersions = new HashMap<>(); public static int getVersion(Player player) { - return playerVersions.getOrDefault(player, -1); + return playerVersions.getOrDefault(player.getUniqueId(), -1); + } + + public static boolean isBedrock(Player player) { + return player.getName().startsWith("."); } public PlayerVersion() { - Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), PLAYER_VERSION_CHANNEL, this); Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + register(); } - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { - if (!channel.equals(PLAYER_VERSION_CHANNEL)) { - return; - } - - final JsonObject payload = GSON.fromJson(new String(bytes), JsonObject.class); - final String version = payload.get("versionName").getAsString(); - playerVersions.put(player, Integer.parseInt(version.split("-")[0].split("\\.")[1])); + @Handler + public void handlePacket(ClientVersionPacket clientVersionPacket) { + playerVersions.put(clientVersionPacket.getPlayer(), clientVersionPacket.getVersion()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerQuit(PlayerQuitEvent event) { - playerVersions.remove(event.getPlayer()); + playerVersions.remove(event.getPlayer().getUniqueId()); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java index 79ed288b..2439d40d 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -27,7 +27,7 @@ public interface WorldEditRendererWrapper { WorldEditRendererWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); static void safeDraw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2) { - if (Core.isBedrockPlayer(player) || PlayerVersion.getVersion(player) < 20) { + if (PlayerVersion.isBedrock(player) || PlayerVersion.getVersion(player) < 20) { fallback.draw(player, scheduled, clipboard, pos1, pos2); } else { impl.draw(player, scheduled, clipboard, pos1, pos2); diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java index c28a8fee..4976213f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java @@ -27,19 +27,27 @@ import com.velocitypowered.api.proxy.server.ServerInfo; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.velocity.platform.VelocityViaConfig; import de.steamwar.messages.Chatter; +import de.steamwar.network.packets.server.ClientVersionPacket; import de.steamwar.persistent.Subserver; +import de.steamwar.velocitycore.network.NetworkSender; public class VersionAnnouncer extends BasicListener { @Subscribe public void postConnect(ServerConnectedEvent e) { ServerInfo server = e.getServer().getServerInfo(); - if(!Subserver.isBuild(Subserver.getSubserver(server))) - return; - Player player = e.getPlayer(); int serverVersion = ((VelocityViaConfig) Via.getConfig()).getVelocityServerProtocols().get(server.getName()); - if(Via.getAPI().getPlayerVersion(player) == serverVersion) + + int playerVersion = Via.getAPI().getPlayerVersion(player); + String version = ProtocolVersion.getProtocolVersion(playerVersion).getVersionIntroducedIn(); + // PluginChannel 'vv:proxy_details' from ViaVersion apparently does not work any longer! + NetworkSender.send(player, new ClientVersionPacket(player.getUniqueId(), Integer.parseInt(version.split("-")[0].split("\\.")[1]))); + + if(playerVersion == serverVersion) + return; + + if(!Subserver.isBuild(Subserver.getSubserver(server))) return; player.sendActionBar(Chatter.of(player).parse("SERVER_VERSION", ProtocolVersion.getProtocolVersion(serverVersion).getMostRecentSupportedVersion()));