public virtual void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo) { if (mode.HasFlag(SerializationModeFlags.ConstantDataFromClient)) { LoginToken = reader.ReadString(); } }
public void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo) { if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0) { weight = reader.ReadSingle(); spawnTypeName = reader.ReadCanonicalString(); } }
public override void Deserialize(NetworkBinaryReader reader, SerializationModeFlags mode, int framesAgo) { base.Deserialize(reader, mode, framesAgo); if ((mode & SerializationModeFlags.ConstantDataFromServer) != 0) { actionGobName = reader.ReadString(); } }
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); } }
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); }
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); } }
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; }
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); } }
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); } }
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); } } }
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); }
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); }
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); } }
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); } }
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); }
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 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); }
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); } } }
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); } }
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; }