private void PacketEntities(byte[] packetBuffer)
        {
            PacketEntities packetEntitys = new PacketEntities(packetBuffer);

            BitStream bitStream = new BitStream(packetEntitys.EntityData);

            int entityIndex = -1;
            EntityHeaderFlags entityHeaderFlags = EntityHeaderFlags.FHDR_ZERO;
            EntityUpdateType entityUpdateType = EntityUpdateType.PreserveEnt;
            bool isDelta = packetEntitys.IsDelta;
            int lastEntityIndex = -1;
            int updatedEntries = packetEntitys.UpdatedEntries;

            while (entityUpdateType < EntityUpdateType.Finished)
            {
                updatedEntries--;

                bool isEntity = (updatedEntries >= 0) ? true : false;

                if (isEntity)
                {
                    entityHeaderFlags = EntityHeaderFlags.FHDR_ZERO;

                    entityIndex = (int)(bitStream.ReadUBitInt() + lastEntityIndex + 1);
                    lastEntityIndex = entityIndex;

                    if (!bitStream.ReadBit())
                    {
                        if (bitStream.ReadBit())
                        {
                            entityHeaderFlags |= EntityHeaderFlags.FHDR_ENTERPVS;
                        }
                    }
                    else
                    {
                        entityHeaderFlags |= EntityHeaderFlags.FHDR_LEAVEPVS;

                        if (bitStream.ReadBit())
                        {
                            entityHeaderFlags |= EntityHeaderFlags.FHDR_DELETE;
                        }
                    }
                }

                for (entityUpdateType = EntityUpdateType.PreserveEnt; entityUpdateType == EntityUpdateType.PreserveEnt;)
                {
                    if (!isEntity || entityIndex > HL2SDK.ENTITY_SENTINEL)
                    {
                        entityUpdateType = EntityUpdateType.Finished;
                    }
                    else
                    {
                        if (entityHeaderFlags.HasFlag(EntityHeaderFlags.FHDR_ENTERPVS))
                        {
                            entityUpdateType = EntityUpdateType.EnterPVS;
                        }
                        else if (entityHeaderFlags.HasFlag(EntityHeaderFlags.FHDR_LEAVEPVS))
                        {
                            entityUpdateType = EntityUpdateType.LeavePVS;
                        }
                        else
                        {
                            entityUpdateType = EntityUpdateType.DeltaEnt;
                        }
                    }

                    switch (entityUpdateType)
                    {
                        case EntityUpdateType.DeltaEnt:
                            {
                                Entity entity = m_Demo.Entities.GetEntity(entityIndex);

                                if (entity != null)
                                {
                                    entity.Update(bitStream, true);
                                }
                                else
                                {
                                    Console.WriteLine("EntityUpdateType.DeltaEnt: entity == null");

                                    throw new Exception("EntityUpdateType.DeltaEnt: entity == null");
                                }

                                break;
                            }
                        case EntityUpdateType.EnterPVS:
                            {
                                uint serverClassID = bitStream.ReadBits((int)Math.Ceiling(Math.Log(m_Demo.ServerClasses.Count, 2)));
                                uint seiral = bitStream.ReadBits(10);

                                ServerClass serverClass = m_Demo.ServerClasses.GetServerClass((int)serverClassID);

                                Entity entity = new Entity(m_Demo, entityIndex, seiral, serverClass);

                                entity.Update(bitStream, false);

                                m_Demo.Entities.Add(entity);

                                break;
                            }
                        case EntityUpdateType.LeavePVS:
                            {
                                if (!isDelta)
                                {
                                    Console.WriteLine("WARNING: EntityUpdateType.LeavePVS on Full Update");

                                    entityUpdateType = EntityUpdateType.Failed;

                                    throw new Exception("WARNING: EntityUpdateType.LeavePVS on Full Update");
                                }
                                else
                                {
                                    m_Demo.Entities.Remove(entityIndex);
                                }

                                break;
                            }
                        case EntityUpdateType.PreserveEnt:
                            {
                                if (!isDelta)
                                {
                                    Console.WriteLine("WARNING: EntityUpdateType.PreserveEnt on Full Update");

                                    entityUpdateType = EntityUpdateType.Failed;

                                    throw new Exception("WARNING: EntityUpdateType.PreserveEnt on Full Update");
                                }
                                else
                                {
                                    if (entityIndex >= HL2SDK.MAX_EDICTS)
                                    {
                                        Console.WriteLine("EntityUpdateType.PreserveEnt: entityIndex == MAX_EDICTS");

                                        throw new Exception("EntityUpdateType.PreserveEnt: entityIndex == MAX_EDICTS");
                                    }
                                    else
                                    {
                                    }
                                }

                                break;
                            }
                    }
                }
            }
        }