From c6ccaa6abb4354a0547d3297dc5fe234aff6ee9b Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Fri, 5 Apr 2024 19:33:34 +0200 Subject: [PATCH 1/3] A Starting point --- build.gradle | 18 +- settings.gradle | 2 +- src/de/steamwar/bungeecore/Broadcaster.java | 11 +- src/de/steamwar/bungeecore/EventStarter.java | 11 +- src/de/steamwar/bungeecore/Message.java | 43 ++--- src/de/steamwar/bungeecore/Node.java | 10 +- src/de/steamwar/bungeecore/ServerStarter.java | 34 ++-- .../steamwar/bungeecore/SubserverSystem.java | 10 +- .../{BungeeCore.java => VelocityCore.java} | 158 ++++++++---------- .../steamwar/bungeecore/bot/AuthManager.java | 6 +- .../bungeecore/bot/SteamwarDiscordBot.java | 10 +- .../bot/listeners/DiscordTicketListener.java | 4 +- .../bot/listeners/PrivateMessageListener.java | 4 +- .../bungeecore/commands/BauCommand.java | 8 +- .../commands/BuilderCloudCommand.java | 6 +- .../bungeecore/commands/CheckCommand.java | 6 +- .../bungeecore/commands/EventCommand.java | 2 +- .../bungeecore/commands/GDPRQuery.java | 4 +- .../bungeecore/commands/KickCommand.java | 4 +- .../commands/PunishmentCommand.java | 4 +- .../bungeecore/commands/TutorialCommand.java | 8 +- .../bungeecore/commands/VerifyCommand.java | 4 +- .../bungeecore/listeners/BanListener.java | 10 +- .../bungeecore/listeners/BasicListener.java | 31 ---- .../bungeecore/listeners/ChatListener.java | 5 +- .../listeners/ConnectionListener.java | 4 +- .../bungeecore/listeners/IPSanitizer.java | 4 +- .../bungeecore/listeners/PluginMessage.java | 63 +++---- .../bungeecore/listeners/SessionManager.java | 4 +- .../listeners/SettingsChangedListener.java | 4 +- src/de/steamwar/bungeecore/mods/FML.java | 6 +- src/de/steamwar/bungeecore/mods/FML2.java | 10 +- .../bungeecore/mods/FabricModSender.java | 4 +- src/de/steamwar/bungeecore/mods/Hostname.java | 30 ++-- src/de/steamwar/bungeecore/mods/LabyMod.java | 4 +- src/de/steamwar/bungeecore/mods/Lunar.java | 4 +- src/de/steamwar/bungeecore/mods/ModUtils.java | 6 +- .../steamwar/bungeecore/mods/ReplayMod.java | 4 +- .../bungeecore/mods/ServerListPing.java | 67 +++++--- .../network/handlers/EloPlayerHandler.java | 4 +- .../handlers/InventoryCallbackHandler.java | 4 +- .../bungeecore/tablist/TablistManager.java | 4 +- .../bungeecore/util/SteamWarModule.java | 49 ++++++ .../bungeecore/util/annotations/Create.java | 31 ++++ .../steamwar/command/CommandRegistering.java | 13 +- src/de/steamwar/command/SWCommand.java | 57 +++---- src/de/steamwar/command/TypeMapper.java | 6 +- src/de/steamwar/messages/ChatSender.java | 116 ++++++------- .../messages/SteamwarResourceBundle.java | 21 ++- src/de/steamwar/sql/SQLConfigImpl.java | 4 +- src/de/steamwar/sql/SQLWrapperImpl.java | 4 +- 51 files changed, 498 insertions(+), 442 deletions(-) rename src/de/steamwar/bungeecore/{BungeeCore.java => VelocityCore.java} (67%) delete mode 100644 src/de/steamwar/bungeecore/listeners/BasicListener.java create mode 100644 src/de/steamwar/bungeecore/util/SteamWarModule.java create mode 100644 src/de/steamwar/bungeecore/util/annotations/Create.java diff --git a/build.gradle b/build.gradle index c88301d..885077d 100644 --- a/build.gradle +++ b/build.gradle @@ -38,8 +38,8 @@ version '' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 17 +targetCompatibility = 17 mainClassName = '' @@ -58,13 +58,17 @@ sourceSets { repositories { mavenCentral() maven { - url 'https://m2.dv8tion.net/releases' + name = 'papermc' + url = 'https://repo.papermc.io/repository/maven-public/' + } + maven { + url = 'https://m2.dv8tion.net/releases' content { includeGroup 'net.dv8tion' } } maven { - url 'https://repo.lunarclient.dev' + url = 'https://repo.lunarclient.dev' content { includeGroup 'com.lunarclient' } @@ -86,7 +90,9 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.22' testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' - compileOnly 'de.steamwar:waterfall:RELEASE' + compileOnly 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT' + annotationProcessor 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT' + compileOnly 'de.steamwar:persistentbungeecore:RELEASE' implementation("net.dv8tion:JDA:4.4.0_352") { exclude module: 'opus-java' @@ -96,4 +102,6 @@ dependencies { implementation 'com.lunarclient:apollo-api:1.1.0' implementation 'com.lunarclient:apollo-common:1.1.0' + + implementation 'org.reflections:reflections:0.10.2' } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index ca75fd7..aab2ecd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -26,6 +26,6 @@ pluginManagement { } } -rootProject.name = 'BungeeCore' +rootProject.name = 'VelocityCore' include 'CommonCore' \ No newline at end of file diff --git a/src/de/steamwar/bungeecore/Broadcaster.java b/src/de/steamwar/bungeecore/Broadcaster.java index 3020d01..c084347 100644 --- a/src/de/steamwar/bungeecore/Broadcaster.java +++ b/src/de/steamwar/bungeecore/Broadcaster.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore; -import net.md_5.bungee.api.ProxyServer; +import de.steamwar.messages.ChatSender; import java.util.concurrent.TimeUnit; @@ -29,14 +29,15 @@ class Broadcaster { private int lastBroadCast = 0; Broadcaster(){ - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { - if(!ProxyServer.getInstance().getPlayers().isEmpty() && broadCastMsgs.length > 0) - BungeeCore.broadcast(BungeeCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]); + VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> { + if(!VelocityCore.get().getProxyServer().getAllPlayers().isEmpty() && broadCastMsgs.length > 0) { + VelocityCore.broadcast(VelocityCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]); + } lastBroadCast++; if(lastBroadCast == broadCastMsgs.length){ lastBroadCast = 0; } - }, 10, 10, TimeUnit.MINUTES); + }).repeat(10, TimeUnit.MINUTES); } static void setBroadCastMsgs(String[] broadCastMsgs) { diff --git a/src/de/steamwar/bungeecore/EventStarter.java b/src/de/steamwar/bungeecore/EventStarter.java index 60ad454..6400518 100644 --- a/src/de/steamwar/bungeecore/EventStarter.java +++ b/src/de/steamwar/bungeecore/EventStarter.java @@ -21,8 +21,7 @@ package de.steamwar.bungeecore; import de.steamwar.sql.EventFight; import de.steamwar.sql.Team; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.ClickEvent; +import net.kyori.adventure.text.event.ClickEvent; import java.sql.Timestamp; import java.util.HashMap; @@ -42,7 +41,7 @@ public class EventStarter { public EventStarter() { EventFight.loadAllComingFights(); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), this::run, 1, 10, TimeUnit.SECONDS); + VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), this::run).repeat(10, TimeUnit.SECONDS); } public static Map getEventServer() { @@ -59,7 +58,7 @@ public class EventStarter { Team red = Team.get(next.getTeamRed()); //Don't start EventServer if not the event bungee - if(BungeeCore.EVENT_MODE || next.getSpectatePort() == 0) { + if(VelocityCore.EVENT_MODE || next.getSpectatePort() == 0) { ServerStarter starter = new ServerStarter().event(next); starter.callback(subserver -> { @@ -68,10 +67,10 @@ public class EventStarter { }).start(); Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER", - new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); + ClickEvent.runCommand("/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); } else { Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER", - new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/" + spectatePorts.get(next.getSpectatePort())), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); + ClickEvent.runCommand("/" + spectatePorts.get(next.getSpectatePort())), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); } } } diff --git a/src/de/steamwar/bungeecore/Message.java b/src/de/steamwar/bungeecore/Message.java index 683b9ed..876353a 100644 --- a/src/de/steamwar/bungeecore/Message.java +++ b/src/de/steamwar/bungeecore/Message.java @@ -19,12 +19,13 @@ package de.steamwar.bungeecore; +import com.velocitypowered.api.command.CommandSource; import de.steamwar.messages.ChatSender; import de.steamwar.messages.SteamwarResourceBundle; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.text.DateFormat; import java.text.MessageFormat; @@ -35,17 +36,17 @@ import java.util.ResourceBundle; public class Message { @Deprecated - public static TextComponent parseToComponent(String message, boolean prefixed, CommandSender sender, Object... params){ - return new TextComponent(TextComponent.fromLegacyText(parse(message, prefixed, locale(sender), params))); + public static Component parseToComponent(String message, boolean prefixed, CommandSource sender, Object... params){ + return LegacyComponentSerializer.legacySection().deserialize(parse(message, prefixed, locale(sender), params)); } @Deprecated - public static String parsePrefixed(String message, CommandSender sender, Object... params){ + public static String parsePrefixed(String message, CommandSource sender, Object... params){ return parse(message, true, locale(sender), params); } @Deprecated - public static String parse(String message, CommandSender sender, Object... params){ + public static String parse(String message, CommandSource sender, Object... params){ return parse(message, false, locale(sender), params); } @@ -55,8 +56,8 @@ public class Message { } @Deprecated - private static Locale locale(CommandSender sender) { - return ChatSender.of(sender).getLocale(); + private static Locale locale(CommandSource sender) { + return sender.get(Identity.LOCALE).orElse(Locale.GERMAN); } @Deprecated @@ -82,32 +83,32 @@ public class Message { } @Deprecated - public static void send(String message, CommandSender sender, Object... params){ - send(message, true, sender, ChatMessageType.SYSTEM, null, null, params); + public static void send(String message, CommandSource sender, Object... params){ + send(message, true, sender, null, null, params); } @Deprecated - public static void sendPrefixless(String message, CommandSender sender, Object... params){ - send(message, false, sender, ChatMessageType.SYSTEM, null, null, params); + public static void sendPrefixless(String message, CommandSource sender, Object... params){ + send(message, false, sender, null, null, params); } @Deprecated - public static void send(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){ - send(message, true, sender, ChatMessageType.SYSTEM, onHover, onClick, params); + public static void send(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){ + send(message, true, sender, onHover, onClick, params); } @Deprecated - public static void sendPrefixless(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){ - send(message, false, sender, ChatMessageType.SYSTEM, onHover, onClick, params); + public static void sendPrefixless(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){ + send(message, false, sender, onHover, onClick, params); } @Deprecated - private static void send(String message, boolean prefixed, CommandSender s, ChatMessageType type, String onHover, ClickEvent onClick, Object... params){ + private static void send(String message, boolean prefixed, CommandSource s, String onHover, ClickEvent onClick, Object... params){ ChatSender sender = ChatSender.of(s); - if(type == ChatMessageType.CHAT && !sender.chatShown()) + if(!sender.chatShown()) return; - sender.send(prefixed, type, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params)); + sender.send(prefixed, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params)); } public static void broadcast(String message, Object... params) { diff --git a/src/de/steamwar/bungeecore/Node.java b/src/de/steamwar/bungeecore/Node.java index eb132e2..70727d8 100644 --- a/src/de/steamwar/bungeecore/Node.java +++ b/src/de/steamwar/bungeecore/Node.java @@ -74,7 +74,7 @@ public abstract class Node { protected Node(String hostname) { this.hostname = hostname; nodes.add(this); - BungeeCord.getInstance().getScheduler().schedule(BungeeCore.get(), this::calcLoadLimit, 1, 2, TimeUnit.SECONDS); + VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> calcLoadLimit()).repeat(2, TimeUnit.SECONDS); } public void execute(String... command) { @@ -83,7 +83,7 @@ public abstract class Node { } catch (IOException e) { throw new SecurityException("Could not execute command", e); } catch (InterruptedException e) { - ProxyServer.getInstance().getLogger().log(Level.SEVERE, "Interrupted during execution", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Interrupted during execution", e); Thread.currentThread().interrupt(); } } @@ -155,7 +155,7 @@ public abstract class Node { try (BufferedReader meminfo = new BufferedReader(new InputStreamReader(Files.newInputStream(MEMINFO.toPath())))) { calcLoadLimit(meminfo); } catch (IOException e) { - BungeeCore.get().getLogger().log(Level.SEVERE, "Could not read local load", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could not read local load", e); belowLoadLimit = false; } } @@ -170,7 +170,7 @@ public abstract class Node { public RemoteNode(String hostname) { super(hostname); - BungeeCore.get().getLogger().log(Level.INFO, "Added node " + hostname); + VelocityCore.get().getLogger().log(Level.INFO, "Added node " + hostname); } @Override @@ -207,7 +207,7 @@ public abstract class Node { } } catch (IOException e) { if(belowLoadLimit) - BungeeCore.get().getLogger().log(Level.SEVERE, "Could read remote load", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could read remote load", e); belowLoadLimit = false; } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/src/de/steamwar/bungeecore/ServerStarter.java b/src/de/steamwar/bungeecore/ServerStarter.java index fdea7c1..10c1ebf 100644 --- a/src/de/steamwar/bungeecore/ServerStarter.java +++ b/src/de/steamwar/bungeecore/ServerStarter.java @@ -1,9 +1,9 @@ package de.steamwar.bungeecore; +import com.velocitypowered.api.proxy.Player; import de.steamwar.messages.ChatSender; import de.steamwar.sql.*; import lombok.Getter; -import net.md_5.bungee.api.connection.ProxiedPlayer; import java.io.DataOutputStream; import java.io.File; @@ -19,8 +19,8 @@ import java.util.stream.Collectors; public class ServerStarter { - private static final Portrange BAU_PORTS = BungeeCore.MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200); - private static final Portrange ARENA_PORTS = BungeeCore.MAIN_SERVER ? new Portrange(3000, 3100) : (BungeeCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS); + private static final Portrange BAU_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200); + private static final Portrange ARENA_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(3000, 3100) : (VelocityCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS); private static final String SERVER_PATH = "/servers/"; private static final String USER_HOME = System.getProperty("user.home") + "/"; @@ -50,7 +50,7 @@ public class ServerStarter { private ServerConstructor constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Arenaserver(serverName, gameMode, fightMap, allowMerge, port, builder, shutdownCallback); private Consumer callback = subserver -> {}; - private final Set playersToSend = new HashSet<>(); + private final Set playersToSend = new HashSet<>(); private final Map arguments = new HashMap<>(); public ServerStarter arena(ArenaMode mode, String map) { @@ -68,7 +68,7 @@ public class ServerStarter { public ServerStarter event(EventFight eventFight) { arena(ArenaMode.getByInternal(eventFight.getSpielmodus()), eventFight.getMap()); - node = BungeeCore.local; + node = VelocityCore.local; worldDir = EVENT_PATH; worldCleanup = () -> {}; arguments.put("fightID", String.valueOf(eventFight.getFightID())); @@ -81,7 +81,7 @@ public class ServerStarter { return this; } - public ServerStarter test(ArenaMode mode, String map, ProxiedPlayer owner) { + public ServerStarter test(ArenaMode mode, String map, Player owner) { arena(mode, map); buildWithTemp(owner); portrange = BAU_PORTS; @@ -89,12 +89,12 @@ public class ServerStarter { return send(owner); } - public ServerStarter blueLeader(ProxiedPlayer player) { + public ServerStarter blueLeader(Player player) { arguments.put("blueLeader", player.getUniqueId().toString()); return send(player); } - public ServerStarter redLeader(ProxiedPlayer player) { + public ServerStarter redLeader(Player player) { arguments.put("redLeader", player.getUniqueId().toString()); return send(player); } @@ -133,7 +133,7 @@ public class ServerStarter { startCondition = () -> { Bauserver subserver = Bauserver.get(owner); if(subserver != null) { - for(ProxiedPlayer p : playersToSend) + for(Player p : playersToSend) SubserverSystem.sendPlayer(subserver, p); return false; } @@ -143,7 +143,7 @@ public class ServerStarter { return bauweltMember.isSupervisor(); }); if (!atLeastOneSupervisor) { - for (ProxiedPlayer p : playersToSend) { + for (Player p : playersToSend) { ChatSender.of(p).system("BAU_START_NOT_ALLOWED"); } } @@ -153,7 +153,7 @@ public class ServerStarter { return this; } - public ServerStarter tutorial(ProxiedPlayer owner, Tutorial tutorial) { + public ServerStarter tutorial(Player owner, Tutorial tutorial) { directory = new File(SERVER_PATH, "Tutorial"); buildWithTemp(owner); tempWorld(TUTORIAL_PATH + tutorial.getTutorialId()); @@ -167,7 +167,7 @@ public class ServerStarter { worldCleanup = () -> SubserverSystem.deleteFolder(node, worldDir + worldName); } - private void buildWithTemp(ProxiedPlayer owner) { + private void buildWithTemp(Player owner) { build(owner.getUniqueId()); // Stop existing build server @@ -201,7 +201,7 @@ public class ServerStarter { startCondition = () -> { Builderserver subserver = Builderserver.get(worldName); if (subserver != null) { - for(ProxiedPlayer p : playersToSend) + for(Player p : playersToSend) SubserverSystem.sendPlayer(subserver, p); return false; } @@ -222,7 +222,7 @@ public class ServerStarter { return this; } - public ServerStarter send(ProxiedPlayer player) { + public ServerStarter send(Player player) { playersToSend.add(player); return this; } @@ -242,7 +242,7 @@ public class ServerStarter { if(node == null) { node = Node.getNode(); if(node == null) { - for (ProxiedPlayer p : playersToSend) + for (Player p : playersToSend) ChatSender.of(p).system("SERVER_START_OVERLOAD"); return false; @@ -282,13 +282,13 @@ public class ServerStarter { } private void postStart(Subserver subserver) { - for(ProxiedPlayer p : playersToSend) + for(Player p : playersToSend) SubserverSystem.sendPlayer(subserver, p); callback.accept(subserver); } - private static boolean startingBau(ProxiedPlayer p) { + private static boolean startingBau(Player p) { Bauserver subserver = Bauserver.get(p.getUniqueId()); if(subserver != null && !subserver.isStarted()) { ChatSender.of(p).system("BAU_START_ALREADY"); diff --git a/src/de/steamwar/bungeecore/SubserverSystem.java b/src/de/steamwar/bungeecore/SubserverSystem.java index 71b5809..bea874e 100644 --- a/src/de/steamwar/bungeecore/SubserverSystem.java +++ b/src/de/steamwar/bungeecore/SubserverSystem.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore; +import com.velocitypowered.api.proxy.Player; import de.steamwar.bungeecore.network.NetworkSender; import de.steamwar.bungeecore.network.handlers.FightInfoHandler; import de.steamwar.sql.IgnoreSystem; @@ -37,10 +38,13 @@ public class SubserverSystem { node.execute("rm", "-r", worldName); } - public static void sendDeniedMessage(ProxiedPlayer p, UUID owner){ - ProxiedPlayer o = ProxyServer.getInstance().getPlayer(owner); - if(o == null) + public static void sendDeniedMessage(Player p, UUID owner){ + Player o = VelocityCore.get().getProxyServer().getPlayer(owner).orElse(null); + + if(o == null){ return; + } + if(IgnoreSystem.isIgnored(owner, p.getUniqueId())){ Message.send("SERVER_IGNORED", p); return; diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/VelocityCore.java similarity index 67% rename from src/de/steamwar/bungeecore/BungeeCore.java rename to src/de/steamwar/bungeecore/VelocityCore.java index f6de66b..86db31a 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/VelocityCore.java @@ -19,6 +19,15 @@ package de.steamwar.bungeecore; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyReloadEvent; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.commands.*; @@ -27,6 +36,8 @@ import de.steamwar.bungeecore.mods.ServerListPing; import de.steamwar.bungeecore.mods.*; import de.steamwar.bungeecore.network.BungeeNetworkHandler; import de.steamwar.bungeecore.tablist.TablistManager; +import de.steamwar.bungeecore.util.SteamWarModule; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.command.SWCommandUtils; import de.steamwar.command.SWTypeMapperCreator; import de.steamwar.command.TabCompletionCache; @@ -36,28 +47,23 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.Team; import de.steamwar.sql.UserElo; import de.steamwar.sql.internal.Statement; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; +import lombok.Getter; +import org.reflections.Reflections; import java.io.File; import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.List; +import java.nio.file.Path; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.logging.Level; +import java.util.logging.Logger; -public class BungeeCore extends Plugin { +@Plugin( + id = "velocitycore", + name = "VelocityCore", + authors = {"SteamWar"} +) +public class VelocityCore { public static boolean MAIN_SERVER; @@ -65,35 +71,66 @@ public class BungeeCore extends Plugin { public static String LOBBY_SERVER; public static boolean EVENT_MODE; - private static BungeeCore instance; + private static VelocityCore instance; - public static Node local; private ErrorLogger errorLogger; private TablistManager tablistManager; - @Override - public void onEnable(){ + @Getter + private final ProxyServer proxyServer; + + @Getter + private final Logger logger; + + @Getter + private final Path dataDirectory; + + @Getter + private Injector injector; + + @Inject + public VelocityCore(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataDirectory, Injector injector) { + this.proxyServer = proxyServer; + this.logger = logger; + this.dataDirectory = dataDirectory; + this.injector = injector; + } + + @Subscribe + public void onProxyInitialization(ProxyInitializeEvent event) { setInstance(this); - MAIN_SERVER = ProxyServer.getInstance().getConfig().getListeners().stream().anyMatch(info -> ((InetSocketAddress) info.getSocketAddress()).getPort() == 25565); + MAIN_SERVER = proxyServer.getBoundAddress().getPort() == 25565; loadConfig(); + injector = injector.createChildInjector(new SteamWarModule(this)); + errorLogger = new ErrorLogger(); - SWCommandUtils.init((SWTypeMapperCreator, CommandSender, Object>) (mapper, tabCompleter) -> new TypeMapper() { + SWCommandUtils.init((SWTypeMapperCreator, Player, Object>) (mapper, tabCompleter) -> new TypeMapper() { @Override - public Object map(CommandSender commandSender, String[] previousArguments, String s) { + public Object map(Player commandSender, String[] previousArguments, String s) { return mapper.apply(s); } @Override - public Collection tabCompletes(CommandSender sender, String[] previousArguments, String s) { + public Collection tabCompletes(Player sender, String[] previousArguments, String s) { return tabCompleter.apply(sender, s); } }); - ProxyServer.getInstance().getScheduler().schedule(this, TabCompletionCache::invalidateOldEntries, 1, 1, TimeUnit.SECONDS); + proxyServer.getScheduler().buildTask(this, TabCompletionCache::invalidateOldEntries).repeat(1, TimeUnit.SECONDS); + + Reflections reflections = new Reflections("de.steamwar.bungeecore"); + reflections.getTypesAnnotatedWith(Create.class) + .forEach(clazz -> { + Create create = clazz.getAnnotation(Create.class); + if (create.eventProxy() || MAIN_SERVER) { + Object obj = injector.getInstance(clazz); + if (Arrays.stream(clazz.getDeclaredMethods()).anyMatch(method -> method.isAnnotationPresent(Subscribe.class))) { + proxyServer.getEventManager().register(this, obj); + } + } + }); - new Hostname(); - new ServerListPing(); new PluginMessage(); new Schematica(); new Badlion(); @@ -107,7 +144,6 @@ public class BungeeCore extends Plugin { new CheckListener(); new IPSanitizer(); - local = new Node.LocalNode(); if(MAIN_SERVER) { //new Node.RemoteNode("lx"); } @@ -179,11 +215,11 @@ public class BungeeCore extends Plugin { tablistManager = new TablistManager(); new SettingsChangedListener(); - getProxy().getScheduler().schedule(this, () -> { + proxyServer.getScheduler().buildTask(this, () -> { SteamwarUser.clear(); UserElo.clear(); Team.clear(); - }, 1, 1, TimeUnit.HOURS); + }).repeat(1, TimeUnit.HOURS); if (SteamwarDiscordBotConfig.loaded) { try { @@ -194,8 +230,8 @@ public class BungeeCore extends Plugin { } } - @Override - public void onDisable(){ + @Subscribe + public void onDisable(ProxyReloadEvent event) { if (SteamwarDiscordBotConfig.loaded) { try { SteamwarDiscordBot.instance().getJda().shutdown(); @@ -210,64 +246,10 @@ public class BungeeCore extends Plugin { Statement.closeAll(); } - public static BungeeCore get() { + public static VelocityCore get() { return instance; } - public static TextComponent stringToText(String msg){ - return new TextComponent(TextComponent.fromLegacyText(msg)); - } - public static void send(ProxiedPlayer player, String msg){ - send(player, msg, null, null); - } - public static void send(CommandSender sender, String msg){ - sender.sendMessage(stringToText(msg)); - } - public static void send(ProxiedPlayer player, ChatMessageType type, String msg){ - send(player, type, msg, null, null); - } - public static void send(ProxiedPlayer player, String msg, String onHover, ClickEvent onClick){ - send(player, ChatMessageType.SYSTEM, msg, onHover, onClick); - } - public static void send(ProxiedPlayer player, ChatMessageType type, String msg, String onHover, ClickEvent onClick){ - if(type == ChatMessageType.CHAT && player.getChatMode() != ProxiedPlayer.ChatMode.SHOWN) - return; - TextComponent message = stringToText(msg); - if(onHover != null) - message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover))); - if(onClick != null) - message.setClickEvent(onClick); - player.sendMessage(type, message); - } - public static void broadcast(String msg){ - ProxyServer.getInstance().broadcast(stringToText(msg)); - } - public static void broadcast(String msg, String onHover, ClickEvent onClick){ - TextComponent message = stringToText(msg); - if(onHover != null) - message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover))); - if(onClick != null) - message.setClickEvent(onClick); - ProxyServer.getInstance().broadcast(message); - } - - public static void log(final ServerInfo server, final String msg){ - log(server.getName() + ": " + msg); - } - public static void log(final ProxiedPlayer player, final String msg){ - log(player.getName() + ": " + msg); - } - public static void log(final String msg){ - log(Level.INFO, msg); - } - public static void log(final Level logLevel, final String msg){ - get().getLogger().log(logLevel, msg); - } - public static void log(final String msg, final Throwable e){ - get().getLogger().log(Level.SEVERE, msg, e); - } - - private static void loadConfig(){ Configuration config; try{ @@ -321,7 +303,7 @@ public class BungeeCore extends Plugin { } } - private static void setInstance(BungeeCore core){ + private static void setInstance(VelocityCore core){ instance = core; } } diff --git a/src/de/steamwar/bungeecore/bot/AuthManager.java b/src/de/steamwar/bungeecore/bot/AuthManager.java index 8500f12..dc40faa 100644 --- a/src/de/steamwar/bungeecore/bot/AuthManager.java +++ b/src/de/steamwar/bungeecore/bot/AuthManager.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.bot; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.sql.SteamwarUser; import net.dv8tion.jda.api.MessageBuilder; @@ -46,8 +46,8 @@ public class AuthManager { String code = Base64.getEncoder().encodeToString(randBytes); TOKENS.put(code, member.getIdLong()); - BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag()); - BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES); + VelocityCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag()); + VelocityCore.get().getProxy().getScheduler().schedule(VelocityCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES); return code; } diff --git a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java index 759edcc..9ec0602 100644 --- a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java +++ b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.bot; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.bot.commands.*; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.bot.events.EventManager; @@ -81,7 +81,7 @@ public class SteamwarDiscordBot { } catch (LoginException e) { throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e); } - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { try { jda.awaitReady(); } catch (InterruptedException e) { @@ -90,11 +90,11 @@ public class SteamwarDiscordBot { try { activity(); } catch (Exception e) { - BungeeCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e); } EventManager.update(); SchematicsManager.update(); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { try { activity(); EventManager.update(); @@ -148,7 +148,7 @@ public class SteamwarDiscordBot { } break; case 1: - int count = BungeeCore.get().getProxy().getOnlineCount(); + int count = VelocityCore.get().getProxy().getOnlineCount(); if (count == 1) { jda.getPresence().setActivity(Activity.playing("mit 1 Spieler")); } else { diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java index e41342e..15cb3c2 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.bot.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.bot.config.DiscordTicketType; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; @@ -137,7 +137,7 @@ public class DiscordTicketListener extends BasicDiscordListener { public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { if(event.getChannel().getParent() != null && event.getChannel().getParent().getId().equals(SteamwarDiscordBotConfig.TICKET_CATEGORY)) { if(!event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_CHANNEL) && !event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_LOG)) { - BungeeCore.get().getProxy().getPlayers().forEach(player -> { + VelocityCore.get().getProxy().getPlayers().forEach(player -> { if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return; SteamwarUser user = SteamwarUser.get(player.getUniqueId()); boolean sendMessage; diff --git a/src/de/steamwar/bungeecore/bot/listeners/PrivateMessageListener.java b/src/de/steamwar/bungeecore/bot/listeners/PrivateMessageListener.java index 58800d0..1ef256d 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/PrivateMessageListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/PrivateMessageListener.java @@ -18,7 +18,7 @@ package de.steamwar.bungeecore.bot.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.NodeData; import de.steamwar.sql.Punishment; import de.steamwar.sql.SchematicNode; @@ -72,7 +72,7 @@ public class PrivateMessageListener extends BasicDiscordListener { event.getMessage().reply("`" + name + "` wurde erfolgreich hochgeladen").queue(); } catch (Exception e) { event.getMessage().reply("`" + name + "` konnte nicht hochgeladen werden, bitte versuche es später nochmal oder wende dich an einen Developer").queue(); - BungeeCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"", e); + VelocityCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"", e); } } } diff --git a/src/de/steamwar/bungeecore/commands/BauCommand.java b/src/de/steamwar/bungeecore/commands/BauCommand.java index 9981b71..04c1b39 100644 --- a/src/de/steamwar/bungeecore/commands/BauCommand.java +++ b/src/de/steamwar/bungeecore/commands/BauCommand.java @@ -245,7 +245,7 @@ public class BauCommand extends SWCommand { Message.send("BAU_DELMEMBER_DELETED_TARGET", toRemove, p.getName()); Subserver currentServer = Subserver.getSubserver(toRemove.getServer().getInfo()); if (currentServer != null && currentServer.getType() == Servertype.BAUSERVER && ((Bauserver) currentServer).getOwner().equals(p.getUniqueId())) { - toRemove.connect(ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER)); + toRemove.connect(ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER)); } } Message.send("BAU_DELMEMBER_DELETED", p); @@ -289,12 +289,12 @@ public class BauCommand extends SWCommand { } private static void deleteWorld(ProxiedPlayer player, String world) { - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { Bauserver subserver = Bauserver.get(player.getUniqueId()); if(subserver != null) subserver.stop(); - SubserverSystem.deleteFolder(BungeeCore.local, world); + SubserverSystem.deleteFolder(VelocityCore.local, world); Message.send("BAU_DELETE_DELETED", player); }); } @@ -303,7 +303,7 @@ public class BauCommand extends SWCommand { @Register("testarena") public void testarena(ProxiedPlayer p, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) { FightCommand.createArena(p, "/bau testarena ", false, arenaMode, map, false, (player, mode, m) -> { - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> new ServerStarter().test(mode, m, p).start()); + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> new ServerStarter().test(mode, m, p).start()); }); } diff --git a/src/de/steamwar/bungeecore/commands/BuilderCloudCommand.java b/src/de/steamwar/bungeecore/commands/BuilderCloudCommand.java index 90eb22f..d047a07 100644 --- a/src/de/steamwar/bungeecore/commands/BuilderCloudCommand.java +++ b/src/de/steamwar/bungeecore/commands/BuilderCloudCommand.java @@ -1,7 +1,7 @@ package de.steamwar.bungeecore.commands; import de.steamwar.bungeecore.ArenaMode; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.ServerStarter; import de.steamwar.bungeecore.listeners.ConnectionListener; import de.steamwar.command.SWCommand; @@ -81,8 +81,8 @@ public class BuilderCloudCommand extends SWCommand { return; } - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { - BungeeCore.local.execute("/binarys/deployarena.py", arenaMode.getConfig(), Integer.toString(version.getVersionSuffix()), map); + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { + VelocityCore.local.execute("/binarys/deployarena.py", arenaMode.getConfig(), Integer.toString(version.getVersionSuffix()), map); ArenaMode.init(); ChatSender.of(player).system("BUILDERCLOUD_DEPLOY_FINISHED"); }); diff --git a/src/de/steamwar/bungeecore/commands/CheckCommand.java b/src/de/steamwar/bungeecore/commands/CheckCommand.java index 82ebaa6..daf35dd 100644 --- a/src/de/steamwar/bungeecore/commands/CheckCommand.java +++ b/src/de/steamwar/bungeecore/commands/CheckCommand.java @@ -66,7 +66,7 @@ public class CheckCommand extends SWCommand { public CheckCommand() { super("check", ConnectionListener.CHECK_PERMISSION); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { List schematics = getSchemsToCheck(); if(schematics.size() != currentCheckers.size()) Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size()); @@ -220,7 +220,7 @@ public class CheckCommand extends SWCommand { this.startTime = Timestamp.from(Instant.now()); this.checkList = checkQuestions.get(schematic.getSchemtype()).listIterator(); - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { ArenaMode mode = ArenaMode.getBySchemType(fightTypes.get(schematic.getSchemtype())); if(!new ServerStarter().test(mode, mode.getRandomMap(), checker).check(schematic.getId()).start()) { remove(); @@ -317,7 +317,7 @@ public class CheckCommand extends SWCommand { private void stop(){ currentCheckers.remove(checker.getUniqueId()); currentSchems.remove(schematic.getId()); - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { Bauserver subserver = Bauserver.get(checker.getUniqueId()); if(subserver != null) subserver.stop(); diff --git a/src/de/steamwar/bungeecore/commands/EventCommand.java b/src/de/steamwar/bungeecore/commands/EventCommand.java index fe197e7..863ff56 100644 --- a/src/de/steamwar/bungeecore/commands/EventCommand.java +++ b/src/de/steamwar/bungeecore/commands/EventCommand.java @@ -107,7 +107,7 @@ public class EventCommand extends SWCommand { } } - BungeeCore.send(player, fline.toString()); + VelocityCore.send(player, fline.toString()); } } diff --git a/src/de/steamwar/bungeecore/commands/GDPRQuery.java b/src/de/steamwar/bungeecore/commands/GDPRQuery.java index 0158edf..593f60e 100644 --- a/src/de/steamwar/bungeecore/commands/GDPRQuery.java +++ b/src/de/steamwar/bungeecore/commands/GDPRQuery.java @@ -1,6 +1,6 @@ package de.steamwar.bungeecore.commands; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.sql.internal.Statement; import de.steamwar.sql.SteamwarUser; @@ -31,7 +31,7 @@ public class GDPRQuery extends SWCommand { return; } - BungeeCord.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + BungeeCord.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { try { createZip(player, user); } catch (IOException e) { diff --git a/src/de/steamwar/bungeecore/commands/KickCommand.java b/src/de/steamwar/bungeecore/commands/KickCommand.java index ccaac30..bac7468 100644 --- a/src/de/steamwar/bungeecore/commands/KickCommand.java +++ b/src/de/steamwar/bungeecore/commands/KickCommand.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.commands; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.listeners.ConnectionListener; import de.steamwar.command.SWCommand; @@ -37,7 +37,7 @@ public class KickCommand extends SWCommand { if (message.length == 0) { target.disconnect(Message.parseToComponent("KICK_NORMAL", true, target)); } else { - target.disconnect(BungeeCore.stringToText(BungeeCore.CHAT_PREFIX + "§c" + String.join(" ", message))); + target.disconnect(VelocityCore.stringToText(VelocityCore.CHAT_PREFIX + "§c" + String.join(" ", message))); } Message.send("KICK_CONFIRM", sender, target.getName()); } diff --git a/src/de/steamwar/bungeecore/commands/PunishmentCommand.java b/src/de/steamwar/bungeecore/commands/PunishmentCommand.java index 03a36b3..5b474e3 100644 --- a/src/de/steamwar/bungeecore/commands/PunishmentCommand.java +++ b/src/de/steamwar/bungeecore/commands/PunishmentCommand.java @@ -20,7 +20,7 @@ package de.steamwar.bungeecore.commands; import com.google.gson.JsonParser; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.listeners.ConnectionListener; import de.steamwar.bungeecore.listeners.IPSanitizer; @@ -78,7 +78,7 @@ public class PunishmentCommand { } catch (NoSuchElementException e) { // ignore, player does not exist } catch (IOException e) { - BungeeCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID " + playerName, e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID " + playerName, e); } return null; } diff --git a/src/de/steamwar/bungeecore/commands/TutorialCommand.java b/src/de/steamwar/bungeecore/commands/TutorialCommand.java index d7bce43..3ca240d 100644 --- a/src/de/steamwar/bungeecore/commands/TutorialCommand.java +++ b/src/de/steamwar/bungeecore/commands/TutorialCommand.java @@ -100,7 +100,7 @@ public class TutorialCommand extends SWCommand { return; } else if(own && click.isShiftClick() && click.isRightClick()) { tutorial.delete(); - SubserverSystem.deleteFolder(BungeeCore.local, world(tutorial).getPath()); + SubserverSystem.deleteFolder(VelocityCore.local, world(tutorial).getPath()); openInventory(player, released, own); return; } @@ -151,13 +151,13 @@ public class TutorialCommand extends SWCommand { } subserver.execute("save-all"); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { Tutorial tutorial = Tutorial.create(user.getId(), name, item); File tutorialWorld = world(tutorial); if (tutorialWorld.exists()) - SubserverSystem.deleteFolder(BungeeCore.local, tutorialWorld.getPath()); - ServerStarter.copyWorld(BungeeCore.local, tempWorld.getPath(), tutorialWorld.getPath()); + SubserverSystem.deleteFolder(VelocityCore.local, tutorialWorld.getPath()); + ServerStarter.copyWorld(VelocityCore.local, tempWorld.getPath(), tutorialWorld.getPath()); Message.send("TUTORIAL_CREATED", player); }, 1, TimeUnit.SECONDS); } diff --git a/src/de/steamwar/bungeecore/commands/VerifyCommand.java b/src/de/steamwar/bungeecore/commands/VerifyCommand.java index 4d2cf64..071f1e1 100644 --- a/src/de/steamwar/bungeecore/commands/VerifyCommand.java +++ b/src/de/steamwar/bungeecore/commands/VerifyCommand.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.commands; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.bot.AuthManager; import de.steamwar.sql.SteamwarUser; @@ -52,7 +52,7 @@ public class VerifyCommand extends SWCommand { if(bytes[0] == 'D' && bytes[1] == 'C') { Member member = AuthManager.connectAuth(SteamwarUser.get(sender.getName()), code); if(member != null) { - BungeeCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong()); + VelocityCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong()); Message.send("VERIFY_SUCCESS", sender, member.getUser().getAsTag()); } else { Message.send("VERIFY_INVALID", sender); diff --git a/src/de/steamwar/bungeecore/listeners/BanListener.java b/src/de/steamwar/bungeecore/listeners/BanListener.java index 3cb9f0f..9bc5262 100644 --- a/src/de/steamwar/bungeecore/listeners/BanListener.java +++ b/src/de/steamwar/bungeecore/listeners/BanListener.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.commands.PunishmentCommand; import de.steamwar.bungeecore.commands.WebpasswordCommand; @@ -42,8 +42,8 @@ public class BanListener extends BasicListener { @EventHandler public void onLogin(LoginEvent event) { - event.registerIntent(BungeeCore.get()); - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + event.registerIntent(VelocityCore.get()); + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { PendingConnection connection = event.getConnection(); SteamwarUser user = SteamwarUser.getOrCreate(connection.getUniqueId(), connection.getName(), ConnectionListener::newPlayer, WebpasswordCommand::changeUsername); String ip = IPSanitizer.getTrueAddress(connection).getHostAddress(); @@ -51,7 +51,7 @@ public class BanListener extends BasicListener { event.setCancelled(true); BannedUserIPs.banIP(user.getId(), ip); ChatSender.of(event).system(PunishmentCommand.punishmentMessage(user, Punishment.PunishmentType.Ban)); - event.completeIntent(BungeeCore.get()); + event.completeIntent(VelocityCore.get()); return; } @@ -88,7 +88,7 @@ public class BanListener extends BasicListener { )); } - event.completeIntent(BungeeCore.get()); + event.completeIntent(VelocityCore.get()); }); } } diff --git a/src/de/steamwar/bungeecore/listeners/BasicListener.java b/src/de/steamwar/bungeecore/listeners/BasicListener.java deleted file mode 100644 index 5c20d17..0000000 --- a/src/de/steamwar/bungeecore/listeners/BasicListener.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - 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.bungeecore.listeners; - -import de.steamwar.bungeecore.BungeeCore; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.plugin.Listener; - -public abstract class BasicListener implements Listener { - - public BasicListener(){ - ProxyServer.getInstance().getPluginManager().registerListener(BungeeCore.get(), this); - } -} diff --git a/src/de/steamwar/bungeecore/listeners/ChatListener.java b/src/de/steamwar/bungeecore/listeners/ChatListener.java index 2158fff..d59b07b 100644 --- a/src/de/steamwar/bungeecore/listeners/ChatListener.java +++ b/src/de/steamwar/bungeecore/listeners/ChatListener.java @@ -27,7 +27,6 @@ import de.steamwar.bungeecore.util.Chat19; import de.steamwar.messages.ChatSender; import de.steamwar.network.packets.server.PingPacket; import de.steamwar.sql.*; -import net.md_5.bungee.api.*; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.TabCompleteEvent; @@ -58,7 +57,7 @@ public class ChatListener extends BasicListener { if (message.contains("jndi:ldap")) { SteamwarUser user = SteamwarUser.get(player.getUniqueId()); PunishmentCommand.ban(user, Punishment.PERMA_TIME, "Versuchte Exploit-Ausnutzung", SteamwarUser.get(-1), true); - BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen jndi:ldap gebannt."); + VelocityCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen jndi:ldap gebannt."); return; } @@ -192,7 +191,7 @@ public class ChatListener extends BasicListener { TaskScheduler scheduler = ProxyServer.getInstance().getScheduler(); for(int i = 0; i < delay.length; i++) { int finalI = i; - scheduler.schedule(BungeeCore.get(), () -> sender.prefixless("CHAT_MSG", name, sender.user(), new Message(baseMessage + (finalI+1))), delay[i], TimeUnit.SECONDS); + scheduler.schedule(VelocityCore.get(), () -> sender.prefixless("CHAT_MSG", name, sender.user(), new Message(baseMessage + (finalI+1))), delay[i], TimeUnit.SECONDS); } } diff --git a/src/de/steamwar/bungeecore/listeners/ConnectionListener.java b/src/de/steamwar/bungeecore/listeners/ConnectionListener.java index 6cafdb0..3de874a 100644 --- a/src/de/steamwar/bungeecore/listeners/ConnectionListener.java +++ b/src/de/steamwar/bungeecore/listeners/ConnectionListener.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Subserver; @@ -142,7 +142,7 @@ public class ConnectionListener extends BasicListener { } } - ServerInfo kickTo = ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER); + ServerInfo kickTo = ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER); if (kickedFrom != null && kickedFrom.equals(kickTo)) { return; diff --git a/src/de/steamwar/bungeecore/listeners/IPSanitizer.java b/src/de/steamwar/bungeecore/listeners/IPSanitizer.java index 9396a27..4cf33fb 100644 --- a/src/de/steamwar/bungeecore/listeners/IPSanitizer.java +++ b/src/de/steamwar/bungeecore/listeners/IPSanitizer.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.connection.InitialHandler; @@ -60,7 +60,7 @@ public class IPSanitizer extends BasicListener { @EventHandler public void loginEvent(LoginEvent e) { - BungeeCore.get().getLogger().log(Level.INFO, e.getConnection().getSocketAddress() + " has logged in with user name " + e.getConnection().getName()); + VelocityCore.get().getLogger().log(Level.INFO, e.getConnection().getSocketAddress() + " has logged in with user name " + e.getConnection().getName()); getChannelWrapper(e.getConnection()).setRemoteAddress(sanitized); } } diff --git a/src/de/steamwar/bungeecore/listeners/PluginMessage.java b/src/de/steamwar/bungeecore/listeners/PluginMessage.java index e04723d..89ee68f 100644 --- a/src/de/steamwar/bungeecore/listeners/PluginMessage.java +++ b/src/de/steamwar/bungeecore/listeners/PluginMessage.java @@ -20,26 +20,17 @@ package de.steamwar.bungeecore.listeners; import com.lunarclient.apollo.ApolloManager; -import de.steamwar.bungeecore.BungeeCore; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.commands.TeamCommand; import de.steamwar.bungeecore.mods.*; import de.steamwar.bungeecore.network.ServerMetaInfo; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.messages.ChatSender; import de.steamwar.network.packets.NetworkPacket; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.Unpooled; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.Connection; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.connection.Server; -import net.md_5.bungee.api.event.PluginMessageEvent; -import net.md_5.bungee.connection.InitialHandler; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.protocol.DefinedPacket; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -48,25 +39,16 @@ import java.util.*; import java.util.function.Consumer; import java.util.logging.Level; -public class PluginMessage extends BasicListener { +@Create +public class PluginMessage { - public static void send(ProxiedPlayer player, String legacyChannel, String channel, byte[] data) { + public static void send(Player player, String legacyChannel, String channel, byte[] data) { // 1.12 format change - send(player, player.getPendingConnection().getVersion() > 340 ? channel : legacyChannel, data); + send(player, player.getProtocolVersion().getProtocol() > 340 ? channel : legacyChannel, data); } - public static void send(ProxiedPlayer player, String channel, byte[] data) { - if(((InitialHandler)player.getPendingConnection()).getRegisteredChannels().contains(channel)) - player.sendData(channel, data); - } - - public static byte[] genBufPacket(Consumer generator) { - ByteBuf buf = Unpooled.buffer(); - generator.accept(buf); - - byte[] packet = new byte[buf.readableBytes()]; - buf.readBytes(packet); - return packet; + public static void send(Player player, String channel, byte[] data) { + player.sendPluginMessage(MinecraftChannelIdentifier.from(channel), data); } public static byte[] genStreamPacket(StreamConsumer generator) { @@ -86,14 +68,17 @@ public class PluginMessage extends BasicListener { void accept(DataOutputStream out) throws IOException; } - private static final Parser UNKNOWN = event -> BungeeCore.get().getLogger().log(Level.WARNING, () -> "Undefined PluginMessage on channel " + event.getTag() + " from " + event.getSender() + " received.\n" + new String(event.getData()) + "\n" + Arrays.toString(event.getData())); - private static final Parser PASS_THROUGH = event -> event.setCancelled(false); - private static final Parser DROP = event -> {}; + private static final Parser UNKNOWN = event -> { + VelocityCore.get().getLogger().log(Level.WARNING, () -> "Undefined PluginMessage on channel " + event.getIdentifier().getId() + " from " + (event.getSource() instanceof Player pl ? pl.getUsername() : event.getSource().toString()) + " received.\n" + new String(event.getData()) + "\n" + Arrays.toString(event.getData())); + event.setResult(PluginMessageEvent.ForwardResult.handled()); + }; + private static final Parser PASS_THROUGH = event -> event.setResult(PluginMessageEvent.ForwardResult.forward()); + private static final Parser DROP = event -> event.setResult(PluginMessageEvent.ForwardResult.handled()); private final Lunar lunar = new Lunar(); private final Set knownBrands = new HashSet<>(); - private final Map> channelRegisterHandlers = new HashMap<>(); + private final Map> channelRegisterHandlers = new HashMap<>(); private final Map handlers = new HashMap<>(); public PluginMessage() { @@ -145,8 +130,10 @@ public class PluginMessage extends BasicListener { "noxesium-v1:reset", "noxesium-v1:change_server_rules", "noxesium-v1:server_info", "noxesium-v1:mcc_server", "noxesium-v1:mcc_game_state", "noxesium-v1:reset_server_rules", "noxesium-v1:stop_sound", "noxesium-v1:start_sound", "noxesium-v1:modify_sound" - )) - channelRegisterHandlers.put(channel, player -> {}); + )) { + channelRegisterHandlers.put(channel, player -> { + }); + } channelRegisterHandlers.put(ApolloManager.PLUGIN_MESSAGE_CHANNEL, lunar::sendRestrictions); channelRegisterHandlers.put(Feather.CHANNEL, new Feather()::sendRestrictions); @@ -254,7 +241,7 @@ public class PluginMessage extends BasicListener { ProxiedPlayer player = (ProxiedPlayer) event.getSender(); for(String channel : new String(event.getData()).split("\0")) { - channelRegisterHandlers.getOrDefault(channel, p -> BungeeCore.get().getLogger().log(Level.WARNING, () -> p.getName() + " registered unknown channel " + channel)).accept(player); + channelRegisterHandlers.getOrDefault(channel, p -> VelocityCore.get().getLogger().log(Level.WARNING, () -> p.getName() + " registered unknown channel " + channel)).accept(player); } PASS_THROUGH.handle(event); @@ -274,7 +261,7 @@ public class PluginMessage extends BasicListener { String brand = DefinedPacket.readString(buf); boolean lunarclient = brand.startsWith("lunarclient:"); - BungeeCore.get().getLogger().log(knownBrands.contains(brand) || lunarclient ? Level.INFO : Level.WARNING, () -> player.getName() + " joins with brand: " + brand); + VelocityCore.get().getLogger().log(knownBrands.contains(brand) || lunarclient ? Level.INFO : Level.WARNING, () -> player.getName() + " joins with brand: " + brand); if(lunarclient) lunar.sendRestrictions(player); @@ -313,7 +300,7 @@ public class PluginMessage extends BasicListener { } private Parser async(Parser parser) { - return event -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> parser.handle(event)); + return event -> ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> parser.handle(event)); } private interface Parser { diff --git a/src/de/steamwar/bungeecore/listeners/SessionManager.java b/src/de/steamwar/bungeecore/listeners/SessionManager.java index db5a820..422f4b4 100644 --- a/src/de/steamwar/bungeecore/listeners/SessionManager.java +++ b/src/de/steamwar/bungeecore/listeners/SessionManager.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.Session; import de.steamwar.sql.SteamwarUser; import net.md_5.bungee.api.ProxyServer; @@ -43,7 +43,7 @@ public class SessionManager extends BasicListener { public void onDisconnect(PlayerDisconnectEvent e){ Timestamp timestamp = sessions.remove(e.getPlayer()); if(timestamp != null) { - ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> Session.insertSession(SteamwarUser.get(e.getPlayer().getUniqueId()).getId(), timestamp)); + ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> Session.insertSession(SteamwarUser.get(e.getPlayer().getUniqueId()).getId(), timestamp)); } } } diff --git a/src/de/steamwar/bungeecore/listeners/SettingsChangedListener.java b/src/de/steamwar/bungeecore/listeners/SettingsChangedListener.java index ec11c46..8e42f03 100644 --- a/src/de/steamwar/bungeecore/listeners/SettingsChangedListener.java +++ b/src/de/steamwar/bungeecore/listeners/SettingsChangedListener.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.listeners; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.network.NetworkSender; import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.server.LocaleInvalidationPacket; @@ -32,7 +32,7 @@ public class SettingsChangedListener extends BasicListener { @EventHandler public void onSettingsChanged(SettingsChangedEvent event) { - BungeeCord.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + BungeeCord.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> { ProxiedPlayer player = event.getPlayer(); SteamwarUser user = SteamwarUser.get(player.getUniqueId()); user.setLocale(player.getLocale(), false); diff --git a/src/de/steamwar/bungeecore/mods/FML.java b/src/de/steamwar/bungeecore/mods/FML.java index 1bd7805..c4df2d7 100644 --- a/src/de/steamwar/bungeecore/mods/FML.java +++ b/src/de/steamwar/bungeecore/mods/FML.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.mods; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.sql.Mod; import io.netty.buffer.ByteBuf; @@ -86,8 +86,8 @@ public class FML extends BasicListener { synchronized (unlocked) { unlocked.add(p.getUniqueId()); } - p.disconnect(BungeeCore.stringToText("§7Deine installierten Mods wurden überprüft\n§aDu kannst nun §eSteam§8War §abetreten")); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + p.disconnect(VelocityCore.stringToText("§7Deine installierten Mods wurden überprüft\n§aDu kannst nun §eSteam§8War §abetreten")); + ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { synchronized (unlocked) { unlocked.remove(p.getUniqueId()); } diff --git a/src/de/steamwar/bungeecore/mods/FML2.java b/src/de/steamwar/bungeecore/mods/FML2.java index 68699ad..de899be 100644 --- a/src/de/steamwar/bungeecore/mods/FML2.java +++ b/src/de/steamwar/bungeecore/mods/FML2.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.mods; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.bungeecore.listeners.IPSanitizer; import de.steamwar.bungeecore.listeners.PluginMessage; @@ -81,7 +81,7 @@ public class FML2 extends BasicListener { IPSanitizer.getChannelWrapper(connection).getHandle().pipeline().get(HandlerBoss.class).setHandler(new FML2LoginHandler(event)); - event.registerIntent(BungeeCore.get()); + event.registerIntent(VelocityCore.get()); if(forge) connection.unsafe().sendPacket(new LoginPayloadRequest(1, "forge:login", forgeModListPacket)); else @@ -170,14 +170,14 @@ public class FML2 extends BasicListener { if(!ModUtils.handleMods(event.getConnection().getUniqueId(), Locale.getDefault(), event::setReason, mods)) event.setCancelled(true); - event.completeIntent(BungeeCore.get()); + event.completeIntent(VelocityCore.get()); } private void abort(LoginPayloadResponse response, String error) { event.setReason(TextComponent.fromLegacy(error)); event.setCancelled(true); - event.completeIntent(BungeeCore.get()); - BungeeCore.get().getLogger().log(Level.SEVERE, () -> error + "\n" + response); + event.completeIntent(VelocityCore.get()); + VelocityCore.get().getLogger().log(Level.SEVERE, () -> error + "\n" + response); } } } diff --git a/src/de/steamwar/bungeecore/mods/FabricModSender.java b/src/de/steamwar/bungeecore/mods/FabricModSender.java index d064861..93f54fa 100644 --- a/src/de/steamwar/bungeecore/mods/FabricModSender.java +++ b/src/de/steamwar/bungeecore/mods/FabricModSender.java @@ -22,7 +22,7 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Storage; import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.sql.Mod; @@ -55,7 +55,7 @@ public class FabricModSender extends BasicListener { neededFabricMods.add("fabricloader"); neededQuiltMods.add("quilt_loader"); - BungeeCord.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + BungeeCord.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { synchronized (Storage.fabricExpectPluginMessage) { for (Map.Entry entry : Storage.fabricExpectPluginMessage.entrySet()) { if (!Storage.fabricCheckedPlayers.containsKey(entry.getKey())) { diff --git a/src/de/steamwar/bungeecore/mods/Hostname.java b/src/de/steamwar/bungeecore/mods/Hostname.java index 79b8ebe..f6d9f23 100644 --- a/src/de/steamwar/bungeecore/mods/Hostname.java +++ b/src/de/steamwar/bungeecore/mods/Hostname.java @@ -19,20 +19,19 @@ package de.steamwar.bungeecore.mods; -import de.steamwar.bungeecore.BungeeCore; -import de.steamwar.bungeecore.listeners.BasicListener; -import net.md_5.bungee.api.event.PlayerHandshakeEvent; -import net.md_5.bungee.connection.InitialHandler; -import net.md_5.bungee.event.EventHandler; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyPingEvent; +import de.steamwar.bungeecore.VelocityCore; +import de.steamwar.bungeecore.util.annotations.Create; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; -public class Hostname extends BasicListener { +@Create +public class Hostname { private final Set knownHostnames = new HashSet<>(); - private final Set knownExtraData = new HashSet<>(); public Hostname() { knownHostnames.add("steamwar.de"); @@ -45,22 +44,13 @@ public class Hostname extends BasicListener { knownHostnames.add("wtf.mynx.lol"); //https://discord.com/invite/serverseeker knownHostnames.add("masscan"); knownHostnames.add("aaa"); - - knownExtraData.add(""); - knownExtraData.add("\0FML\0"); - knownExtraData.add("\0FML2\0"); - knownExtraData.add("\0FML3\0"); - knownExtraData.add("\0FORGE"); } - @EventHandler - public void onHandshake(PlayerHandshakeEvent event) { - String hostname = event.getHandshake().getHost().toLowerCase(); - String extraDataInHandshake = ((InitialHandler) event.getConnection()).getExtraDataInHandshake(); + @Subscribe + public void onHandshake(ProxyPingEvent event) { + String hostname = event.getConnection().getVirtualHost().map(inetSocketAddress -> inetSocketAddress.getHostName()).orElse(""); if (!knownHostnames.contains(hostname) && !hostname.endsWith(".steamwar.de")) { - BungeeCore.get().getLogger().log(Level.WARNING, () -> event.getConnection().getSocketAddress() + " connected with unknown hostname " + event.getHandshake() + " " + extraDataInHandshake); - } else if (!knownExtraData.contains(extraDataInHandshake)) { - BungeeCore.get().getLogger().log(Level.WARNING, () -> event.getConnection().getSocketAddress() + " connected with unknown extra data " + event.getHandshake() + " " + extraDataInHandshake); + VelocityCore.get().getLogger().log(Level.WARNING, () -> event.getConnection().getRemoteAddress().toString() + " connected with unknown hostname '" + hostname + "'"); } } } diff --git a/src/de/steamwar/bungeecore/mods/LabyMod.java b/src/de/steamwar/bungeecore/mods/LabyMod.java index cc29995..16f597a 100644 --- a/src/de/steamwar/bungeecore/mods/LabyMod.java +++ b/src/de/steamwar/bungeecore/mods/LabyMod.java @@ -22,7 +22,7 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.listeners.PluginMessage; import de.steamwar.sql.Mod; import io.netty.buffer.ByteBuf; @@ -74,7 +74,7 @@ public class LabyMod { } if(message.has("mods")) { - BungeeCore.get().getLogger().log(Level.WARNING, () -> "LabyMod External Mods for debugging: " + message.getAsJsonArray("mods")); + VelocityCore.get().getLogger().log(Level.WARNING, () -> "LabyMod External Mods for debugging: " + message.getAsJsonArray("mods")); for(JsonElement element : message.getAsJsonArray("mods")) { JsonObject addon = element.getAsJsonObject(); //TODO observe: FORGE and FABRIC mods available, do they always and with .jar? (would equal new mod platform) diff --git a/src/de/steamwar/bungeecore/mods/Lunar.java b/src/de/steamwar/bungeecore/mods/Lunar.java index e2c3f9a..7eb0d29 100644 --- a/src/de/steamwar/bungeecore/mods/Lunar.java +++ b/src/de/steamwar/bungeecore/mods/Lunar.java @@ -32,7 +32,7 @@ import com.lunarclient.apollo.option.Options; import com.lunarclient.apollo.player.AbstractApolloPlayer; import com.lunarclient.apollo.player.v1.ModMessage; import com.lunarclient.apollo.player.v1.PlayerHandshakeMessage; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.Mod; import lombok.AllArgsConstructor; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -94,7 +94,7 @@ public class Lunar { case TYPE_UNSPECIFIED: case UNRECOGNIZED: default: - BungeeCore.get().getLogger().log(Level.INFO, () -> player.getName() + " uses Lunar mod with unknown type " + mod); + VelocityCore.get().getLogger().log(Level.INFO, () -> player.getName() + " uses Lunar mod with unknown type " + mod); break; } } diff --git a/src/de/steamwar/bungeecore/mods/ModUtils.java b/src/de/steamwar/bungeecore/mods/ModUtils.java index 40a1790..e4aad3b 100644 --- a/src/de/steamwar/bungeecore/mods/ModUtils.java +++ b/src/de/steamwar/bungeecore/mods/ModUtils.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.mods; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.commands.PunishmentCommand; import de.steamwar.sql.SteamwarUser; @@ -54,7 +54,7 @@ public class ModUtils { public static boolean handleMods(UUID uuid, Locale locale, Consumer disconnect, List mods){ SteamwarUser user = SteamwarUser.get(uuid); playerModMap.put(uuid,new ArrayList<>(mods)); - BungeeCore.get().getLogger().log(Level.INFO, user.getUserName() + " declares mods: " + mods.stream().map(mod -> mod.getPlatform() + ":" + mod.getModName()).collect(Collectors.joining(" "))); + VelocityCore.get().getLogger().log(Level.INFO, user.getUserName() + " declares mods: " + mods.stream().map(mod -> mod.getPlatform() + ":" + mod.getModName()).collect(Collectors.joining(" "))); ModType max = ModType.YELLOW; Iterator it = mods.iterator(); @@ -83,7 +83,7 @@ public class ModUtils { if(max == ModType.RED) { PunishmentCommand.ban(user, Timestamp.from(Instant.now().plus(7, ChronoUnit.DAYS)), message, SteamwarUser.get(-1), false); - BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen der Mods " + modList + " gebannt."); + VelocityCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen der Mods " + modList + " gebannt."); } disconnect.accept(TextComponent.fromLegacy(message)); diff --git a/src/de/steamwar/bungeecore/mods/ReplayMod.java b/src/de/steamwar/bungeecore/mods/ReplayMod.java index d92a451..a12efed 100644 --- a/src/de/steamwar/bungeecore/mods/ReplayMod.java +++ b/src/de/steamwar/bungeecore/mods/ReplayMod.java @@ -21,7 +21,7 @@ package de.steamwar.bungeecore.mods; import de.steamwar.bungeecore.Bauserver; import de.steamwar.bungeecore.Builderserver; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Subserver; import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.bungeecore.listeners.PluginMessage; @@ -55,7 +55,7 @@ public class ReplayMod extends BasicListener { public void onPlayerJoin(ServerSwitchEvent event) { ProxiedPlayer player = event.getPlayer(); ServerInfo server = player.getServer().getInfo(); - if(ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER) == server) + if(ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER) == server) return; Subserver subserver = Subserver.getSubserver(server); diff --git a/src/de/steamwar/bungeecore/mods/ServerListPing.java b/src/de/steamwar/bungeecore/mods/ServerListPing.java index e774794..330a944 100644 --- a/src/de/steamwar/bungeecore/mods/ServerListPing.java +++ b/src/de/steamwar/bungeecore/mods/ServerListPing.java @@ -20,44 +20,67 @@ package de.steamwar.bungeecore.mods; import com.google.gson.*; -import de.steamwar.bungeecore.listeners.BasicListener; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.ServerPing; +import com.google.inject.Inject; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.ServerPing; +import de.steamwar.bungeecore.util.annotations.Create; import java.lang.reflect.Field; import java.lang.reflect.Type; -public class ServerListPing extends BasicListener implements JsonSerializer, JsonDeserializer { +@Create +public class ServerListPing { // https://github.com/Aizistral-Studios/No-Chat-Reports/discussions/206 // https://github.com/Aizistral-Studios/No-Chat-Reports/wiki/How-to-Get-Safe-Server-Status - private final Gson gson; + @SuppressWarnings("unused") + private final ProxyServer proxyServer; - public ServerListPing() { - BungeeCord bungeeCord = BungeeCord.getInstance(); - gson = bungeeCord.gson; + private static final String[] FIELDS_TO_OVERRIDE = new String[] { + "PRE_1_16_PING_SERIALIZER", + "PRE_1_20_3_PING_SERIALIZER", + "MODERN_PING_SERIALIZER" + }; + + @Inject + public ServerListPing(ProxyServer proxyServer) { + this.proxyServer = proxyServer; try { - Field gsonField = BungeeCord.class.getDeclaredField("gson"); - gsonField.setAccessible(true); - gsonField.set(bungeeCord, gson.newBuilder().registerTypeAdapter(ServerPing.class, this).create()); + for (String fieldName : FIELDS_TO_OVERRIDE) { + Field field = proxyServer.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + Object obj = field.get(null); + if (obj instanceof Gson gsonOld) { + Gson gsonNew = new GsonBuilder() + .registerTypeAdapter(ServerPing.class, new ServerListPingSerializer(gsonOld)) + .create(); + field.set(null, gsonNew); + } else { + throw new SecurityException("Failed to inject ServerListPing in " + fieldName); + } + } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new SecurityException("Failed to inject ServerListPing", e); } } - @Override - public JsonElement serialize(ServerPing ping, Type type, JsonSerializationContext context) { - JsonElement element = gson.toJsonTree(ping, type); + private record ServerListPingSerializer( + Gson gson) implements JsonSerializer, JsonDeserializer { - JsonObject object = element.getAsJsonObject(); - object.addProperty("preventsChatReports", true); + @Override + public JsonElement serialize(ServerPing ping, Type type, JsonSerializationContext context) { + JsonElement element = gson.toJsonTree(ping, type); - return element; - } + JsonObject object = element.getAsJsonObject(); + object.addProperty("preventsChatReports", true); - @Override - public ServerPing deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException { - return gson.fromJson(element, ServerPing.class); - } + return element; + } + + @Override + public ServerPing deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException { + return gson.fromJson(element, ServerPing.class); + } + } } diff --git a/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java b/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java index 18b2f19..7f3582f 100644 --- a/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java @@ -20,7 +20,7 @@ package de.steamwar.bungeecore.network.handlers; import de.steamwar.bungeecore.ArenaMode; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.common.FightEndsPacket; import de.steamwar.sql.SchematicNode; @@ -203,7 +203,7 @@ public class EloPlayerHandler extends PacketHandler { for (int i = 0; i < 40; i++) { BaseComponent[] eloGainComponent = TextComponent.fromLegacyText(color + (int) (eloStep * (i + 1))); int finalI = i; - scheduler.schedule(BungeeCore.get(), () -> { + scheduler.schedule(VelocityCore.get(), () -> { if (player == null) return; if (!player.isConnected()) return; Title title = new BungeeTitle().title(TextComponent.fromLegacyText(getRankup.apply(finalI))).subTitle(eloGainComponent).fadeIn(finalI == 0 ? 5 : 0).stay(40).fadeOut(finalI == 39 ? 5 : 0); diff --git a/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java b/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java index b759f8c..4827dda 100644 --- a/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.network.handlers; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.inventory.InvCallback; import de.steamwar.bungeecore.inventory.SWInventory; import de.steamwar.bungeecore.network.NetworkSender; @@ -42,7 +42,7 @@ public class InventoryCallbackHandler extends PacketHandler { SteamwarUser owner = SteamwarUser.get(packet.getOwner()); InventoryCallbackPacket.CallbackType type = packet.getType(); if(!inventoryHashMap.containsKey(owner.getId())) { - BungeeCore.send(ProxyServer.getInstance().getPlayer(owner.getUUID()), BungeeCore.CHAT_PREFIX + "§cBitte erneut versuchen. Durch ein Softwareupdate konnte die übliche Aktion nicht durchgeführt werden."); + VelocityCore.send(ProxyServer.getInstance().getPlayer(owner.getUUID()), VelocityCore.CHAT_PREFIX + "§cBitte erneut versuchen. Durch ein Softwareupdate konnte die übliche Aktion nicht durchgeführt werden."); if(type == InventoryCallbackPacket.CallbackType.CLICK) { NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).getSender(), new CloseInventoryPacket(owner.getId())); } diff --git a/src/de/steamwar/bungeecore/tablist/TablistManager.java b/src/de/steamwar/bungeecore/tablist/TablistManager.java index 2a02d55..4e56855 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistManager.java +++ b/src/de/steamwar/bungeecore/tablist/TablistManager.java @@ -19,7 +19,7 @@ package de.steamwar.bungeecore.tablist; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Storage; import de.steamwar.bungeecore.Subserver; @@ -50,7 +50,7 @@ public class TablistManager extends BasicListener { private int seconds = 0; public TablistManager() { - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), this::updateTablist, 1, 1, TimeUnit.SECONDS); + ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), this::updateTablist, 1, 1, TimeUnit.SECONDS); synchronized (tablists) { ProxyServer.getInstance().getPlayers().forEach(player -> tablists.put(player, new Tablist(player))); } diff --git a/src/de/steamwar/bungeecore/util/SteamWarModule.java b/src/de/steamwar/bungeecore/util/SteamWarModule.java new file mode 100644 index 0000000..8db72a7 --- /dev/null +++ b/src/de/steamwar/bungeecore/util/SteamWarModule.java @@ -0,0 +1,49 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 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.bungeecore.util; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import de.steamwar.bungeecore.Node; +import de.steamwar.bungeecore.VelocityCore; +import de.steamwar.bungeecore.commands.HelpCommand; +import org.jetbrains.annotations.NotNull; + +public final class SteamWarModule extends AbstractModule { + + private final @NotNull VelocityCore core; + + public SteamWarModule(@NotNull VelocityCore core) { + this.core = core; + } + + @Override + protected void configure() { + bind(VelocityCore.class).toInstance(core); + bind(HelpCommand.class).in(Singleton.class); + } + + @Provides + @Singleton + Node provideNode() { + return new Node.LocalNode(); + } +} diff --git a/src/de/steamwar/bungeecore/util/annotations/Create.java b/src/de/steamwar/bungeecore/util/annotations/Create.java new file mode 100644 index 0000000..9bec88e --- /dev/null +++ b/src/de/steamwar/bungeecore/util/annotations/Create.java @@ -0,0 +1,31 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 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.bungeecore.util.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Create { + boolean eventProxy() default true; +} diff --git a/src/de/steamwar/command/CommandRegistering.java b/src/de/steamwar/command/CommandRegistering.java index b6a4994..57a9694 100644 --- a/src/de/steamwar/command/CommandRegistering.java +++ b/src/de/steamwar/command/CommandRegistering.java @@ -19,19 +19,18 @@ package de.steamwar.command; -import de.steamwar.bungeecore.BungeeCore; +import com.velocitypowered.api.command.Command; +import de.steamwar.bungeecore.VelocityCore; import lombok.experimental.UtilityClass; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.plugin.Command; @UtilityClass class CommandRegistering { - static void unregister(Command command) { - ProxyServer.getInstance().getPluginManager().unregisterCommand(command); + static void unregister(String name) { + VelocityCore.getProxy().getCommandManager().unregister(name); } - static void register(Command command) { - ProxyServer.getInstance().getPluginManager().registerCommand(BungeeCore.get(), command); + static void register(Command command, String name, String... aliases) { + VelocityCore.getProxy().getCommandManager().register(name, command, aliases); } } diff --git a/src/de/steamwar/command/SWCommand.java b/src/de/steamwar/command/SWCommand.java index 83b4d8d..3943c80 100644 --- a/src/de/steamwar/command/SWCommand.java +++ b/src/de/steamwar/command/SWCommand.java @@ -19,29 +19,28 @@ package de.steamwar.command; -import de.steamwar.bungeecore.BungeeCore; +import com.velocitypowered.api.command.Command; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.SimpleCommand; +import com.velocitypowered.api.proxy.Player; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.messages.ChatSender; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; -import net.md_5.bungee.api.plugin.TabExecutor; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.logging.Level; -public class SWCommand extends AbstractSWCommand { +public class SWCommand extends AbstractSWCommand { static { TypeUtils.init(); } + private String name; + private String[] aliases; private String permission; private Command command; @@ -56,8 +55,10 @@ public class SWCommand extends AbstractSWCommand { } protected SWCommand(String command, String permission, String... aliases) { - super(CommandSender.class, command, aliases); + super(CommandSource.class, command, aliases); + this.name = command; this.permission = permission; + this.aliases = aliases; create = true; createAndSafeCommand(command, aliases); unregister(); @@ -69,46 +70,40 @@ public class SWCommand extends AbstractSWCommand { @Override protected void createAndSafeCommand(String command, String[] aliases) { if (!create) return; - this.command = new TabCompletableCommand(command, permission, aliases) { + this.command = new SimpleCommand() { @Override - public void execute(CommandSender commandSender, String[] strings) { - SWCommand.this.execute(commandSender, null, strings); + public void execute(Invocation invocation) { + SWCommand.this.execute(invocation.source(), invocation.alias(), invocation.arguments()); } @Override - public Iterable onTabComplete(CommandSender commandSender, String[] strings) { - return SWCommand.this.tabComplete(commandSender, null, strings); + public List suggest(Invocation invocation) { + return SWCommand.this.tabComplete(invocation.source(), invocation.alias(), invocation.arguments()); } }; } - private abstract static class TabCompletableCommand extends Command implements TabExecutor { - public TabCompletableCommand(String name, String permission, String... aliases) { - super(name, permission, aliases); - } - } - @Override public void unregister() { if (command == null) return; - CommandRegistering.unregister(this.command); + CommandRegistering.unregister(this.name); } @Override public void register() { if (command == null) return; - CommandRegistering.register(this.command); + CommandRegistering.register(command, name, aliases); } @Override - protected void commandSystemError(CommandSender sender, CommandFrameworkException e) { - BungeeCore.get().getLogger().log(Level.SEVERE, e.getMessage(), e); + protected void commandSystemError(Player sender, CommandFrameworkException e) { + VelocityCore.get().getLogger().log(Level.SEVERE, e.getMessage(), e); ChatSender.of(sender).prefixless("COMMAND_SYSTEM_ERROR"); } @Override protected void commandSystemWarning(Supplier message) { - BungeeCore.get().getLogger().log(Level.WARNING, message); + VelocityCore.get().getLogger().log(Level.WARNING, message); } public void addDefaultHelpMessage(String message) { @@ -116,18 +111,18 @@ public class SWCommand extends AbstractSWCommand { } @Override - protected void sendMessage(CommandSender sender, String message, Object[] args) { + protected void sendMessage(Player sender, String message, Object[] args) { ChatSender.of(sender).system(message, args); } @Register(noTabComplete = true) - public void internalHelp(ProxiedPlayer p, String... args) { + public void internalHelp(Player p, String... args) { ChatSender chatSender = ChatSender.of(p); try { chatSender.prefixless("COMMAND_HELP_HEAD", command.getName()); defaultHelpMessages.forEach(chatSender::prefixless); } catch (Exception e) { - BungeeCore.get().getLogger().log(Level.WARNING, "Failed to send help message", e); + VelocityCore.get().getLogger().log(Level.WARNING, "Failed to send help message", e); return; } AtomicInteger atomicInteger = new AtomicInteger(); @@ -156,7 +151,7 @@ public class SWCommand extends AbstractSWCommand { } } - private void send(ChatSender chatSender, SubCommand subCommand) { + private void send(ChatSender chatSender, SubCommand subCommand) { try { for (String s : subCommand.description) { String hover = "§8/§e" + command.getName() + " " + String.join(" ", subCommand.subCommand); @@ -164,7 +159,7 @@ public class SWCommand extends AbstractSWCommand { chatSender.prefixless(s, new Message("PLAIN_STRING", hover), new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, suggest)); } } catch (Exception e) { - BungeeCore.get().getLogger().log(Level.WARNING, "Failed to send description of registered method '" + subCommand.method + "' with description '" + subCommand.description + "'", e); + VelocityCore.get().getLogger().log(Level.WARNING, "Failed to send description of registered method '" + subCommand.method + "' with description '" + subCommand.description + "'", e); } } } diff --git a/src/de/steamwar/command/TypeMapper.java b/src/de/steamwar/command/TypeMapper.java index 1d9cb72..f935da6 100644 --- a/src/de/steamwar/command/TypeMapper.java +++ b/src/de/steamwar/command/TypeMapper.java @@ -19,11 +19,11 @@ package de.steamwar.command; -import net.md_5.bungee.api.CommandSender; +import com.velocitypowered.api.proxy.Player; -public interface TypeMapper extends AbstractTypeMapper { +public interface TypeMapper extends AbstractTypeMapper { /** * The CommandSender can be null! */ - T map(CommandSender commandSender, String[] previousArguments, String s); + T map(Player commandSender, String[] previousArguments, String s); } diff --git a/src/de/steamwar/messages/ChatSender.java b/src/de/steamwar/messages/ChatSender.java index 99916a0..bc4671d 100644 --- a/src/de/steamwar/messages/ChatSender.java +++ b/src/de/steamwar/messages/ChatSender.java @@ -19,35 +19,35 @@ package de.steamwar.messages; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.event.ResultedEvent; +import com.velocitypowered.api.event.connection.LoginEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.player.PlayerSettings; import de.steamwar.bungeecore.*; import de.steamwar.bungeecore.bot.listeners.DiscordChatListener; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.hover.content.Text; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.LoginEvent; -import net.md_5.bungee.command.ConsoleCommandSender; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import java.text.DateFormat; import java.text.MessageFormat; import java.util.Date; import java.util.Locale; import java.util.ResourceBundle; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.logging.Level; import java.util.stream.Stream; public interface ChatSender { - static Stream all() { - return ProxyServer.getInstance().getPlayers().stream(); + static Stream all() { + return VelocityCore.get().getProxyServer().getAllPlayers().stream(); } static Stream allReceivers() { @@ -57,7 +57,7 @@ public interface ChatSender { static Stream globalReceivers() { return all().filter(player -> { Subserver subserver = Subserver.getSubserver(player); - return subserver == null || !(subserver.getType() == Servertype.ARENA && subserver.getServer() == player.getServer().getInfo()); + return subserver == null || !(subserver.getType() == Servertype.ARENA && subserver.getServer() == player.getCurrentServer().get()); }).map(ChatSender::of); } @@ -69,10 +69,10 @@ public interface ChatSender { Locale getLocale(); boolean chatShown(); - void sendMessage(ChatMessageType type, BaseComponent... msg); + void sendMessage(Component msg); default void chat(Message message) { - send(false, ChatMessageType.CHAT, null, null, message); + send(false, null, null, message); } default void system(String format, Object... params) { @@ -80,11 +80,11 @@ public interface ChatSender { } default void system(Message message) { - send(true, ChatMessageType.SYSTEM, null, null, message); + send(true, null, null, message); } default void system(String format, Message onHover, ClickEvent onClick, Object... params) { - send(true, ChatMessageType.SYSTEM, onHover, onClick, new Message(format, params)); + send(true, onHover, onClick, new Message(format, params)); } default void prefixless(String format, Object... params) { @@ -92,20 +92,20 @@ public interface ChatSender { } default void prefixless(String format, Message onHover, ClickEvent onClick, Object... params) { - send(false, ChatMessageType.SYSTEM, onHover, onClick, new Message(format, params)); + send(false, onHover, onClick, new Message(format, params)); } - default void send(boolean prefixed, ChatMessageType type, Message onHover, ClickEvent onClick, Message message) { - TextComponent msg = parseToComponent(prefixed, message); + default void send(boolean prefixed, Message onHover, ClickEvent onClick, Message message) { + Component msg = parseToComponent(prefixed, message); if(onHover != null) - msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(parse(false, onHover)))); + msg = msg.hoverEvent(HoverEvent.showText(parse(false, onHover))); if(onClick != null) - msg.setClickEvent(onClick); - sendMessage(type, msg); + msg = msg.clickEvent(onClick); + sendMessage(msg); } - default TextComponent parseToComponent(boolean prefixed, Message message) { - return new TextComponent(parse(prefixed, message)); + default Component parseToComponent(boolean prefixed, Message message) { + return parse(prefixed, message); } default String parseToPlain(String format, Object... params) { @@ -113,7 +113,7 @@ public interface ChatSender { } default String parseToPlain(Message message) { - return parseToComponent(false, message).toPlainText(); + return PlainTextComponentSerializer.plainText().serialize(parseToComponent(false, message)); } default String parseToLegacy(String format, Object... params) { @@ -121,14 +121,14 @@ public interface ChatSender { } default String parseToLegacy(Message message) { - return parseToComponent(false, message).toLegacyText(); + return LegacyComponentSerializer.legacySection().serialize(parseToComponent(false, message)); } - default BaseComponent[] parse(boolean prefixed, String format, Object... params) { + default Component parse(boolean prefixed, String format, Object... params) { return parse(prefixed, new Message(format, params)); } - default BaseComponent[] parse(boolean prefixed, Message message) { + default Component parse(boolean prefixed, Message message) { Locale locale = getLocale(); ResourceBundle resourceBundle = SteamwarResourceBundle.getResourceBundle(locale); String pattern = ""; @@ -141,20 +141,20 @@ public interface ChatSender { for (int i = 0; i < params.length; i++) { if(params[i] instanceof Message) { params[i] = parseToLegacy((Message) params[i]); - } else if(params[i] instanceof Date) { - params[i] = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale).format((Date) params[i]); + } else if(params[i] instanceof Date d) { + params[i] = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale).format((Date) d); } else if(params[i] instanceof SteamwarUser) { params[i] = ((SteamwarUser) params[i]).getUserName(); - } else if(params[i] instanceof ProxiedPlayer) { - params[i] = ((ProxiedPlayer) params[i]).getName(); - } else if(params[i] instanceof ChatSender) { - params[i] = ((ChatSender) params[i]).user().getUserName(); + } else if(params[i] instanceof Player player) { + params[i] = player.getGameProfile().getName(); + } else if(params[i] instanceof ChatSender cs) { + params[i] = cs.user().getUserName(); } } - return TextComponent.fromLegacyText(format.format(params)); + return LegacyComponentSerializer.legacySection().deserialize(format.format(params)); } - static ChatSender ofProxiedPlayer(ProxiedPlayer player, BiConsumer sendMessage) { + static ChatSender ofProxiedPlayer(Player player, Consumer sendMessage) { return new ChatSender() { @Override public SteamwarUser user() { @@ -168,27 +168,27 @@ public interface ChatSender { @Override public boolean chatShown() { - return player.getChatMode() == ProxiedPlayer.ChatMode.SHOWN; + return player.getPlayerSettings().getChatMode() == PlayerSettings.ChatMode.SHOWN; } @Override - public void sendMessage(ChatMessageType type, BaseComponent... msg) { - sendMessage.accept(type, msg); + public void sendMessage(Component msg) { + sendMessage.accept(msg); } }; } - static ChatSender of(ProxiedPlayer player) { + static ChatSender of(Player player) { return ofProxiedPlayer(player, player::sendMessage); } - static ChatSender disconnect(ProxiedPlayer player) { - return ofProxiedPlayer(player, (type, msg) -> player.disconnect(msg)); + static ChatSender disconnect(Player player) { + return ofProxiedPlayer(player, player::disconnect); } - static ChatSender of(CommandSender sender) { - if(sender instanceof ProxiedPlayer) - return of((ProxiedPlayer) sender); + static ChatSender of(CommandSource sender) { + if(sender instanceof Player player) + return of(player); //Console return new ChatSender() { @@ -208,21 +208,21 @@ public interface ChatSender { } @Override - public void sendMessage(ChatMessageType type, BaseComponent... msg) { + public void sendMessage(Component msg) { sender.sendMessage(msg); } }; } static ChatSender console() { - return of(ConsoleCommandSender.getInstance()); + return of(VelocityCore.get().getProxyServer().getConsoleCommandSource()); } static ChatSender of(LoginEvent event) { return new ChatSender() { @Override public SteamwarUser user() { - return SteamwarUser.get(event.getConnection().getUniqueId()); + return SteamwarUser.get(event.getPlayer().getUniqueId()); } @Override @@ -236,8 +236,8 @@ public interface ChatSender { } @Override - public void sendMessage(ChatMessageType type, BaseComponent... msg) { - event.setCancelReason(msg); + public void sendMessage(Component msg) { + event.setResult(ResultedEvent.ComponentResult.denied(msg)); } }; } @@ -260,11 +260,11 @@ public interface ChatSender { } @Override - public void sendMessage(ChatMessageType type, BaseComponent... msg) { + public void sendMessage(Component msg) { try { - channel.send(" " + new TextComponent(msg).toPlainText()); + channel.send(" " + PlainTextComponentSerializer.plainText().serialize(msg)); } catch (Exception e) { - BungeeCore.get().getLogger().log(Level.SEVERE, "Could not send chat message to discord", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could not send chat message to discord", e); } } }; @@ -288,11 +288,11 @@ public interface ChatSender { } @Override - public void sendMessage(ChatMessageType type, BaseComponent... msg) { + public void sendMessage(Component msg) { try { message.delete().queue(); } catch (Exception e) { - BungeeCore.get().getLogger().log(Level.SEVERE, "Could not send chat reply to discord user", e); + VelocityCore.get().getLogger().log(Level.SEVERE, "Could not send chat reply to discord user", e); } } }; diff --git a/src/de/steamwar/messages/SteamwarResourceBundle.java b/src/de/steamwar/messages/SteamwarResourceBundle.java index 2252609..1836c01 100644 --- a/src/de/steamwar/messages/SteamwarResourceBundle.java +++ b/src/de/steamwar/messages/SteamwarResourceBundle.java @@ -20,6 +20,9 @@ package de.steamwar.messages; import de.steamwar.bungeecore.Message; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.translation.GlobalTranslator; +import net.kyori.adventure.translation.TranslationRegistry; import java.io.IOException; import java.io.InputStream; @@ -27,12 +30,28 @@ import java.util.*; public class SteamwarResourceBundle extends PropertyResourceBundle { + public static final TranslationRegistry registry = TranslationRegistry.create(Key.key("steamwar:i18n")); + + static { + GlobalTranslator.translator().addSource(registry); + } + private static final String BASE_PATH = "/" + "de.steamwar.messages.BungeeCore".replace('.', '/'); + private static final Map localeBundles = new HashMap<>(); + private static final Map bundles = new HashMap<>(); public static ResourceBundle getResourceBundle(Locale locale) { - return getResourceBundle(locale.toString(), getResourceBundle(locale.getLanguage(), getResourceBundle( "", null))); + return getResourceBundleTree(locale); + } + + private static ResourceBundle getResourceBundleTree(Locale locale) { + return localeBundles.computeIfAbsent(locale, locale1 -> { + ResourceBundle bundle = getResourceBundle(locale.toString(), getResourceBundle(locale.getLanguage(), getResourceBundle( "", null))); + registry.registerAll(locale, bundle, true); + return bundle; + }); } private static synchronized ResourceBundle getResourceBundle(String locale, ResourceBundle parent) { diff --git a/src/de/steamwar/sql/SQLConfigImpl.java b/src/de/steamwar/sql/SQLConfigImpl.java index d1e1701..71f8c1e 100644 --- a/src/de/steamwar/sql/SQLConfigImpl.java +++ b/src/de/steamwar/sql/SQLConfigImpl.java @@ -19,7 +19,7 @@ package de.steamwar.sql; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.internal.SQLConfig; import java.util.logging.Logger; @@ -27,7 +27,7 @@ import java.util.logging.Logger; public class SQLConfigImpl implements SQLConfig { @Override public Logger getLogger() { - return BungeeCore.get().getLogger(); + return VelocityCore.get().getLogger(); } @Override diff --git a/src/de/steamwar/sql/SQLWrapperImpl.java b/src/de/steamwar/sql/SQLWrapperImpl.java index 42677c5..8130873 100644 --- a/src/de/steamwar/sql/SQLWrapperImpl.java +++ b/src/de/steamwar/sql/SQLWrapperImpl.java @@ -19,7 +19,7 @@ package de.steamwar.sql; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.commands.CheckCommand; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; @@ -54,7 +54,7 @@ public class SQLWrapperImpl implements SQLWrapper { @Override public void loadSchemTypes(List tmpTypes, Map tmpFromDB) { - File folder = new File(BungeeCore.get().getDataFolder().getParentFile(), "FightSystem"); + File folder = new File(VelocityCore.get().getDataFolder().getParentFile(), "FightSystem"); if(folder.exists()) { for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) { Configuration config; -- 2.39.2 From 153d354c60c45e04f301dd387a2779edd94da8e9 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Thu, 11 Apr 2024 00:22:55 +0200 Subject: [PATCH 2/3] Porta Porting --- build.gradle | 5 + src/de/steamwar/bungeecore/ServerStarter.java | 2 +- .../steamwar/bungeecore/SubserverSystem.java | 7 +- src/de/steamwar/bungeecore/VelocityCore.java | 7 - .../bungeecore/listeners/IPSanitizer.java | 42 +++--- .../bungeecore/listeners/PluginMessage.java | 46 ++++-- src/de/steamwar/bungeecore/mods/Badlion.java | 14 +- .../steamwar/bungeecore/mods/Controlify.java | 14 +- src/de/steamwar/bungeecore/mods/FML.java | 88 ++++++++---- src/de/steamwar/bungeecore/mods/FML2.java | 132 +++++++++--------- .../bungeecore/mods/FabricModSender.java | 55 +++++--- src/de/steamwar/bungeecore/mods/Feather.java | 10 +- src/de/steamwar/bungeecore/mods/LabyMod.java | 27 ++-- src/de/steamwar/bungeecore/mods/Lunar.java | 30 ++-- src/de/steamwar/bungeecore/mods/ModUtils.java | 31 ++-- .../bungeecore/mods/WorldDownloader.java | 6 +- .../bungeecore/network/ServerMetaInfo.java | 2 +- src/de/steamwar/bungeecore/util/BauLock.java | 27 ++-- src/de/steamwar/bungeecore/util/Chat19.java | 29 ++-- .../bungeecore/util/SteamWarModule.java | 10 +- .../steamwar/command/CommandRegistering.java | 55 +++++++- 21 files changed, 399 insertions(+), 240 deletions(-) diff --git a/build.gradle b/build.gradle index 885077d..93dfbab 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,7 @@ repositories { includeGroup 'com.lunarclient' } } + mavenLocal() } shadowJar { @@ -92,6 +93,7 @@ dependencies { compileOnly 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT' annotationProcessor 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT' + compileOnly 'com.velocitypowered:velocity-proxy:3.3.0-SNAPSHOT' compileOnly 'de.steamwar:persistentbungeecore:RELEASE' implementation("net.dv8tion:JDA:4.4.0_352") { @@ -104,4 +106,7 @@ dependencies { implementation 'com.lunarclient:apollo-common:1.1.0' implementation 'org.reflections:reflections:0.10.2' + + compileOnly 'io.netty:netty-buffer:4.1.106.Final' + compileOnly 'io.netty:netty-transport:4.1.106.Final' } \ No newline at end of file diff --git a/src/de/steamwar/bungeecore/ServerStarter.java b/src/de/steamwar/bungeecore/ServerStarter.java index 10c1ebf..7b2fad7 100644 --- a/src/de/steamwar/bungeecore/ServerStarter.java +++ b/src/de/steamwar/bungeecore/ServerStarter.java @@ -68,7 +68,7 @@ public class ServerStarter { public ServerStarter event(EventFight eventFight) { arena(ArenaMode.getByInternal(eventFight.getSpielmodus()), eventFight.getMap()); - node = VelocityCore.local; + node = Node.LocalNode.getNode(); worldDir = EVENT_PATH; worldCleanup = () -> {}; arguments.put("fightID", String.valueOf(eventFight.getFightID())); diff --git a/src/de/steamwar/bungeecore/SubserverSystem.java b/src/de/steamwar/bungeecore/SubserverSystem.java index bea874e..1e3d5a5 100644 --- a/src/de/steamwar/bungeecore/SubserverSystem.java +++ b/src/de/steamwar/bungeecore/SubserverSystem.java @@ -25,9 +25,6 @@ import de.steamwar.bungeecore.network.handlers.FightInfoHandler; import de.steamwar.sql.IgnoreSystem; import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.server.StartingServerPacket; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.UUID; @@ -50,12 +47,12 @@ public class SubserverSystem { return; } - Message.send("SERVER_ADD_MEMBER", o, p.getName()); + Message.send("SERVER_ADD_MEMBER", o, p.getUsername()); Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getName()), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bau addmember " + p.getName())); } - public static void sendPlayer(Subserver subserver, ProxiedPlayer player) { + public static void sendPlayer(Subserver subserver, Player player) { subserver.sendPlayer(player); if(!subserver.hasStarted() && FightInfoHandler.onLobby(player)) NetworkSender.send(player, new StartingServerPacket(SteamwarUser.get(player.getUniqueId()).getId())); diff --git a/src/de/steamwar/bungeecore/VelocityCore.java b/src/de/steamwar/bungeecore/VelocityCore.java index 86db31a..3637240 100644 --- a/src/de/steamwar/bungeecore/VelocityCore.java +++ b/src/de/steamwar/bungeecore/VelocityCore.java @@ -131,13 +131,6 @@ public class VelocityCore { } }); - new PluginMessage(); - new Schematica(); - new Badlion(); - new FabricModSender(); - new ReplayMod(); - new FML2(); - new ConnectionListener(); new ChatListener(); new BanListener(); diff --git a/src/de/steamwar/bungeecore/listeners/IPSanitizer.java b/src/de/steamwar/bungeecore/listeners/IPSanitizer.java index 4cf33fb..fad4489 100644 --- a/src/de/steamwar/bungeecore/listeners/IPSanitizer.java +++ b/src/de/steamwar/bungeecore/listeners/IPSanitizer.java @@ -19,48 +19,56 @@ package de.steamwar.bungeecore.listeners; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.PreLoginEvent; +import com.velocitypowered.api.proxy.InboundConnection; +import com.velocitypowered.proxy.connection.MinecraftConnection; +import com.velocitypowered.proxy.connection.client.InitialInboundConnection; +import com.velocitypowered.proxy.connection.client.LoginInboundConnection; import de.steamwar.bungeecore.VelocityCore; -import net.md_5.bungee.api.connection.PendingConnection; -import net.md_5.bungee.api.event.LoginEvent; -import net.md_5.bungee.connection.InitialHandler; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.netty.ChannelWrapper; import java.lang.reflect.Field; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.logging.Level; -public class IPSanitizer extends BasicListener { +public class IPSanitizer { - private static final Field initialHandlerCh; + private static final Field delegateField; + private static final Field remoteAddressField; static { try { - initialHandlerCh = InitialHandler.class.getDeclaredField("ch"); + delegateField = LoginInboundConnection.class.getDeclaredField("delegate"); + remoteAddressField = MinecraftConnection.class.getDeclaredField("remoteAddress"); } catch (NoSuchFieldException e) { throw new SecurityException("Could not initialize Reflection", e); } - initialHandlerCh.setAccessible(true); + delegateField.setAccessible(true); + remoteAddressField.setAccessible(true); } - public static ChannelWrapper getChannelWrapper(PendingConnection connection) { + public static MinecraftConnection getChannelWrapper(InboundConnection connection) { try { - return (ChannelWrapper) initialHandlerCh.get(connection); + return ((InitialInboundConnection) delegateField.get(connection)).getConnection(); } catch (IllegalAccessException e) { throw new SecurityException("Could not get channel wrapper", e); } } - public static InetAddress getTrueAddress(PendingConnection connection) { - return ((InetSocketAddress) getChannelWrapper(connection).getHandle().remoteAddress()).getAddress(); + public static InetAddress getTrueAddress(InboundConnection connection) { + return ((InetSocketAddress) getChannelWrapper(connection).getRemoteAddress()).getAddress(); } private final InetSocketAddress sanitized = new InetSocketAddress("127.127.127.127", 25565); - @EventHandler - public void loginEvent(LoginEvent e) { - VelocityCore.get().getLogger().log(Level.INFO, e.getConnection().getSocketAddress() + " has logged in with user name " + e.getConnection().getName()); - getChannelWrapper(e.getConnection()).setRemoteAddress(sanitized); + @Subscribe + public void loginEvent(PreLoginEvent e) { + VelocityCore.get().getLogger().log(Level.INFO, e.getConnection().getRemoteAddress().getAddress().toString() + " has logged in with user name " + e.getUsername()); + try { + remoteAddressField.set(getChannelWrapper(e.getConnection()), sanitized); + } catch (IllegalAccessException ex) { + throw new SecurityException("Could not set remote address", ex); + } } } diff --git a/src/de/steamwar/bungeecore/listeners/PluginMessage.java b/src/de/steamwar/bungeecore/listeners/PluginMessage.java index 89ee68f..ae3da20 100644 --- a/src/de/steamwar/bungeecore/listeners/PluginMessage.java +++ b/src/de/steamwar/bungeecore/listeners/PluginMessage.java @@ -19,9 +19,11 @@ package de.steamwar.bungeecore.listeners; +import com.google.inject.Inject; import com.lunarclient.apollo.ApolloManager; import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; @@ -31,10 +33,14 @@ import de.steamwar.bungeecore.network.ServerMetaInfo; import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.messages.ChatSender; import de.steamwar.network.packets.NetworkPacket; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import net.kyori.adventure.text.Component; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Consumer; import java.util.logging.Level; @@ -42,6 +48,12 @@ import java.util.logging.Level; @Create public class PluginMessage { + private final Lunar lunar; + private final LabyMod labyMod; + private final WorldDownloader wdl; + private final FabricModSender fms; + private final FML flm; + public static void send(Player player, String legacyChannel, String channel, byte[] data) { // 1.12 format change send(player, player.getProtocolVersion().getProtocol() > 340 ? channel : legacyChannel, data); @@ -51,6 +63,15 @@ public class PluginMessage { player.sendPluginMessage(MinecraftChannelIdentifier.from(channel), data); } + public static byte[] genBufPacket(Consumer generator) { + ByteBuf buf = Unpooled.buffer(); + generator.accept(buf); + + byte[] packet = new byte[buf.readableBytes()]; + buf.readBytes(packet); + return packet; + } + public static byte[] genStreamPacket(StreamConsumer generator) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(stream); @@ -75,16 +96,17 @@ public class PluginMessage { private static final Parser PASS_THROUGH = event -> event.setResult(PluginMessageEvent.ForwardResult.forward()); private static final Parser DROP = event -> event.setResult(PluginMessageEvent.ForwardResult.handled()); - private final Lunar lunar = new Lunar(); - private final Set knownBrands = new HashSet<>(); private final Map> channelRegisterHandlers = new HashMap<>(); private final Map handlers = new HashMap<>(); - public PluginMessage() { - //TODO interface generalisation - LabyMod labyMod = new LabyMod(); - WorldDownloader wdl = new WorldDownloader(); + @Inject + public PluginMessage(Lunar lunar, LabyMod labyMod, WorldDownloader wdl, FabricModSender fms, FML flm) { + this.lunar = lunar; + this.labyMod = labyMod; + this.wdl = wdl; + this.fms = fms; + this.flm = flm; knownBrands.addAll(Arrays.asList("vanilla", "fabric", "quilt", "forge", "optifine", "Geyser", "labymod", "Feather Fabric")); @@ -136,12 +158,12 @@ public class PluginMessage { } channelRegisterHandlers.put(ApolloManager.PLUGIN_MESSAGE_CHANNEL, lunar::sendRestrictions); - channelRegisterHandlers.put(Feather.CHANNEL, new Feather()::sendRestrictions); - channelRegisterHandlers.put("xaerominimap:main", player -> player.sendMessage(ChatMessageType.SYSTEM, new TextComponent("§n§o§m§i§n§i§m§a§p"))); //https://www.curseforge.com/minecraft/mc-mods/xaeros-minimap + channelRegisterHandlers.put(Feather.CHANNEL.getId(), new Feather()::sendRestrictions); + channelRegisterHandlers.put("xaerominimap:main", player -> player.sendMessage(Component.text("§n§o§m§i§n§i§m§a§p"))); //https://www.curseforge.com/minecraft/mc-mods/xaeros-minimap channelRegisterHandlers.put("litemoretica:init_easy_place", player -> player.disconnect(ChatSender.of(player).parseToComponent(false, new Message("MOD_YELLOW_SING", "litematica")))); //https://github.com/Earthcomputer/litemoretica/tree/master channelRegisterHandlers.put("voxelmap:settings", player -> player.disconnect(ChatSender.of(player).parseToComponent(false, new Message("MOD_YELLOW_SING", "voxelmap")))); //https://modrinth.com/mod/voxelmap-updated undocumented channelRegisterHandlers.put("worldinfo:world_id", player -> player.disconnect(ChatSender.of(player).parseToComponent(false, new Message("MOD_YELLOW_SING", "minimap")))); // JourneyMap and VoxelMap - channelRegisterHandlers.put(Controlify.CHANNEL, new Controlify()::onRegister); + channelRegisterHandlers.put(Controlify.CHANNEL.getId(), new Controlify()::onRegister); registerBiDirPassthrough("worldedit:cui"); @@ -181,9 +203,9 @@ public class PluginMessage { register("minecraft:brand", false, directional(this::steamWarBrand, this::userBrand)); //Needs to be registered cause paper refuses to send PluginMessages on unregistered channels... - register("sw:bridge", true, directional(onlySWSource(async(event -> NetworkPacket.handle(new ServerMetaInfo(((Server) event.getSender()).getInfo()), event.getData()))), UNKNOWN)); + register("sw:bridge", true, directional(onlySWSource(async(event -> NetworkPacket.handle(new ServerMetaInfo(((ServerConnection) event.getSource()).getServerInfo()), event.getData()))), UNKNOWN)); register("sw:hotkeys", false, directional(UNKNOWN, PASS_THROUGH)); - register("fabricmodsender:mods", true, directional(UNKNOWN, async(new FabricModSender()::handlePluginMessage))); + register("fabricmodsender:mods", true, directional(UNKNOWN, async(fms::handlePluginMessage))); register("WDL|INIT", true, directional(UNKNOWN, wdl::handlePluginMessage)); register("wdl:init", true, directional(UNKNOWN, wdl::handlePluginMessage)); @@ -192,7 +214,7 @@ public class PluginMessage { register("LMC", true, directional(UNKNOWN, async(labyMod::handlePluginMessage))); register("labymod3:main", true, directional(UNKNOWN, async(labyMod::handlePluginMessage))); register("labymod:neo", false, directional(UNKNOWN, DROP)); //undocumented, JSON format "0" byte, packetlängen byte, {"version":"4.1.25"} - register(FML.CHANNEL, true, directional(UNKNOWN, async(new FML()::handlePluginMessage))); + register(FML.CHANNEL, true, directional(UNKNOWN, async(flm::handlePluginMessage))); //vanilla does not register any channels (sends only one minecraft:brand vanilla, nothing else (potential spoofed client detection)) //Forge interestingly registers all channels the server registers diff --git a/src/de/steamwar/bungeecore/mods/Badlion.java b/src/de/steamwar/bungeecore/mods/Badlion.java index 4a58f0f..7c6de73 100644 --- a/src/de/steamwar/bungeecore/mods/Badlion.java +++ b/src/de/steamwar/bungeecore/mods/Badlion.java @@ -20,11 +20,13 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonObject; -import de.steamwar.bungeecore.listeners.BasicListener; -import net.md_5.bungee.api.event.PostLoginEvent; -import net.md_5.bungee.event.EventHandler; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.PostLoginEvent; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import de.steamwar.bungeecore.util.annotations.Create; -public class Badlion extends BasicListener { +@Create +public class Badlion { // https://github.com/BadlionClient/BadlionClientModAPI private final byte[] packet; @@ -50,8 +52,8 @@ public class Badlion extends BasicListener { packet = json.toString().getBytes(); } - @EventHandler + @Subscribe public void onPostLogin(PostLoginEvent event) { - event.getPlayer().sendData("badlion:mods", packet); + event.getPlayer().sendPluginMessage(MinecraftChannelIdentifier.from("badlion:mods"), packet); } } diff --git a/src/de/steamwar/bungeecore/mods/Controlify.java b/src/de/steamwar/bungeecore/mods/Controlify.java index 2c24017..6dfded4 100644 --- a/src/de/steamwar/bungeecore/mods/Controlify.java +++ b/src/de/steamwar/bungeecore/mods/Controlify.java @@ -19,16 +19,18 @@ package de.steamwar.bungeecore.mods; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.proxy.protocol.ProtocolUtils; import de.steamwar.bungeecore.listeners.PluginMessage; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.protocol.DefinedPacket; public class Controlify { //https://modrinth.com/mod/controlify //https://github.com/isXander/Controlify/blob/1.20.x/dev/src/main/java/dev/isxander/controlify/server/ServerPolicyPacket.java //https://github.com/isXander/Controlify/blob/1.20.x/dev/src/main/java/dev/isxander/controlify/server/ServerPolicies.java - public static final String CHANNEL = "controlify:server_policy"; + public static final ChannelIdentifier CHANNEL = MinecraftChannelIdentifier.from("controlify:server_policy"); private final byte[][] packets; public Controlify() { @@ -40,13 +42,13 @@ public class Controlify { private byte[] restrict(String name) { return PluginMessage.genBufPacket(buf -> { - DefinedPacket.writeString(name, buf); + ProtocolUtils.writeString(buf, name); buf.writeBoolean(false); }); } - public void onRegister(ProxiedPlayer player) { + public void onRegister(Player player) { for(byte[] packet : packets) - player.sendData(CHANNEL, packet); + player.sendPluginMessage(CHANNEL, packet); } } diff --git a/src/de/steamwar/bungeecore/mods/FML.java b/src/de/steamwar/bungeecore/mods/FML.java index c4df2d7..fe38d83 100644 --- a/src/de/steamwar/bungeecore/mods/FML.java +++ b/src/de/steamwar/bungeecore/mods/FML.java @@ -19,31 +19,68 @@ package de.steamwar.bungeecore.mods; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.ConnectionHandshakeEvent; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.event.connection.PostLoginEvent; +import com.velocitypowered.api.proxy.LoginPhaseConnection; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.proxy.connection.ConnectionType; +import com.velocitypowered.proxy.connection.ConnectionTypes; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; +import com.velocitypowered.proxy.connection.client.InitialInboundConnection; +import com.velocitypowered.proxy.connection.client.LoginInboundConnection; +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import com.velocitypowered.proxy.protocol.packet.HandshakePacket; import de.steamwar.bungeecore.VelocityCore; -import de.steamwar.bungeecore.listeners.BasicListener; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.Mod; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.connection.PendingConnection; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PluginMessageEvent; -import net.md_5.bungee.api.event.PostLoginEvent; -import net.md_5.bungee.connection.InitialHandler; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.protocol.DefinedPacket; +import lombok.SneakyThrows; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.TimeUnit; -public class FML extends BasicListener { +@Create +public class FML { // https://wiki.vg/Minecraft_Forge_Handshake#FML_protocol_.281.7_-_1.12.29 - public static boolean isFML(PendingConnection connection, String type) { - return ((InitialHandler)connection).getExtraDataInHandshake().equals("\0" + type); + private static final Field delegateField; + private static final Field handshakeField; + + static { + try { + delegateField = LoginInboundConnection.class.getDeclaredField("delegate"); + handshakeField = InitialInboundConnection.class.getDeclaredField("handshake"); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } } - public static final String CHANNEL = "FML|HS"; + private final ModUtils utils; + private final ProxyServer proxyServer; + private final VelocityCore core; + + @Inject + public FML(ModUtils utils, ProxyServer proxyServer, VelocityCore core) { + this.utils = utils; + this.proxyServer = proxyServer; + this.core = core; + } + + @SneakyThrows + public static boolean isFML(LoginPhaseConnection connection, String type) { + return handshakeField.get(delegateField.get(connection)) instanceof HandshakePacket packet && packet.getServerAddress().endsWith("\0" + type); + } + + public static final ChannelIdentifier CHANNEL = MinecraftChannelIdentifier.from("FML|HS"); private final byte[] helloPacket = new byte[]{ /* Packet type: ServerHello */ 0, /* FML protocol version */ 2, @@ -52,9 +89,9 @@ public class FML extends BasicListener { private static final Set unlocked = new HashSet<>(); - @EventHandler + @Subscribe public void onPostLogin(PostLoginEvent event) { - ProxiedPlayer player = event.getPlayer(); + Player player = event.getPlayer(); synchronized (unlocked) { if(unlocked.contains(player.getUniqueId())){ @@ -63,35 +100,36 @@ public class FML extends BasicListener { } } - if(isFML(player.getPendingConnection(), "FML\0")) - player.sendData(CHANNEL, helloPacket); + if(((ConnectedPlayer) event.getPlayer()).getConnection().getType() == ConnectionTypes.LEGACY_FORGE) { + player.sendPluginMessage(CHANNEL, helloPacket); + } } public void handlePluginMessage(PluginMessageEvent event) { - ProxiedPlayer p = (ProxiedPlayer) event.getSender(); + Player p = (Player) event.getSource(); ByteBuf buf = Unpooled.wrappedBuffer(event.getData()); if (buf.readByte() == /* ModList */ 2) { - int numMods = DefinedPacket.readVarInt(buf); + int numMods = ProtocolUtils.readVarInt(buf); List mods = new ArrayList<>(); for(int i = 0; i < numMods; i++) { - String name = DefinedPacket.readString(buf); - DefinedPacket.readString(buf); // version + String name = ProtocolUtils.readString(buf); + ProtocolUtils.readString(buf); // version mods.add(Mod.getOrCreate(name, Mod.Platform.FORGE)); } - if (ModUtils.handleMods(p, mods)) { + if (utils.handleMods(p, mods)) { synchronized (unlocked) { unlocked.add(p.getUniqueId()); } - p.disconnect(VelocityCore.stringToText("§7Deine installierten Mods wurden überprüft\n§aDu kannst nun §eSteam§8War §abetreten")); - ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { + p.disconnect(LegacyComponentSerializer.legacySection().deserialize("§7Deine installierten Mods wurden überprüft\n§aDu kannst nun §eSteam§8War §abetreten")); + proxyServer.getScheduler().buildTask(core, () -> { synchronized (unlocked) { unlocked.remove(p.getUniqueId()); } - }, 30, TimeUnit.SECONDS); + }).delay(30, TimeUnit.SECONDS); } } } diff --git a/src/de/steamwar/bungeecore/mods/FML2.java b/src/de/steamwar/bungeecore/mods/FML2.java index de899be..f3d6cec 100644 --- a/src/de/steamwar/bungeecore/mods/FML2.java +++ b/src/de/steamwar/bungeecore/mods/FML2.java @@ -19,29 +19,30 @@ package de.steamwar.bungeecore.mods; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.PreLoginEvent; +import com.velocitypowered.api.proxy.LoginPhaseConnection; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.proxy.connection.client.LoginInboundConnection; +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import com.velocitypowered.proxy.protocol.StateRegistry; import de.steamwar.bungeecore.VelocityCore; -import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.bungeecore.listeners.IPSanitizer; import de.steamwar.bungeecore.listeners.PluginMessage; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.Mod; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.PendingConnection; -import net.md_5.bungee.api.event.LoginEvent; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.netty.HandlerBoss; -import net.md_5.bungee.netty.PacketHandler; -import net.md_5.bungee.protocol.DefinedPacket; -import net.md_5.bungee.protocol.packet.LoginPayloadRequest; -import net.md_5.bungee.protocol.packet.LoginPayloadResponse; +import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; +import java.util.*; import java.util.logging.Level; -public class FML2 extends BasicListener { +@Create +public class FML2 { + + protected final ModUtils modUtils; // FML2: https://wiki.vg/Minecraft_Forge_Handshake#FML2_protocol_.281.13_-_Current.29 // FML3: https://github.com/adde0109/Ambassador/tree/non-api/src/main/java/org/adde0109/ambassador/forge @@ -53,25 +54,27 @@ public class FML2 extends BasicListener { private final byte[] fml3ModListPacket; private final byte[] forgeModListPacket; - public FML2() { + @Inject + public FML2(ModUtils modUtils) { + this.modUtils = modUtils; fml2ModListPacket = generateModListPacket(false); fml3ModListPacket = generateModListPacket(true); forgeModListPacket = PluginMessage.genBufPacket(buf -> { buf.writeByte(0); // Login wrapper packet - DefinedPacket.writeString("forge:handshake", buf); + ProtocolUtils.writeString(buf, "forge:handshake"); ByteBuf packet = Unpooled.buffer(); packet.writeByte(1); // Mod list packet - DefinedPacket.writeVarInt(0, packet); // Mod amount + ProtocolUtils.writeVarInt(packet, 0); // Mod amount - DefinedPacket.writeVarInt(packet.readableBytes(), buf); + ProtocolUtils.writeVarInt(buf, packet.readableBytes()); buf.writeBytes(packet); }); } - @EventHandler - public void onLogin(LoginEvent event) { - PendingConnection connection = event.getConnection(); + @Subscribe + public void onLogin(PreLoginEvent event) { + LoginInboundConnection connection = (LoginInboundConnection) event.getConnection(); boolean fml2 = FML.isFML(connection, "FML2\0"); boolean fml3 = FML.isFML(connection, "FML3\0"); @@ -79,45 +82,49 @@ public class FML2 extends BasicListener { if(!fml2 && !fml3 && !forge) return; - IPSanitizer.getChannelWrapper(connection).getHandle().pipeline().get(HandlerBoss.class).setHandler(new FML2LoginHandler(event)); + FML2LoginHandler handler = new FML2LoginHandler(connection, event.getUniqueId(), forge); - event.registerIntent(VelocityCore.get()); - if(forge) - connection.unsafe().sendPacket(new LoginPayloadRequest(1, "forge:login", forgeModListPacket)); - else - connection.unsafe().sendPacket(new LoginPayloadRequest(1, "fml:loginwrapper", fml3 ? fml3ModListPacket : fml2ModListPacket)); + if(forge) { + ((LoginInboundConnection) event.getConnection()).sendLoginPluginMessage(MinecraftChannelIdentifier.from("forge:login"), forgeModListPacket, handler); + } else { + ((LoginInboundConnection) event.getConnection()).sendLoginPluginMessage(MinecraftChannelIdentifier.from("fml:loginwrapper"), fml3 ? fml3ModListPacket : fml2ModListPacket, handler); + } } private byte[] generateModListPacket(boolean fml3) { return PluginMessage.genBufPacket(buf -> { - DefinedPacket.writeString("fml:handshake", buf); + ProtocolUtils.writeString(buf, "fml:handshake"); ByteBuf packet = Unpooled.buffer(); packet.writeByte(1); // Mod list packet - DefinedPacket.writeVarInt(0, packet); // Mod amount + ProtocolUtils.writeVarInt(packet, 0); // Mod amount if(fml3) { - DefinedPacket.writeVarInt(1, packet); // Channel amount - DefinedPacket.writeString("forge:tier_sorting", packet); - DefinedPacket.writeString("1.0", packet); + ProtocolUtils.writeVarInt(packet,1); // Channel amount + ProtocolUtils.writeString(packet, "forge:tier_sorting"); + ProtocolUtils.writeString(packet, "1.0"); } else { - DefinedPacket.writeVarInt(0, packet); // Channel amount + ProtocolUtils.writeVarInt(packet, 0); // Channel amount } - DefinedPacket.writeVarInt(0, packet); // Registries amount + ProtocolUtils.writeVarInt(packet, 0); // Registries amount if(fml3) - DefinedPacket.writeVarInt(0, packet); // DataPacks amount + ProtocolUtils.writeVarInt(packet, 0); // DataPacks amount - DefinedPacket.writeVarInt(packet.readableBytes(), buf); + ProtocolUtils.writeVarInt(buf, packet.readableBytes()); buf.writeBytes(packet); }); } - private static class FML2LoginHandler extends PacketHandler { - private final LoginEvent event; + private class FML2LoginHandler implements LoginPhaseConnection.MessageConsumer { + private final LoginInboundConnection connection; + private final UUID uuid; + private final boolean forge; - public FML2LoginHandler(LoginEvent event) { - this.event = event; + private FML2LoginHandler(LoginInboundConnection connection, UUID uuid, boolean forge) { + this.connection = connection; + this.uuid = uuid; + this.forge = forge; } @Override @@ -125,59 +132,52 @@ public class FML2 extends BasicListener { return "SteamWar Forge Handler"; } + private void abort(byte[] response, String error) { + + VelocityCore.get().getLogger().log(Level.SEVERE, () -> error + "\n" + Base64.getEncoder().encodeToString(response)); + } + @Override - public void handle(LoginPayloadResponse response) { - boolean forge = FML.isFML(event.getConnection(), "FORGE"); - byte[] data = response.getData(); + public void onMessageResponse(byte @Nullable [] data) { if(data == null) { - abort(response, "Not FML2/3 client"); + abort(null, "Not FML2/3 client"); return; } ByteBuf buf = Unpooled.wrappedBuffer(data); if(forge && buf.readByte() != 0) { - abort(response, "Not FORGE login wrapper"); + abort(data, "Not FORGE login wrapper"); return; } - if(!DefinedPacket.readString(buf).equals(forge ? "forge:handshake" : "fml:handshake")) { - abort(response, "Not FML2/3/FORGE handshake response"); + if(!ProtocolUtils.readString(buf).equals(forge ? "forge:handshake" : "fml:handshake")) { + abort(data, "Not FML2/3/FORGE handshake response"); return; } - if(DefinedPacket.readVarInt(buf) != buf.readableBytes()) { - abort(response, "FML2/3/FORGE packet size mismatch"); + if(ProtocolUtils.readVarInt(buf) != buf.readableBytes()) { + abort(data, "FML2/3/FORGE packet size mismatch"); return; } - if(DefinedPacket.readVarInt(buf) != (forge ? /* Mod Versions */ 1 : /* Mod List Reply */ 2)) { - abort(response, "Not FML2/3/FORGE mod list reply"); + if(ProtocolUtils.readVarInt(buf) != (forge ? /* Mod Versions */ 1 : /* Mod List Reply */ 2)) { + abort(data, "Not FML2/3/FORGE mod list reply"); return; } List mods = new ArrayList<>(); - int modCount = DefinedPacket.readVarInt(buf); + int modCount = ProtocolUtils.readVarInt(buf); for(int i = 0; i < modCount; i++) { - mods.add(Mod.getOrCreate(DefinedPacket.readString(buf), Mod.Platform.FORGE)); + mods.add(Mod.getOrCreate(ProtocolUtils.readString(buf), Mod.Platform.FORGE)); if(forge) { - DefinedPacket.readString(buf); // Human readable name - DefinedPacket.readString(buf); // Version + ProtocolUtils.readString(buf); // Human readable name + ProtocolUtils.readString(buf); // Version } } - if(!ModUtils.handleMods(event.getConnection().getUniqueId(), Locale.getDefault(), event::setReason, mods)) - event.setCancelled(true); - - event.completeIntent(VelocityCore.get()); - } - - private void abort(LoginPayloadResponse response, String error) { - event.setReason(TextComponent.fromLegacy(error)); - event.setCancelled(true); - event.completeIntent(VelocityCore.get()); - VelocityCore.get().getLogger().log(Level.SEVERE, () -> error + "\n" + response); + modUtils.handleMods(uuid, Locale.getDefault(), connection::disconnect, mods); } } } diff --git a/src/de/steamwar/bungeecore/mods/FabricModSender.java b/src/de/steamwar/bungeecore/mods/FabricModSender.java index 93f54fa..13ff553 100644 --- a/src/de/steamwar/bungeecore/mods/FabricModSender.java +++ b/src/de/steamwar/bungeecore/mods/FabricModSender.java @@ -22,31 +22,42 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.event.player.ServerConnectedEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.proxy.protocol.ProtocolUtils; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Storage; -import de.steamwar.bungeecore.listeners.BasicListener; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.Mod; import de.steamwar.sql.SWException; import de.steamwar.sql.SteamwarUser; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PlayerDisconnectEvent; -import net.md_5.bungee.api.event.PluginMessageEvent; -import net.md_5.bungee.api.event.ServerSwitchEvent; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.protocol.DefinedPacket; import java.util.*; import java.util.concurrent.TimeUnit; -public class FabricModSender extends BasicListener { +@Create +public class FabricModSender { + + private final ModUtils utils; + private final ProxyServer proxyServer; + private final VelocityCore core; private final Set neededFabricMods = new HashSet<>(); private final Set neededQuiltMods = new HashSet<>(); - public FabricModSender() { + @Inject + public FabricModSender(ModUtils utils, ProxyServer proxyServer, VelocityCore core) { + this.utils = utils; + this.proxyServer = proxyServer; + this.core = core; neededFabricMods.add("java"); neededFabricMods.add("minecraft"); neededFabricMods.add("steamwarmodsender"); @@ -55,9 +66,9 @@ public class FabricModSender extends BasicListener { neededFabricMods.add("fabricloader"); neededQuiltMods.add("quilt_loader"); - BungeeCord.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { + proxyServer.getScheduler().buildTask(VelocityCore.get(), () -> { synchronized (Storage.fabricExpectPluginMessage) { - for (Map.Entry entry : Storage.fabricExpectPluginMessage.entrySet()) { + for (Map.Entry entry : Storage.fabricExpectPluginMessage.entrySet()) { if (!Storage.fabricCheckedPlayers.containsKey(entry.getKey())) { continue; } @@ -67,11 +78,11 @@ public class FabricModSender extends BasicListener { } } } - }, 0, 1, TimeUnit.SECONDS); + }).repeat(1, TimeUnit.SECONDS); } public void handlePluginMessage(PluginMessageEvent e){ - ProxiedPlayer player = (ProxiedPlayer) e.getSender(); + Player player = (Player) e.getSource(); SteamwarUser user = SteamwarUser.get(player.getUniqueId()); if (!Storage.fabricCheckedPlayers.containsKey(player)) { @@ -87,7 +98,7 @@ public class FabricModSender extends BasicListener { List mods = new ArrayList<>(); ByteBuf buf = Unpooled.wrappedBuffer(e.getData()); - String data = DefinedPacket.readString(buf, 1024*1024); + String data = ProtocolUtils.readString(buf, 1024*1024); if(buf.readableBytes() > 0) { logMessage(user, "Invalid message length", Arrays.toString(e.getData())); return; @@ -104,7 +115,7 @@ public class FabricModSender extends BasicListener { return; } - if(!ModUtils.handleMods(player,mods)) + if(!utils.handleMods(player,mods)) return; if (!Storage.fabricCheckedPlayers.containsKey(player)) { @@ -114,17 +125,17 @@ public class FabricModSender extends BasicListener { } } - @EventHandler - public void onServerSwitchEvent(ServerSwitchEvent e) { - if (e.getFrom() == null) return; + @Subscribe + public void onServerSwitchEvent(ServerConnectedEvent e) { + if (e.getPreviousServer().isEmpty()) return; synchronized (Storage.fabricExpectPluginMessage) { Storage.fabricExpectPluginMessage.put(e.getPlayer(), System.currentTimeMillis()); } } - @EventHandler - public void onDisconnect(PlayerDisconnectEvent e) { - ProxiedPlayer player = e.getPlayer(); + @Subscribe + public void onDisconnect(DisconnectEvent e) { + Player player = e.getPlayer(); Storage.fabricCheckedPlayers.remove(player); synchronized (Storage.fabricExpectPluginMessage) { diff --git a/src/de/steamwar/bungeecore/mods/Feather.java b/src/de/steamwar/bungeecore/mods/Feather.java index c7d2b65..1325ffb 100644 --- a/src/de/steamwar/bungeecore/mods/Feather.java +++ b/src/de/steamwar/bungeecore/mods/Feather.java @@ -21,12 +21,14 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.md_5.bungee.api.connection.ProxiedPlayer; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; public class Feather { //https://github.com/Koupah/Feather-Client-API/blob/main/src/club/koupah/feather/packets/FeatherMod.java //https://archive.org/details/feather-server-api - public static final String CHANNEL = "feather:client"; + public static final ChannelIdentifier CHANNEL = MinecraftChannelIdentifier.from("feather:client"); private final byte[] packet; public Feather() { @@ -50,7 +52,7 @@ public class Feather { packet = obj.toString().getBytes(); } - public void sendRestrictions(ProxiedPlayer player) { - player.sendData(CHANNEL, packet); + public void sendRestrictions(Player player) { + player.sendPluginMessage(CHANNEL, packet); } } diff --git a/src/de/steamwar/bungeecore/mods/LabyMod.java b/src/de/steamwar/bungeecore/mods/LabyMod.java index 16f597a..8ac12ec 100644 --- a/src/de/steamwar/bungeecore/mods/LabyMod.java +++ b/src/de/steamwar/bungeecore/mods/LabyMod.java @@ -22,48 +22,53 @@ package de.steamwar.bungeecore.mods; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.proxy.protocol.ProtocolUtils; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.listeners.PluginMessage; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.Mod; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PluginMessageEvent; -import net.md_5.bungee.protocol.DefinedPacket; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; +@Create public class LabyMod { // https://docs.labymod.net/pages/server/introduction/ // https://github.com/LabyMod/labymod-server-api // https://dl.labymod.net/addons.json + private final ModUtils utils; + private final byte[] gameInfoPacket; - public LabyMod() { + public LabyMod(ModUtils utils) { + this.utils = utils; gameInfoPacket = PluginMessage.genBufPacket(buf -> { - DefinedPacket.writeString("discord_rpc", buf); + ProtocolUtils.writeString(buf, "discord_rpc"); JsonObject json = new JsonObject(); json.addProperty("hasGame", true); json.addProperty("game_mode", "steamwar.de"); json.addProperty("game_startTime", 0); json.addProperty("game_endTime", 0); - DefinedPacket.writeString(json.toString(), buf); + ProtocolUtils.writeString(buf, json.toString()); }); } public void handlePluginMessage(PluginMessageEvent event) { - ProxiedPlayer player = (ProxiedPlayer) event.getSender(); - player.sendData(event.getTag(), gameInfoPacket); + Player player = (Player) event.getSource(); + player.sendPluginMessage(event.getIdentifier(), gameInfoPacket); ByteBuf buf = Unpooled.wrappedBuffer(event.getData()); - String purpose = DefinedPacket.readString(buf); + String purpose = ProtocolUtils.readString(buf); if(!"INFO".equals(purpose)) return; - JsonObject message = JsonParser.parseString(DefinedPacket.readString(buf)).getAsJsonObject(); + JsonObject message = JsonParser.parseString(ProtocolUtils.readString(buf)).getAsJsonObject(); List mods = new LinkedList<>(); if(message.has("addons")) { @@ -82,6 +87,6 @@ public class LabyMod { } } - ModUtils.handleMods(player, mods); + utils.handleMods(player, mods); } } diff --git a/src/de/steamwar/bungeecore/mods/Lunar.java b/src/de/steamwar/bungeecore/mods/Lunar.java index 7eb0d29..9b8f147 100644 --- a/src/de/steamwar/bungeecore/mods/Lunar.java +++ b/src/de/steamwar/bungeecore/mods/Lunar.java @@ -32,11 +32,14 @@ import com.lunarclient.apollo.option.Options; import com.lunarclient.apollo.player.AbstractApolloPlayer; import com.lunarclient.apollo.player.v1.ModMessage; import com.lunarclient.apollo.player.v1.PlayerHandshakeMessage; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import de.steamwar.bungeecore.VelocityCore; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.Mod; import lombok.AllArgsConstructor; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PluginMessageEvent; import java.util.ArrayList; import java.util.List; @@ -44,13 +47,16 @@ import java.util.UUID; import java.util.function.Consumer; import java.util.logging.Level; +@Create public class Lunar { // https://lunarclient.dev/apollo/introduction // https://github.com/LunarClient/Apollo private final ApolloModuleManager manager = new ApolloModuleManagerImpl().addModule(ModSettingModule.class); - public Lunar() { //TODO seems defunct + private final ModUtils utils; + + public Lunar(ModUtils utils) { //TODO seems defunct Options modSettings = manager.getModule(ModSettingModule.class).getOptions(); modSettings.set(ModReplaymod.ENABLED, false); // TODO check if restrictions working modSettings.set(ModFreelook.ENABLED, false); @@ -60,14 +66,16 @@ public class Lunar { modSettings.set(ModTeamView.ENABLED, false); modSettings.set(ModTntCountdown.ENABLED, false); modSettings.set(ModToggleSneak.TOGGLE_SNEAK_CONTAINER, false); + + this.utils = utils; } - public void sendRestrictions(ProxiedPlayer player) { + public void sendRestrictions(Player player) { NetworkOptions.sendOptions(manager.getModules(), true, new SWApolloPlayer(player)); } public void handlePluginMessage(PluginMessageEvent event) { - ProxiedPlayer player = (ProxiedPlayer) event.getSender(); + Player player = (Player) event.getSource(); Any packet; try { @@ -94,12 +102,12 @@ public class Lunar { case TYPE_UNSPECIFIED: case UNRECOGNIZED: default: - VelocityCore.get().getLogger().log(Level.INFO, () -> player.getName() + " uses Lunar mod with unknown type " + mod); + VelocityCore.get().getLogger().log(Level.INFO, () -> player.getUsername() + " uses Lunar mod with unknown type " + mod); break; } } - ModUtils.handleMods(player, mods); + utils.handleMods(player, mods); }); } @@ -112,7 +120,9 @@ public class Lunar { @AllArgsConstructor private static class SWApolloPlayer extends AbstractApolloPlayer { - private final ProxiedPlayer player; + private static final ChannelIdentifier CHANNEL = MinecraftChannelIdentifier.from(ApolloManager.PLUGIN_MESSAGE_CHANNEL); + + private final Player player; @Override public void sendPacket(Message message) { @@ -121,11 +131,11 @@ public class Lunar { @Override public void sendPacket(byte[] bytes) { - player.sendData(ApolloManager.PLUGIN_MESSAGE_CHANNEL, bytes); + player.sendPluginMessage(CHANNEL, bytes); } @Override public UUID getUniqueId() { return player.getUniqueId(); } - @Override public String getName() { return player.getName(); } + @Override public String getName() { return player.getUsername(); } @Override public boolean hasPermission(String s) { return player.hasPermission(s); } @Override public Object getPlayer() { return player; } } diff --git a/src/de/steamwar/bungeecore/mods/ModUtils.java b/src/de/steamwar/bungeecore/mods/ModUtils.java index e4aad3b..2534605 100644 --- a/src/de/steamwar/bungeecore/mods/ModUtils.java +++ b/src/de/steamwar/bungeecore/mods/ModUtils.java @@ -19,19 +19,20 @@ package de.steamwar.bungeecore.mods; +import com.google.inject.Inject; +import com.velocitypowered.api.proxy.Player; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.commands.PunishmentCommand; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.sql.SteamwarUser; import de.steamwar.messages.ChatSender; import de.steamwar.sql.Mod; import de.steamwar.sql.Mod.ModType; import de.steamwar.sql.UserPerm; import lombok.Getter; -import lombok.experimental.UtilityClass; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.sql.Timestamp; import java.time.Instant; @@ -39,19 +40,27 @@ import java.time.temporal.ChronoUnit; import java.util.*; import java.util.function.Consumer; import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; -@UtilityClass +@Create public class ModUtils { - @Getter - private static final Map> playerModMap = new HashMap<>(); + private final Logger logger; - public static boolean handleMods(ProxiedPlayer player, List mods) { + @Getter + private final Map> playerModMap = new HashMap<>(); + + @Inject + public ModUtils(Logger logger) { + this.logger = logger; + } + + public boolean handleMods(Player player, List mods) { return handleMods(player.getUniqueId(), ChatSender.of(player).getLocale(), player::disconnect, mods); } - public static boolean handleMods(UUID uuid, Locale locale, Consumer disconnect, List mods){ + public boolean handleMods(UUID uuid, Locale locale, Consumer disconnect, List mods){ SteamwarUser user = SteamwarUser.get(uuid); playerModMap.put(uuid,new ArrayList<>(mods)); VelocityCore.get().getLogger().log(Level.INFO, user.getUserName() + " declares mods: " + mods.stream().map(mod -> mod.getPlatform() + ":" + mod.getModName()).collect(Collectors.joining(" "))); @@ -83,10 +92,10 @@ public class ModUtils { if(max == ModType.RED) { PunishmentCommand.ban(user, Timestamp.from(Instant.now().plus(7, ChronoUnit.DAYS)), message, SteamwarUser.get(-1), false); - VelocityCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen der Mods " + modList + " gebannt."); + logger.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen der Mods " + modList + " gebannt."); } - disconnect.accept(TextComponent.fromLegacy(message)); + disconnect.accept(LegacyComponentSerializer.legacySection().deserialize(message)); return false; } } diff --git a/src/de/steamwar/bungeecore/mods/WorldDownloader.java b/src/de/steamwar/bungeecore/mods/WorldDownloader.java index d18be4c..45e2f04 100644 --- a/src/de/steamwar/bungeecore/mods/WorldDownloader.java +++ b/src/de/steamwar/bungeecore/mods/WorldDownloader.java @@ -19,9 +19,9 @@ package de.steamwar.bungeecore.mods; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.proxy.Player; import de.steamwar.bungeecore.listeners.PluginMessage; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PluginMessageEvent; public class WorldDownloader { // https://wiki.vg/Plugin_channels/World_downloader @@ -43,6 +43,6 @@ public class WorldDownloader { } public void handlePluginMessage(PluginMessageEvent event) { - PluginMessage.send((ProxiedPlayer) event.getSender(), "WDL|CONTROL", "wdl:control", controlPacket); + PluginMessage.send((Player) event.getSource(), "WDL|CONTROL", "wdl:control", controlPacket); } } diff --git a/src/de/steamwar/bungeecore/network/ServerMetaInfo.java b/src/de/steamwar/bungeecore/network/ServerMetaInfo.java index 5f38da1..6f0e870 100644 --- a/src/de/steamwar/bungeecore/network/ServerMetaInfo.java +++ b/src/de/steamwar/bungeecore/network/ServerMetaInfo.java @@ -19,8 +19,8 @@ package de.steamwar.bungeecore.network; +import com.velocitypowered.api.proxy.server.ServerInfo; import de.steamwar.network.packets.MetaInfos; -import net.md_5.bungee.api.config.ServerInfo; public class ServerMetaInfo implements MetaInfos { diff --git a/src/de/steamwar/bungeecore/util/BauLock.java b/src/de/steamwar/bungeecore/util/BauLock.java index e47dabe..65c64ae 100644 --- a/src/de/steamwar/bungeecore/util/BauLock.java +++ b/src/de/steamwar/bungeecore/util/BauLock.java @@ -19,26 +19,35 @@ package de.steamwar.bungeecore.util; +import com.google.inject.Inject; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; import de.steamwar.bungeecore.Message; +import de.steamwar.bungeecore.util.annotations.Create; import de.steamwar.messages.ChatSender; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserConfig; import de.steamwar.sql.UserPerm; -import lombok.experimental.UtilityClass; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.connection.ProxiedPlayer; -@UtilityClass +@Create public class BauLock { - private static final String BAU_LOCK_CONFIG_NAME = "baulockstate"; - public static void setLocked(ProxiedPlayer p, BauLockState state) { + private final ProxyServer proxy; + + private final String BAU_LOCK_CONFIG_NAME = "baulockstate"; + + @Inject + public BauLock(ProxyServer proxy) { + this.proxy = proxy; + } + + public void setLocked(Player p, BauLockState state) { SteamwarUser owner = SteamwarUser.get(p.getUniqueId()); UserConfig.updatePlayerConfig(owner.getId(), BAU_LOCK_CONFIG_NAME, state == BauLockState.OPEN ? null : state.name()); Message.send("BAU_LOCKED_" + state.name(), p); } - public static boolean checkNotifyLocked(SteamwarUser owner, ProxiedPlayer player) { + public boolean checkNotifyLocked(SteamwarUser owner, Player player) { ChatSender sender = ChatSender.of(player); SteamwarUser target = sender.user(); if (owner.getId() == target.getId()) @@ -70,9 +79,7 @@ public class BauLock { if(locked) { sender.system("BAU_LOCKED_NOALLOWED"); - ProxiedPlayer ownerPlayer = ProxyServer.getInstance().getPlayer(owner.getUUID()); - if(ownerPlayer != null) - ChatSender.of(ownerPlayer).system("BAU_LOCK_BLOCKED", player.getName()); + proxy.getPlayer(owner.getUUID()).ifPresent(ownerPlayer -> ChatSender.of(ownerPlayer).system("BAU_LOCK_BLOCKED", player.getUsername())); } return locked; diff --git a/src/de/steamwar/bungeecore/util/Chat19.java b/src/de/steamwar/bungeecore/util/Chat19.java index a543f74..ec75070 100644 --- a/src/de/steamwar/bungeecore/util/Chat19.java +++ b/src/de/steamwar/bungeecore/util/Chat19.java @@ -19,30 +19,19 @@ package de.steamwar.bungeecore.util; -import net.md_5.bungee.ServerConnection; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.protocol.ChatChain; -import net.md_5.bungee.protocol.ProtocolConstants; -import net.md_5.bungee.protocol.SeenMessages; -import net.md_5.bungee.protocol.packet.ClientChat; -import net.md_5.bungee.protocol.packet.ClientCommand; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; -import java.util.BitSet; -import java.util.Collections; +import java.time.Instant; public class Chat19 { private Chat19(){} - public static void chat(ProxiedPlayer p, String message) { - int version = p.getPendingConnection().getVersion(); - if(version >= ProtocolConstants.MINECRAFT_1_19) { - if(message.startsWith("/")) { - ((ServerConnection) p.getServer()).getCh().write(new ClientCommand(message.substring(1), System.currentTimeMillis(), 0, Collections.emptyMap(), false, new ChatChain(Collections.emptyList(), null), new SeenMessages(0, new BitSet(0)))); - } else { - ((ServerConnection) p.getServer()).getCh().write(new ClientChat(message, System.currentTimeMillis(), 0, version < ProtocolConstants.MINECRAFT_1_19_3 ? new byte[0] : null, false, new ChatChain(Collections.emptyList(), null), new SeenMessages(0, new BitSet(0)))); - } - } else { - p.chat(message); - } + public static void chat(Player p, String message) { + ((ConnectedPlayer) p).getChatBuilderFactory().builder() + .setTimestamp(Instant.now()) + .asPlayer(p) + .message(message) + .toServer(); } } \ No newline at end of file diff --git a/src/de/steamwar/bungeecore/util/SteamWarModule.java b/src/de/steamwar/bungeecore/util/SteamWarModule.java index 8db72a7..a3950c5 100644 --- a/src/de/steamwar/bungeecore/util/SteamWarModule.java +++ b/src/de/steamwar/bungeecore/util/SteamWarModule.java @@ -21,10 +21,12 @@ package de.steamwar.bungeecore.util; import com.google.inject.AbstractModule; import com.google.inject.Provides; +import com.google.inject.Scopes; import com.google.inject.Singleton; import de.steamwar.bungeecore.Node; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.commands.HelpCommand; +import de.steamwar.bungeecore.mods.*; import org.jetbrains.annotations.NotNull; public final class SteamWarModule extends AbstractModule { @@ -38,7 +40,13 @@ public final class SteamWarModule extends AbstractModule { @Override protected void configure() { bind(VelocityCore.class).toInstance(core); - bind(HelpCommand.class).in(Singleton.class); + bind(HelpCommand.class).in(Scopes.SINGLETON); + bind(ModUtils.class).in(Scopes.SINGLETON); + bind(LabyMod.class).in(Scopes.SINGLETON); + bind(WorldDownloader.class).in(Scopes.SINGLETON); + bind(FML.class).in(Scopes.SINGLETON); + bind(FML2.class).in(Scopes.SINGLETON); + bind(BauLock.class).in(Scopes.SINGLETON); } @Provides diff --git a/src/de/steamwar/command/CommandRegistering.java b/src/de/steamwar/command/CommandRegistering.java index 57a9694..135da53 100644 --- a/src/de/steamwar/command/CommandRegistering.java +++ b/src/de/steamwar/command/CommandRegistering.java @@ -19,18 +19,69 @@ package de.steamwar.command; +import com.mojang.brigadier.tree.CommandNode; import com.velocitypowered.api.command.Command; +import com.velocitypowered.api.command.CommandManager; +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; import de.steamwar.bungeecore.VelocityCore; +import lombok.EqualsAndHashCode; +import lombok.ToString; import lombok.experimental.UtilityClass; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.*; @UtilityClass class CommandRegistering { static void unregister(String name) { - VelocityCore.getProxy().getCommandManager().unregister(name); + VelocityCore.get().getProxyServer().getCommandManager().unregister(name); } static void register(Command command, String name, String... aliases) { - VelocityCore.getProxy().getCommandManager().register(name, command, aliases); + VelocityCore.get().getProxyServer().getCommandManager().register(new SWCommandMeta(name, aliases), command); + } + + private record SWCommandMeta(String name, String[] aliases) implements CommandMeta { + + @Override + public Collection getAliases() { + List list = new ArrayList<>(aliases.length + 1); + list.add(name); + list.addAll(Arrays.asList(aliases)); + return Collections.unmodifiableList(list); + } + + @Override + public Collection> getHints() { + return List.of(); + } + + @Override + public @Nullable Object getPlugin() { + return VelocityCore.get(); + } + + @Override + public String toString() { + return "SWCommandMeta{" + + "name='" + name + '\'' + + ", aliases=" + Arrays.toString(aliases) + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SWCommandMeta that = (SWCommandMeta) o; + return Objects.equals(name, that.name) && Objects.deepEquals(aliases, that.aliases); + } + + @Override + public int hashCode() { + return Objects.hash(name, Arrays.hashCode(aliases)); + } } } -- 2.39.2 From c0f8058c60d03ffbf13ffba096d9f42fa6d48fba Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 18 May 2024 12:56:15 +0200 Subject: [PATCH 3/3] Push --- build.gradle | 13 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- src/de/steamwar/bungeecore/ArenaMode.java | 10 ++-- src/de/steamwar/bungeecore/Broadcaster.java | 3 +- .../steamwar/bungeecore/SubserverSystem.java | 7 +-- .../bungeecore/commands/CheckCommand.java | 23 ++++---- .../bungeecore/network/NetworkSender.java | 18 ++++--- .../bungeecore/network/ServerMetaInfo.java | 15 ++---- .../network/handlers/EloPlayerHandler.java | 41 +++++++------- .../handlers/ExecuteCommandHandler.java | 4 +- .../network/handlers/FightInfoHandler.java | 20 +++---- .../network/handlers/ImALobbyHandler.java | 2 +- .../handlers/InventoryCallbackHandler.java | 9 ++-- .../network/handlers/PrepareSchemHandler.java | 6 +-- .../steamwar/bungeecore/tablist/Tablist.java | 16 +----- .../bungeecore/tablist/TablistBuild.java | 28 +++++----- .../bungeecore/tablist/TablistGroup.java | 4 +- .../bungeecore/tablist/TablistManager.java | 3 +- .../bungeecore/tablist/TablistPart.java | 44 +++++++-------- .../bungeecore/tablist/TablistServer.java | 53 +++++++++---------- src/de/steamwar/sql/SQLWrapperImpl.java | 23 ++++---- 21 files changed, 169 insertions(+), 175 deletions(-) diff --git a/build.gradle b/build.gradle index 93dfbab..2f8311f 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ plugins { id 'java' id 'application' - id 'com.github.johnrengelman.shadow' version '5.0.0' + id 'com.github.johnrengelman.shadow' version '8.1.1' id 'de.steamwar.gradle' version 'RELEASE' } @@ -38,8 +38,10 @@ version '' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 17 -targetCompatibility = 17 +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} mainClassName = '' @@ -73,6 +75,7 @@ repositories { includeGroup 'com.lunarclient' } } + maven { url 'https://jitpack.io' } mavenLocal() } @@ -95,7 +98,7 @@ dependencies { annotationProcessor 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT' compileOnly 'com.velocitypowered:velocity-proxy:3.3.0-SNAPSHOT' - compileOnly 'de.steamwar:persistentbungeecore:RELEASE' + compileOnly 'de.steamwar:persistentvelocitycore:DEV' implementation("net.dv8tion:JDA:4.4.0_352") { exclude module: 'opus-java' } @@ -109,4 +112,6 @@ dependencies { compileOnly 'io.netty:netty-buffer:4.1.106.Final' compileOnly 'io.netty:netty-transport:4.1.106.Final' + + implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4' } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f5795e..5432a49 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ #Sat Apr 10 23:34:12 CEST 2021 -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists diff --git a/src/de/steamwar/bungeecore/ArenaMode.java b/src/de/steamwar/bungeecore/ArenaMode.java index d3a8d8b..c487093 100644 --- a/src/de/steamwar/bungeecore/ArenaMode.java +++ b/src/de/steamwar/bungeecore/ArenaMode.java @@ -20,10 +20,8 @@ package de.steamwar.bungeecore; import de.steamwar.sql.SchematicType; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; +import org.simpleyaml.configuration.Configuration; +import org.simpleyaml.configuration.file.YamlFile; import java.io.File; import java.io.IOException; @@ -49,12 +47,12 @@ public class ArenaMode { bySchemType.clear(); allModes.clear(); - File folder = new File(ProxyServer.getInstance().getPluginsFolder(), "FightSystem"); + File folder = new File(VelocityCore.get().getDataDirectory().getParent().toFile(), "FightSystem"); for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) { Configuration config; try { - config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + config = YamlFile.loadConfiguration(configFile); } catch (IOException e) { throw new SecurityException("Could not load SchematicTypes", e); } diff --git a/src/de/steamwar/bungeecore/Broadcaster.java b/src/de/steamwar/bungeecore/Broadcaster.java index c084347..f09dd63 100644 --- a/src/de/steamwar/bungeecore/Broadcaster.java +++ b/src/de/steamwar/bungeecore/Broadcaster.java @@ -20,6 +20,7 @@ package de.steamwar.bungeecore; import de.steamwar.messages.ChatSender; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.util.concurrent.TimeUnit; @@ -31,7 +32,7 @@ class Broadcaster { Broadcaster(){ VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> { if(!VelocityCore.get().getProxyServer().getAllPlayers().isEmpty() && broadCastMsgs.length > 0) { - VelocityCore.broadcast(VelocityCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]); + VelocityCore.get().getProxyServer().sendMessage(LegacyComponentSerializer.legacySection().deserialize(VelocityCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast])); } lastBroadCast++; if(lastBroadCast == broadCastMsgs.length){ diff --git a/src/de/steamwar/bungeecore/SubserverSystem.java b/src/de/steamwar/bungeecore/SubserverSystem.java index 1e3d5a5..5b6ea24 100644 --- a/src/de/steamwar/bungeecore/SubserverSystem.java +++ b/src/de/steamwar/bungeecore/SubserverSystem.java @@ -25,6 +25,7 @@ import de.steamwar.bungeecore.network.handlers.FightInfoHandler; import de.steamwar.sql.IgnoreSystem; import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.server.StartingServerPacket; +import net.kyori.adventure.text.event.ClickEvent; import java.util.UUID; @@ -48,13 +49,13 @@ public class SubserverSystem { } Message.send("SERVER_ADD_MEMBER", o, p.getUsername()); - Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getName()), - new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bau addmember " + p.getName())); + Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getUsername()), + ClickEvent.runCommand("/bau addmember " + p.getUsername())); } public static void sendPlayer(Subserver subserver, Player player) { subserver.sendPlayer(player); - if(!subserver.hasStarted() && FightInfoHandler.onLobby(player)) + if(!subserver.isStarted() && FightInfoHandler.onLobby(player)) NetworkSender.send(player, new StartingServerPacket(SteamwarUser.get(player.getUniqueId()).getId())); } } diff --git a/src/de/steamwar/bungeecore/commands/CheckCommand.java b/src/de/steamwar/bungeecore/commands/CheckCommand.java index daf35dd..3add460 100644 --- a/src/de/steamwar/bungeecore/commands/CheckCommand.java +++ b/src/de/steamwar/bungeecore/commands/CheckCommand.java @@ -19,17 +19,14 @@ package de.steamwar.bungeecore.commands; +import com.velocitypowered.api.proxy.Player; import de.steamwar.bungeecore.*; import de.steamwar.bungeecore.bot.util.DiscordSchemAlert; import de.steamwar.bungeecore.listeners.ConnectionListener; import de.steamwar.sql.*; import de.steamwar.command.SWCommand; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.config.Configuration; +import net.kyori.adventure.text.event.ClickEvent; +import org.simpleyaml.configuration.Configuration; import java.sql.Timestamp; import java.time.Instant; @@ -55,27 +52,27 @@ public class CheckCommand extends SWCommand { fightTypes.put(checkType, fightType); } - public static boolean isChecking(ProxiedPlayer player){ + public static boolean isChecking(Player player){ return currentCheckers.containsKey(player.getUniqueId()); } - public static SchematicNode getCheckingSchem(ProxiedPlayer player) { + public static SchematicNode getCheckingSchem(Player player) { return currentCheckers.get(player.getUniqueId()).schematic; } public CheckCommand() { super("check", ConnectionListener.CHECK_PERMISSION); - ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> { + VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> { List schematics = getSchemsToCheck(); if(schematics.size() != currentCheckers.size()) - Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size()); - }, 10, 10, TimeUnit.MINUTES); + Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size()); + }).repeat(10, TimeUnit.MINUTES).schedule(); } - public static void sendReminder(ProxiedPlayer player) { + public static void sendReminder(Player player) { List schematics = getSchemsToCheck(); if(schematics.size() != currentCheckers.size()) - Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size()); + Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size()); } @Register(value = "list", description = "CHECK_HELP_LIST") diff --git a/src/de/steamwar/bungeecore/network/NetworkSender.java b/src/de/steamwar/bungeecore/network/NetworkSender.java index c7109a5..61a4192 100644 --- a/src/de/steamwar/bungeecore/network/NetworkSender.java +++ b/src/de/steamwar/bungeecore/network/NetworkSender.java @@ -19,20 +19,22 @@ package de.steamwar.bungeecore.network; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.network.packets.NetworkPacket; import lombok.SneakyThrows; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; public class NetworkSender { - @SneakyThrows - public static void send(ProxiedPlayer player, NetworkPacket packet) { - player.getServer().sendData("sw:bridge", packet.serialize()); + private static final ChannelIdentifier CHANNEL = MinecraftChannelIdentifier.create("sw", "bridge"); + + public static void send(Player player, NetworkPacket packet) { + player.getCurrentServer().ifPresent(serverConnection -> send(serverConnection.getServer(), packet)); } - public static void send(ServerInfo serverInfo, NetworkPacket packet) { - ProxiedPlayer player = serverInfo.getPlayers().iterator().next(); - send(player, packet); + public static void send(RegisteredServer server, NetworkPacket packet) { + server.sendPluginMessage(CHANNEL, packet.serialize()); } } diff --git a/src/de/steamwar/bungeecore/network/ServerMetaInfo.java b/src/de/steamwar/bungeecore/network/ServerMetaInfo.java index 6f0e870..93eef11 100644 --- a/src/de/steamwar/bungeecore/network/ServerMetaInfo.java +++ b/src/de/steamwar/bungeecore/network/ServerMetaInfo.java @@ -19,18 +19,11 @@ package de.steamwar.bungeecore.network; -import com.velocitypowered.api.proxy.server.ServerInfo; +import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.network.packets.MetaInfos; +import lombok.Getter; -public class ServerMetaInfo implements MetaInfos { +@Getter +public record ServerMetaInfo(RegisteredServer sender) implements MetaInfos { - private ServerInfo sender; - - public ServerMetaInfo(ServerInfo sender) { - this.sender = sender; - } - - public ServerInfo getSender() { - return sender; - } } diff --git a/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java b/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java index 7f3582f..8943eb8 100644 --- a/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/EloPlayerHandler.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.network.handlers; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.scheduler.Scheduler; import de.steamwar.bungeecore.ArenaMode; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.network.packets.PacketHandler; @@ -28,14 +30,12 @@ import de.steamwar.sql.SchematicType; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserElo; import lombok.RequiredArgsConstructor; -import net.md_5.bungee.BungeeTitle; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.Title; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.scheduler.TaskScheduler; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.title.Title; +import org.jetbrains.annotations.Nullable; +import java.time.Duration; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.IntFunction; @@ -45,7 +45,7 @@ public class EloPlayerHandler extends PacketHandler { private static final int MEDIAN_ELO_GAIN = 40; private static final int MEDIAN_ELO_LOSE = 20; - private static final long REMATCH_LIFETIME = 1L * 60 * 60 * 1000; + private static final long REMATCH_LIFETIME = (long) 60 * 60 * 1000; private Map> gameModeGames = new HashMap<>(); @@ -183,7 +183,7 @@ public class EloPlayerHandler extends PacketHandler { } } - private void animate(ProxiedPlayer player, String oldEmblem, String newEmblem, String arrowColor, int eloGain) { + private void animate(Player player, String oldEmblem, String newEmblem, String arrowColor, int eloGain) { String finalOldEmblem = (oldEmblem.isEmpty() ? "/" : oldEmblem).trim(); String finalNewEmblem = (newEmblem.isEmpty() ? "/" : newEmblem).trim(); @@ -198,22 +198,25 @@ public class EloPlayerHandler extends PacketHandler { String color = ((eloGain > 0) ? "§a+" : (eloGain == 0 ? "§7" : "§c")); - TaskScheduler scheduler = ProxyServer.getInstance().getScheduler(); + Scheduler scheduler = VelocityCore.get().getProxyServer().getScheduler(); double eloStep = eloGain / 40.0; for (int i = 0; i < 40; i++) { - BaseComponent[] eloGainComponent = TextComponent.fromLegacyText(color + (int) (eloStep * (i + 1))); + Component eloGainComponent = LegacyComponentSerializer.legacySection().deserialize(color + (int) (eloStep * (i + 1))); int finalI = i; - scheduler.schedule(VelocityCore.get(), () -> { + scheduler.buildTask(VelocityCore.get(), () -> { if (player == null) return; - if (!player.isConnected()) return; - Title title = new BungeeTitle().title(TextComponent.fromLegacyText(getRankup.apply(finalI))).subTitle(eloGainComponent).fadeIn(finalI == 0 ? 5 : 0).stay(40).fadeOut(finalI == 39 ? 5 : 0); - title.send(player); - }, i * 50L, TimeUnit.MILLISECONDS); + Title title = Title.title(LegacyComponentSerializer.legacySection().deserialize(getRankup.apply(finalI)), eloGainComponent, Title.Times.times( + Duration.ofSeconds(finalI == 0 ? 5 : 0), + Duration.ofSeconds(2), + Duration.ofSeconds(finalI == 39 ? 5 : 0) + )); + player.showTitle(title); + }).delay(i * 50L, TimeUnit.MILLISECONDS).schedule(); } } - private ProxiedPlayer player(int userId) { - return ProxyServer.getInstance().getPlayer(SteamwarUser.get(userId).getUUID()); + private @Nullable Player player(int userId) { + return VelocityCore.get().getProxyServer().getPlayer(SteamwarUser.get(userId).getUUID()).orElseThrow(); } private double getTimeFactor(int duration) { @@ -245,7 +248,7 @@ public class EloPlayerHandler extends PacketHandler { @RequiredArgsConstructor private static class Game { - private long time = System.currentTimeMillis(); + private final long time = System.currentTimeMillis(); private final List bluePlayers; private final List redPlayers; diff --git a/src/de/steamwar/bungeecore/network/handlers/ExecuteCommandHandler.java b/src/de/steamwar/bungeecore/network/handlers/ExecuteCommandHandler.java index 91f8027..c3d2eb3 100644 --- a/src/de/steamwar/bungeecore/network/handlers/ExecuteCommandHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/ExecuteCommandHandler.java @@ -19,10 +19,10 @@ package de.steamwar.bungeecore.network.handlers; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.client.ExecuteCommandPacket; -import net.md_5.bungee.api.ProxyServer; public class ExecuteCommandHandler extends PacketHandler { @@ -31,6 +31,6 @@ public class ExecuteCommandHandler extends PacketHandler { SteamwarUser target = SteamwarUser.get(packet.getPlayerId()); String command = packet.getCommand(); - ProxyServer.getInstance().getPluginManager().dispatchCommand(ProxyServer.getInstance().getPlayer(target.getUUID()), command); + VelocityCore.get().getProxyServer().getPlayer(target.getUUID()).ifPresent(player -> VelocityCore.get().getProxyServer().getCommandManager().executeAsync(player, command)); } } diff --git a/src/de/steamwar/bungeecore/network/handlers/FightInfoHandler.java b/src/de/steamwar/bungeecore/network/handlers/FightInfoHandler.java index 3f4bff2..634043b 100644 --- a/src/de/steamwar/bungeecore/network/handlers/FightInfoHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/FightInfoHandler.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.network.handlers; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.bungeecore.network.NetworkSender; import de.steamwar.bungeecore.network.ServerMetaInfo; import de.steamwar.bungeecore.tablist.TablistManager; @@ -33,28 +35,28 @@ import java.util.Set; public class FightInfoHandler extends PacketHandler { - private static final Set lobbys = new HashSet<>(); + private static final Set lobbys = new HashSet<>(); - public static void addLobby(ServerInfo lobby) { + public static void addLobby(RegisteredServer lobby) { lobbys.add(lobby); } - public static boolean onLobby(ProxiedPlayer player) { - return lobbys.contains(player.getServer().getInfo()); + public static boolean onLobby(Player player) { + return player.getCurrentServer().map(serverConnection -> lobbys.contains(serverConnection.getServer())).orElse(false); } @Handler public void handle(FightInfoPacket packet) { - ServerInfo info = ((ServerMetaInfo) packet.getMetaInfos()).getSender(); + RegisteredServer info = ((ServerMetaInfo) packet.getMetaInfos()).sender(); - FightInfoPacket lobbyPacket = packet.withServerName(info.getName()); + FightInfoPacket lobbyPacket = packet.withServerName(info.getServerInfo().getName()); TablistManager.newFightInfo(info, packet); - Iterator lobbyIt = lobbys.iterator(); + Iterator lobbyIt = lobbys.iterator(); while(lobbyIt.hasNext()) { - ServerInfo lobby = lobbyIt.next(); - Iterator it = lobby.getPlayers().iterator(); + RegisteredServer lobby = lobbyIt.next(); + Iterator it = lobby.getPlayersConnected().iterator(); if(!it.hasNext()){ lobbyIt.remove(); continue; diff --git a/src/de/steamwar/bungeecore/network/handlers/ImALobbyHandler.java b/src/de/steamwar/bungeecore/network/handlers/ImALobbyHandler.java index 82ff82f..1141461 100644 --- a/src/de/steamwar/bungeecore/network/handlers/ImALobbyHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/ImALobbyHandler.java @@ -27,6 +27,6 @@ public class ImALobbyHandler extends PacketHandler { @Handler public void handle(ImALobbyPacket packet) { - FightInfoHandler.addLobby(((ServerMetaInfo) packet.getMetaInfos()).getSender()); + FightInfoHandler.addLobby(((ServerMetaInfo) packet.getMetaInfos()).sender()); } } diff --git a/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java b/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java index 4827dda..038b425 100644 --- a/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/InventoryCallbackHandler.java @@ -28,7 +28,10 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.client.InventoryCallbackPacket; import de.steamwar.network.packets.server.CloseInventoryPacket; -import net.md_5.bungee.api.ProxyServer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.util.HashMap; import java.util.Map; @@ -42,9 +45,9 @@ public class InventoryCallbackHandler extends PacketHandler { SteamwarUser owner = SteamwarUser.get(packet.getOwner()); InventoryCallbackPacket.CallbackType type = packet.getType(); if(!inventoryHashMap.containsKey(owner.getId())) { - VelocityCore.send(ProxyServer.getInstance().getPlayer(owner.getUUID()), VelocityCore.CHAT_PREFIX + "§cBitte erneut versuchen. Durch ein Softwareupdate konnte die übliche Aktion nicht durchgeführt werden."); + VelocityCore.get().getProxyServer().getPlayer(owner.getUUID()).ifPresent(player -> player.sendMessage(LegacyComponentSerializer.legacySection().deserialize(VelocityCore.CHAT_PREFIX).append(Component.text("Bitte erneut versuchen. Durch ein Softwareupdate konnte die übliche Aktion nicht durchgeführt werden.", Style.style(NamedTextColor.RED))))); if(type == InventoryCallbackPacket.CallbackType.CLICK) { - NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).getSender(), new CloseInventoryPacket(owner.getId())); + NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).sender(), new CloseInventoryPacket(owner.getId())); } return; } diff --git a/src/de/steamwar/bungeecore/network/handlers/PrepareSchemHandler.java b/src/de/steamwar/bungeecore/network/handlers/PrepareSchemHandler.java index d9eae09..ce372a0 100644 --- a/src/de/steamwar/bungeecore/network/handlers/PrepareSchemHandler.java +++ b/src/de/steamwar/bungeecore/network/handlers/PrepareSchemHandler.java @@ -19,20 +19,20 @@ package de.steamwar.bungeecore.network.handlers; +import com.velocitypowered.api.proxy.Player; import de.steamwar.bungeecore.ArenaMode; import de.steamwar.bungeecore.ServerStarter; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.SchematicType; import de.steamwar.sql.SteamwarUser; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.client.PrepareSchemPacket; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.connection.ProxiedPlayer; public class PrepareSchemHandler extends PacketHandler { @Handler public void handle(PrepareSchemPacket packet) { - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(packet.getPlayer()).getUUID()); + Player player = VelocityCore.get().getProxyServer().getPlayer(SteamwarUser.get(packet.getPlayer()).getUUID()).orElseThrow(); int schematicID = packet.getSchem(); ArenaMode mode = ArenaMode.getBySchemType(SchematicType.fromDB(packet.getSchemType())); diff --git a/src/de/steamwar/bungeecore/tablist/Tablist.java b/src/de/steamwar/bungeecore/tablist/Tablist.java index 804ff18..4da05b8 100644 --- a/src/de/steamwar/bungeecore/tablist/Tablist.java +++ b/src/de/steamwar/bungeecore/tablist/Tablist.java @@ -19,24 +19,12 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.player.TabList; import de.steamwar.bungeecore.Storage; import de.steamwar.messages.ChatSender; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.MessageToMessageDecoder; -import net.md_5.bungee.ServerConnection; -import net.md_5.bungee.UserConnection; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.netty.PipelineUtils; -import net.md_5.bungee.protocol.DefinedPacket; -import net.md_5.bungee.protocol.Either; -import net.md_5.bungee.protocol.PacketWrapper; -import net.md_5.bungee.protocol.ProtocolConstants; -import net.md_5.bungee.protocol.packet.*; import java.util.*; import java.util.stream.Collectors; @@ -48,7 +36,7 @@ public class Tablist extends MessageToMessageDecoder { private static final UUID[] uuids = IntStream.range(0, 80).mapToObj(i -> UUID.randomUUID()).toArray(UUID[]::new); private static final String[] names = IntStream.range(0, 80).mapToObj(i -> " »SW« " + String.format("%02d", i)).toArray(String[]::new); private static final String TAB_TEAM = "zzzzzsw-tab"; - private static final Team teamPacket = new Team(TAB_TEAM, (byte) 0, Either.right(TextComponent.fromLegacy("")), Either.right(TextComponent.fromLegacy("")), Either.right(TextComponent.fromLegacy("")), "never", "always", 21, (byte)0x00, names); + private static final TabList teamPacket = new Team(TAB_TEAM, (byte) 0, Either.right(TextComponent.fromLegacy("")), Either.right(TextComponent.fromLegacy("")), Either.right(TextComponent.fromLegacy("")), "never", "always", 21, (byte)0x00, names); private final Map directTabItems; private final Set npcs = new HashSet<>(); diff --git a/src/de/steamwar/bungeecore/tablist/TablistBuild.java b/src/de/steamwar/bungeecore/tablist/TablistBuild.java index 4f7f2b6..187b160 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistBuild.java +++ b/src/de/steamwar/bungeecore/tablist/TablistBuild.java @@ -19,12 +19,14 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ServerConnection; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.proxy.server.ServerInfo; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Subserver; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.messages.ChatSender; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.ArrayList; import java.util.HashMap; @@ -34,19 +36,19 @@ import java.util.stream.Collectors; public class TablistBuild implements TablistPart { - private final List servers = new ArrayList<>(); - private final Map> players = new HashMap<>(); + private final List servers = new ArrayList<>(); + private final Map> players = new HashMap<>(); public TablistBuild() { - for (ServerInfo server : new ArrayList<>(ProxyServer.getInstance().getServers().values())){ - Subserver subserver = Subserver.getSubserver(server); - if(server.getPlayers().isEmpty() || subserver == null || subserver.getType() != Servertype.BAUSERVER) + for (RegisteredServer server : new ArrayList<>(VelocityCore.get().getProxyServer().getAllServers())){ + Subserver subserver = Subserver.getSubserver(server.getServerInfo()); + if(server.getPlayersConnected().isEmpty() || subserver == null || subserver.getType() != Servertype.BAUSERVER) continue; servers.add(server); - players.put(server, server.getPlayers().stream().sorted(((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName()))).map(Item::new).collect(Collectors.toList())); + players.put(server, server.getPlayersConnected().stream().sorted(((p1, p2) -> p1.getUsername().compareToIgnoreCase(p2.getUsername()))).map(Item::new).collect(Collectors.toList())); } - servers.sort((s1, s2) -> s1.getName().compareToIgnoreCase(s2.getName())); + servers.sort((s1, s2) -> s1.getServerInfo().getName().compareToIgnoreCase(s2.getServerInfo().getName())); } @Override @@ -55,14 +57,14 @@ public class TablistBuild implements TablistPart { } @Override - public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { - ServerInfo server = player.getServer().getInfo(); + public void print(ChatSender viewer, Player player, List tablist, List direct) { + RegisteredServer server = player.getCurrentServer().map(ServerConnection::getServer).orElseThrow(); if(players.keySet().stream().anyMatch(info -> server != info)) { tablist.add(new Item(null, "", TablistServer.GRAY)); tablist.add(new Item(null, viewer.parseToLegacy("TABLIST_BAU"), TablistServer.LIGHT_GRAY)); } - for (ServerInfo info : servers) { + for (RegisteredServer info : servers) { TablistServer.teamify(players.get(info), player) .forEach(((server == info) ? direct : tablist)::add); } diff --git a/src/de/steamwar/bungeecore/tablist/TablistGroup.java b/src/de/steamwar/bungeecore/tablist/TablistGroup.java index fdb227a..33279dc 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistGroup.java +++ b/src/de/steamwar/bungeecore/tablist/TablistGroup.java @@ -19,8 +19,8 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.Player; import de.steamwar.messages.ChatSender; -import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.List; @@ -37,7 +37,7 @@ public class TablistGroup implements TablistPart { } @Override - public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { + public void print(ChatSender viewer, Player player, List tablist, List direct) { for (TablistPart sublist : sublists) { sublist.print(viewer, player, tablist, direct); } diff --git a/src/de/steamwar/bungeecore/tablist/TablistManager.java b/src/de/steamwar/bungeecore/tablist/TablistManager.java index 4e56855..7de12a0 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistManager.java +++ b/src/de/steamwar/bungeecore/tablist/TablistManager.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Storage; @@ -38,7 +39,7 @@ import java.util.concurrent.TimeUnit; public class TablistManager extends BasicListener { - private static final Map fightInfos = new HashMap<>(); + private static final Map fightInfos = new HashMap<>(); public static synchronized void newFightInfo(ServerInfo info, FightInfoPacket packet) { fightInfos.put(info, packet); diff --git a/src/de/steamwar/bungeecore/tablist/TablistPart.java b/src/de/steamwar/bungeecore/tablist/TablistPart.java index f15a239..1a95678 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistPart.java +++ b/src/de/steamwar/bungeecore/tablist/TablistPart.java @@ -19,54 +19,54 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.util.GameProfile; import de.steamwar.messages.ChatSender; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.connection.InitialHandler; -import net.md_5.bungee.connection.LoginResult; -import net.md_5.bungee.protocol.Property; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import java.util.Collections; import java.util.List; import java.util.UUID; interface TablistPart { String sortKey(); - void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct); + void print(ChatSender viewer, Player player, List tablist, List direct); class Item { - public static Property[] playerProperties(ProxiedPlayer player) { - LoginResult loginResult = ((InitialHandler) player.getPendingConnection()).getLoginProfile(); + public static List playerProperties(Player player) { + List loginResult = player.getGameProfileProperties(); if(loginResult == null) - return new Property[0]; + return Collections.emptyList(); - return loginResult.getProperties(); + return loginResult; } private final UUID uuid; - private final BaseComponent displayName; - private final Property[] properties; + private final Component displayName; + private final List properties; - public Item(UUID uuid, String displayName, Property[] properties) { + public Item(UUID uuid, String displayName, List properties) { this.uuid = uuid; this.displayName = reformat(displayName); this.properties = properties; } - public Item(ProxiedPlayer player) { + public Item(Player player) { this(player, false); } - public Item(ProxiedPlayer player, boolean sameTeam) { + public Item(Player player, boolean sameTeam) { this.uuid = player.getUniqueId(); UserPerm.Prefix prefix = SteamwarUser.get(player.getUniqueId()).prefix(); if (prefix == UserPerm.emptyPrefix && sameTeam) { - this.displayName = reformat("§f" + player.getName()); + this.displayName = reformat("§f" + player.getUsername()); } else { - this.displayName = reformat(prefix.getColorCode() + player.getName()); + this.displayName = reformat(prefix.getColorCode() + player.getUsername()); } this.properties = playerProperties(player); } @@ -75,16 +75,16 @@ interface TablistPart { return uuid; } - public BaseComponent getDisplayName() { + public Component getDisplayName() { return displayName; } - public Property[] getProperties() { + public List getProperties() { return properties; } - private BaseComponent reformat(String string) { - return TextComponent.fromArray(TextComponent.fromLegacyText(string)); + private Component reformat(String string) { + return LegacyComponentSerializer.legacyAmpersand().deserialize(string); } } } diff --git a/src/de/steamwar/bungeecore/tablist/TablistServer.java b/src/de/steamwar/bungeecore/tablist/TablistServer.java index 812588d..b968c8e 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistServer.java +++ b/src/de/steamwar/bungeecore/tablist/TablistServer.java @@ -19,82 +19,81 @@ package de.steamwar.bungeecore.tablist; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ServerConnection; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.util.GameProfile; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Subserver; +import de.steamwar.bungeecore.VelocityCore; import de.steamwar.sql.SteamwarUser; import de.steamwar.messages.ChatSender; import de.steamwar.network.packets.common.FightInfoPacket; -import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.protocol.Property; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class TablistServer implements TablistPart { - public static final Property[] GRAY = new Property[]{new Property("textures", "eyJ0aW1lc3RhbXAiOjE0NTU1NzQxMTk0MzMsInByb2ZpbGVJZCI6ImIzYjE4MzQ1MzViZjRiNzU4ZTBjZGJmMGY4MjA2NTZlIiwicHJvZmlsZU5hbWUiOiIxMDExMTEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZlNzJkMzE0NzczMmQ5NzFkZWZhZTIzMWIzOGQ5NDI0MTRiMDU3YTcxNTFjNTNjNWZkNjI5NmEzYjllZGEwYWIifX19", "ro/ZKHt7278yhCr+CFTcPp/q6wAUlef//85k2DzkfRaZqy0CtGgwisDs2U4pVKvQ2pfXvitzWgbJvD0bLeQ12xWi4c1Fc29LCArosVJoFmrJDHz7N2MlstHT+ynQROb9d2aiFA6uOXfLjPKb1noUZ/YQoZjqcPIvD5oFZtD5DHV5O4hYz0IvgHbIjDqjz6ITsTcKiBlbxNg2loTFxSlW1ZfnNCO+kcAmeyB5NFY3j0e+/AqVANiNoiC3OKsECM/yEx/acf+vKWcT8mQn4wRoIGtxfEU7ZjNtgdh73NvXXBygW+K9AiJ242g8Y06Xxuk8kaNEGmT6H/mM7nbwjZmQQXpi/Pao2gYqyeIofeCPfr8RsGXoDX3nXDAw8/LyhTCHgx+sp6IQYSfGcSMJtoNeTJ0liIFxqn1V9/zKmzOZAPzR6qrQPOjoRFljLAlv7rfzotaEqh/1ldd40GdS8tstczn7f29OQerNDaqvbDb00Gy0STdUr1bVyCDptA54XKjT9WFv7QpBikEculxqSppAXPxD2Fb/ZmphbZx8WEGfG6bVFhf6fQdDAUXlcv8BxjElNPwlolF86M2KJd5VquLluhrCjwID7OK/pffNultAVH+Lxw4QOAXmJqjUrA1KHgyG1S0Cwj/f4E2hdxZJBvkfVtq9qPkd9nignhEoTCTOHf0=")}; - public static final Property[] LIGHT_GRAY = new Property[]{new Property("textures", "eyJ0aW1lc3RhbXAiOjE0NTU2MjU1OTM5NjIsInByb2ZpbGVJZCI6ImIzYjE4MzQ1MzViZjRiNzU4ZTBjZGJmMGY4MjA2NTZlIiwicHJvZmlsZU5hbWUiOiIxMDExMTEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzc4Y2I3ZmMyMDhiMzM4NTUwNGE4MTQ0MjA0NDI4ZmRjZDYzMjRiZWIzMWNhMmNlODZjYzQyNGI5NjNkODVjIn19fQ==", "R/wZUZRC1dishRdM9a2SSxxW3oYa0XSb/MxHbQpEUA791HxyqjaKLDu0wFX2r2a8ZTeVjzXpNzkg3+PkrA11o8h7lt86MTD1pi/rQqj/WRuoqf2LP+ypbssKV+LU15cYez2cj3QQVcJDXgWEnfSLNuBv6NG8BDUpUAjTWldvu99NCJHUoD0jNMHxY/fu4k5vCgOjaBaKgkjVk2bmUhegusmtMwco+3pYx+y8+gUW8ptx5SnePG+dOwTqLyBFiOt2AQ+gSvbU/jP9aAXgxOwz/b1pMaBWtzVhFU865NHlIdSpIHg/sh3uNah3a7gTgtTvxPQv1OzM/KtqYKiamsrRzAQMzRcs4A7Tp0GakLuxEaz401IwvQ7UGVYLFzGUVLB2MyqtPgifiqQSQxZpiqj9sM5QadhsUw00nfX7mTdW46U0MtNIbby1rLrvgQKoj08zt6LJlhI3yjyawy4iZkgF4oc+PCNwZc93GIbVL9LJaGkXk3RVA+JpGwfMJrGVbL7hl8ibbAcUv7uCEWdkAgZCd6w75jEE4tlhDSPDD4rXbn+FeTZRg2n/PGKtnoTZRzbniiFaNoSAHDZSVRG39xvBDFvtmL3SPaKhzKaifiYrgNn453WtR3kymqdAtPf1GN9d1VltGZ/+vMPwqPJb6thcrlcU64UGHbg1olRkiyZHvY8=")}; + public static final List GRAY = Collections.singletonList(new GameProfile.Property("textures", "eyJ0aW1lc3RhbXAiOjE0NTU1NzQxMTk0MzMsInByb2ZpbGVJZCI6ImIzYjE4MzQ1MzViZjRiNzU4ZTBjZGJmMGY4MjA2NTZlIiwicHJvZmlsZU5hbWUiOiIxMDExMTEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZlNzJkMzE0NzczMmQ5NzFkZWZhZTIzMWIzOGQ5NDI0MTRiMDU3YTcxNTFjNTNjNWZkNjI5NmEzYjllZGEwYWIifX19", "ro/ZKHt7278yhCr+CFTcPp/q6wAUlef//85k2DzkfRaZqy0CtGgwisDs2U4pVKvQ2pfXvitzWgbJvD0bLeQ12xWi4c1Fc29LCArosVJoFmrJDHz7N2MlstHT+ynQROb9d2aiFA6uOXfLjPKb1noUZ/YQoZjqcPIvD5oFZtD5DHV5O4hYz0IvgHbIjDqjz6ITsTcKiBlbxNg2loTFxSlW1ZfnNCO+kcAmeyB5NFY3j0e+/AqVANiNoiC3OKsECM/yEx/acf+vKWcT8mQn4wRoIGtxfEU7ZjNtgdh73NvXXBygW+K9AiJ242g8Y06Xxuk8kaNEGmT6H/mM7nbwjZmQQXpi/Pao2gYqyeIofeCPfr8RsGXoDX3nXDAw8/LyhTCHgx+sp6IQYSfGcSMJtoNeTJ0liIFxqn1V9/zKmzOZAPzR6qrQPOjoRFljLAlv7rfzotaEqh/1ldd40GdS8tstczn7f29OQerNDaqvbDb00Gy0STdUr1bVyCDptA54XKjT9WFv7QpBikEculxqSppAXPxD2Fb/ZmphbZx8WEGfG6bVFhf6fQdDAUXlcv8BxjElNPwlolF86M2KJd5VquLluhrCjwID7OK/pffNultAVH+Lxw4QOAXmJqjUrA1KHgyG1S0Cwj/f4E2hdxZJBvkfVtq9qPkd9nignhEoTCTOHf0=")); + public static final List LIGHT_GRAY = Collections.singletonList(new GameProfile.Property("textures", "eyJ0aW1lc3RhbXAiOjE0NTU2MjU1OTM5NjIsInByb2ZpbGVJZCI6ImIzYjE4MzQ1MzViZjRiNzU4ZTBjZGJmMGY4MjA2NTZlIiwicHJvZmlsZU5hbWUiOiIxMDExMTEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzc4Y2I3ZmMyMDhiMzM4NTUwNGE4MTQ0MjA0NDI4ZmRjZDYzMjRiZWIzMWNhMmNlODZjYzQyNGI5NjNkODVjIn19fQ==", "R/wZUZRC1dishRdM9a2SSxxW3oYa0XSb/MxHbQpEUA791HxyqjaKLDu0wFX2r2a8ZTeVjzXpNzkg3+PkrA11o8h7lt86MTD1pi/rQqj/WRuoqf2LP+ypbssKV+LU15cYez2cj3QQVcJDXgWEnfSLNuBv6NG8BDUpUAjTWldvu99NCJHUoD0jNMHxY/fu4k5vCgOjaBaKgkjVk2bmUhegusmtMwco+3pYx+y8+gUW8ptx5SnePG+dOwTqLyBFiOt2AQ+gSvbU/jP9aAXgxOwz/b1pMaBWtzVhFU865NHlIdSpIHg/sh3uNah3a7gTgtTvxPQv1OzM/KtqYKiamsrRzAQMzRcs4A7Tp0GakLuxEaz401IwvQ7UGVYLFzGUVLB2MyqtPgifiqQSQxZpiqj9sM5QadhsUw00nfX7mTdW46U0MtNIbby1rLrvgQKoj08zt6LJlhI3yjyawy4iZkgF4oc+PCNwZc93GIbVL9LJaGkXk3RVA+JpGwfMJrGVbL7hl8ibbAcUv7uCEWdkAgZCd6w75jEE4tlhDSPDD4rXbn+FeTZRg2n/PGKtnoTZRzbniiFaNoSAHDZSVRG39xvBDFvtmL3SPaKhzKaifiYrgNn453WtR3kymqdAtPf1GN9d1VltGZ/+vMPwqPJb6thcrlcU64UGHbg1olRkiyZHvY8=")); - private final ServerInfo server; + private final RegisteredServer server; private final List players; - public TablistServer(ServerInfo server) { - this(server, server.getPlayers().stream().sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())).map(TablistPart.Item::new).collect(Collectors.toList())); + public TablistServer(RegisteredServer server) { + this(server, server.getPlayersConnected().stream().sorted((p1, p2) -> p1.getUsername().compareToIgnoreCase(p2.getUsername())).map(TablistPart.Item::new).collect(Collectors.toList())); } - public TablistServer(ServerInfo server, FightInfoPacket info) { + public TablistServer(RegisteredServer server, FightInfoPacket info) { this(server, new ArrayList<>()); - Collection onlinePlayers = server.getPlayers(); + Collection onlinePlayers = server.getPlayersConnected(); addPlayers(info.getBlueName().substring(0, 2), info.getBluePlayers(), onlinePlayers); addPlayers(info.getRedName().substring(0, 2), info.getRedPlayers(), onlinePlayers); addPlayers("§7", info.getSpectators(), onlinePlayers); } - public TablistServer(ServerInfo server, List players) { + public TablistServer(RegisteredServer server, List players) { this.server = server; this.players = players; } @Override public String sortKey() { - return server.getName(); + return server.getServerInfo().getName(); } @Override - public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { - boolean onServer = player.getServer().getInfo() == server; + public void print(ChatSender viewer, Player player, List tablist, List direct) { + boolean onServer = server.getPlayersConnected().contains(player); List items = onServer ? direct : tablist; if(!onServer) { items.add(new Item(null, "", GRAY)); - items.add(new Item(null, "§7§l" + server.getName(), LIGHT_GRAY)); + items.add(new Item(null, "§7§l" + server.getServerInfo().getName(), LIGHT_GRAY)); } teamify(players, player).forEach(items::add); } - private void addPlayers(String prefix, List teamPlayers, Collection onlinePlayers){ + private void addPlayers(String prefix, List teamPlayers, Collection onlinePlayers){ teamPlayers.stream().map(SteamwarUser::get).map( user -> onlinePlayers.stream().filter(player -> player.getUniqueId().equals(user.getUUID())).findAny() ).filter(Optional::isPresent).map(Optional::get).sorted( - (p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName()) - ).forEachOrdered(player -> players.add(new Item(player.getUniqueId(), prefix + player.getName(), Item.playerProperties(player)))); + (p1, p2) -> p1.getUsername().compareToIgnoreCase(p2.getUsername()) + ).forEachOrdered(player -> players.add(new Item(player.getUniqueId(), prefix + player.getUsername(), Item.playerProperties(player)))); } - public static Stream teamify(List players, ProxiedPlayer player) { + public static Stream teamify(List players, Player player) { int team = SteamwarUser.get(player.getUniqueId()).getTeam(); if (team == 0) return players.stream(); return players.stream().map(item -> { - ProxiedPlayer p = BungeeCord.getInstance().getPlayer(item.getUuid()); - if (p == null) return item; - Subserver subserver = Subserver.getSubserver(p.getServer().getInfo()); + Optional pOpt = VelocityCore.get().getProxyServer().getPlayer(item.getUuid()); + if (pOpt.isEmpty()) return item; + Player p = pOpt.get(); + Subserver subserver = Subserver.getSubserver(p.getCurrentServer().map(ServerConnection::getServerInfo).orElse(null)); if (subserver != null && subserver.getType() == Servertype.ARENA) return item; if (SteamwarUser.get(p.getUniqueId()).getTeam() != team) return item; return new Item(p, true); diff --git a/src/de/steamwar/sql/SQLWrapperImpl.java b/src/de/steamwar/sql/SQLWrapperImpl.java index 8130873..f589363 100644 --- a/src/de/steamwar/sql/SQLWrapperImpl.java +++ b/src/de/steamwar/sql/SQLWrapperImpl.java @@ -19,14 +19,13 @@ package de.steamwar.sql; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.proxy.server.ServerInfo; import de.steamwar.bungeecore.VelocityCore; import de.steamwar.bungeecore.commands.CheckCommand; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; +import org.simpleyaml.configuration.Configuration; +import org.simpleyaml.configuration.file.YamlFile; import java.io.File; import java.io.IOException; @@ -54,12 +53,12 @@ public class SQLWrapperImpl implements SQLWrapper { @Override public void loadSchemTypes(List tmpTypes, Map tmpFromDB) { - File folder = new File(VelocityCore.get().getDataFolder().getParentFile(), "FightSystem"); + File folder = new File(VelocityCore.get().getDataDirectory().getParent().toFile(), "FightSystem"); if(folder.exists()) { for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) { Configuration config; try { - config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + config = YamlFile.loadConfiguration(configFile); } catch (IOException e) { throw new SecurityException("Could not load SchematicTypes", e); } @@ -96,10 +95,10 @@ public class SQLWrapperImpl implements SQLWrapper { @Override public void additionalExceptionMetadata(StringBuilder builder) { builder.append("\nServers: "); - for(Map.Entry server : ProxyServer.getInstance().getServers().entrySet()) { - builder.append(server.getKey()).append("("); - for(ProxiedPlayer player : server.getValue().getPlayers()) { - builder.append(player.getName()).append(" "); + for(RegisteredServer server : VelocityCore.get().getProxyServer().getAllServers()) { + builder.append(server.getServerInfo().getName()).append("("); + for(Player player : server.getPlayersConnected()) { + builder.append(player.getUsername()).append(" "); } builder.append(") "); } -- 2.39.2