/// <summary> /// Busca la sala incompleta con mas cuentas /// </summary> /// <returns>La sala que aun no esta completa</returns> private Sala BuscarSalaIncompleta() { Sala SalaConMayorNumeroDeJugadores = null; foreach (Sala sala in SalasCreadas) { if (sala.EsSalaPublica && !sala.EstaLaSalaLlena()) { if (SalaConMayorNumeroDeJugadores == null) { SalaConMayorNumeroDeJugadores = sala; } else { if (SalaConMayorNumeroDeJugadores.NumeroJugadoresEnSala < sala.NumeroJugadoresEnSala) { SalaConMayorNumeroDeJugadores = sala; } } } } return(SalaConMayorNumeroDeJugadores); }
/// <summary> /// Crea una Sala personalizada /// </summary> /// <param name="Id">String</param> /// <param name="EsSalaPublica">Boolean</param> /// <param name="Cuenta">CuentaModel</param> /// <param name="ActualCallback">IGameServiceCallback</param> /// <returns>EnumEstadoCrearSalaConId</returns> public EnumEstadoCrearSalaConId CrearSala(string Id, Boolean EsSalaPublica, CuentaModel Cuenta, IGameServiceCallback ActualCallback, String DireccionIpDelCliente) { EnumEstadoCrearSalaConId EstadoDeCreacionDeSala = EnumEstadoCrearSalaConId.NoSeEncuentraEnSesion; if (ManejadorDeSesiones.VerificarCuentaLogeada(Cuenta)) { Cuenta = ManejadorDeSesiones.ObtenerCuentaCompleta(Cuenta); if (!EstaElIdDeSalaEnUso(Id)) { Sala SalaAAgregar = new Sala(Id, EsSalaPublica, Cuenta, ActualCallback, DireccionIpDelCliente); SalasCreadas.Add(SalaAAgregar); SuscribirseAEventosDeSala(SalaAAgregar); SalaCreada?.Invoke(SalaAAgregar); EstadoDeCreacionDeSala = EnumEstadoCrearSalaConId.CreadaCorrectamente; } else { EstadoDeCreacionDeSala = EnumEstadoCrearSalaConId.IdYaExistente; } } return(EstadoDeCreacionDeSala); }
/// <summary> /// Agrega una Cuenta a una sala completa, si no hay salas disponibles la crea /// </summary> /// <param name="Cuenta">CuentaModel</param> /// <param name="ActualCallback">IGameServiceCallback</param> /// <returns>Verdadero si la sala cuenta se unico correctamenete a la sala o falso si no</returns> public Boolean UnisrseASalaDisponible(CuentaModel Cuenta, IGameServiceCallback ActualCallback, String DireccionIpDelCliente) { Boolean seUnioASala = false; if (ManejadorDeSesiones.VerificarCuentaLogeada(Cuenta)) { Cuenta = ManejadorDeSesiones.ObtenerCuentaCompleta(Cuenta); Sala SalaAUnirse = BuscarSalaIncompleta(); if (SalaAUnirse != null) { seUnioASala = SalaAUnirse.UnirseASala(Cuenta, ActualCallback, DireccionIpDelCliente); SeUnioASala?.Invoke(SalaAUnirse.Id); } else { Sala NuevaSala = CrearSalaConIdAleatorio(Cuenta, ActualCallback, DireccionIpDelCliente); SalasCreadas.Add(NuevaSala); SuscribirseAEventosDeSala(NuevaSala); SalaCreada?.Invoke(NuevaSala); seUnioASala = true; } } return(seUnioASala); }
/// <summary> /// Destruye una sala y envia una notificacion /// </summary> /// <param name="salaADestruir">Sala</param> private void DestruirSala(Sala salaADestruir) { SalasCreadas.Remove(salaADestruir); SalaDestriuda?.Invoke(salaADestruir); }
/// <summary> /// Se suscribe a los eventos que ofrece la sala /// </summary> /// <param name="salaASuscribirse">Sala</param> private void SuscribirseAEventosDeSala(Sala salaASuscribirse) { salaASuscribirse.SalaVacia += DestruirSala; }