private void ProcessPendingRemoteSpectatorsOnServer() { DataEngine.ProcessPendingRemoteSpectatorsOnServer(spectator => { var stats = spectator.GetStats(); var mess = new SpectatorSettingsReply { SpectatorLocalID = spectator.LocalID, SpectatorID = Spectator.UNINITIALIZED_ID, FailMessage = "", }; if (stats.IsLoggedIn) { if (stats.PilotId == null) return false; var oldSpectator = DataEngine.Spectators.FirstOrDefault(spec => spec.GetStats().IsLoggedIn && spec.GetStats().PilotId == stats.PilotId); if (oldSpectator == null) { AddRemoteSpectator(spectator); mess.SpectatorID = spectator.ID; } else if (oldSpectator.IsDisconnected) { ReconnectRemoteSpectatorOnServer(spectator, oldSpectator); mess.SpectatorID = oldSpectator.ID; } else { RefuseRemoteSpectatorOnServer(spectator, oldSpectator); mess.FailMessage = "Pilot already in game"; } } else { var oldSpectator = DataEngine.Spectators.FirstOrDefault(spec => !spec.GetStats().IsLoggedIn && spec.IPAddress.Equals(spectator.IPAddress) && spec.Name == spectator.Name); if (oldSpectator == null) { AddRemoteSpectator(spectator); mess.SpectatorID = spectator.ID; } else if (oldSpectator.IsDisconnected) { ReconnectRemoteSpectatorOnServer(spectator, oldSpectator); mess.SpectatorID = oldSpectator.ID; } else { AddRemoteSpectator(spectator); mess.SpectatorID = spectator.ID; } } NetworkEngine.GetConnection(spectator.ConnectionID).Send(mess); return true; }); }
private void HandleSpectatorSettingsReply(SpectatorSettingsReply mess) { var spectator = Game.DataEngine.Spectators.FirstOrDefault(plr => plr.LocalID == mess.SpectatorLocalID); if (spectator == null) throw new ApplicationException("Cannot find unregistered local spectator with local ID " + mess.SpectatorLocalID); if (mess.Success) { spectator.ServerRegistration = Spectator.ServerRegistrationType.Yes; spectator.ID = mess.SpectatorID; // If we reconnected, remove the duplicate spectator that was sent by the server earlier. var oldSpectator = Game.DataEngine.Spectators.FirstOrDefault(spec => spec.ID == spectator.ID && spec != spectator); if (oldSpectator != null) { spectator.ReconnectOnClient(oldSpectator); Game.DataEngine.Spectators.Remove(oldSpectator); } } else Game.NetworkingErrors.Enqueue(string.Format("Server refused {0}:\n{1}", spectator.Name, mess.FailMessage)); // TODO: Proper line wrapping in dialogs }