public void MessagesTest() { List <StormMessage> messages = _stormReplay.Messages.ToList(); StormMessage stormMessage = messages.Last(); Assert.AreEqual(StormMessageEventType.SChatMessage, stormMessage.MessageEventType); Assert.AreEqual("Rehgar", stormMessage.MessageSender !.PlayerHero !.HeroName); Assert.AreEqual(StormMessageTarget.Allies, stormMessage.ChatMessage !.MessageTarget); Assert.IsTrue(stormMessage.ChatMessage !.Message !.StartsWith("https:")); Assert.IsTrue(stormMessage.ChatMessage !.Message !.EndsWith("nzs")); Assert.AreEqual(new TimeSpan(11055625000), stormMessage.Timestamp); stormMessage = messages.First(); Assert.AreEqual(StormMessageEventType.SLoadingProgressMessage, stormMessage.MessageEventType); Assert.AreEqual("Rehgar", stormMessage.MessageSender !.PlayerHero !.HeroName); Assert.AreEqual(12, stormMessage.LoadingProgressMessage !.LoadingProgress); Assert.AreEqual(new TimeSpan(0), stormMessage.Timestamp); stormMessage = messages[97]; Assert.AreEqual(StormMessageEventType.SPingMessage, stormMessage.MessageEventType); Assert.AreEqual("Arthas", stormMessage.MessageSender !.PlayerHero !.HeroName); Assert.AreEqual(StormMessageTarget.Allies, stormMessage.PingMessage !.MessageTarget); Assert.AreEqual(146.725830078125, stormMessage.PingMessage !.Point !.Value.X); Assert.AreEqual(73.9296875, stormMessage.PingMessage !.Point !.Value.Y); Assert.AreEqual(new TimeSpan(1091250000), stormMessage.Timestamp); }
public void MessagesTest() { List <StormMessage> messages = _stormReplay.Messages.ToList(); StormMessage stormMessage = messages[144]; Assert.AreEqual(StormMessageEventType.SPlayerAnnounceMessage, stormMessage.MessageEventType); Assert.AreEqual("Li Li", stormMessage.MessageSender !.PlayerHero !.HeroName); Assert.AreEqual(0, stormMessage.PlayerAnnounceMessage !.AbilityAnnouncement !.Value.AbilityIndex); Assert.AreEqual(423, stormMessage.PlayerAnnounceMessage !.AbilityAnnouncement !.Value.AbilityLink); Assert.AreEqual(954, stormMessage.PlayerAnnounceMessage !.AbilityAnnouncement !.Value.ButtonLink); Assert.AreEqual(new TimeSpan(7110000000), stormMessage.Timestamp); stormMessage = messages.Last(); Assert.AreEqual(StormMessageEventType.SChatMessage, stormMessage.MessageEventType); Assert.AreEqual("Li-Ming", stormMessage.MessageSender !.PlayerHero !.HeroName); Assert.AreEqual(new TimeSpan(12031875000), stormMessage.Timestamp); Assert.AreEqual(StormMessageTarget.All, stormMessage.ChatMessage !.MessageTarget); }
public static void Parse(StormReplay replay, ReadOnlySpan <byte> source) { if (source.Length <= 1) { return; } BitReader bitReader = new BitReader(source, EndianType.BigEndian); uint ticksElapsed = 0; while (bitReader.Index < source.Length) { ticksElapsed += bitReader.ReadBits(6 + ((int)bitReader.ReadBits(2) << 3)); TimeSpan timeStamp = TimeSpan.FromSeconds(ticksElapsed / 16.0); int playerIndex = (int)bitReader.ReadBits(5); StormMessageEventType messageEventType = (StormMessageEventType)bitReader.ReadBits(4); StormMessage?message = null; switch (messageEventType) { case StormMessageEventType.SChatMessage: ChatMessage chatMessage = new ChatMessage { MessageTarget = (StormMessageTarget)bitReader.ReadBits(3), // m_recipient (the target) Message = bitReader.ReadBlobAsString(11), // m_string }; message = new StormMessage(chatMessage); break; case StormMessageEventType.SPingMessage: PingMessage pingMessage = new PingMessage() { MessageTarget = (StormMessageTarget)bitReader.ReadBits(3), // m_recipient (the target) Point = new Point((double)(bitReader.ReadInt32Unaligned() - (-2147483648)) / 4096, ((double)bitReader.ReadInt32Unaligned() - (-2147483648)) / 4096), // m_point x and m_point y }; message = new StormMessage(pingMessage); break; case StormMessageEventType.SLoadingProgressMessage: LoadingProgressMessage loadingProgressMessage = new LoadingProgressMessage() { LoadingProgress = bitReader.ReadInt32Unaligned() - (-2147483648), // m_progress }; message = new StormMessage(loadingProgressMessage); break; case StormMessageEventType.SServerPingMessage: break; case StormMessageEventType.SReconnectNotifyMessage: bitReader.ReadBits(2); // m_status; is either a 1 or a 2 break; case StormMessageEventType.SPlayerAnnounceMessage: PlayerAnnounceMessage playerAnnounceMessage = new PlayerAnnounceMessage() { AnnouncementType = (AnnouncementType)bitReader.ReadBits(2), }; switch (playerAnnounceMessage.AnnouncementType) { case AnnouncementType.None: break; case AnnouncementType.Ability: int abilityLink = bitReader.ReadInt16Unaligned(); // m_abilLink int abilityIndex = (int)bitReader.ReadBits(5); // m_abilCmdIndex int buttonLink = bitReader.ReadInt16Unaligned(); // m_buttonLink playerAnnounceMessage.AbilityAnnouncement = new AbilityAnnouncement(abilityIndex, abilityLink, buttonLink); break; case AnnouncementType.Behavior: bitReader.ReadInt16Unaligned(); // m_behaviorLink bitReader.ReadInt16Unaligned(); // m_buttonLink break; case AnnouncementType.Vitals: playerAnnounceMessage.VitalAnnouncement = new VitalAnnouncement((VitalType)(bitReader.ReadInt16Unaligned() - (-32768))); break; default: throw new NotImplementedException(); } if (replay.ReplayBuild > 45635) { // m_announceLink bitReader.ReadInt16Unaligned(); } bitReader.ReadInt32Unaligned(); // m_otherUnitTag bitReader.ReadInt32Unaligned(); // m_unitTag message = new StormMessage(playerAnnounceMessage); break; default: throw new NotImplementedException(); } if (message != null) { message.MessageEventType = messageEventType; message.Timestamp = timeStamp; if (playerIndex != 16) { message.MessageSender = replay.ClientListByUserID[playerIndex]; } replay.MessagesInternal.Add(message); } bitReader.AlignToByte(); } }