public virtual void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     if (mode.HasFlag(SerializationModeFlags.ConstantDataFromClient))
     {
         LoginToken = reader.ReadString();
     }
 }
Exemple #2
0
 public void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0)
     {
         weight = reader.ReadSingle();
         spawnTypeName = reader.ReadCanonicalString();
     }
 }
Exemple #3
0
 public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     base.Deserialize(reader, mode, framesAgo);
     if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0)
     {
         actionGobName = reader.ReadString();
     }
 }
Exemple #4
0
 public void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     checked
     {
         var packedValue = ((int)Weapon1) | (((int)Weapon2) << 4) | (((int)ExtraDevice) << 8);
         writer.Write((ushort)packedValue);
     }
 }
 /// <summary>
 /// Reads the updates for the spectators and teams. If <paramref name="spectatorOrTeamFinder"/> returns null,
 /// then that and the following updates in this message are skipped.
 /// </summary>
 public void Read(Func<int, INetworkSerializable> spectatorOrTeamFinder, SerializationModeFlags serializationMode, int framesAgo)
 {
     for (int i = 0; i < _ids.Count; i++)
     {
         var spectatorOrTeam = spectatorOrTeamFinder(_ids[i]);
         if (spectatorOrTeam == null) break;
         Read(spectatorOrTeam, serializationMode, framesAgo);
     }
 }
Exemple #6
0
 public void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     if (mode.HasFlag(SerializationModeFlags.ConstantDataFromServer))
     {
         Name = reader.ReadString();
         Color = reader.ReadColor();
     }
     ArenaStatistics.Deserialize(reader, mode, framesAgo);
 }
Exemple #7
0
 public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     base.Deserialize(reader, mode, framesAgo);
     if (mode.HasFlag(SerializationModeFlags.ConstantDataFromServer))
     {
         _propModelName = reader.ReadCanonicalString();
         ModelName = _propModelName;
     }
 }
 /// <summary>
 /// Reads the updates. If <paramref name="itemFinder"/> returns null,
 /// then that and the following updates in this message are skipped.
 /// </summary>
 public void Read(Func<int, INetworkSerializable> itemFinder, SerializationModeFlags serializationMode, int framesAgo)
 {
     for (int i = 0; i < _ids.Count; i++)
     {
         var item = itemFinder(_ids[i]);
         if (item == null) break;
         Read(item, serializationMode, framesAgo);
     }
 }
Exemple #9
0
 public void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     var packedValue = reader.ReadUInt16();
     Weapon1 = (ShipDevice.FiringResult)(packedValue & 0x07);
     if (!Enum.IsDefined(typeof(ShipDevice.FiringResult), Weapon1)) Weapon1 = ShipDevice.FiringResult.Void;
     Weapon2 = (ShipDevice.FiringResult)((packedValue >> 4) & 0x07);
     if (!Enum.IsDefined(typeof(ShipDevice.FiringResult), Weapon2)) Weapon2 = ShipDevice.FiringResult.Void;
     ExtraDevice = (ShipDevice.FiringResult)((packedValue >> 8) & 0x07);
     if (!Enum.IsDefined(typeof(ShipDevice.FiringResult), ExtraDevice)) ExtraDevice = ShipDevice.FiringResult.Void;
 }
Exemple #10
0
 public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     base.Deserialize(reader, mode, framesAgo);
     if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0)
     {
         _wallModelName = reader.ReadCanonicalString();
         var model = Game.Content.Load<Model>(_wallModelName);
         Effect = GetEffect(model);
         Texture = GetTexture(model);
     }
 }
Exemple #11
0
 public void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     {
         writer.Write((string)PreText);
         writer.Write((string)Text);
         writer.Write((Color)TextColor);
     }
 }
Exemple #12
0
 public override void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     {
         base.Serialize(writer, mode);
         if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0)
         {
             writer.Write((string)actionGobName);
         }
     }
 }
