Esempio n. 1
0
        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;
                    }
                    }
                }
            }
        }
Esempio n. 2
0
 private void HandlePacket(CSVCMsgPacketEntities message)
 {
     EntityManager.HandlePacket(message);
 }