private void LoadActions(BinaryReader reader) { int time = 0; bool isPaused = false; while (reader.BaseStream.Length - reader.BaseStream.Position > 0) { byte blockId = reader.ReadByte(); switch (blockId) { case 0x1A: case 0x1B: case 0x1C: reader.BaseStream.Seek(reader.BaseStream.Position + 4, SeekOrigin.Begin); break; case 0x22: reader.BaseStream.Seek(reader.BaseStream.Position + 5, SeekOrigin.Begin); break; case 0x23: reader.BaseStream.Seek(reader.BaseStream.Position + 10, SeekOrigin.Begin); break; case 0x2F: reader.BaseStream.Seek(reader.BaseStream.Position + 8, SeekOrigin.Begin); break; //leave game case 0x17: reader.ReadInt32(); byte playerId = reader.ReadByte(); Player p = GetPlayerById(playerId); p.Time = time; reader.ReadInt64(); chats.Add(new ChatInfo(time, p, TalkTo.System, null, "leave")); break; //chat case 0x20: byte fromId = reader.ReadByte(); reader.ReadBytes(2); byte chatType = reader.ReadByte(); TalkTo to = TalkTo.All; if (chatType != 0x10) { to = (TalkTo)reader.ReadInt32(); } string message = ParserUtility.ReadString(reader); if (chatType != 0x10) { ChatInfo chat = new ChatInfo(time, GetPlayerById(fromId), to, GetPlayerById((byte)(to - 3)), message); chats.Add(chat); } break; //time slot case 0x1E: case 0x1F: short rest = reader.ReadInt16(); short increasedTime = reader.ReadInt16(); if (!isPaused) time += increasedTime; rest -= 2; LoadTimeSlot(reader, rest, time, ref isPaused); break; case 0: return; default: throw new W3gParserException("Unknown Action code:" + blockId); } } }