package com.rzg.zombieland.server.sesion; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.rzg.zombieland.comunes.comunicacion.EnviaPeticiones; import com.rzg.zombieland.comunes.comunicacion.Peticion; import com.rzg.zombieland.comunes.misc.Log; import com.rzg.zombieland.comunes.misc.ZombielandException; import com.rzg.zombieland.server.juego.Personaje; import com.rzg.zombieland.server.meta.Partida; /** * Rastrea el estado de un jugador: si ha iniciado sesi�n, en qu� partida est� jugando y a qu� * personaje est� controlando. * @author nicolas * */ public class Sesion { // El jugador relacionado a la sesi�n. private Jugador jugador; // El ID �nico de la sesi�n. private UUID id; // La partida a la que est� asociada el jugador. Puede ser null. private Partida partida; // El objeto que env�a peticiones al otro lado. private EnviaPeticiones hilo; // El listado de listener de sesi�n. private List<SesionListener> listeners; // El personaje que el jugador maneja. private Personaje personaje; /** * Interfaz de escuchador de sesi�n. * @author nicolas * */ public interface SesionListener { /** * Indica que la sesi�n se cerr�. * @param sesion */ public void notificarSesionCerrada(Sesion sesion); } /** * Construye una sesi�n a partir del jugador. * @param jugador * @param hilo - el hilo de escucha que atiende esta sesi�n. * @throws NullPointerException si el jugador es nulo. */ public Sesion(Jugador jugador, EnviaPeticiones hilo) { if (jugador == null) throw new NullPointerException("El jugador no puede ser null"); if (hilo == null) throw new NullPointerException("El hilo no puede ser null"); this.jugador = jugador; id = UUID.randomUUID(); this.hilo = hilo; listeners = new ArrayList<SesionListener>(); } /** * @return el ID de la sesi�n. */ public UUID getId() { return id; } /** * @return el jugador asociado a la sesi�n. */ public Jugador getJugador() { return jugador; } /** * @return la partida jugada en esta sesi�n. */ public Partida getPartida() { return partida; } /** * Establece la partida que el jugador comienza. * @param partida * @throws ZombielandException */ public void setPartida(Partida partida) throws ZombielandException { abandonarPartidaActual(); this.partida = partida; } /** * Env�a una petici�n al cliente asociado a la sesi�n. * @throws ZombielandException */ public void enviarPeticion(Peticion<?, ?> peticion) throws ZombielandException { hilo.enviarPeticion(peticion); } public void addListener(SesionListener listener) { synchronized (listeners) { listeners.add(listener); } } /** * Cierra la sesi�n del jugador. */ public void cerrar() { Log.info("El jugador " + jugador.getNombre() + " ha cerrado sesi�n."); synchronized (listeners) { for (SesionListener listener : listeners) listener.notificarSesionCerrada(this); } } /** * Hace que el jugador abandone la partida. * @throws ZombielandException */ private void abandonarPartidaActual() throws ZombielandException { if (partida == null) return; partida.removerJugador(jugador); partida = null; } /** * Establece el personaje que el jugador mover�. * @param personaje */ public void setPersonaje(Personaje personaje) { this.personaje = personaje; } /** * @return el personaje que el jugador mover�. */ public Personaje getPersonaje() { return personaje; } }