Example #1
0
 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;
     });
 }
Example #2
0
 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
 }