示例#1
0
        /**
         * @return Q3DemoMessage return a next message buffer or null if EOD is reached
         * @throws Exception in case stream is corrupted
         */
        public Q3DemoMessage nextMessage()
        {
            byte[] headerBuffer = binaryReader.ReadBytes(8);
            if (headerBuffer.Length != 8)
            {
                return(null);
            }

            //if (BitConverter.IsLittleEndian) {
            //    Array.Reverse(headerBuffer);
            //}

            int sequence  = BitConverter.ToInt32(headerBuffer, 0);
            int msgLength = BitConverter.ToInt32(headerBuffer, 4);

            if (sequence == -1 && msgLength == -1)
            {
                // a normal case, end of message-sequence
                return(null);
            }

            if (msgLength < 0 || msgLength > Constants.Q3_MESSAGE_MAX_SIZE)
            {
                throw new ErrorWrongLength();
            }

            var msg = new Q3DemoMessage(sequence, msgLength);

            msg.data = binaryReader.ReadBytes(msgLength);

            this.readMessages++;
            return(msg);
        }
示例#2
0
        private Q3DemoConfigParser doParse(Q3DemoConfigParser msgParser)
        {
            Q3MessageStream messageStream = new Q3MessageStream(this.file_name);

            try
            {
                Q3DemoMessage msg = null;
                while ((msg = messageStream.nextMessage()) != null)
                {
                    if (!msgParser.parse(msg))
                    {
                        break;
                    }
                }
            }
            catch (Exception r) {
                Q3Utils.PrintDebug(msgParser.clc.errors, r.Message);
            }
            messageStream.close();
            return(msgParser);
        }
示例#3
0
        public bool parse(Q3DemoMessage message)
        {
            clc.serverMessageSequence = message.sequence;
            Q3HuffmanReader reader = new Q3HuffmanReader(message.data);

            reader.readLong();

            while (!reader.isEOD())
            {
                var b = reader.readByte();
                switch (b)
                {
                case Q3_SVC.BAD:
                case Q3_SVC.NOP:
                    return(true);

                case Q3_SVC.EOF:
                    return(true);

                case Q3_SVC.SERVERCOMMAND:
                    this.parseServerCommand(reader);
                    break;

                case Q3_SVC.GAMESTATE:
                    this.parseGameState(reader);
                    break;

                case Q3_SVC.SNAPSHOT:
                    this.parseSnapshot(reader);
                    // snapshots couldn't be mixed with game-state command in a single message
                    break;

                default:
                    // unknown command / corrupted stream
                    return(true);
                }
            }
            return(true);
        }