public static void TellAbove(this Client player, string prefix, string message) { if (player == null) { return; } //macros message = Format.ReceiverMacros(player, message); ChatMessageServer cm = ChatMessageServer.CreateText(prefix + message); cm.Position = ChatPosition.AboveActionBar; player.Queue.Queue(cm); }
/// <summary> /// Pure chat messages /// </summary> public static void ParseClientChat(Client player, string message) { //Block unknown prevent mistype if (message.StartsWith(",") || message.StartsWith(">")) { player.TellSystem(Chat.Red, "unknown start symbol, begin with a space to ignore"); return; } //remove links from new players /* * if (player.Uptime.TotalDays < 2) * { * player.Tell(Chat.Purple, "New players can't send links"); * message = message.Replace("http://", ""); * message = message.Replace("https://", ""); * var mp = message.Split(); * foreach(var m in mp) * { * if(m.StartsWith("http://") || m.StartsWith("https://")) * } * }*/ //Short /tell if (message.StartsWith(".")) { string[] parts = message.Substring(1).Split(' '); if (parts.Length < 2) { player.TellSystem(Chat.Red, "Usage: .username message"); return; } message = FormatSpell(player, parts.JoinFrom(1)); Chatting.Parser.SendPrivateMessage(player, parts [0], message); return; } //Short reply if (message.StartsWith("<")) { if (player.LastInTell == null) { player.TellSystem(Chat.Red, "You must have received a private message before replying"); return; } message = FormatSpell(player, message.Substring(1)); Chatting.Parser.SendPrivateMessage(player, player.LastInTell, message); return; } //Short /t if (message.StartsWith("-")) { if (player.LastOutTell == null) { player.TellSystem(Chat.Red, "Use \".username message\" one time first"); return; } message = FormatSpell(player, message.Substring(1)); Chatting.Parser.SendPrivateMessage(player, player.LastOutTell, message); return; } //CAPS block if (message.Length > 3) { string caps = message.ToUpperInvariant(); if (caps == message) { message = message.ToLowerInvariant(); } } //Shout ! if (message == "!") { message = "!!"; } bool shout = message.StartsWith("!"); if (shout) { message = message.Substring(1); } if (player.Session.CurrentRegion != null && player.Session.CurrentRegion.Type == "spawn" && player.ChatChannel == null) { shout = true; } int receivers = 0; //No shouting for banned if (shout && Banned.CheckBanned(player) != null) { player.TellSystem(Chat.Red, "No shouting for the banned!"); return; } //Format Translate Spell for all other message = FormatSpell(player, message); //War chat if (!shout) { if (WarChat(player, message)) { return; } } if (player.Settings.Cloaked != null || player.Session is PossessSession) { player.TellSystem(Chat.Red, "no chat while cloaked, pm still works"); return; } foreach (Client p in PlayerList.List) { if (shout) { p.TellSystem(Chat.Gold + player.Name + " " + Chat.White + (p.Settings.Help ? "[shout] " : ""), message); receivers += 1; continue; } if (player.ChatChannel != null) { //Channel chat if (player.ChatChannel == p.ChatChannel) { p.TellSystem(Chat.Blue + player.Name + " " + Chat.Green + "[" + p.ChatChannel + "] ", message); receivers += 1; } continue; } double distance = player.Session.Position.DistanceTo(p.Session.Position); //residents always hear if (distance >= DistanceMax && TalkingToResident(player, p)) { p.TellSystem(Chat.Blue + player.Name + " " + Chat.Aqua + "[" + player.Session.CurrentRegion.Name + "] " + Chat.Gray, message); receivers += 1; continue; } if (p.Settings.Firehose == false) { if (player.Session.World != p.Session.World) { continue; } if (player.Session.Dimension != p.Session.Dimension) { continue; } } else { if (player.Session.World != p.Session.World) { distance = DistanceMax + 1; } if (player.Session.Dimension != p.Session.Dimension) { distance = DistanceMax + 1; } //firehose does not hear banned if ((p.Session is HellSession == false) && Banned.CheckBanned(player) != null) { continue; } } var chatText = new ChatJson() { Text = message, Color = "gray", //HoverEvent = ChatEvent.HoverShowText("that's what " + player.Name + " said"), }; var c = new ChatJson(); c.Translate = "%1$s %2$s"; c.With = new List <ChatJson>() { new ChatJson() { Text = player.Name, Color = "blue", ClickEvent = ChatEvent.ClickSuggestCommand("." + player.Name + " "), HoverEvent = ChatEvent.HoverShowText("send private message"), }, chatText }; if (distance < DistanceClose && p != player) { chatText.Color = "yellow"; } else if (distance < DistanceFar || p.Settings.Firehose && distance < DistanceMax) { chatText.Color = "white"; } else if (distance < DistanceMax || p.Settings.Firehose) { chatText.Color = "gray"; } else { continue; } var packet = new ChatMessageServer(); packet.Json = c; //Send message p.Queue.Queue(packet); if (p.Settings.Cloaked != null) //Dont count cloaked players { continue; } if (p != player) { receivers += 1; } } if (receivers == 0) { player.TellSystem(Chat.Blue, "No one heard you, " + Chat.Gray + "see /help"); } Log.WriteChat(player, player.ChatChannel, receivers, message); player.ChatEntry = new Entry(player.ChatChannel, message); }
/// <summary> /// Return true to block message /// </summary> public static bool ParseServer(Client player, ChatMessageServer chat) { chat.SetPacketBuffer(null); var cm = chat.Json; string trans = cm.Translate; if (trans == "tile.bed.noSleep") { player.TellSystem(Chat.DarkBlue, "No sleep during daytime"); return(true); } var args = cm.With; if (trans == null || args == null) { return(false); } //ignore Joined/Left messages, generated in proxy instead if (trans.StartsWith("multiplayer.player")) { return(true); } switch (trans) { //ignore some messages case "commands.weather.clear": case "commands.weather.rain": case "commands.weather.thunder": case "commands.gamemode.success.other": case "commands.save.success": case "chat.type.admin": return(true); } Debug.WriteLine("ServerChat: " + cm.Serialize()); if (trans == "chat.type.announcement") { /* * if (args.Count == 2) * player.Tell(Chat.Purple, "[" + args [0] + "] " + args [1]); * else * { * string t = ""; * foreach (var a in args) * t += " " + a.Text; * player.Tell(Chat.Purple, t); * }*/ return(false); } //Herobrine never dies for (int n = 0; n < args.Count; n++) { if (args [n].Text == "Player") { return(true); } } //Allow all other if (trans.StartsWith("death.") == false) { return(false); } //Block all other usernames if (args [0].Text != player.MinecraftUsername) { return(true); } //not sure but better require preparation again chat.SetPacketBuffer(null); //Adjust player name if (args [0].Text != null) { args [0].Text = args [0].Text.Replace(player.MinecraftUsername, player.Name); } if (args [0].ClickEvent != null) { args [0].ClickEvent.Value = args [0].ClickEvent.Value.Replace(player.MinecraftUsername, player.Name); } //Adjust attacker name if (args.Count > 1) { string byWho = args [1].Text; Client pp = PlayerList.GetPlayerByUsername(byWho); if (pp != null) { Log.WriteAction(player, new Attacked(pp), true); if (pp.Settings.Cloaked == MobType.None.ToString()) { trans = "death.attack.mob"; cm.Translate = trans; args [1].Text = "Skeleton"; } else if (pp.Settings.Cloaked != null) { trans = "death.attack.mob"; cm.Translate = trans; args [1].Text = pp.Settings.Cloaked; } else { //Stats player.Settings.Stats.Murdered += 1; pp.Settings.Stats.Kills += 1; } } } if (!Cause.Alternatives.ContainsKey(trans)) { Parser.TellNuxas(Chat.Aqua, "Unhandled cause of death: " + trans); return(false); } /*var list = Cause.Alternatives [trans]; * Random r = new Random(); * cm.Translate = list [r.Next(list.Length)]; */ cm.Color = "red"; player.Session.World.SendToAll(chat); player.Settings.Stats.NaturalDeath += 1; return(true); }
public static List <ChatMessageServer> Split(string prefix, string message, ChatPosition pos) { List <ChatMessageServer> msg = new List <ChatMessageServer>(); if (prefix.Length + message.Length <= wrapLength) { msg.Add(ChatMessageServer.CreateText(prefix + message, pos)); return(msg); } //Split long messages if (prefix.Length > 57) { return(Split("", prefix + message, pos)); //Split long prefix too } int max = 57 - prefix.Length; if (max <= 30) { msg.Add(ChatMessageServer.CreateText(prefix)); prefix = ""; max = 57; } string[] parts = message.Split(' '); string m = ""; foreach (string p in parts) { //Fit if (m.Length + p.Length + (m == "" ? 0 : 1) <= max) { if (m == "") { m = p; } else { m += " " + p; } continue; } //Dont fit, push it if (m == "") { int step = max - prefix.Length; for (int n = 0; n < p.Length; n += step) { if (n + step < p.Length) { msg.Add(ChatMessageServer.CreateText(prefix + p.Substring(n, step))); } else { msg.Add(ChatMessageServer.CreateText(prefix + p.Substring(n))); } } continue; } //Send old, start a new msg.Add(ChatMessageServer.CreateText(prefix + m)); m = p; } if (m != "") { msg.Add(ChatMessageServer.CreateText(prefix + m)); } return(msg); }