/// <summary>
 /// Used internally to write messages
 /// </summary>
 /// <param name="message"></param>
 /// <param name="mode"></param>
 public void OnMessage(string message, MessageModes mode = MessageModes.Information)
 {
     if (WriteMessage != null)
     {
         WriteMessage(message, mode);
     }
 }
Beispiel #2
0
        private static void WriteConsole(string msg, MessageModes mode)
        {
            var consoleColor = Console.ForegroundColor;

            if (mode == Westwind.HtmlPackager.MessageModes.Error)
            {
                Console.ForegroundColor = ConsoleColor.Red;
            }
            else if (mode == Westwind.HtmlPackager.MessageModes.Warning)
            {
                Console.ForegroundColor = ConsoleColor.DarkYellow;
            }
            else if (mode == Westwind.HtmlPackager.MessageModes.Information)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
            }
            else if (mode == Westwind.HtmlPackager.MessageModes.Information2)
            {
                Console.ForegroundColor = ConsoleColor.Green;
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.White;
            }

            Console.WriteLine(msg);

            Console.ForegroundColor = consoleColor;
        }
Beispiel #3
0
        private static void WriteConsole(string msg, MessageModes mode)
        {
            var consoleColor = Console.ForegroundColor;

            if (mode == MessageModes.Error)
            {
                Console.ForegroundColor = ConsoleColor.Red;
            }
            else if (mode == MessageModes.Warning)
            {
                Console.ForegroundColor = ConsoleColor.DarkYellow;
            }
            else if (mode == MessageModes.Information)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
            }
            else if (mode == MessageModes.Success)
            {
                Console.ForegroundColor = ConsoleColor.Green;
            }

            Console.WriteLine(msg);

            Console.ForegroundColor = consoleColor;
        }
Beispiel #4
0
        public void SendTalk(MessageModes mode, params object[] rest)
        {
            OutputMessage message = new OutputMessage();

            message.AddU8(ClientServerOpCodes.Talk);
            message.AddU8((byte)mode);

            if (rest.Length == 1 && rest[0] is string)
            {
                message.AddString(rest[0] as string);
            }
            else if (rest.Length == 2 && rest[0] is string && rest[1] is string)
            {
                message.AddString(rest[0] as string);
                message.AddString(rest[1] as string);
            }
            else if (rest.Length == 2 && rest[0] is int && rest[1] is string)
            {
                int channelID = (int)rest[0];
                message.AddU16((ushort)channelID);
                message.AddString(rest[1] as string);
            }

            WriteToOutput(message);
        }
Beispiel #5
0
        public MessageMode GetMessageMode(MessageModes mode)
        {
            if (!MessageMode.s_CheckMode((int)mode))
            {
                throw new System.ArgumentException("MessageModeSet.getMessageMode: Invalid mode: " + mode + ".");
            }

            return(m_MessageModes[(int)mode]);
        }
Beispiel #6
0
 public OnscreenMessageBox(Vector3Int?position, string speaker, int speakerLevel, MessageModes mode, int messagesSize, TMPro.TextMeshProUGUI textMesh = null)
 {
     m_Position     = position;
     Speaker        = speaker;
     m_SpeakerLevel = speakerLevel;
     Mode           = mode;
     m_Messages     = new Utility.RingBuffer <OnscreenMessage>(messagesSize);
     m_TextMesh     = textMesh;
 }
Beispiel #7
0
        // [TODO] Allowment to have custom filter sets (changing the default colors of anything)
        public MessageFilterSet(int id)
        {
            m_ID           = id;
            m_MessageModes = new MessageMode[(int)MessageModes.BeyondLast];

            for (MessageModes i = MessageModes.None; i < MessageModes.BeyondLast; i++)
            {
                AddMessageMode(new MessageMode(i));
            }
        }
