public void HandlePacket(CSVCMsgPacketEntities message) { var headerCount = message.UpdatedEntries; var updateType = UpdateType.PreserveEnt; var updateFlags = UpdateFlags.Zero; var headerBase = -1; var newEntity = -1; var bitBuffer = new BitBuffer(message.EntityData); while (updateType < UpdateType.Finished) { var isEntity = --headerCount >= 0; if (isEntity) { updateFlags = UpdateFlags.Zero; newEntity = headerBase + 1 + (int)bitBuffer.ReadUBitVar(); headerBase = newEntity; if (!bitBuffer.ReadOneBit()) { if (bitBuffer.ReadOneBit()) { updateFlags |= UpdateFlags.EnterPvs; } } else { updateFlags |= UpdateFlags.LeavePvs; if (bitBuffer.ReadOneBit()) { updateFlags |= UpdateFlags.Delete; } } } for (updateType = UpdateType.PreserveEnt; updateType == UpdateType.PreserveEnt;) { if (!isEntity || newEntity > EntitySentinel) { updateType = UpdateType.Finished; } else if ((updateFlags & UpdateFlags.EnterPvs) == UpdateFlags.EnterPvs) { updateType = UpdateType.EnterPVS; } else if ((updateFlags & UpdateFlags.LeavePvs) == UpdateFlags.LeavePvs) { updateType = UpdateType.LeavePVS; } else { updateType = UpdateType.DeltaEnt; } switch (updateType) { case UpdateType.EnterPVS: { var classId = bitBuffer.ReadUBitLong(_serverClassBits); var serialNum = bitBuffer.ReadUBitLong(10); var ent = AddEntity(newEntity, (int)classId, serialNum); var baselineTable = _netClient.GetStringTable("instancebaseline"); byte[] baselineData; if (baselineTable.TryGetUserData(ent.ClassId.ToString(), out baselineData)) { ReadNewEntity(new BitBuffer(baselineData), ent); } ReadNewEntity(bitBuffer, ent); break; } case UpdateType.LeavePVS: { Debug.Assert(message.IsDelta); RemoveEntity(newEntity); break; } case UpdateType.DeltaEnt: { var ent = FindEntity(newEntity); Debug.Assert(ent != null, "Attempted to update a non-existent entity!"); if (ent == null) { return; } ReadNewEntity(bitBuffer, ent); break; } case UpdateType.PreserveEnt: { Debug.Assert(message.IsDelta); Debug.Assert(newEntity < 1 << 11); break; } } } } }
private void HandlePacket(CSVCMsgPacketEntities message) { EntityManager.HandlePacket(message); }