Exemple #13
0
 public override void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     {
         base.Serialize(writer, mode);
         if (mode.HasFlag(SerializationModeFlags.ConstantDataFromServer))
         {
             writer.Write((CanonicalString)_propModelName);
         }
     }
 }
 public void AddGob(int gobId, INetworkSerializable gob, SerializationModeFlags serializationMode)
 {
     // Note: Data in GobUpdateMessage may get lost on client because of this case:
     // Client doesn't have the gob at the moment the update message is received.
     // Because the gob doesn't exist, the client doesn't know the type of the gob and
     // therefore has no way of knowing how many bytes in the message are for that one gob.
     // The only solution is to skip the remaining message, losing many gob updates.
     // This is why GobUpdateMessage sends only varying data.
     if (_state != StateType.Initial && _state != StateType.AddingGobs) throw new InvalidOperationException("Cannot add a gob in state " + _state);
     _state = StateType.AddingGobs;
     _gobIds.Add(gobId);
     Write(gob, serializationMode);
 }
Exemple #15
0
 public void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     {
         if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0)
         {
             writer.Write((float)weight);
             writer.Write((CanonicalString)spawnTypeName);
         }
     }
 }
 public void Add(int id, INetworkSerializable spectatorOrTeam, SerializationModeFlags serializationMode)
 {
     _ids.Add(id);
     Write(spectatorOrTeam, serializationMode);
 }
Exemple #17
0
 private void SendSpectatorSettingsToRemote(SerializationModeFlags mode, Func<Spectator, bool> sendCriteria, Func<Spectator, SpectatorSettingsRequest> newSpectatorSettingsRequest, IEnumerable<Connection> connections)
 {
     foreach (var spectator in DataEngine.Spectators.Where(sendCriteria))
     {
         var mess = newSpectatorSettingsRequest(spectator);
         mess.Write(spectator, mode);
         if (spectator.ServerRegistration == Spectator.ServerRegistrationType.No)
             spectator.ServerRegistration = Spectator.ServerRegistrationType.Requested;
         foreach (var conn in connections) if (spectator.ConnectionID != conn.ID) conn.Send(mess);
     }
 }
Exemple #18
0
 public virtual void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     checked
     {
         if (mode.HasFlag(SerializationModeFlags.ConstantDataFromServer) ||
             mode.HasFlag(SerializationModeFlags.ConstantDataFromClient))
         {
             writer.Write((string)Name);
         }
         if (mode.HasFlag(SerializationModeFlags.VaryingDataFromServer))
         {
             writer.Write((bool)IsDisconnected);
             writer.WriteID(Team);
         }
         StatsData.Serialize(writer, mode);
         ArenaStatistics.Serialize(writer, mode);
     }
 }
Exemple #19
0
 public virtual void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     if (mode.HasFlag(SerializationModeFlags.ConstantDataFromServer) ||
         mode.HasFlag(SerializationModeFlags.ConstantDataFromClient))
     {
         Name = reader.ReadString();
     }
     if (mode.HasFlag(SerializationModeFlags.VaryingDataFromServer))
     {
         var isDisconnected = reader.ReadBoolean();
         if (IsRemote && isDisconnected) ConnectionStatus = ConnectionStatusType.Disconnected;
         if (IsDisconnected && !isDisconnected) ConnectionStatus = ConnectionStatusType.Remote;
         var oldTeam = Team;
         TeamProxy = reader.ReadTeamID(FindTeam);
         if (oldTeam != Team)
         {
             // Resign from old team now while we still have a direct reference to it.
             // The new team may not exist yet, so assign to it later in Update().
             if (oldTeam != null) oldTeam.UpdateAssignment(this);
             _teamAssignmentDeserialized = true;
         }
     }
     StatsData.Deserialize(reader, mode, framesAgo);
     ArenaStatistics.Deserialize(reader, mode, framesAgo);
 }
 public IEnumerable<CollisionEvent> ReadCollisionEvents(Func<int, Gob> gobFinder, SerializationModeFlags serializationMode, int framesAgo)
 {
     if (_state != StateType.GobsRead) throw new InvalidOperationException("Cannot read collision events in state " + _state);
     _state = StateType.CollisionEventsRead;
     for (int i = 0; i < _collisionEventCount; i++)
     {
         var collisionEventData = new CollisionEvent.SerializationData();
         Read(collisionEventData, serializationMode, framesAgo);
         yield return new CollisionEvent(collisionEventData, gobFinder);
     }
 }
 public void SetCollisionEvents(List<CollisionEvent> collisionEvents, SerializationModeFlags serializationMode)
 {
     if (_state != StateType.Initial && _state != StateType.AddingGobs) throw new InvalidOperationException("Cannot set collision events in state " + _state);
     _state = StateType.CollisionEventsSet;
     _collisionEventCount = collisionEvents.Count;
     foreach (var collisionEvent in collisionEvents) Write(collisionEvent.GetSerializationData(), serializationMode);
 }
