diff --git a/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java b/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java index 3095819d..0b21cef1 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java +++ b/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java @@ -25,6 +25,7 @@ import de.steamwar.persistent.Subserver; import de.steamwar.sql.EventFight; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.Team; +import lombok.Getter; import net.kyori.adventure.text.event.ClickEvent; import java.sql.Timestamp; @@ -37,6 +38,7 @@ import static de.steamwar.persistent.Storage.eventServer; public class EventStarter { + @Getter private static final Map spectatePorts = new HashMap<>(); public static void addSpectateServer(int port, String command) { @@ -70,12 +72,14 @@ public class EventStarter { eventServer.put(blue.getTeamId(), subserver); eventServer.put(red.getTeamId(), subserver); - VelocityCore.getProxy().getAllPlayers().forEach(player -> { - SteamwarUser user = SteamwarUser.get(player.getUniqueId()); - if (user.getTeam() == blue.getTeamId() || user.getTeam() == red.getTeamId()) { - subserver.sendPlayer(player); - } - }); + if (VelocityCore.get().getConfig().isEventmode()) { + VelocityCore.getProxy().getAllPlayers().forEach(player -> { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + if (user.getTeam() == blue.getTeamId() || user.getTeam() == red.getTeamId()) { + subserver.sendPlayer(player); + } + }); + } }).start(); command = "/event " + blue.getTeamKuerzel(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java b/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java index 3cec098b..40432704 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java +++ b/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java @@ -217,6 +217,7 @@ public class VelocityCore implements ReloadablePlugin { new TutorialCommand(); new Broadcaster(); + new CookieEvents(); }else{ new EventModeListener(); } @@ -288,7 +289,7 @@ public class VelocityCore implements ReloadablePlugin { if(server.getSpectatePort() != 0) EventStarter.addSpectateServer(server.getSpectatePort(), cmd); - new ServerSwitchCommand(cmd, entry.getKey(), cmds.toArray(new String[0])); + new ServerSwitchCommand(cmd, entry.getKey(), server.getSpectatePort() != 0, cmds.toArray(new String[0])); } } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/ServerSwitchCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/ServerSwitchCommand.java index 8cbcd01e..3586f150 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/ServerSwitchCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/ServerSwitchCommand.java @@ -22,6 +22,7 @@ package de.steamwar.velocitycore.commands; import java.net.InetSocketAddress; import java.util.List; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.velocitycore.VelocityCore; import de.steamwar.command.SWCommand; @@ -42,7 +43,7 @@ public class ServerSwitchCommand extends SWCommand { @Register public void genericCommand(PlayerChatter sender) { - if (isSpectateServer) { + if (isSpectateServer && sender.getPlayer().getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20_5)) { SteamwarUser user = SteamwarUser.get(sender.getPlayer().getUniqueId()); List activeFights = EventFight.getActiveFights(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java index 95edeabb..f18288f6 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java @@ -23,6 +23,7 @@ import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.permission.PermissionsSetupEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.permission.Tristate; import com.velocitypowered.api.proxy.Player; import de.steamwar.messages.Chatter; @@ -30,6 +31,7 @@ import de.steamwar.messages.Message; import de.steamwar.persistent.Subserver; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; +import de.steamwar.velocitycore.EventStarter; import de.steamwar.velocitycore.commands.*; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.discord.util.DiscordRanks; @@ -88,6 +90,10 @@ public class ConnectionListener extends BasicListener { } DiscordBot.withBot(bot -> DiscordRanks.update(user)); + + if (player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20_5)) { + player.requestCookie(EventModeListener.EVENT_TO_SPECTATE_KEY); + } } @Subscribe diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/CookieEvents.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/CookieEvents.java new file mode 100644 index 00000000..2c319b72 --- /dev/null +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/CookieEvents.java @@ -0,0 +1,46 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.velocitycore.listeners; + +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.player.CookieReceiveEvent; +import com.velocitypowered.api.proxy.Player; +import de.steamwar.sql.EventFight; +import de.steamwar.sql.SteamwarUser; +import de.steamwar.velocitycore.EventStarter; +import de.steamwar.velocitycore.VelocityCore; + +public class CookieEvents extends BasicListener { + + @Subscribe + public void handleCookies(CookieReceiveEvent e) { + if (e.getOriginalKey().equals(EventModeListener.EVENT_TO_SPECTATE_KEY)) { + Player player = e.getPlayer(); + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + + EventFight.getActiveFights().stream() + .filter(fight -> fight.getTeamRed() == user.getTeam() || fight.getTeamBlue() == user.getTeam()) + .filter(fight -> fight.getSpectatePort() != 0) + .findFirst() + .flatMap(fight -> VelocityCore.getProxy().getServer(EventStarter.getSpectatePorts().get(fight.getSpectatePort()))) + .ifPresent(registeredServer -> player.createConnectionRequest(registeredServer).fireAndForget()); + } + } +} diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/EventModeListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/EventModeListener.java index 0b09ef33..688f3885 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/EventModeListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/EventModeListener.java @@ -20,13 +20,16 @@ package de.steamwar.velocitycore.listeners; import java.net.InetSocketAddress; +import java.nio.charset.Charset; import java.util.List; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.player.ServerConnectedEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.Player; +import de.steamwar.messages.Chatter; import de.steamwar.persistent.Subserver; import de.steamwar.sql.Event; import de.steamwar.sql.EventFight; @@ -34,21 +37,35 @@ import de.steamwar.sql.Referee; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.TeamTeilnahme; import de.steamwar.velocitycore.EventStarter; +import de.steamwar.velocitycore.VelocityCore; +import net.kyori.adventure.key.Key; public class EventModeListener extends BasicListener { + public static final Key EVENT_TO_SPECTATE_KEY = Key.key("sw", "event_to_spectate"); + @Subscribe public void onPostLogin(PostLoginEvent e) { Player player = e.getPlayer(); SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + Chatter sender = Chatter.disconnect(player); Event event = Event.get(); if (event == null) { - player.transferToHost(new InetSocketAddress("steamwar.de", 25565)); + if (player.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20_5)) { + sender.system("EVENTMODE_KICK"); + } else { + player.transferToHost(new InetSocketAddress("steamwar.de", 25565)); + } return; } if (TeamTeilnahme.nimmtTeil(user.getTeam(), event.getEventID())) { + if (player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20_5) && VelocityCore.getProxy().getAllPlayers().stream().map(p -> SteamwarUser.get(p.getUniqueId())).filter(u -> u.getTeam() == user.getTeam()).count() > event.getMaximumTeamMembers()) { + player.storeCookie(EVENT_TO_SPECTATE_KEY, "TRUE".getBytes()); + player.transferToHost(new InetSocketAddress("steamwar.de", 25565)); + return; + } Subserver server = EventStarter.getEventServer().get(user.getTeam()); @@ -62,12 +79,21 @@ public class EventModeListener extends BasicListener { if (Referee.get(event.getEventID()).contains(user.getId())) return; - player.transferToHost(new InetSocketAddress("steamwar.de", 25565)); + if (player.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20_5)) { + sender.system("EVENTMODE_KICK"); + } else { + player.transferToHost(new InetSocketAddress("steamwar.de", 25565)); + } } @Subscribe public void onLobby(ServerConnectedEvent e) { Player player = e.getPlayer(); + + if (player.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20_5)) { + return; + } + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); EventFight.clearActiveFightsCache();