Beispiel #8
0
 public Channel(Utility.UnionStrInt ID, string name, MessageModes sendMode)
 {
     m_ID            = ID;
     m_Name          = name;
     m_SendMode      = sendMode;
     m_Closable      = true;
     m_SendAllowed   = true;
     m_NicklistItems = new List <object>();
     m_Messages      = new List <ChannelMessage>(MessagesSize);
 }
Beispiel #9
0
 public MessageMode(MessageModes mode)
 {
     m_ID = mode;
     m_ShowOnscreenMessage = MessageModeDefaults[(int)m_ID].ShowOnscreen;
     m_ShowChannelMessage  = MessageModeDefaults[(int)m_ID].ShowChannel;
     m_TextARGB            = MessageModeDefaults[(int)m_ID].TextARGB;
     m_HighlightARGB       = MessageModeDefaults[(int)m_ID].HighlightARGB;
     m_ScreenTarget        = MessageModeDefaults[(int)m_ID].ScreenTarget;
     m_Header = MessageModeDefaults[(int)m_ID].Header;
     m_Prefix = MessageModeDefaults[(int)m_ID].Prefix;
 }
Beispiel #10
0
 public MessageModeProperties(MessageModes mode, bool showOnscreen, bool showChannel, uint textARGB, uint highlightARGB, bool editable, bool ignoreNameFilter, MessageScreenTargets screenTarget, MessageModeHeaders header = MessageModeHeaders.None, MessageModePrefixes prefix = MessageModePrefixes.None)
 {
     Mode             = mode;
     ShowOnscreen     = showOnscreen;
     ShowChannel      = showChannel;
     TextARGB         = textARGB;
     HighlightARGB    = highlightARGB;
     Editable         = editable;
     IgnoreNameFilter = ignoreNameFilter;
     ScreenTarget     = screenTarget;
     Header           = header;
     Prefix           = prefix;
 }
Beispiel #11
0
        public ChannelMessage(int id, string speaker, int speakerLevel, MessageModes mode, string text)
        {
            if (id <= 0)
            {
                m_ID = --s_NextID;
            }
            else
            {
                m_ID = id;
            }

            m_Speaker      = speaker;
            m_SpeakerLevel = speakerLevel;
            m_Mode         = mode;
            m_RawText      = text;
            m_TimeStamp    = System.DateTime.Now.Ticks;
        }
Beispiel #12
0
        public OnscreenMessage(int statementID, string speaker, int speakerLevel, MessageModes mode, string text)
        {
            if (statementID <= 0)
            {
                m_ID = --s_NextID;
            }
            else
            {
                m_ID = statementID;
            }

            m_Speaker      = speaker;
            m_SpeakerLevel = speakerLevel;
            m_Mode         = mode;
            m_Text         = text;
            m_VisibleSince = int.MaxValue;
            m_TTL          = (30 + m_Text.Length / 3) * 100;
        }
Beispiel #13
0
        public void AddText(string text)
        {
            if (text == null)
            {
                throw new System.ArgumentNullException("MessageBlock.AddText: text is null.");
            }

            m_TextPieces.Add(text);
            MessageModes mode = m_NextOnscreenMessageIndex == 0 ? MessageModes.NpcFromStartBlock : MessageModes.NpcFrom;

            OpenTibiaUnity.ChatStorage.AddChannelMessage(ChatStorage.NpcChannelID, 0, m_Speaker, 0, mode, text);
            if (m_NextOnscreenMessageIndex == 0 || m_NextOnscreenMessageIndex > 0 && OpenTibiaUnity.TicksMillis > m_MinTimeForNextOnscreenMessage)
            {
                ShowNextOnscreenMessage();
            }
            else if (!m_TimerEventRegistered)
            {
                OpenTibiaUnity.GameManager.AddSecondaryTimerListener(OnSecondaryTimer);
                m_TimerEventRegistered = true;
            }
        }
