Beispiel #1
0
        private void MessageSpawnBaseline()
        {
            if (!demo.ConvertNetworkProtocol())
            {
                parser.MessageSpawnBaseline();
                return;
            }

            Int32     messageStartOffset = parser.BitBuffer.CurrentByte;
            BitWriter bitWriter          = new BitWriter();

            // read message into new message
            if (demo.NetworkProtocol <= 43)
            {
                parser.BitBuffer.Endian = BitBuffer.EndianType.Big;
            }

            while (true)
            {
                UInt32 entityIndex = parser.BitBuffer.ReadUnsignedBits(11);
                bitWriter.WriteUnsignedBits(entityIndex, 11);

                if (entityIndex == (1 << 11) - 1) // all 1's
                {
                    break;
                }

                UInt32 entityType = parser.BitBuffer.ReadUnsignedBits(2);
                bitWriter.WriteUnsignedBits(entityType, 2);

                String entityTypeString;

                if ((entityType & 1) != 0)
                {
                    if (entityIndex > 0 && entityIndex <= demo.MaxClients)
                    {
                        entityTypeString = "entity_state_player_t";
                    }
                    else
                    {
                        entityTypeString = "entity_state_t";
                    }
                }
                else
                {
                    entityTypeString = "custom_entity_state_t";
                }

                HalfLifeDeltaStructure deltaStructure = parser.GetDeltaStructure(entityTypeString);
                HalfLifeDelta          delta          = deltaStructure.CreateDelta();
                Byte[] bitmaskBytes;
                deltaStructure.ReadDelta(parser.BitBuffer, delta, out bitmaskBytes);

                if (demo.Game != null)
                {
                    demo.Game.ConvertPacketEntititiesCallback(delta, entityTypeString, demo.GameVersion);
                }

                deltaStructure.WriteDelta(bitWriter, delta, bitmaskBytes);
            }

            UInt32 footer = parser.BitBuffer.ReadUnsignedBits(5); // should be all 1's

            bitWriter.WriteUnsignedBits(footer, 5);

            if (footer != (1 << 5) - 1)
            {
                throw new ApplicationException("Bad svc_spawnbaseline footer.");
            }

            UInt32 nExtraData = parser.BitBuffer.ReadUnsignedBits(6);

            bitWriter.WriteUnsignedBits(nExtraData, 6);

            HalfLifeDeltaStructure entityStateStructure = parser.GetDeltaStructure("entity_state_t");

            for (Int32 i = 0; i < nExtraData; i++)
            {
                HalfLifeDelta delta = entityStateStructure.CreateDelta();
                Byte[]        bitmaskBytes;
                entityStateStructure.ReadDelta(parser.BitBuffer, delta, out bitmaskBytes);
                entityStateStructure.WriteDelta(bitWriter, delta, bitmaskBytes);
            }

            parser.BitBuffer.Endian = BitBuffer.EndianType.Little;
            parser.BitBuffer.SkipRemainingBits();

            // insert new message
            ReWriteMessage(messageStartOffset, bitWriter.Data);
        }