コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: Format.cs プロジェクト: mctraveler/MineSharp
        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);
        }