Beispiel #14
0
        public Channel AddChannel(Utility.UnionStrInt channelID, string name, MessageModes mode)
        {
            Channel channel = GetChannel(channelID);

            if (channel != null)
            {
                channel.Name        = name;
                channel.SendAllowed = true;
            }
            else
            {
                channel = new Channel(channelID, name, mode);
                m_Channels.Add(channel);
                onAddChannel.Invoke(channel);

                switch ((int)channelID)
                {
                case HelpChannelID:
                    AddChannelMessage(channelID, -1, null, 0, MessageModes.ChannelManagment, "Welcome to the help channel. In this channel you can ask questions about/ Tibia. Experienced players will gladly help you to the best of their knowledge. If their answer was helpful, reward them with a \"Thank You!\" which/you /can select by right-clicking on their statement. For detailed information about quests and other game content, please take a look at our /supported fansite in /the community section of the official Tibia website.");
                    break;

                case MainAdvertisingChannelID:
                case RookAdvertisingChannelID:
                    AddChannelMessage(channelID, -1, null, 0, MessageModes.ChannelManagment, "Here you can advertise all kinds of things. Among others, you can trade Tibia/ items, advertise ingame events, seek characters for a quest or a hunting group, find members for your guild or look for somebody to help you with /something. It goes without saying that all advertisements must conform to the Tibia Rules. Keep in mind that it is illegal to advertise trades /including real money or Tibia characters.");
                    break;

                default:
                    break;
                }
            }

            var player = OpenTibiaUnity.Player;

            if (!!player && player.Name != null)
            {
                channel.PlayerJoined(player.Name);
            }

            return(channel);
        }
Beispiel #15
0
        public string SendChannelMessage(string text, Channel channel, MessageModes mode)
        {
            var protocolGame = OpenTibiaUnity.ProtocolGame;
            var player       = OpenTibiaUnity.Player;

            if (protocolGame == null || !protocolGame.IsGameRunning)
            {
                return("");
            }

            text = text.Trim();
            if (text.Length > Constants.MaxTalkLength)
            {
                text = text.Substring(0, Constants.MaxTalkLength);
            }

            if (text.Length == 0)
            {
                return("");
            }

            mode = mode != MessageModes.None ? mode : channel.SendMode;

            Utility.UnionStrInt channelID = null;
            if ((!channel.ID.IsInt || (channel.ID != DebugChannelID && channel.ID != LocalChannelID && channel.ID != ServerChannelID)) && channel.SendAllowed)
            {
                channelID = channel.ID;
            }

            string channelName = null;

            var regex1 = new System.Text.RegularExpressions.Regex(@"^#([sywbixc])\s+(.*)");
            var regex2 = new System.Text.RegularExpressions.Regex(@"^([*@$])([^\1]+?)\1\s*(.*)");

            string externalCommand = null;

            System.Text.RegularExpressions.Match match;
            if ((match = regex1.Match(text)) != null && match.Success)
            {
                externalCommand = match.Groups[1].ToString().ToLower();
                if (externalCommand == "b")
                {
                    mode = MessageModes.GamemasterBroadcast;
                }
                else if (externalCommand == "c")
                {
                    mode = MessageModes.GamemasterChannel;
                }
                else if (externalCommand == "i")
                {
                    mode = MessageModes.None;
                }
                else if (externalCommand == "s")
                {
                    mode = MessageModes.Say;
                }
                else if (externalCommand == "w")
                {
                    mode = MessageModes.Whisper;
                }
                else if (externalCommand == "x")
                {
                    mode = MessageModes.None;
                }
                else if (externalCommand == "y")
                {
                    mode = MessageModes.Yell;
                }

                text = match.Groups[2].ToString();
            }
            else if ((match = regex2.Match(text)) != null && match.Success)
            {
                externalCommand = match.Groups[1].ToString().ToLower();
                if (externalCommand == "*")
                {
                    mode = MessageModes.PrivateTo;
                }
                else if (externalCommand == "@")
                {
                    mode = MessageModes.GamemasterPrivateTo;
                }

                channelID   = match.Groups[2].ToString();
                channelName = channelID;
                if (channelName.Length > Constants.MaxChannelLength)
                {
                    channelName = channelName.Substring(0, Constants.MaxChannelLength);
                }

                text = match.Groups[3].ToString();
            }

            if (mode == MessageModes.GamemasterChannel && (!channelID.IsInt || channelID == NpcChannelID))
            {
                OpenTibiaUnity.WorldMapStorage.AddOnscreenMessage(MessageModes.Failure, TextResources.MSG_CHANNEL_NO_ANONYMOUS);
                return("");
            }

            if (HasOwnPrivateChannel)
            {
                if (externalCommand == "i")
                {
                    protocolGame.SendInviteToChannel(text, OwnPrivateChannelID);
                }
                else if (externalCommand == "x")
                {
                    protocolGame.SendExcludeFromChannel(text, OwnPrivateChannelID);
                }
            }

            switch (mode)
            {
            case MessageModes.None: break;

            case MessageModes.Say:
            case MessageModes.Whisper:
            case MessageModes.Yell:
                protocolGame.SendTalk(mode, text);
                break;

            case MessageModes.Channel:
                protocolGame.SendTalk(mode, (int)channelID, text);
                break;

            case MessageModes.PrivateTo:
                AddChannelMessage(channelID, -1, player.Name, player.Level, mode, text);
                if (channelID != player.Name.ToLower())
                {
                    protocolGame.SendTalk(mode, channelID, text);
                }
                break;
            }

            if (channelID != channel.ID && (mode == MessageModes.PrivateTo || mode == MessageModes.GamemasterPrivateTo))
            {
                return("*" + channelName + "* ");
            }

            return("");
        }
