Rework chat into Velocity-managed channels

Chat is now handled entirely by VelocityCore through channels with
separate readers and writers (Global, Local/Fight, Blue/Red fight team,
Team, ServerTeam, Alert and 1:1 direct messages). Each player has a
saved default channel; messages from other channels are tagged with
the channel name, and every default change is announced.

- /global, /local, /tc, /stc, /msg and /r switch the default channel
  when called without a message
- /chat <channel> switches, /chat <channel> join|leave toggles reading
  (saved); moderators can join arenas by name and write with
  /chat <channel> msg <text>
- '+' sends from global to local and from local/fight to the fight team
- Referees write yellow in the fight chat
- Subservers no longer receive chat; arenas get a record-only
  ChatRecordPacket so replays keep their chat
- Remove the chat listeners of SpigotCore, FightSystem, MissileWars,
  TowerRun and TNTLeague

Closes #460, #129
This commit is contained in:
2026-10-15 19:55:25 +02:00
parent d727982ce0
commit 9fe05b59e4
37 changed files with 1607 additions and 372 deletions
@@ -109,7 +109,6 @@ TEAM_READY = §aTeam ready
TEAM_NOT_READY = §c§mTeam ready
SKIP_READY = §aSkipping to next event
SKIP_NOT_READY = §c§mSkipping to next event
TEAM_CHAT = {0}{1}§8» {0}{2}
CHOOSE_KIT = §eChoose kit
RESPAWN = §eRespawn
MANAGE_PLAYERS = §cManage players
@@ -256,10 +256,6 @@ public class FightTeam {
broadcast(player -> FightSystem.getMessage().send(message, player, params));
}
public void broadcastChat(Player sender, String message) {
broadcast(player -> FightSystem.getMessage().sendPrefixless("TEAM_CHAT", player, ChatMessageType.CHAT, prefix, sender.getName(), message));
}
private void broadcast(Consumer<Player> f) {
players.forEach((uuid, fightPlayer) -> {
Player player = Bukkit.getPlayer(uuid);
@@ -19,50 +19,41 @@
package de.steamwar.fightsystem.listener;
import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.record.GlobalRecorder;
import de.steamwar.fightsystem.states.FightState;
import de.steamwar.fightsystem.states.StateDependentListener;
import de.steamwar.linkage.Linked;
import de.steamwar.network.packets.PacketHandler;
import de.steamwar.network.packets.server.ChatRecordPacket;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import java.util.logging.Level;
/**
* Chat is handled by Velocity. Messages written on this server are only sent here to be recorded for the replay.
*/
@Linked
public class Chat implements Listener {
public class Chat extends PacketHandler {
public Chat() {
new StateDependentListener(ArenaMode.All, FightState.All, this);
}
@Handler
public void handleChatRecord(ChatRecordPacket packet) {
SteamwarUser user = SteamwarUser.byId(packet.getPlayerId());
String message = packet.getMessage();
FightSystem.getPlugin().getLogger().log(Level.INFO, user.getUserName() + "» " + message);
@EventHandler
public void handlePlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
String message = event.getMessage();
FightSystem.getPlugin().getLogger().log(Level.INFO, player.getName() + "» " + message);
FightTeam fightTeam = Fight.getPlayerTeam(player);
Player player = Bukkit.getPlayer(user.getUUID());
FightTeam fightTeam = player != null ? Fight.getPlayerTeam(player) : null;
if (fightTeam != null) {
String teamName = fightTeam.getColoredName();
if (message.startsWith(Config.GameModeConfig.TeamChatPrefix)) {
fightTeam.broadcastChat(player, message.substring(1));
} else {
broadcastChat("PARTICIPANT_CHAT", teamName, player.getName(), message);
}
} else if (Config.isReferee(player)) {
broadcastChat("FIGHTLEADER_CHAT", player.getName(), message);
GlobalRecorder.getInstance().chat("PARTICIPANT_CHAT", fightTeam.getColoredName(), user.getUserName(), message);
} else if (player != null && Config.isReferee(player)) {
GlobalRecorder.getInstance().chat("FIGHTLEADER_CHAT", user.getUserName(), message);
} else {
broadcastChat("SPECTATOR_CHAT", player.getName(), message);
GlobalRecorder.getInstance().chat("SPECTATOR_CHAT", user.getUserName(), message);
}
event.setCancelled(true);
}
public static void broadcastChat(String message, Object... params) {