public void Add(string _message, ChatAudibleLevel _audible, ChatType _type, ChatSourceType _sourcetype, string _fromName, UUID _id, UUID _ownerid, Vector3 _position) { Reference.Log.Debug(_message + " ChatAudibleLevel:" + _audible.ToString() + " ChatType:" + _type.ToString() + " ChatSourceType:" + _sourcetype.ToString() + " FromName:" + _fromName); // name. string fromName = _fromName + ":"; lock (messageHistory) { messageHistory.Add(fromName); Reference.Viewer.GuiManager.ChatAddMessage(fromName); } // message. string msg = _message; if (_message.Length > maxMessageLength) { string tail = "・・・"; msg = _message.Substring(0, maxMessageLength - tail.Length); msg += tail; } // wide-char space -> 2 char space. msg = msg.Replace(" ", " "); // trim space. msg = msg.Trim(); List<int> colLen = new List<int>(); int colMaxLen = 16 * 2; int lenCounter = 0; for (int i = 0; i < msg.Length; i++) { char c = msg[i]; if (c < '!' || '~' < c) { lenCounter += 2; } else { lenCounter += 1; } if ((lenCounter >= colMaxLen) || ((i + 1) == msg.Length)) { colLen.Add(i + 1); lenCounter = 0; } } List<string> msgList = new List<string>(); for (int i = 0; i < colLen.Count; i++) { int start = (i > 0 ? colLen[i - 1] : 0); int length = (i > 0 ? colLen[i] - colLen[i - 1] : colLen[i]); string text = msg.Substring(start, length); msgList.Add(text); } for (int i = 0; i < msgList.Count; i++) { // message. string addMessage = " " + msgList[i]; lock (messageHistory) { messageHistory.Add(addMessage); Reference.Viewer.GuiManager.ChatAddMessage(addMessage); } } Reference.Viewer.Adapter.CallReceiveMessaged(_id.ToString(), _fromName, _message); }