Exemple #1
0
        public void WriteEvent(ReplayEvent replayEvent)
        {
            if (disposedValue)
            {
                throw new ObjectDisposedException(nameof(ReplayWriter));
            }

            if (replayEvent.Type == ReplayEventType.Start)
            {
                if (_wroteStartEvent)
                {
                    throw new InvalidOperationException($"Already wrote Start event");
                }

                _wroteStartEvent = true;
            }

            if (Replay == null)
            {
                replayEvent.Time = _lobbyTime;
                _lobbyTime      += TimeSpan.FromMilliseconds(10);
                _prestartQueue.Enqueue(replayEvent);
            }
            else
            {
                replayEvent.Time = DateTime.Now - _startTime;
                ReplayEvent.Write(replayEvent, _binaryWriter);
                _binaryWriter.Flush();
            }
        }
Exemple #2
0
        public void Start(Replay replay, Stream stream)
        {
            if (disposedValue)
            {
                throw new ObjectDisposedException(nameof(ReplayWriter));
            }
            if (Replay != null)
            {
                throw new InvalidOperationException("Already started.");
            }

            _startTime = DateTime.Now - _lobbyTime;

            Replay = replay ?? throw new ArgumentNullException(nameof(replay));

            _binaryWriter = new BinaryWriter(_stream = stream ?? throw new ArgumentNullException(nameof(stream)));

            // header count
            _binaryWriter.Write(4);
            _binaryWriter.Write(Replay.Name);
            _binaryWriter.Write(Replay.GameId.ToString());
            _binaryWriter.Write(Replay.User);
            _binaryWriter.Write(_lobbyTime.Ticks); // Game start time, for fastforwarding

            while (_prestartQueue.Count > 0)
            {
                var item = _prestartQueue.Dequeue();
                ReplayEvent.Write(item, _binaryWriter);
            }

            _binaryWriter.Flush();
        }