示例#1
0
        private void PopulateGobUpdateMessage(GobUpdateMessage gobMessage, IEnumerable<Gob> gobs, SerializationModeFlags serializationMode)
        {
            var now = DataEngine.ArenaTotalTime;
            var debugMessage = Settings.Net.HeavyDebugLog && gobs.OfType<AW2.Game.Gobs.Wall>().Any(wall => wall.ForcedNetworkUpdate)
                ? new System.Text.StringBuilder("Gob update ")
                : null; // DEBUG: catch a rare crash that seems to happen only when serializing walls.
            foreach (var gob in gobs)
            {
                if (!gob.ForcedNetworkUpdate)
                {
                    if (!gob.IsRelevant) continue;
                    if (gob.MoveType == MoveType.Static) continue;
                    if (gob.NetworkUpdatePeriod == TimeSpan.Zero) continue;
                    if (gob.LastNetworkUpdate + gob.NetworkUpdatePeriod > now) continue;
                }
                gob.ForcedNetworkUpdate = false;
                gob.LastNetworkUpdate = now;
                gobMessage.AddGob(gob.ID, gob, serializationMode);
                if (debugMessage != null) debugMessage.AppendFormat("{0} [{1}], ", gob.GetType().Name, gob.TypeName); // DEBUG: catch a rare crash that seems to happen only when serializing walls.
            }
            gobMessage.SetCollisionEvents(_collisionEventsToRemote, serializationMode);
            _collisionEventsToRemote = new List<CollisionEvent>();

            if (debugMessage != null) // DEBUG: catch a rare crash that seems to happen only when serializing walls.
            {
                var writer = new NetworkBinaryWriter(new System.IO.MemoryStream(_debugBuffer));
                gobMessage.Serialize(writer);
                debugMessage.Append(MiscHelper.BytesToString(new ArraySegment<byte>(_debugBuffer, 0, (int)writer.GetBaseStream().Position)));
                Log.Write(debugMessage.ToString());
            }
        }
示例#2
0
 public virtual void Serialize(NetworkBinaryWriter writer)
 {
     writer.Seek(HEADER_LENGTH, SeekOrigin.Current);
     var bodyStartPosition = writer.GetBaseStream().Position;
     SerializeBody(writer);
     var bodyLength = checked((ushort)(writer.GetBaseStream().Position - bodyStartPosition));
     writer.Seek(-(HEADER_LENGTH + bodyLength), SeekOrigin.Current);
     SerializeHeader(writer, bodyLength);
     writer.Seek(bodyLength, SeekOrigin.Current);
 }