diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index bb133b93..789ccced 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -580,7 +580,9 @@ CHAT_GLOBAL = §8» {7}{2} CHAT_TEAM_SENDER = §e{0} CHAT_TEAM = §8» §f{2} CHAT_MSG_SENDER = §e{0} -CHAT_MSG = §8»§e{1} §7{2} +CHAT_MSG_SEPARATOR = §8» +CHAT_MSG_RECEIVER = §e{0} +CHAT_MSG = §7{0} CHAT_SPECIAL_ALERT = §e{0}§8»§e{1} §7{2} CHAT_FIGHT_PARTICIPANT_SENDER = {0}{1} CHAT_FIGHT_PARTICIPANT = §8» §7{0} diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index e7f26c99..99bcd3d3 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -545,7 +545,9 @@ CHAT_GLOBAL = §8» {7}{2} CHAT_TEAM_SENDER = §e{0} CHAT_TEAM = §8» §f{2} CHAT_MSG_SENDER = §e{0} -CHAT_MSG = §8»§e{1} §7{2} +CHAT_MSG_SEPARATOR = §8» +CHAT_MSG_RECEIVER = §e{0} +CHAT_MSG = §7{0} CHAT_SPECIAL_ALERT = §e{0}§8»§e{1} §7{2} CHAT_FIGHT_PARTICIPANT_SENDER = {0}{1} CHAT_FIGHT_PARTICIPANT = §8» §7{0} diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java index c560c12c..51ccc0d2 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java @@ -25,6 +25,7 @@ import de.steamwar.sql.AuditLog; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import java.util.LinkedHashMap; @@ -64,6 +65,28 @@ public abstract class ChatChannel { return null; } + /** + * @return the text put into the chat input when clicking the channel icon to write a single message, null if there is none + */ + protected String suggestion(Chatter receiver) { + return null; + } + + /** + * @return the channel icon with its name on hover and its write command on click + */ + Component iconComponent(Chatter receiver, String color) { + Message icon = icon(receiver); + Component component = icon == null ? receiver.parse(tag(receiver)) : receiver.parse(new Message("CHAT_ICON", color, icon)); + component = component.hoverEvent(HoverEvent.showText(receiver.parse(hover(receiver)))); + + String suggestion = suggestion(receiver); + if (suggestion != null) { + component = component.clickEvent(ClickEvent.suggestCommand(suggestion)); + } + return component; + } + public abstract Stream readers(); /** @@ -107,11 +130,9 @@ public abstract class ChatChannel { if (!receiver.chatShown()) continue; Component msg = format(receiver, sender, coloredMessage); - Message icon = icon(receiver); - if (icon != null) { - Component iconComponent = receiver.parse(new Message("CHAT_ICON", ChatManager.getDefault(receiver) == this ? "§e" : "§7", icon)) - .hoverEvent(HoverEvent.showText(receiver.parse(hover(receiver)))); - msg = Component.text().append(iconComponent).append(Component.text(" ")).append(msg).build(); + if (icon(receiver) != null) { + Component icon = iconComponent(receiver, ChatManager.getDefault(receiver) == this ? "§e" : "§7"); + msg = Component.text().append(icon).append(Component.text(" ")).append(msg).build(); } receiver.sendMessage(msg); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatManager.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatManager.java index bcdabf7e..199cda66 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatManager.java @@ -44,7 +44,6 @@ import de.steamwar.velocitycore.listeners.BasicListener; import de.steamwar.velocitycore.tablist.TablistManager; import lombok.Getter; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.event.HoverEvent; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -368,10 +367,8 @@ public class ChatManager extends BasicListener { * Tells the player which channel they write into, showing the channel icon with its name on hover. */ public static void notifyDefault(PlayerChatter player, ChatChannel channel) { - Message icon = channel.icon(player); - Component iconComponent = icon == null ? player.parse(channel.tag(player)) : player.parse(new Message("CHAT_ICON", "§a", icon)); player.sendMessage(Component.text() - .append(iconComponent.hoverEvent(HoverEvent.showText(player.parse(channel.hover(player))))) + .append(channel.iconComponent(player, "§a")) .append(Component.text(" ")) .append(player.parse(new Message("CHAT_CHANNEL_DEFAULT"))) .build()); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java index f0a79923..5b89b8ba 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java @@ -70,6 +70,11 @@ public class DirectChannel extends ChatChannel { return new Message("CHAT_ICON_MSG"); } + @Override + protected String suggestion(Chatter receiver) { + return "/msg " + SteamwarUser.get(partner(receiver.user().getUUID())).getUserName() + " "; + } + @Override public Stream readers() { return Stream.of(first, second) @@ -95,7 +100,14 @@ public class DirectChannel extends ChatChannel { @Override protected Component format(Chatter receiver, Chatter sender, String message) { - return ChatFormat.player("CHAT_MSG", receiver, sender, Chatter.of(partner(sender.user().getUUID())), message); + SteamwarUser partner = SteamwarUser.get(partner(sender.user().getUUID())); + return Component.text() + .append(ChatFormat.withTeamHover(receiver, sender.user(), receiver.parse(new Message("CHAT_MSG_SENDER", sender.user())))) + .append(receiver.parse(new Message("CHAT_MSG_SEPARATOR"))) + .append(ChatFormat.withTeamHover(receiver, partner, receiver.parse(new Message("CHAT_MSG_RECEIVER", partner)))) + .append(Component.text(" ")) + .append(receiver.parse(new Message("CHAT_MSG", ChatFormat.highlightMentions(message, "§7", receiver)))) + .build(); } @Override diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java index 4e018ddd..49b75cfa 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java @@ -83,6 +83,12 @@ public class FightTeamChannel extends ChatChannel { return new Message("CHAT_ICON_FIGHT_TEAM_FOREIGN", color, server.getServerInfo().getName()); } + @Override + protected String suggestion(Chatter receiver) { + // Messages starting with '+' go into the fight team chat while writing into the fight chat + return ChatManager.onServer(receiver, server) ? "+" : null; + } + @Override public Stream readers() { List members = members(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java index cc2219cd..67730da7 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java @@ -44,6 +44,11 @@ public class GlobalChannel extends ChatChannel { return new Message("CHAT_ICON_GLOBAL"); } + @Override + protected String suggestion(Chatter receiver) { + return "/global "; + } + @Override public Stream readers() { return Stream.concat(Stream.of(Chatter.console()), Chatter.allPlayers().filter(ChatManager::readsGlobal).map(Chatter::of).filter(chatter -> ChatManager.reads(chatter, persistId()))); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java index a32d3f23..d3a3e41c 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java @@ -79,6 +79,14 @@ public class LocalChannel extends ChatChannel { return new Message("CHAT_ICON_FIGHT_FOREIGN", server.getServerInfo().getName()); } + @Override + protected String suggestion(Chatter receiver) { + if (isArena() && !ChatManager.onServer(receiver, server)) { + return "/chat " + server.getServerInfo().getName() + " msg "; + } + return "/local "; + } + @Override public Stream readers() { Stream players = server.getPlayersConnected().stream().map(Chatter::of).filter(chatter -> ChatManager.reads(chatter, persistId())).map(Chatter.class::cast); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java index 1860633d..1e23d787 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java @@ -48,6 +48,11 @@ public class ServerTeamChannel extends ChatChannel { return new Message("CHAT_ICON_SERVERTEAM"); } + @Override + protected String suggestion(Chatter receiver) { + return "/stc "; + } + @Override public Stream readers() { return Arrays.stream(Chatter.serverteam().getChatters()).filter(chatter -> ChatManager.reads(chatter, persistId())); diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java index f362099b..4603c3d5 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java @@ -54,6 +54,11 @@ public class TeamChannel extends ChatChannel { return new Message("CHAT_ICON_TEAM"); } + @Override + protected String suggestion(Chatter receiver) { + return "/tc "; + } + @Override public Stream readers() { return Chatter.allPlayers()