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