Beispiel #16
0
        public ChannelMessage AddChannelMessage(Utility.UnionStrInt channelID, int statementID, string speaker, int speakerLevel, MessageModes mode, string text)
        {
            var messageFilterSet = OpenTibiaUnity.OptionStorage.GetMessageFilterSet(MessageFilterSet.Default);
            var messageMode      = messageFilterSet.GetMessageMode(mode);

            if (messageMode == null || !messageMode.ShowChannelMessage)
            {
                return(null);
            }

            // TODO: NameFilterSet

            bool           isReportName      = speaker != null && channelID.IsInt && ((int)channelID == ChatStorage.HelpChannelID || speakerLevel > 0);
            bool           isReportStatement = statementID > 0;
            Channel        channel           = null;
            ChannelMessage channelMessage    = new ChannelMessage(statementID, speaker, speakerLevel, mode, text);

            channelMessage.FormatMessage(messageFilterSet.ShowTimeStamps, messageFilterSet.ShowLevels, messageMode.TextARGB, messageMode.HighlightARGB);

            switch (mode)
            {
            case MessageModes.Say:
            case MessageModes.Yell:
            case MessageModes.Whisper:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(ChatStorage.LocalChannelID);
                break;

            case MessageModes.PrivateFrom:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(channelID);
                if (channel == null)
                {
                    channel = GetChannel(ChatStorage.LocalChannelID);
                }
                break;

            case MessageModes.PrivateTo:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(channelID);
                if (channel == null)
                {
                    channel = GetChannel(ChatStorage.LocalChannelID);
                }
                break;

            case MessageModes.ChannelManagment:
                channel = GetChannel(channelID);
                if (channel == null)
                {
                    channel = GetChannel(ChatStorage.LocalChannelID);
                }
                break;

            case MessageModes.Channel:
            case MessageModes.ChannelHighlight:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(channelID);
                break;

            case MessageModes.Spell:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channel = GetChannel(ChatStorage.LocalChannelID);
                break;

            case MessageModes.NpcFromStartBlock:
            case MessageModes.NpcFrom:
            case MessageModes.NpcTo:
                channel = AddChannel(ChatStorage.NpcChannelID, "NPCs", MessageModes.NpcTo);
                break;

            case MessageModes.GamemasterBroadcast:
                channel = GetChannel(ChatStorage.ServerChannelID);
                break;

            case MessageModes.GamemasterChannel:
                channel = GetChannel(channelID);
                break;

            case MessageModes.GamemasterPrivateFrom:
            case MessageModes.GamemasterPrivateTo:
                channel = GetChannel(ChatStorage.ServerChannelID);
                break;

            case MessageModes.Login:
            case MessageModes.Admin:
            case MessageModes.Game:
            case MessageModes.GameHighlight:
            case MessageModes.Look:
            case MessageModes.DamageDealed:
            case MessageModes.DamageReceived:
            case MessageModes.Heal:
            case MessageModes.Mana:
            case MessageModes.Exp:
            case MessageModes.DamageOthers:
            case MessageModes.HealOthers:
            case MessageModes.ExpOthers:
            case MessageModes.Status:
            case MessageModes.Loot:
            case MessageModes.TradeNpc:
            case MessageModes.Report:
            case MessageModes.HotkeyUse:
            case MessageModes.TutorialHint:
            case MessageModes.Thankyou:
                channel = GetChannel(ChatStorage.ServerChannelID);
                break;

            case MessageModes.Guild:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(channelID);
                if (channel == null)
                {
                    channel = GetChannel(ChatStorage.ServerChannelID);
                }
                break;

            case MessageModes.PartyManagement:
            case MessageModes.Party:
                channelMessage.SetReportTypeAllowed(ReportTypes.Name, isReportName);
                channelMessage.SetReportTypeAllowed(ReportTypes.Statement, isReportStatement);
                channel = GetChannel(channelID);
                if (channel == null)
                {
                    channel = GetChannel(ChatStorage.ServerChannelID);
                }
                break;
            }

            if (channel != null)
            {
                channel.AppendMessage(channelMessage);
                return(channelMessage);
            }

            return(null);
        }
