Keep spectators in fight chat and treat spectate servers as fight servers

- '+' from a spectator on a fight server stays in the fight chat
- Event spectate servers (static servers with a spectate port) use a
  local fight chat by default and hide the global chat like arenas
This commit is contained in:
2026-10-16 09:07:58 +02:00
parent 65cc6119b0
commit 4c75879915
3 changed files with 18 additions and 5 deletions
@@ -31,8 +31,10 @@ import net.kyori.adventure.text.event.ClickEvent;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.Queue;
import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static de.steamwar.persistent.Storage.eventServer; import static de.steamwar.persistent.Storage.eventServer;
@@ -43,8 +45,15 @@ public class EventStarter {
@Getter @Getter
private static final Map<Integer, String> spectatePorts = new HashMap<>(); private static final Map<Integer, String> spectatePorts = new HashMap<>();
public static void addSpectateServer(int port, String command) { private static final Set<String> spectateServers = new HashSet<>();
public static void addSpectateServer(int port, String command, String serverName) {
spectatePorts.put(port, command); spectatePorts.put(port, command);
spectateServers.add(serverName);
}
public static boolean isSpectateServer(String serverName) {
return spectateServers.contains(serverName);
} }
public EventStarter() { public EventStarter() {
@@ -236,7 +236,7 @@ public class VelocityCore implements ReloadablePlugin {
String cmd = cmds.remove(0); String cmd = cmds.remove(0);
if (server.getSpectatePort() != 0) { if (server.getSpectatePort() != 0) {
EventStarter.addSpectateServer(server.getSpectatePort(), cmd); EventStarter.addSpectateServer(server.getSpectatePort(), cmd, entry.getKey());
} }
new ServerSwitchCommand(cmd, entry.getKey(), server.getSpectatePort() != 0, cmds.toArray(new String[0])); new ServerSwitchCommand(cmd, entry.getKey(), server.getSpectatePort() != 0, cmds.toArray(new String[0]));
@@ -113,8 +113,11 @@ public class ChatManager extends BasicListener {
return VelocityCore.getProxy().getServer(server.getServerInfo().getName()).orElse(null) != server; return VelocityCore.getProxy().getServer(server.getServerInfo().getName()).orElse(null) != server;
} }
/**
* @return true for arenas and event spectate servers, which use a fight chat instead of the global chat
*/
public static boolean isArena(RegisteredServer server) { public static boolean isArena(RegisteredServer server) {
return Subserver.isArena(Subserver.getSubserver(server.getServerInfo())); return Subserver.isArena(Subserver.getSubserver(server.getServerInfo())) || EventStarter.isSpectateServer(server.getServerInfo().getName());
} }
private static Optional<RegisteredServer> currentServer(Player player) { private static Optional<RegisteredServer> currentServer(Player player) {
@@ -371,14 +374,15 @@ public class ChatManager extends BasicListener {
RegisteredServer server = currentServer(sender.getPlayer()).orElse(null); RegisteredServer server = currentServer(sender.getPlayer()).orElse(null);
if (server == null) return current; if (server == null) return current;
if (current instanceof LocalChannel) { if (current instanceof LocalChannel local) {
FightTeamChannel blue = fightTeam(server, true); FightTeamChannel blue = fightTeam(server, true);
if (blue.isMember(sender)) return blue; if (blue.isMember(sender)) return blue;
FightTeamChannel red = fightTeam(server, false); FightTeamChannel red = fightTeam(server, false);
if (red.isMember(sender)) return red; if (red.isMember(sender)) return red;
return global; // Spectators on fight servers stay in the fight chat
return local.isArena() ? local : global;
} }
return local(server); return local(server);