Exemple #22
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());
            }
        }
Exemple #23
0
 public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
 {
     base.Deserialize(reader, mode, framesAgo);
     if ((mode & SerializationModeFlags.VaryingDataFromServer) != 0)
     {
         var maybeHoverAroundPos = reader.ReadHalfVector2();
         if (float.IsNaN(maybeHoverAroundPos.X))
             _hoverAroundPos = null;
         else
             _hoverAroundPos = maybeHoverAroundPos;
     }
 }
 public void Add(int id, INetworkSerializable item, SerializationModeFlags mode)
 {
     _ids.Add(id);
     Write(item, mode);
 }
Exemple #25
0
        public override void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
        {
#if NETWORK_PROFILING
            using (new NetworkProfilingScope(this))
#endif
            checked
            {
                base.Serialize(writer, mode);

                // HACK to avoid null references:
                //   - ForwardShot using Ship.Model before LoadContent() is called
                //   - Thrust() using _thrusterSound before Activate() is called
                var shipMode = mode.HasFlag(SerializationModeFlags.ConstantDataFromServer)
                    ? mode & ~SerializationModeFlags.VaryingDataFromServer
                    : mode;

                if (shipMode.HasFlag(SerializationModeFlags.VaryingDataFromServer))
                {
                    var visualThrustForceAndFlags = (byte)MathHelper.Clamp(_visualThrustForce * 127, 0, 127);
                    var updateDeviceTypes = _deviceTypeNameUpdateTimer.IsElapsed;
                    if (updateDeviceTypes) visualThrustForceAndFlags |= 0x80;
                    writer.Write((byte)visualThrustForceAndFlags);
                    _visualThrustForceSerializedThisFrame = true;
                    Action<ShipDevice> serializeDevice = device =>
                    {
                        var chargeData = device == null ? 0 : byte.MaxValue * device.Charge / device.ChargeMax;
                        writer.Write((byte)chargeData);
                        if (updateDeviceTypes) writer.Write((CanonicalString)device.TypeName);
                    };
                    serializeDevice(Weapon1);
                    serializeDevice(Weapon2);
                    serializeDevice(ExtraDevice);
                    DeviceUsagesToClients.Serialize(writer, mode);
                    DeviceUsagesToClients.Clear();
                }
                if (shipMode.HasFlag(SerializationModeFlags.VaryingDataFromClient))
                {
                    var rotationByte = unchecked((byte)((int)Math.Round(Rotation / MathHelper.TwoPi * (byte.MaxValue + 1))));
                    writer.Write((byte)rotationByte);
                }
            }
        }