Beispiel #17
0
 public OnscreenMessageBox AddOnscreenMessage(MessageModes mode, string text)
 {
     return(AddOnscreenMessage(null, -1, null, 0, mode, text, uint.MaxValue));
 }
Beispiel #18
0
        private void ParseTalk(InputMessage message)
        {
            uint   statementID  = message.GetU32();
            string speaker      = message.GetString();
            ushort speakerLevel = message.GetU16();

            MessageModes mode = (MessageModes)message.GetU8();

            Vector3Int?absolutePosition = null;

            Utility.UnionStrInt channelID = null;

            switch (mode)
            {
            case MessageModes.Say:
            case MessageModes.Whisper:
            case MessageModes.Yell:
                absolutePosition = message.GetPosition();
                channelID        = Chat.ChatStorage.LocalChannelID;
                break;

            case MessageModes.PrivateFrom:
                channelID = speaker;
                break;

            case MessageModes.Channel:
            case MessageModes.ChannelHighlight:
                channelID = message.GetU16();
                break;

            case MessageModes.Spell:
                absolutePosition = message.GetPosition();
                channelID        = Chat.ChatStorage.LocalChannelID;
                break;

            case MessageModes.NpcFromStartBlock:
                absolutePosition = message.GetPosition();
                break;

            case MessageModes.GamemasterBroadcast:
                break;

            case MessageModes.GamemasterChannel:
                channelID = message.GetU16();
                break;

            case MessageModes.GamemasterPrivateFrom:
                channelID = speaker;
                break;

            case MessageModes.BarkLow:
            case MessageModes.BarkLoud:
                absolutePosition = message.GetPosition();
                channelID        = -1;
                break;

            case MessageModes.Game:
                break;

            default:
                throw new System.Exception("ProtocolGame.ParseTalk: invalid message mode.");
            }

            string text = message.GetString();

            if (mode != MessageModes.NpcFromStartBlock && mode != MessageModes.NpcFrom)
            {
                try {
                    m_WorldMapStorage.AddOnscreenMessage(absolutePosition, (int)statementID, speaker, speakerLevel, mode, text);
                    m_ChatStorage.AddChannelMessage(channelID, (int)statementID, speaker, speakerLevel, mode, text);
                } catch (System.Exception e) {
                    throw new System.Exception("ProtocolGame.ParseTalk: Failed to add message: " + e.Message + "\n" + e.StackTrace);
                }
            }
            else if (mode == MessageModes.NpcFromStartBlock)
            {
                m_MessageStorage.StartMessageBlock(speaker, absolutePosition, text);
            }
            else if (mode == MessageModes.NpcFrom)
            {
                m_MessageStorage.AddTextToBlock(speaker, text);
            }
        }
