Several small adjustments to lobby structure

This commit is contained in:
Jonas 2022-04-11 16:17:35 +02:00
parent 7df07b490a
commit 240a44d1c3
5 changed files with 75 additions and 32 deletions

View File

@ -70,6 +70,13 @@ public class Protocol {
*/ */
public static final String listLobbies = "LISTL"; public static final String listLobbies = "LISTL";
/**
* Client requests to join the Lobby with the given number, for example,
* {@code JOINL$2} means the client wants to join lobby 2.
* todo: document handling when lobby is already full
*/
public static final String joinLobby = "JOINL";
//SERVER TO CLIENT COMMANDS //SERVER TO CLIENT COMMANDS
/** /**
@ -106,4 +113,6 @@ public class Protocol {
public static final String serverDeliversLobbyList = "LLIST"; public static final String serverDeliversLobbyList = "LLIST";
} }

View File

@ -18,7 +18,7 @@ public class ClientHandler implements Runnable {
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
public static final BudaLogConfig l = new BudaLogConfig(LOGGER); public static final BudaLogConfig l = new BudaLogConfig(LOGGER);
CentralServerData serverData; CentralServerData serverData; //todo: does this really need to be instantiated?
private String clientUserName; private String clientUserName;
private BufferedWriter out; private BufferedWriter out;
@ -161,7 +161,7 @@ public class ClientHandler implements Runnable {
* announcements rather than chat messages. The message will be printed to the user exactly as it * announcements rather than chat messages. The message will be printed to the user exactly as it
* is given to this method. Unlike broadcastChatMessage, it will also be printed onto the server * is given to this method. Unlike broadcastChatMessage, it will also be printed onto the server
* console. * console.
* * todo: this could be static!
* @param msg the Message to be broadcast * @param msg the Message to be broadcast
*/ */
public void broadcastAnnouncement(String msg) { public void broadcastAnnouncement(String msg) {
@ -179,7 +179,7 @@ public class ClientHandler implements Runnable {
*/ */
public void sendMsgToClient(String msg) { public void sendMsgToClient(String msg) {
try { try {
if(!msg.equals("SPING"))LOGGER.debug("Message sent to client: " + msg); //if(!msg.equals("SPING"))LOGGER.debug("Message sent to client: " + msg);
out.write(msg); out.write(msg);
out.newLine(); out.newLine();
out.flush(); out.flush();

View File

@ -2,6 +2,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.server;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.sebaschi.Lobby;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol;
@ -57,6 +58,18 @@ public class JServerProtocolParser {
case Protocol.clientQuitRequest: case Protocol.clientQuitRequest:
h.removeClientOnLogout(); h.removeClientOnLogout();
break; break;
case Protocol.joinLobby:
//todo: have this be a method of clientHandler.
int i = Integer.parseInt(msg.substring(6, 7));
Lobby l = Lobby.getLobbyFromID(i);
if (l != null) {
l.addPlayer(h);
h.broadcastAnnouncement(h.getClientUserName() + " joined Lobby nr. " + l.getLobbyID());
} else {
LOGGER.debug(h.getClientUserName() + " tried to join Lobby nr. "
+ i + " but that doesn't exist.");
}
break;
case Protocol.createNewGame: case Protocol.createNewGame:
h.createNewLobby(); h.createNewLobby();
LOGGER.debug(Protocol.createNewGame LOGGER.debug(Protocol.createNewGame
@ -65,7 +78,7 @@ public class JServerProtocolParser {
break; break;
case Protocol.listLobbies: case Protocol.listLobbies:
h.listAllLobbiesToClient(); h.listAllLobbiesToClient();
LOGGER.debug(Protocol.listLobbies + " command recieved from: " + h.getClientUserName()); LOGGER.debug(Protocol.listLobbies + " command received from: " + h.getClientUserName());
break; break;
default: default:
System.out.println("Received unknown command"); System.out.println("Received unknown command");

View File

@ -9,7 +9,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
/** /**
* Class that shall contain all non-game logik information relevant to a game session needed for * Class that shall contain all non-game logic information relevant to a game session needed for
* client-server and client-client communication. * client-server and client-client communication.
*/ */
public class GameSessionData { public class GameSessionData {

View File

@ -3,8 +3,7 @@ package ch.unibas.dmi.dbis.cs108.sebaschi;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol;
import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler;
import java.util.ArrayList; import java.util.HashSet;
import java.util.List;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -18,15 +17,15 @@ public class Lobby {
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
public static final BudaLogConfig l = new BudaLogConfig(LOGGER); public static final BudaLogConfig l = new BudaLogConfig(LOGGER);
public static HashSet<Lobby> lobbies = new HashSet<>();
private static final int MAX_NO_OF_CLIENTS = 6; private static final int MAX_NO_OF_CLIENTS = 6;
public static int lobbies;
//TODO //TODO
CentralServerData serverData; CentralServerData serverData;
/** /**
* The Person who created the game and can configure it and decide to start once enough players * The Person who created the game and can configure it and decide to start once enough lobbyClients
* have entered the lobby. * have entered the lobby.
*/ */
private final ClientHandler admin; private final ClientHandler admin;
@ -34,31 +33,28 @@ public class Lobby {
/** /**
* Everyone who's in the lobby. * Everyone who's in the lobby.
*/ */
private List<ClientHandler> players = new ArrayList<>(6); private HashSet<ClientHandler> lobbyClients = new HashSet<>(6);
private int numberOfPlayersInLobby; private int numberOfPlayersInLobby;
//TODO maybe it makes sense to have LobbyID Class?
private final int lobbyID = lobbies++;
private final int lobbyID;
static {
lobbies = 0;
}
/** /**
* Constructor. Sets the admin to who created the lobby. Adds the admin to the list of players. * Constructor. Sets the admin to who created the lobby. Adds the admin to the list of lobbyClients.
* Increases the number of players from 0 to 1. * Increases the number of lobbyClients from 0 to 1.
* *
* @param admin the Client who called CRTGM * @param admin the Client who called CRTGM
*/ */
public Lobby(ClientHandler admin) { public Lobby(ClientHandler admin) {
this.admin = admin; this.admin = admin;
this.players.add(admin); this.lobbyClients.add(admin);
this.numberOfPlayersInLobby = 1; this.numberOfPlayersInLobby = 1;
LOGGER.debug("New Lobby created by " + admin.getClientUserName() + ". This lobby's ID: " lobbies.add(this);
+ this.lobbyID); this.lobbyID = lobbies.size();
admin.broadcastAnnouncement("New Lobby created by " + admin.getClientUserName() +
". This lobby's ID: " + this.lobbyID);
} }
/** /**
@ -80,12 +76,12 @@ public class Lobby {
} }
/** /**
* Returns the list containing players currently in the lobby * Returns the list containing lobbyClients currently in the lobby
* *
* @return list of players * @return list of lobbyClients
*/ */
public List<ClientHandler> getPlayers() { public HashSet<ClientHandler> getLobbyClients() {
return this.players; return this.lobbyClients;
} }
/** /**
@ -104,22 +100,47 @@ public class Lobby {
return response.toString(); return response.toString();
} }
/**
* Returns the lobby with the desired LobbyID.
* For example, getLobbyFromID(5) returns the lobby whose LobbyID is 5.
* If no such lobby exists, it returns null.
*/
public static Lobby getLobbyFromID(int i) {
for (Lobby l: lobbies) {
if (l.getLobbyID() == i) {
return l;
}
}
return null;
}
public static boolean clientIsInALobby(ClientHandler h) {
for (Lobby l: lobbies) {
for (ClientHandler clientHandler: l.getLobbyClients()) {
if (h.equals(clientHandler)) {
return true;
}
}
}
return false;
}
/** /**
* Adds a player to the lobby. * Adds a player to the lobby.
* TODO: add an appropriate response. Currently hardcoded. * TODO: add an appropriate response. Currently hardcoded.
* TODO: Does this method need to be implemented somewhere else, e.g. in the ClientHandler? * TODO: Does this method need to be implemented somewhere else, e.g. in the ClientHandler?
* * //todo: Client can only join one Lobby.
* @param player who wants to join the lobby. * @param player who wants to join the lobby.
*/ */
public synchronized void addPlayer(ClientHandler player) { public synchronized void addPlayer(ClientHandler player) {
if (players.size() <= MAX_NO_OF_CLIENTS) { if (lobbyClients.size() < MAX_NO_OF_CLIENTS) {
players.add(player); lobbyClients.add(player);
numberOfPlayersInLobby++; numberOfPlayersInLobby++;
LOGGER.debug(player.getClientUserName() + " has been added to Lobby with ID: " + lobbyID LOGGER.debug(player.getClientUserName() + " has been added to Lobby with ID: " + lobbyID
+ ". Current number of players in this lobby: " + players.size()); + ". Current number of lobbyClients in this lobby: " + lobbyClients.size());
} else { } else {
LOGGER.debug( LOGGER.debug(
player.getClientUserName() + " could not be added to lobby. Number of players in lobby: " player.getClientUserName() + " could not be added to lobby. Number of lobbyClients in lobby: "
+ numberOfPlayersInLobby); + numberOfPlayersInLobby);
//TODO: does this have to be formatted in any way to conform to protocol? //TODO: does this have to be formatted in any way to conform to protocol?
player.sendMsgToClient(Protocol.printToClientConsole + player.sendMsgToClient(Protocol.printToClientConsole +
@ -136,11 +157,11 @@ public class Lobby {
* @return true if a player was found and removed. Used for debugging. * @return true if a player was found and removed. Used for debugging.
*/ */
public synchronized boolean removePlayer(ClientHandler player) { public synchronized boolean removePlayer(ClientHandler player) {
return this.getPlayers().remove(player); return this.getLobbyClients().remove(player);
} }
public void broadcastToLounge(String msg) { public void broadcastToLounge(String msg) {
for (ClientHandler lounger : this.getPlayers()) { for (ClientHandler lounger : this.getLobbyClients()) {
} }
} }