Delt opp klasser.

RoboRallyClient med RoboRallyClientListener
Og RoboRallyServer med RoboRallyServerListener
This commit is contained in:
Steinar Aalstad Lillesund 2020-04-14 16:01:04 +02:00
parent 382960d623
commit 99f7578cd7
3 changed files with 143 additions and 31 deletions

View File

@ -3,8 +3,8 @@ package inf112.fiasko.roborally.networking;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import inf112.fiasko.roborally.game_wrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.game_wrapper.screens.CardChoiceScreen;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.gamewrapper.screens.CardChoiceScreen;
import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import inf112.fiasko.roborally.networking.containers.GameStartInfo;
import inf112.fiasko.roborally.objects.ProgrammingCardDeck;
@ -42,34 +42,5 @@ public class RoboRallyClient {
}
}
/**
* This listener handles all receiving from the server
*/
class RoboRallyClientListener extends Listener {
private final RoboRallyWrapper wrapper;
/**
* Instantiates a new Robo Rally client listener
* @param wrapper The Robo Rally wrapper to interact with
*/
RoboRallyClientListener(RoboRallyWrapper wrapper) {
super();
this.wrapper = wrapper;
}
@Override
public void received (Connection connection, Object object) {
if (object instanceof ErrorResponse) {
ErrorResponse errorResponse = (ErrorResponse) object;
System.out.println(errorResponse.getErrorMessage());
} else if (object instanceof GameStartInfo) {
GameStartInfo info = (GameStartInfo) object;
wrapper.roboRallyGame = new RoboRallyGame(info.getPlayerList(), info.getBoardName(),
wrapper.server != null,info.getPlayerName());
}
else if(object instanceof ProgrammingCardDeck){
wrapper.setScreen(new CardChoiceScreen(wrapper,(ProgrammingCardDeck) object));
}
}
}

View File

@ -0,0 +1,43 @@
package inf112.fiasko.roborally.networking;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.gamewrapper.screens.CardChoiceScreen;
import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import inf112.fiasko.roborally.networking.containers.GameStartInfo;
import inf112.fiasko.roborally.objects.ProgrammingCardDeck;
import inf112.fiasko.roborally.objects.RoboRallyGame;
/**
* This listener handles all receiving from the server
*/
class RoboRallyClientListener extends Listener {
private final RoboRallyWrapper wrapper;
/**
* Instantiates a new Robo Rally client listener
* @param wrapper The Robo Rally wrapper to interact with
*/
RoboRallyClientListener(RoboRallyWrapper wrapper) {
super();
this.wrapper = wrapper;
}
@Override
public void received (Connection connection, Object object) {
if (object instanceof ErrorResponse) {
ErrorResponse errorResponse = (ErrorResponse) object;
System.out.println(errorResponse.getErrorMessage());
} else if (object instanceof GameStartInfo) {
GameStartInfo info = (GameStartInfo) object;
wrapper.roboRallyGame = new RoboRallyGame(info.getPlayerList(), info.getBoardName(),
wrapper.server != null,info.getPlayerName());
wrapper.setScreen(wrapper.screenManager.getLoadingScreen(wrapper));
}
else if(object instanceof ProgrammingCardDeck){
wrapper.setScreen(new CardChoiceScreen(wrapper,(ProgrammingCardDeck) object));
}
}
}

View File

@ -0,0 +1,98 @@
package inf112.fiasko.roborally.networking;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import inf112.fiasko.roborally.elementproperties.RobotID;
import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* This listener handles all sending and responses for the server
*/
class RoboRallyServerListener extends Listener {
private Connection host;
private final Map<Connection, RobotID> clients;
private final Map<Connection, String> playerNames;
private List<Connection> deadPlayers;
/**
* Instantiates a new Robo Rally server listener
*/
RoboRallyServerListener() {
super();
clients = new HashMap<>();
playerNames = new HashMap<>();
deadPlayers = new ArrayList<>();
}
/**
* Lets the server know what players have lost this game.
* @param deadRobots List of RobotID
*/
public void setDeadPlayers(List<RobotID> deadRobots) {
for (RobotID robotID:deadRobots) {
for (Connection key:clients.keySet()) {
if (clients.get(key) == robotID) {
deadPlayers.add(key);
}
}
}
}
/**
* Gets a map between connections and their player name
* @return A mapping between connections and robot ids
*/
public Map<Connection, String> getPlayerNames() {
return playerNames;
}
/**
* Gets a map between connections and their robot id
* @return A mapping between connections and robot ids
*/
public Map<Connection, RobotID> getRobotID() {
return clients;
}
@Override
public void received (Connection connection, Object object) {
if (object instanceof String) {
String playerName = (String) object;
if (playerNames.containsValue(playerName)) {
String errorMessage = "The player name send is already taken.";
connection.sendTCP(new ErrorResponse(errorMessage, new IllegalArgumentException(errorMessage)));
} else {
playerNames.put(connection, playerName);
}
}
}
@Override
public void connected(Connection connection) {
//The first client to connect is assumed to be the host
if (host == null) {
host = connection;
}
//Prevents more than 8 players from connecting at once
if (clients.size() >= 8) {
String errorMessage = "The server already has 8 players. You cannot join.";
connection.sendTCP(new ErrorResponse(errorMessage, new IOException(errorMessage)));
connection.close();
return;
}
clients.put(connection, RobotID.getRobotIDFromID(clients.size() + 1));
System.out.println(connection.getRemoteAddressTCP() + " connected");
}
@Override
public void disconnected(Connection connection) {
System.out.println(connection.getRemoteAddressTCP() + " disconnected");
}
}