feat: Player disconnect handler
This commit is contained in:
@@ -3,6 +3,6 @@ package cz.jzitnik.common.socket.messages.player;
|
|||||||
import cz.jzitnik.common.models.coordinates.RoomCords;
|
import cz.jzitnik.common.models.coordinates.RoomCords;
|
||||||
import cz.jzitnik.common.socket.SocketMessage;
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
|
||||||
public record PlayerArrivalChange(int id, RoomCords playerCords, boolean arrived,
|
public record PlayerArrivalChange(int id, RoomCords playerCords, PlayerRotation playerRotation,
|
||||||
boolean rerender) implements SocketMessage {
|
boolean arrived, boolean rerender) implements SocketMessage {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package cz.jzitnik.common.socket.messages.player;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
|
||||||
|
public record PlayerDisconnected(int playerId) implements SocketMessage {
|
||||||
|
}
|
||||||
@@ -3,10 +3,11 @@ package cz.jzitnik.client.socket.events;
|
|||||||
import cz.jzitnik.client.annotations.SocketEventHandler;
|
import cz.jzitnik.client.annotations.SocketEventHandler;
|
||||||
import cz.jzitnik.client.annotations.injectors.InjectDependency;
|
import cz.jzitnik.client.annotations.injectors.InjectDependency;
|
||||||
import cz.jzitnik.client.annotations.injectors.InjectState;
|
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.GameState;
|
||||||
import cz.jzitnik.client.game.Player;
|
import cz.jzitnik.client.game.Player;
|
||||||
import cz.jzitnik.client.socket.AbstractSocketEventHandler;
|
import cz.jzitnik.client.socket.AbstractSocketEventHandler;
|
||||||
|
import cz.jzitnik.client.states.TerminalState;
|
||||||
import cz.jzitnik.client.utils.events.EventManager;
|
import cz.jzitnik.client.utils.events.EventManager;
|
||||||
import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse;
|
import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -16,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
public class CreateGameHandler extends AbstractSocketEventHandler<CreateGameResponse> {
|
public class CreateGameHandler extends AbstractSocketEventHandler<CreateGameResponse> {
|
||||||
@InjectState
|
@InjectState
|
||||||
private GameState gameState;
|
private GameState gameState;
|
||||||
|
@InjectState
|
||||||
|
private TerminalState terminalState;
|
||||||
@InjectDependency
|
@InjectDependency
|
||||||
private EventManager eventManager;
|
private EventManager eventManager;
|
||||||
|
|
||||||
@@ -24,6 +27,6 @@ public class CreateGameHandler extends AbstractSocketEventHandler<CreateGameResp
|
|||||||
log.debug("Game code: {}", event.getGamePassword());
|
log.debug("Game code: {}", event.getGamePassword());
|
||||||
gameState.setPlayer(new Player(event.getOwnerPlayer()));
|
gameState.setPlayer(new Player(event.getOwnerPlayer()));
|
||||||
gameState.setScreen(null);
|
gameState.setScreen(null);
|
||||||
eventManager.emitEvent(new FullRoomDraw());
|
eventManager.emitEvent(new TerminalResizeEvent(terminalState.getTerminalScreen().getTerminalSize()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ public class PlayerArrivalChangeHandler extends AbstractSocketEventHandler<Playe
|
|||||||
OtherPlayer otherPlayer = gameState.getAllOtherPlayers().stream().filter(otherPlayer1 -> otherPlayer1.getId() == event.id()).findFirst().get();
|
OtherPlayer otherPlayer = gameState.getAllOtherPlayers().stream().filter(otherPlayer1 -> otherPlayer1.getId() == event.id()).findFirst().get();
|
||||||
otherPlayer.setVisible(event.arrived());
|
otherPlayer.setVisible(event.arrived());
|
||||||
otherPlayer.getPlayerCords().updateCords(event.playerCords());
|
otherPlayer.getPlayerCords().updateCords(event.playerCords());
|
||||||
|
otherPlayer.setPlayerRotation(event.playerRotation());
|
||||||
|
|
||||||
GameRoom currentRoom = gameState.getCurrentRoom();
|
GameRoom currentRoom = gameState.getCurrentRoom();
|
||||||
BufferedImage playerTexture = otherPlayer.getTexture(resourceManager);
|
BufferedImage playerTexture = otherPlayer.getTexture(resourceManager);
|
||||||
|
|||||||
@@ -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<PlayerDisconnected> {
|
||||||
|
@InjectState
|
||||||
|
private GameState gameState;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(PlayerDisconnected event) {
|
||||||
|
gameState.getAllOtherPlayers().removeIf(player -> player.getId() == event.playerId());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.game.connection.ConnectToAGameResponse;
|
||||||
import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange;
|
import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange;
|
||||||
import cz.jzitnik.common.socket.messages.player.PlayerJoined;
|
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.annotations.EventHandler;
|
||||||
import cz.jzitnik.server.context.GlobalContext;
|
import cz.jzitnik.server.context.GlobalContext;
|
||||||
import cz.jzitnik.server.events.AbstractEventHandler;
|
import cz.jzitnik.server.events.AbstractEventHandler;
|
||||||
import cz.jzitnik.server.game.Client;
|
import cz.jzitnik.server.game.Client;
|
||||||
import cz.jzitnik.server.game.Player;
|
import cz.jzitnik.server.game.Player;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import tools.jackson.databind.ObjectMapper;
|
import tools.jackson.databind.ObjectMapper;
|
||||||
import tools.jackson.databind.ObjectReader;
|
import tools.jackson.databind.ObjectReader;
|
||||||
import tools.jackson.dataformat.yaml.YAMLFactory;
|
import tools.jackson.dataformat.yaml.YAMLFactory;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@EventHandler(ConnectToAGame.class)
|
@EventHandler(ConnectToAGame.class)
|
||||||
public class ConnectToAGameHandler extends AbstractEventHandler<ConnectToAGame> {
|
public class ConnectToAGameHandler extends AbstractEventHandler<ConnectToAGame> {
|
||||||
public ConnectToAGameHandler(GlobalContext globalContext) {
|
public ConnectToAGameHandler(GlobalContext globalContext) {
|
||||||
@@ -24,7 +23,6 @@ public class ConnectToAGameHandler extends AbstractEventHandler<ConnectToAGame>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(ConnectToAGame event, Client client) {
|
public void handle(ConnectToAGame event, Client client) {
|
||||||
log.debug("Pepa");
|
|
||||||
var gameOptional = globalContext.getGame(event.gamePass().toUpperCase());
|
var gameOptional = globalContext.getGame(event.gamePass().toUpperCase());
|
||||||
|
|
||||||
if (gameOptional.isEmpty()) {
|
if (gameOptional.isEmpty()) {
|
||||||
@@ -49,8 +47,8 @@ public class ConnectToAGameHandler extends AbstractEventHandler<ConnectToAGame>
|
|||||||
cl.getSession().sendMessage(new PlayerJoined(player));
|
cl.getSession().sendMessage(new PlayerJoined(player));
|
||||||
|
|
||||||
if (cl.getPlayer().getCurrentRoom().equals(defaultRoomId)) {
|
if (cl.getPlayer().getCurrentRoom().equals(defaultRoomId)) {
|
||||||
cl.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), player.getPlayerCords(), true, true));
|
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(), true, false));
|
client.getSession().sendMessage(new PlayerArrivalChange(cl.getPlayer().getId(), cl.getPlayer().getCords(), PlayerRotation.FRONT, true, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ public class MovePlayerRoomHandler extends AbstractEventHandler<MovePlayerRoom>
|
|||||||
if (player.getPlayer().getId() != client.getPlayer().getId()) {
|
if (player.getPlayer().getId() != client.getPlayer().getId()) {
|
||||||
if (player.getPlayer().getCurrentRoom().equals(oldRoomId)) {
|
if (player.getPlayer().getCurrentRoom().equals(oldRoomId)) {
|
||||||
log.debug("{}", event.oldCords());
|
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())) {
|
} 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package cz.jzitnik.server.socket;
|
package cz.jzitnik.server.socket;
|
||||||
|
|
||||||
import cz.jzitnik.common.socket.SocketMessage;
|
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.game.Client;
|
||||||
import cz.jzitnik.server.context.GlobalContext;
|
import cz.jzitnik.server.context.GlobalContext;
|
||||||
import jakarta.websocket.*;
|
import jakarta.websocket.*;
|
||||||
@@ -37,7 +39,24 @@ public class WebSocket {
|
|||||||
|
|
||||||
@OnClose
|
@OnClose
|
||||||
public void onClose(Session session, CloseReason reason) {
|
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
|
@OnError
|
||||||
|
|||||||
Reference in New Issue
Block a user