private void ParseTextMessage(Internal.ByteArray message) { var mode = TranslateMessageModeFromServer(message.ReadUnsignedByte()); try { switch (mode) { case MessageModeType.ChannelManagement: int channelId = message.ReadUnsignedShort(); string text = message.ReadString(); // 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; WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Guild: case MessageModeType.PartyManagement: case MessageModeType.Party: channelId = message.ReadUnsignedShort(); text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Login: case MessageModeType.Admin: case MessageModeType.Game: case MessageModeType.GameHighlight: case MessageModeType.Failure: case MessageModeType.Look: case MessageModeType.Status: case MessageModeType.Loot: case MessageModeType.TradeNpc: case MessageModeType.HotkeyUse: channelId = -1; text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Market: text = message.ReadString(); // TODO: market break; case MessageModeType.Report: // TODO //ReportWidget.s_ReportTimestampReset(); text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; case MessageModeType.DamageDealed: case MessageModeType.DamageReceived: case MessageModeType.DamageOthers: Vector3Int absolutePosition = message.ReadPosition(); int value = message.ReadInt(); int color = message.ReadUnsignedByte(); if (value > 0) { WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); } value = message.ReadInt(); color = message.ReadUnsignedByte(); if (value > 0) { WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); } text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; case MessageModeType.Heal: case MessageModeType.Mana: case MessageModeType.Exp: case MessageModeType.HealOthers: case MessageModeType.ExpOthers: absolutePosition = message.ReadPosition(); value = message.ReadInt(); color = message.ReadUnsignedByte(); WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; default: text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; } } catch (System.Exception e) { throw new System.Exception("ProtocolGame.ParseTextMessage: Failed to add message of type " + mode + ": " + e.Message + "\n" + e.StackTrace); } }
private void ParseTalk(Internal.ByteArray message) { uint statementId = 0; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameMessageStatements)) { statementId = message.ReadUnsignedInt(); } string speaker = message.ReadString(); ushort speakerLevel = 0; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameMessageLevel)) { speakerLevel = message.ReadUnsignedShort(); } int rawMode = message.ReadUnsignedByte(); MessageModeType mode = TranslateMessageModeFromServer(rawMode); Vector3Int?absolutePosition = null; Utils.UnionStrInt channelId = null; switch (mode) { case MessageModeType.Say: case MessageModeType.Whisper: case MessageModeType.Yell: absolutePosition = message.ReadPosition(); channelId = Chat.ChatStorage.LocalChannelId; break; case MessageModeType.PrivateFrom: channelId = speaker; break; case MessageModeType.Channel: case MessageModeType.ChannelManagement: case MessageModeType.ChannelHighlight: channelId = message.ReadUnsignedShort(); break; case MessageModeType.Spell: absolutePosition = message.ReadPosition(); channelId = Chat.ChatStorage.LocalChannelId; break; case MessageModeType.NpcFromStartBlock: absolutePosition = message.ReadPosition(); break; case MessageModeType.NpcFrom: break; case MessageModeType.GamemasterBroadcast: break; case MessageModeType.GamemasterChannel: channelId = message.ReadUnsignedShort(); break; case MessageModeType.GamemasterPrivateFrom: channelId = speaker; break; case MessageModeType.BarkLow: case MessageModeType.BarkLoud: case MessageModeType.MonsterSay: case MessageModeType.MonsterYell: absolutePosition = message.ReadPosition(); channelId = -1; break; case MessageModeType.Game: break; case MessageModeType.RVRAnswer: case MessageModeType.RVRContinue: channelId = Chat.ChatStorage.RVRChannelId; break; case MessageModeType.RVRChannel: message.ReadUnsignedInt(); channelId = Chat.ChatStorage.RVRChannelId; break; default: throw new System.Exception(string.Format("ProtocolGame.ParseTalk: invalid message mode (raw = {0}, mode = {1})", rawMode, mode)); } string text = message.ReadString(); if (mode != MessageModeType.NpcFromStartBlock && mode != MessageModeType.NpcFrom) { try { WorldMapStorage.AddOnscreenMessage(absolutePosition, (int)statementId, speaker, speakerLevel, mode, text); 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 == MessageModeType.NpcFromStartBlock) { MessageStorage.StartMessageBlock(speaker, absolutePosition, text); } else if (mode == MessageModeType.NpcFrom) { MessageStorage.AddTextToBlock(speaker, text); } }