diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java index e16aa43..d661795 100644 --- a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java @@ -3,6 +3,6 @@ package cz.jzitnik.common.socket.messages.player; import cz.jzitnik.common.models.coordinates.RoomCords; import cz.jzitnik.common.socket.SocketMessage; -public record PlayerArrivalChange(int id, RoomCords playerCords, boolean arrived, - boolean rerender) implements SocketMessage { +public record PlayerArrivalChange(int id, RoomCords playerCords, PlayerRotation playerRotation, + boolean arrived, boolean rerender) implements SocketMessage { } diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java new file mode 100644 index 0000000..85fad63 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.socket.SocketMessage; + +public record PlayerDisconnected(int playerId) implements SocketMessage { +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java index 4ba6b32..e36cd2b 100644 --- a/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java +++ b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java @@ -3,10 +3,11 @@ package cz.jzitnik.client.socket.events; import cz.jzitnik.client.annotations.SocketEventHandler; import cz.jzitnik.client.annotations.injectors.InjectDependency; import cz.jzitnik.client.annotations.injectors.InjectState; -import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.events.TerminalResizeEvent; import cz.jzitnik.client.game.GameState; import cz.jzitnik.client.game.Player; import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.states.TerminalState; import cz.jzitnik.client.utils.events.EventManager; import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse; import lombok.extern.slf4j.Slf4j; @@ -16,6 +17,8 @@ import lombok.extern.slf4j.Slf4j; public class CreateGameHandler extends AbstractSocketEventHandler { @InjectState private GameState gameState; + @InjectState + private TerminalState terminalState; @InjectDependency private EventManager eventManager; @@ -24,6 +27,6 @@ public class CreateGameHandler extends AbstractSocketEventHandler otherPlayer1.getId() == event.id()).findFirst().get(); otherPlayer.setVisible(event.arrived()); otherPlayer.getPlayerCords().updateCords(event.playerCords()); + otherPlayer.setPlayerRotation(event.playerRotation()); GameRoom currentRoom = gameState.getCurrentRoom(); BufferedImage playerTexture = otherPlayer.getTexture(resourceManager); diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java new file mode 100644 index 0000000..bed6d39 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java @@ -0,0 +1,18 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.common.socket.messages.player.PlayerDisconnected; + +@SocketEventHandler(PlayerDisconnected.class) +public class PlayerDisconnectedHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @Override + public void handle(PlayerDisconnected event) { + gameState.getAllOtherPlayers().removeIf(player -> player.getId() == event.playerId()); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java index d72d311..4884773 100644 --- a/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java @@ -5,17 +5,16 @@ import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGame; import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGameResponse; import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; import cz.jzitnik.common.socket.messages.player.PlayerJoined; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; import cz.jzitnik.server.annotations.EventHandler; import cz.jzitnik.server.context.GlobalContext; import cz.jzitnik.server.events.AbstractEventHandler; import cz.jzitnik.server.game.Client; import cz.jzitnik.server.game.Player; -import lombok.extern.slf4j.Slf4j; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.ObjectReader; import tools.jackson.dataformat.yaml.YAMLFactory; -@Slf4j @EventHandler(ConnectToAGame.class) public class ConnectToAGameHandler extends AbstractEventHandler { public ConnectToAGameHandler(GlobalContext globalContext) { @@ -24,7 +23,6 @@ public class ConnectToAGameHandler extends AbstractEventHandler @Override public void handle(ConnectToAGame event, Client client) { - log.debug("Pepa"); var gameOptional = globalContext.getGame(event.gamePass().toUpperCase()); if (gameOptional.isEmpty()) { @@ -49,8 +47,8 @@ public class ConnectToAGameHandler extends AbstractEventHandler cl.getSession().sendMessage(new PlayerJoined(player)); if (cl.getPlayer().getCurrentRoom().equals(defaultRoomId)) { - cl.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), player.getPlayerCords(), true, true)); - client.getSession().sendMessage(new PlayerArrivalChange(cl.getPlayer().getId(), cl.getPlayer().getCords(), true, false)); + cl.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), player.getPlayerCords(), PlayerRotation.FRONT, true, true)); + client.getSession().sendMessage(new PlayerArrivalChange(cl.getPlayer().getId(), cl.getPlayer().getCords(), PlayerRotation.FRONT, true, false)); } } diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java index 3dc6117..7de43db 100644 --- a/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java @@ -40,9 +40,9 @@ public class MovePlayerRoomHandler extends AbstractEventHandler if (player.getPlayer().getId() != client.getPlayer().getId()) { if (player.getPlayer().getCurrentRoom().equals(oldRoomId)) { log.debug("{}", event.oldCords()); - player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.oldCords(), false, true)); + player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.oldCords(), client.getPlayer().getPlayerRotation(), false, true)); } else if (player.getPlayer().getCurrentRoom().equals(event.newRoomId())) { - player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.newCords(), true, true)); + player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.newCords(), client.getPlayer().getPlayerRotation(), true, true)); } } } diff --git a/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java b/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java index e43368d..a0aa476 100644 --- a/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java +++ b/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java @@ -1,6 +1,8 @@ package cz.jzitnik.server.socket; import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; +import cz.jzitnik.common.socket.messages.player.PlayerDisconnected; import cz.jzitnik.server.game.Client; import cz.jzitnik.server.context.GlobalContext; import jakarta.websocket.*; @@ -37,7 +39,24 @@ public class WebSocket { @OnClose public void onClose(Session session, CloseReason reason) { - System.out.println("Connection closed: " + reason); + Client client = globalContext.getSessions().get(session); + client.getGame().getPlayers().remove(client); + + for (Client otherClient : client.getGame().getPlayers()) { + if (otherClient.getPlayer().getCurrentRoom().equals(client.getPlayer().getCurrentRoom())) { + otherClient.getSession().sendMessage(new PlayerArrivalChange( + client.getPlayer().getId(), + client.getPlayer().getCords(), + client.getPlayer().getPlayerRotation(), + false, + true + )); + } + + otherClient.getSession().sendMessage(new PlayerDisconnected(client.getPlayer().getId())); + } + + log.debug("Connection closed: {}", reason); } @OnError