From 41dd2d69d028b71ae022b62da1c584d937a4d529 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Wed, 15 Jun 2022 11:54:36 -0400 Subject: [PATCH] Add `subservers:input` for 1.19+ This is a simple plugin message channel that simulates chat spoofing. --- .../ME1312/SubServers/Bungee/SubCommand.java | 10 +++++--- .../ME1312/SubServers/Bungee/SubProxy.java | 3 ++- .../SubServers/Client/Bukkit/SubPlugin.java | 10 +++++++- SubServers.Client/Bukkit/src/plugin.yml | 2 +- .../SubServers/Client/Sponge/SubPlugin.java | 23 ++++++++++++++----- .../net/ME1312/SubServers/Host/ExHost.java | 2 +- .../net/ME1312/SubServers/Sync/ExProxy.java | 3 ++- .../ME1312/SubServers/Sync/SubCommand.java | 10 +++++--- SubServers.Sync/velocity/pom.xml | 2 +- .../ME1312/SubServers/Velocity/ExProxy.java | 3 ++- .../SubServers/Velocity/SubCommand.java | 12 +++++++--- 11 files changed, 58 insertions(+), 22 deletions(-) diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index b4e6e767..43076a13 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -671,9 +672,12 @@ public final class SubCommand extends Command implements TabExecutor { sender.sendMessages(printHelp()); } } else { - String str = label; - for (String arg : args) str += ' ' + arg; - ((ProxiedPlayer) sender).chat(str); + ProxiedPlayer player = (ProxiedPlayer) sender; + if (player.getPendingConnection().getVersion() < 759) { // player < 1.19 + player.chat((args.length == 0)? label : label + ' ' + String.join(" ", args)); + } else { + player.getServer().sendData("subservers:input", ((args.length == 0)? label : label + ' ' + String.join(" ", args)).getBytes(StandardCharsets.UTF_8)); + } } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java index f1266a3e..aa8ed873 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java @@ -92,7 +92,7 @@ public final class SubProxy extends BungeeCommon implements Listener { public SubProtocol subprotocol; public SubDataServer subdata = null; public SubServer sudo = null; - public static final Version version = Version.fromString("2.18.2a"); + public static final Version version = Version.fromString("2.19a"); public final Proxy mProxy; public boolean canSudo = false; @@ -724,6 +724,7 @@ public final class SubProxy extends BungeeCommon implements Listener { if (!config.get().getMap("Settings").getStringList("Disabled-Overrides", Collections.emptyList()).contains("/glist")) getPluginManager().registerCommand(plugin, new SubCommand.BungeeList(this, "glist")); + registerChannel("subservers:input"); getPluginManager().registerCommand(plugin, new SubCommand(this, "subservers")); getPluginManager().registerCommand(plugin, new SubCommand(this, "subserver")); getPluginManager().registerCommand(plugin, new SubCommand(this, "sub")); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java index dd36ba84..50c4607f 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java @@ -26,6 +26,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandMap; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.Messenger; import java.io.*; import java.lang.invoke.MethodHandle; @@ -33,6 +34,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.*; @@ -96,7 +98,9 @@ public final class SubPlugin extends JavaPlugin { Files.move(new File(new File(System.getProperty("user.dir")), "subdata.rsa.key").toPath(), new File(dir, "subdata.rsa.key").toPath()); } - getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + Messenger pmc = getServer().getMessenger(); + pmc.registerOutgoingPluginChannel(this, "BungeeCord"); + pmc.registerIncomingPluginChannel(this, "subservers:input", (channel, player, bytes) -> player.chat(new String(bytes, StandardCharsets.UTF_8))); reload(false); subprotocol = SubProtocol.get(); @@ -232,6 +236,10 @@ public final class SubPlugin extends JavaPlugin { subdata.clear(); subdata.put(0, null); if (signs != null) signs.save(); + + Messenger pmc = getServer().getMessenger(); + pmc.unregisterOutgoingPluginChannel(this); + pmc.unregisterIncomingPluginChannel(this); } catch (IOException | InterruptedException e) { e.printStackTrace(); } diff --git a/SubServers.Client/Bukkit/src/plugin.yml b/SubServers.Client/Bukkit/src/plugin.yml index 032aa982..f83cc492 100644 --- a/SubServers.Client/Bukkit/src/plugin.yml +++ b/SubServers.Client/Bukkit/src/plugin.yml @@ -1,6 +1,6 @@ name: SubServers-Client-Bukkit main: net.ME1312.SubServers.Client.Bukkit.SubPlugin -version: "2.18.2a" +version: "2.19a" authors: ["ME1312"] softdepend: [TitleAPI, PlaceholderAPI] website: "https://github.com/ME1312/SubServers-2" diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java index 4a845426..be24968a 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java @@ -27,6 +27,7 @@ import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameInitializationEvent; import org.spongepowered.api.event.game.state.GamePreInitializationEvent; +import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.event.game.state.GameStoppingEvent; import org.spongepowered.api.network.ChannelBinding; import org.spongepowered.api.plugin.Plugin; @@ -47,7 +48,7 @@ import static net.ME1312.SubServers.Client.Sponge.Library.AccessMode.NO_COMMANDS /** * SubServers Client Plugin Class */ -@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.18.2a", url = "https://github.com/ME1312/SubServers-2", description = "Take control of the server manager — from your servers") +@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.19a", url = "https://github.com/ME1312/SubServers-2", description = "Take control of the server manager — from your servers") public final class SubPlugin { HashMap subdata = new HashMap(); Pair>> lang = null; @@ -66,14 +67,15 @@ public final class SubPlugin { @Inject public Game game; boolean running = false; + private boolean posted = false; private long resetDate = 0; private boolean reconnect = false; @Listener - public void setup(GamePreInitializationEvent event) { + public void enable(GamePreInitializationEvent event) { if (plugin.getVersion().isPresent()) { version = Version.fromString(plugin.getVersion().get()); - } else version = new Version("Custom"); + } else version = new Version("?"); subdata.put(0, null); } @@ -136,12 +138,23 @@ public final class SubPlugin { reconnect = true; log.info(" "); log.info("Connecting to /" + config.get().getMap("Settings").getMap("SubData").getString("Address", "127.0.0.1:4391")); - connect(null); + if (posted) connect(null); //gui = new InternalUIHandler(this); if (api.access.value > NO_COMMANDS.value && !config.get().getMap("Settings").getBoolean("API-Only-Mode", false)) { Sponge.getCommandManager().register(plugin, new SubCommand(this).spec(), "sub", "subserver", "subservers"); } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Listener + @SuppressWarnings("unchecked") + public void enable(GameStartedServerEvent event) { + if (!posted) try { + posted = true; + connect(null); new Metrics(this); game.getScheduler().createTaskBuilder().async().execute(() -> { @@ -167,8 +180,6 @@ public final class SubPlugin { } } - - public void reload(boolean notifyPlugins) throws IOException { resetDate = Calendar.getInstance().getTime().getTime(); diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java index 89aaf61a..6fedcf5b 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java @@ -42,7 +42,7 @@ import java.util.jar.Manifest; /** * SubServers.Host Main Class */ -@App(name = "SubServers.Host", version = "2.18.2a", authors = "ME1312", website = "https://github.com/ME1312/SubServers-2", description = "Host subservers on separate machines") +@App(name = "SubServers.Host", version = "2.19a", authors = "ME1312", website = "https://github.com/ME1312/SubServers-2", description = "Host subservers on separate machines") public final class ExHost { HashMap subdata = new HashMap(); Pair>> lang = null; diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java index f81fe8f2..2140d939 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java @@ -74,7 +74,7 @@ public final class ExProxy extends BungeeCommon implements Listener { public final Plugin plugin; public final SubAPI api = new SubAPI(this); public SubProtocol subprotocol; - public static final Version version = Version.fromString("2.18.2a"); + public static final Version version = Version.fromString("2.19a"); public final boolean isPatched; public long lastReload = -1; @@ -260,6 +260,7 @@ public final class ExProxy extends BungeeCommon implements Listener { if (!config.get().getMap("Settings").getStringList("Disabled-Overrides", Collections.emptyList()).contains("/glist")) getPluginManager().registerCommand(plugin, new SubCommand.BungeeList(this, "glist")); + registerChannel("subservers:input"); getPluginManager().registerCommand(plugin, new SubCommand(this, "subservers")); getPluginManager().registerCommand(plugin, new SubCommand(this, "subserver")); getPluginManager().registerCommand(plugin, new SubCommand(this, "sub")); diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java index 0e48f20d..009b6bd6 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java @@ -38,6 +38,7 @@ import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -731,9 +732,12 @@ public final class SubCommand extends Command implements TabExecutor { } } } else { - String str = label; - for (String arg : args) str += ' ' + arg; - ((ProxiedPlayer) sender).chat(str); + ProxiedPlayer player = (ProxiedPlayer) sender; + if (player.getPendingConnection().getVersion() < 759) { // player < 1.19 + player.chat((args.length == 0)? label : label + ' ' + String.join(" ", args)); + } else { + player.getServer().sendData("subservers:input", ((args.length == 0)? label : label + ' ' + String.join(" ", args)).getBytes(StandardCharsets.UTF_8)); + } } } diff --git a/SubServers.Sync/velocity/pom.xml b/SubServers.Sync/velocity/pom.xml index 13f8c891..abbe47a7 100644 --- a/SubServers.Sync/velocity/pom.xml +++ b/SubServers.Sync/velocity/pom.xml @@ -28,7 +28,7 @@ com.velocitypowered velocity-api - 3.0.0 + 3.1.0-SNAPSHOT provided diff --git a/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/ExProxy.java b/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/ExProxy.java index f6ae17ef..da2a3e82 100644 --- a/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/ExProxy.java +++ b/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/ExProxy.java @@ -64,7 +64,7 @@ import java.nio.charset.Charset; import java.util.*; import java.util.concurrent.TimeUnit; -@Plugin(id = "subservers-sync", name = "SubServers-Sync", authors = "ME1312", version = "2.18.2a", url = "https://github.com/ME1312/SubServers-2", description = "Dynamically sync player and server connection info over multiple proxy instances") +@Plugin(id = "subservers-sync", name = "SubServers-Sync", authors = "ME1312", version = "2.19a", url = "https://github.com/ME1312/SubServers-2", description = "Dynamically sync player and server connection info over multiple proxy instances") public class ExProxy { HashMap subdata = new HashMap(); @@ -225,6 +225,7 @@ public class ExProxy { if (!config.get().getMap("Settings").getStringList("Disabled-Overrides", Collections.emptyList()).contains("/glist")) proxy.getCommandManager().register("glist", new SubCommand.BungeeList(this)); + proxy.getChannelRegistrar().register(SubCommand.pmc); proxy.getCommandManager().register("subservers", new SubCommand(this), "subserver", "sub"); if (config.get().getMap("Settings").getMap("Smart-Fallback", new ObjectMap<>()).getBoolean("Enabled", true)) diff --git a/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/SubCommand.java b/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/SubCommand.java index 09a82b48..1f8643bc 100644 --- a/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/SubCommand.java +++ b/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/SubCommand.java @@ -29,6 +29,7 @@ import com.velocitypowered.api.command.SimpleCommand; import com.velocitypowered.api.proxy.ConsoleCommandSource; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerInfo; import net.kyori.adventure.text.Component; @@ -42,6 +43,7 @@ import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -49,6 +51,7 @@ import java.util.function.Supplier; @SuppressWarnings("deprecation") public final class SubCommand implements SimpleCommand { + static final MinecraftChannelIdentifier pmc = MinecraftChannelIdentifier.create("subservers", "input"); static HashMap>> permitted = new HashMap>>(); private Map proxyCache = Collections.emptyMap(); private Map hostCache = Collections.emptyMap(); @@ -736,9 +739,12 @@ public final class SubCommand implements SimpleCommand { } } } else { - String str = label; - for (String arg : args) str += ' ' + arg; - ((Player) sender).spoofChatInput(str); + Player player = (Player) sender; + if (player.getProtocolVersion().getProtocol() < 759) { // player < 1.19 + player.spoofChatInput((args.length == 0)? label : label + ' ' + String.join(" ", args)); + } else { + player.getCurrentServer().ifPresent(server -> server.sendPluginMessage(pmc, ((args.length == 0)? label : label + ' ' + String.join(" ", args)).getBytes(StandardCharsets.UTF_8))); + } } }