diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 065cf8635c..c6cccfbcf7 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -187,15 +187,15 @@ public class NetClient implements ApplicationListener{ effect(effect, x, y, rotation, color); } - //called on all clients @Remote(targets = Loc.server, variants = Variant.both) - public static void sendMessage(String message, String sender, Player playersender){ + public static void sendMessage(String message, @Nullable String unformatted, @Nullable Player playersender){ if(Vars.ui != null){ - Vars.ui.chatfrag.addMessage(message, sender); + Vars.ui.chatfrag.addMessage(message); } - if(playersender != null){ - playersender.lastText(message); + //display raw unformatted text above player head + if(playersender != null && unformatted != null){ + playersender.lastText(unformatted); playersender.textFadeTime(1f); } } @@ -204,7 +204,7 @@ public class NetClient implements ApplicationListener{ @Remote(called = Loc.server, targets = Loc.server) public static void sendMessage(String message){ if(Vars.ui != null){ - Vars.ui.chatfrag.addMessage(message, null); + Vars.ui.chatfrag.addMessage(message); } } @@ -240,7 +240,7 @@ public class NetClient implements ApplicationListener{ //special case; graphical server needs to see its message if(!headless){ - sendMessage(message, colorizeName(player.id, player.name), player); + sendMessage(netServer.chatFormatter.format(player, message), message, player); } //server console logging @@ -248,7 +248,7 @@ public class NetClient implements ApplicationListener{ //invoke event for all clients but also locally //this is required so other clients get the correct name even if they don't know who's sending it yet - Call.sendMessage(message, colorizeName(player.id(), player.name), player); + Call.sendMessage(netServer.chatFormatter.format(player, message), message, player); }else{ //a command was sent, now get the output @@ -284,12 +284,6 @@ public class NetClient implements ApplicationListener{ } } - public static String colorizeName(int id, String name){ - Player player = Groups.player.getByID(id); - if(name == null || player == null) return null; - return "[#" + player.color().toString().toUpperCase() + "]" + name; - } - @Remote(called = Loc.client, variants = Variant.one) public static void connect(String ip, int port){ if(!steam && ip.startsWith("steam:")) return; diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index d528f672f5..68557b486f 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -64,6 +64,8 @@ public class NetServer implements ApplicationListener{ return state.rules.defaultTeam; }; + /** Converts a message + NULLABLE player sender into a single string. Override for custom prefixes/suffixes. */ + public ChatFormatter chatFormatter = (player, message) -> player == null ? message : "[coral][[" + player.coloredName() + "[coral]]:[white] " + message; private boolean closing = false; private Interval timer = new Interval(); @@ -293,17 +295,19 @@ public class NetServer implements ApplicationListener{ clientCommands.register("t", "", "Send a message only to your teammates.", (args, player) -> { String message = admins.filterMessage(player, args[0]); if(message != null){ - Groups.player.each(p -> p.team() == player.team(), o -> o.sendMessage(message, player, "[#" + player.team().color.toString() + "]" + NetClient.colorizeName(player.id(), player.name))); + String raw = "[#" + player.team().color.toString() + "] " + chatFormatter.format(player, message); + Groups.player.each(p -> p.team() == player.team(), o -> o.sendMessage(raw, player, message)); } }); clientCommands.register("a", "", "Send a message only to admins.", (args, player) -> { if(!player.admin){ - player.sendMessage("[scarlet]You must be admin to use this command."); + player.sendMessage("[scarlet]You must be an admin to use this command."); return; } - Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[#" + Pal.adminChat.toString() + "]" + NetClient.colorizeName(player.id, player.name))); + String raw = "[#" + Pal.adminChat.toString() + "] " + chatFormatter.format(player, args[0]); + Groups.player.each(Player::admin, a -> a.sendMessage(raw, player, args[0])); }); //duration of a a kick in seconds @@ -981,4 +985,9 @@ public class NetServer implements ApplicationListener{ public interface TeamAssigner{ Team assign(Player player, Iterable players); } + + public interface ChatFormatter{ + /** @return text to be placed before player name */ + String format(@Nullable Player player, String message); + } } diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index d1b3d3da0d..791157ad56 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -9,7 +9,6 @@ import arc.util.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; -import mindustry.core.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -310,10 +309,15 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra Draw.z(z); } + /** @return name with a markup color prefix */ + String coloredName(){ + return "[#" + color.toString().toUpperCase() + "]" + name; + } + void sendMessage(String text){ if(isLocal()){ if(ui != null){ - ui.chatfrag.addMessage(text, null); + ui.chatfrag.addMessage(text); } }else{ Call.sendMessage(con, text, null, null); @@ -321,16 +325,16 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra } void sendMessage(String text, Player from){ - sendMessage(text, from, NetClient.colorizeName(from.id(), from.name)); + sendMessage(text, from, null); } - void sendMessage(String text, Player from, String fromName){ + void sendMessage(String text, Player from, String unformatted){ if(isLocal()){ if(ui != null){ - ui.chatfrag.addMessage(text, fromName); + ui.chatfrag.addMessage(text); } }else{ - Call.sendMessage(con, text, fromName, from); + Call.sendMessage(con, text, unformatted, from); } } diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index 0d97d5d6a2..59026146c8 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -23,7 +23,7 @@ import static mindustry.Vars.*; public class ChatFragment extends Table{ private static final int messagesShown = 10; - private Seq messages = new Seq<>(); + private Seq messages = new Seq<>(); private float fadetime; private boolean shown = false; private TextField chatfield; @@ -144,13 +144,13 @@ public class ChatFragment extends Table{ float theight = offsety + spacing + getMarginBottom() + scene.marginBottom; for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || shown); i++){ - layout.setText(font, messages.get(i).formattedMessage, Color.white, textWidth, Align.bottomLeft, true); + layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true); theight += layout.height + textspacing; if(i - scrollPos == 0) theight -= textspacing + 1; font.getCache().clear(); font.getCache().setColor(Color.white); - font.getCache().addText(messages.get(i).formattedMessage, fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); + font.getCache().addText(messages.get(i), fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); if(!shown && fadetime - i < 1f && fadetime - i >= 0f){ font.getCache().setAlphas((fadetime - i) * opacity); @@ -257,9 +257,9 @@ public class ChatFragment extends Table{ return shown; } - public void addMessage(String message, String sender){ - if(sender == null && message == null) return; - messages.insert(0, new ChatMessage(message, sender)); + public void addMessage(String message){ + if(message == null) return; + messages.insert(0, message); fadetime += 1f; fadetime = Math.min(fadetime, messagesShown) + 1f; @@ -267,22 +267,6 @@ public class ChatFragment extends Table{ if(scrollPos > 0) scrollPos++; } - private static class ChatMessage{ - public final String sender; - public final String message; - public final String formattedMessage; - - public ChatMessage(String message, String sender){ - this.message = message; - this.sender = sender; - if(sender == null){ //no sender, this is a server message? - formattedMessage = message == null ? "" : message; - }else{ - formattedMessage = "[coral][[" + sender + "[coral]]:[white] " + message; - } - } - } - private enum ChatMode{ normal(""), team("/t"),