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; } } } } }