Beispiel #19
0
        private void ParseTextMessage(InputMessage message)
        {
            MessageModes mode = (MessageModes)message.GetU8();

            try {
                switch (mode)
                {
                case MessageModes.ChannelManagment:
                    int    channelID = message.GetU16();
                    string text      = message.GetString();
                    // TODO name filter
                    //var regex = new System.Text.RegularExpressions.Regex(@"^(.+?) invites you to |^You have been excluded from the channel ([^']+)'s Channel\.$");
                    //var match = regex.Match(text);
                    //string speaker = match != null && match.Success ? match.Value : null;

                    m_WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    m_ChatStorage.AddChannelMessage(channelID, -1, null, 0, mode, text);
                    break;

                case MessageModes.Guild:
                case MessageModes.PartyManagement:
                case MessageModes.Party:
                    channelID = message.GetU16();
                    text      = message.GetString();
                    m_WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    m_ChatStorage.AddChannelMessage(channelID, -1, null, 0, mode, text);
                    break;

                case MessageModes.Login:
                case MessageModes.Admin:
                case MessageModes.Game:
                case MessageModes.GameHighlight:
                case MessageModes.Failure:
                case MessageModes.Look:
                case MessageModes.Status:
                case MessageModes.Loot:
                case MessageModes.TradeNpc:
                case MessageModes.HotkeyUse:
                    channelID = -1;
                    text      = message.GetString();
                    m_WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    m_ChatStorage.AddChannelMessage(channelID, -1, null, 0, mode, text);
                    break;

                case MessageModes.Market:
                    text = message.GetString();
                    // TODO: market
                    break;

                case MessageModes.Report:
                    // TODO
                    //ReportWidget.s_ReportTimestampReset();
                    text = message.GetString();
                    m_WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    m_ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                case MessageModes.DamageDealed:
                case MessageModes.DamageReceived:
                case MessageModes.DamageOthers:
                    Vector3Int position = message.GetPosition();
                    uint       value    = message.GetU32();
                    uint       color    = message.GetU8();
                    if (value > 0)
                    {
                        m_WorldMapStorage.AddOnscreenMessage(position, -1, null, 0, mode, (int)value, color);
                    }

                    value = message.GetU32();
                    color = message.GetU8();
                    if (value > 0)
                    {
                        m_WorldMapStorage.AddOnscreenMessage(position, -1, null, 0, mode, (int)value, color);
                    }

                    text = message.GetString();
                    m_ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                case MessageModes.Heal:
                case MessageModes.Mana:
                case MessageModes.Exp:
                case MessageModes.HealOthers:
                case MessageModes.ExpOthers:
                    position = message.GetPosition();
                    value    = message.GetU32();
                    color    = message.GetU8();
                    m_WorldMapStorage.AddOnscreenMessage(position, -1, null, 0, mode, (int)value, color);

                    text = message.GetString();
                    m_ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                default:
                    throw new System.Exception("Invalid message mode " + mode + ".");
                }
            } catch (System.Exception e) {
                throw new System.Exception("Connection.readSMESSAGE: Failed to add message of type " + mode + ": " + e.Message + "\n" + e.StackTrace);
            }
        }
