diff --git a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java index 16c9ec4..54399af 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java @@ -38,6 +38,14 @@ public class GameController { return false; return model.SkipNotConnectedPlayer(player); } + //TODO + public boolean ReconnectPlayer(String username) + { + Player player= model.getPlayerByUsername(username); + if(player==null) + return false; + return model.ReconnectPlayer(player); + } /** * Returns the game model managed by this controller. * diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index ae75315..7fe3929 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -40,6 +40,9 @@ public class Game implements Serializable { public List getPlayers() { return playersList; } + + //TODO + Map disconnetedPlayers = new HashMap<>(); //TODO public boolean SkipNotConnectedPlayer(Player player) { @@ -47,9 +50,28 @@ public class Game implements Serializable { { return false; } - nextPlayerSetup(); - return true; + + if(currentState.getGameStage().equals(GameStages.SLOT_CHOICE)) + { + nextPlayerSetup(); + disconnetedPlayers.put(player,false); + } + else + { + nextPlayerSetup(); + } + return true; + } + + //TODO + public boolean ReconnectPlayer(Player player) + { + if(!disconnetedPlayers.containsKey(player)) + { + return false; + } + return disconnetedPlayers.put(player,false); } /** * Returns the current number of players participating in the game. @@ -728,6 +750,14 @@ public class Game implements Serializable { if (currentState.getRound() < 10) { nextRound(); + for(Map.Entry entry: disconnetedPlayers.entrySet()) + { + if(!entry.getValue()) + { + orderLogicCard.pushNoEffect(entry.getKey()); + disconnetedPlayers.remove(entry.getKey()); + } + } currentState.PlayerUpdate(orderLogicCard.pull(), null); currentState.GameStageUpdate(GameStages.SLOT_CHOICE); } else { diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java index b0e0c4f..fc2b9c8 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java @@ -59,6 +59,20 @@ public abstract class OrderLogicCard implements Serializable { } + /** + * Adds the player to the end of the queue, without effects. + * + * @param player the player to be pushed into the queue. + */ + public void pushNoEffect(Player player){ + if(players.size()==0) + { + playerList=new ArrayList<>(); + + } + playerList.add(new OrderPlayer(player,false)); + players.add(player); + } /** * Removes and returns the first player in the queue. diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java b/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java index dd887b5..dd697c3 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java @@ -15,5 +15,6 @@ public enum EventType { PICK_OPTIONAL_BUILD, SKIP_NO_DRAWABLE, SKIP_PLAYER_DISCONNECTED, + RECONNECT_PLAYER, NO_OPTIONAL_CARD } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java new file mode 100644 index 0000000..d6f61a9 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java @@ -0,0 +1,30 @@ +package it.polimi.ingsw.gc14.Network.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.EventType; +import it.polimi.ingsw.gc14.Network.NetworkEvent; + +import java.io.Serializable; + +//TODO +public class ReconnectPlayer extends NetworkEvent implements Serializable{ + + /** + * Class constructor. + * Initializes all the attributes. + * @param username the name of the player requesting the event + */ + public ReconnectPlayer(String username){ + super(username, EventType.RECONNECT_PLAYER, false); + } + + /** + * @param gameController the Game Controller on which to apply the event + * @return true if the player could skipTheTurn, false otherwise + */ + @Override + public boolean apply(GameController gameController){ + return gameController.ReconnectPlayer(username); + } + +} \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java index 2986e75..498ced8 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java @@ -81,6 +81,7 @@ public class TCPClient implements IClient { return false; } new Thread(this::receiveMessage, "tcp-reader").start(); + // Socket heartbeat this.heartbeatSocket = new Socket(hostname, heartbeatPort); this.heartbeatOut =heartbeatSocket.getOutputStream() ; @@ -89,10 +90,11 @@ public class TCPClient implements IClient { // manda subito username per associare i due socket lato server new ObjectOutputStream(heartbeatSocket.getOutputStream()).writeObject(user); heartbeatOut.flush(); + new Thread(this::heartbeatLoop, "heartbeat").start(); running = true; - new Thread(this::heartbeatLoop, "heartbeat").start(); + return true; } catch (IOException e) { diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java index e30c8a2..8844ffc 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java @@ -7,6 +7,7 @@ import it.polimi.ingsw.gc14.Network.ClientPlayer; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer; +import it.polimi.ingsw.gc14.Network.NetworkEvents.ReconnectPlayer; import java.io.*; import java.net.*; @@ -124,17 +125,12 @@ public class TCPServer { ); clientSocket.getOutputStream().write(1); pendingHeartbeat.put(username, handler); - synchronized (controller) { - handler.notifyModel(controller.getModel()); - } + handler.notifyModel(controller.getModel()); Thread thread = new Thread(handler); thread.start(); clientHandlers.add(handler); connectedPlayers++; - - - - + actionQueue.add(new ReconnectPlayer(username)); } else { clientSocket.getOutputStream().write(-1); clientSocket.close();