Closed u-lo-l closed 1 year ago
socket id 로 찾을수 없으면 user id 로 찾으면 됩니다. player service 메소드 중에 getByUserId라는게 있어요 그걸로 찾을 수 있지 않을까요? @u-lo-l
disconnect이벤트에도 값을 전달해줄 수 있나요? handledisconnected에서 알 수 있는게 game_socket밖에 없는 거 같은데 game_socket을 key로가지는게 없지 않아요?
disconnect에 값을 전달해야할 일이 있나요..?
init을 할때 users에 대한 정보를 채우지 말까요? ready할때 users 정보를 채우면 해결되지 않을까 싶은데.. 지금 로직으로는 ready도 정상적으로 작동 안되는게 맞아보이는데여..? ready할때 client socket의 id하고 init할때 id가 다른게 맞으니..
ready에선 players를 users로 바꾸고, players는 game socket을 가지고 있도록 추가해줘서 처리했어요.
위에서 말씀하신게 이거 맞나요?
1.
private games: Map<string, Game> = new Map();
지금 이렇게 자료구조 하나인데 <gameSocketId: string, roomId : string>Map을 하나 더 만들어서 GameService내에서 처리한다.
getByUserId(id: number): PongClient {
const values = this.clients.values();
for (const pongClient of values) {
if (pongClient.user.id === id) {
return pongClient;
}
//여기서 추가 검사
else if (pongClient.status === ClientStatus.INGAME
&& pongClient.user.gameSocketid === id)
{
return pongClient;
}
}
return null;
}
GameState == Ingame인 경우 gameSocketID도 비교한다.
================================================= 저는 두가지정도 생각나네요.
제가 말한거랑은 다르긴한데.. game 소켓에 연결될때 그냥 다른 socket id를 가지고 있게 하려구요
음. 잘 모르겠지만ㅜㅜ 알겠습니다. 코드로 짜여지면 다시 볼게요
현재 게임 소켓과 전체 소켓을 분리하면서 문제가 발생함.
현재 quit_game에서는 게임 도중에 플레이어가 나가버리는 상황을 처리하기 위해 존재함. 따라서 disconnect 이벤트가 발생할 때, 누가 나갔는지 알 필요가 있고, 따라서 socket.id로 player를 찾고자 시도함. 하지만 player는 게임소켓이 아니라 전체소켓과 1:1대응이라 게임소켓으로 get한 결과는 undefined가 나와서 아래의 로직을 수행하지 않고 바로 return되어버리는 문제가 발생함. #130
ready의 경우에도 비슷한 문제가 있었는데, 그 때는 전체소켓의ID를 전달해주어서 검색이 가능하도록 했음.