Beispiel #20
0
 public OnscreenMessageBox AddOnscreenMessage(UnityEngine.Vector3Int?position, int statementID, string speaker, int speakerLevel, MessageModes mode, string text)
 {
     return(AddOnscreenMessage(position, statementID, speaker, speakerLevel, mode, text, uint.MaxValue));
 }
Beispiel #21
0
        public OnscreenMessageBox AddOnscreenMessage(UnityEngine.Vector3Int?position, int statementID, string speaker, int speakerLevel, MessageModes mode, Utility.UnionStrInt text, uint color)
        {
            Chat.MessageFilterSet messageFilterSet = Chat.MessageFilterSet.DefaultFilterSet;

            Chat.MessageMode messageMode = messageFilterSet.GetMessageMode(mode);
            if (messageMode == null || !messageMode.ShowOnScreen || messageMode.ScreenTarget == MessageScreenTargets.None)
            {
                return(null);
            }

            // TODO: name filter (speaker)

            var screenTarget = messageMode.ScreenTarget;

            if (screenTarget == MessageScreenTargets.EffectCoordinate)
            {
                // color effect on a position
                // Tip: Here you can modify this "is int" and "as int" to add colored text and so on.

                if (!position.HasValue)
                {
                    throw new System.Exception("WorldMapStorage.AddOnscreenMessage: Missing co-ordinate.");
                }

                if (text.IsInt)
                {
                    //uint value = (uint)((int)text);
                    //var textualEffect = OpenTibiaUnity.AppearanceStorage.CreateTextualEffect(-1, color, value);
                    //AppendEffect(position.Value, textualEffect);
                }

                return(null);
            }

            OnscreenMessageBox messageBox = null;
            OnscreenMessage    message    = null;

            if (screenTarget == MessageScreenTargets.BoxCoordinate)
            {
                if (!position.HasValue)
                {
                    throw new System.Exception("WorldMapStorage.AddOnscreenMessage: Missing co-ordinate.");
                }

                bool visible = true;

                for (int i = (int)screenTarget; i < MessageBoxes.Count; i++)
                {
                    var tmpMessageBox = MessageBoxes[i];
                    if (tmpMessageBox.Position == null || tmpMessageBox.Position == position.Value)
                    {
                        if (tmpMessageBox.Speaker == speaker && tmpMessageBox.Mode == mode)
                        {
                            messageBox = tmpMessageBox;
                            break;
                        }

                        visible = false;
                    }
                }

                if (messageBox == null)
                {
                    var textBox = UnityEngine.Object.Instantiate(m_TextBoxPrefab, OpenTibiaUnity.GameManager.OnscreenMessagesContainer);
                    messageBox         = new OnscreenMessageBox(position, speaker, speakerLevel, mode, Constants.NumOnscreenMessages, textBox);
                    messageBox.Visible = visible;

                    var tmpMessage = messageMode.GetOnscreenMessageHeader(speaker, speakerLevel);
                    if (tmpMessage != null)
                    {
                        message = new OnscreenMessage(-1, speaker, speakerLevel, mode, tmpMessage);
                        message.FormatMessage(null, messageMode.TextARGB, messageMode.HighlightARGB);
                        message.TTL = int.MaxValue;
                        messageBox.AppendMessage(message);
                    }

                    MessageBoxes.Add(messageBox);
                }
            }
            else
            {
                messageBox = MessageBoxes[(int)screenTarget];
            }

            message = new OnscreenMessage(statementID, speaker, speakerLevel, mode, text);
            message.FormatMessage(messageMode.GetOnscreenMessagePrefix(speaker, speakerLevel), messageMode.TextARGB, messageMode.HighlightARGB);
            messageBox.AppendMessage(message);
            messageBox.Visible = true;
            InvalidateOnscreenMessages();
            return(messageBox);
        }