Exemple #26
0
        public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo)
        {
            var oldRotation = Rotation;
            base.Deserialize(reader, mode, framesAgo);
            if (Owner != null) Owner.SeizeShip(this);

            // Client alone decides on the rotation of his own ship.
            if (LocationPredicter == null)
            {
                if (!float.IsNaN(oldRotation)) Rotation = oldRotation;
                DrawRotationOffset = 0;
            }

            // HACK to avoid null references:
            //   - ForwardShot using Ship.Model before LoadContent() is called
            //   - Thrust() using _thrusterSound before Activate() is called
            var shipMode = mode.HasFlag(SerializationModeFlags.ConstantDataFromServer)
                ? mode & ~SerializationModeFlags.VaryingDataFromServer
                : mode;

            if (shipMode.HasFlag(SerializationModeFlags.VaryingDataFromServer))
            {
                var visualThrustForceAndFlags = reader.ReadByte();
                _visualThrustForce = (visualThrustForceAndFlags & 0x7f) / 127f;
                var updateDeviceTypes = (visualThrustForceAndFlags & 0x80) != 0;
                Action<ShipDevice> deserializeDevice = device =>
                {
                    var data = reader.ReadByte();
                    if (device == null) return;
                    device.Charge = data * device.ChargeMax / byte.MaxValue;
                    if (!updateDeviceTypes) return;
                    var deviceTypeName = reader.ReadCanonicalString();
                    if (deviceTypeName != device.TypeName) SetDeviceType(device.OwnerHandle, deviceTypeName);
                };
                deserializeDevice(Weapon1);
                deserializeDevice(Weapon2);
                deserializeDevice(ExtraDevice);
                DeviceUsagesToClients.Deserialize(reader, mode, framesAgo);
                ApplyDeviceUsages(DeviceUsagesToClients);
                DeviceUsagesToClients.Clear();
            }
            if (shipMode.HasFlag(SerializationModeFlags.VaryingDataFromClient))
            {
                var rotationByte = reader.ReadByte();
                Rotation = rotationByte * MathHelper.TwoPi / (byte.MaxValue + 1);
            }
        }
Exemple #27
0
 public override void Serialize(NetworkBinaryWriter writer, SerializationModeFlags mode)
 {
     #if NETWORK_PROFILING
     using (new NetworkProfilingScope(this))
     #endif
     {
         base.Serialize(writer, mode);
         if ((mode & SerializationModeFlags.VaryingDataFromServer) != 0)
         {
             if (_hoverAroundPos.HasValue)
                 writer.WriteHalf(_hoverAroundPos.Value);
             else
                 writer.WriteHalf(new Vector2(float.NaN));
         }
     }
 }
 private void TryCreateAndAddNewSpectatorOnServer(SpectatorSettingsRequest mess, SerializationModeFlags mode)
 {
     var ipAddress = Game.NetworkEngine.GetConnection(mess.ConnectionID).RemoteTCPEndPoint.Address;
     var newSpectator = GetSpectator(mess, mode);
     newSpectator.LocalID = mess.SpectatorID;
     var newStats = newSpectator.GetStats();
     if (newStats.IsLoggedIn) Game.WebData.UpdatePilotData(newSpectator, newStats.LoginToken);
     Game.DataEngine.AddPendingRemoteSpectatorOnServer(newSpectator);
 }
 /// <summary>
 /// Reads gob contents from the update message.
 /// </summary>
 public void ReadGobs(Func<int, INetworkSerializable> gobFinder, SerializationModeFlags serializationMode, int framesAgo)
 {
     if (_state != StateType.Initial) throw new InvalidOperationException("Cannot read gobs in state " + _state);
     _state = StateType.GobsRead;
     for (int i = 0; i < _gobIds.Count; ++i)
     {
         var gob = gobFinder(_gobIds[i]);
         if (gob == null) break;
         Read(gob, serializationMode, framesAgo);
     }
 }
 private void TryCreateAndAddNewSpectatorOnClient(SpectatorSettingsRequest mess, SerializationModeFlags mode)
 {
     var newSpectator = GetSpectator(mess, mode);
     var newStats = newSpectator.GetStats();
     if (newStats.IsLoggedIn) Game.WebData.UpdatePilotData(newSpectator, newStats.LoginToken);
     Game.AddRemoteSpectator(newSpectator);
     newSpectator.ID = mess.SpectatorID;
     newSpectator.ServerRegistration = Spectator.ServerRegistrationType.Yes;
 }