diff --git a/apps/client/src/scenes/game/application/GameNetworkSync.ts b/apps/client/src/scenes/game/application/GameNetworkSync.ts index 25fc668..eed8e01 100644 --- a/apps/client/src/scenes/game/application/GameNetworkSync.ts +++ b/apps/client/src/scenes/game/application/GameNetworkSync.ts @@ -73,8 +73,6 @@ private handlePlayerUpdates = (changedPlayers: UpdatePlayersPayload) => { // UPDATE_PLAYERS は差分のみ届くため,対象IDだけ上書き更新する changedPlayers.forEach((playerData) => { - if (playerData.id === this.myId) return; - const target = this.players[playerData.id]; if (target && target instanceof RemotePlayerController) { target.applyRemoteUpdate({ x: playerData.x, y: playerData.y }); diff --git a/apps/server/src/application/coordinators/startGameCoordinator.ts b/apps/server/src/application/coordinators/startGameCoordinator.ts index c69f378..e233507 100644 --- a/apps/server/src/application/coordinators/startGameCoordinator.ts +++ b/apps/server/src/application/coordinators/startGameCoordinator.ts @@ -22,6 +22,7 @@ output: Pick< GameOutputPort, | "publishUpdatePlayersToRoom" + | "publishUpdatePlayersToSocket" | "publishMapCellUpdatesToRoom" | "publishGameEndToRoom" | "publishGameResultToRoom" diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 7c46ac3..02578b3 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -51,6 +51,10 @@ roomId: roomTypes.Room["roomId"], players: UpdatePlayersPayload ): void; + publishUpdatePlayersToSocket( + socketId: string, + players: UpdatePlayersPayload + ): void; publishMapCellUpdatesToRoom( roomId: roomTypes.Room["roomId"], cellUpdates: UpdateMapCellsPayload diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index bb7e8b4..7ec726b 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -14,6 +14,7 @@ output: Pick< GameOutputPort, | "publishUpdatePlayersToRoom" + | "publishUpdatePlayersToSocket" | "publishMapCellUpdatesToRoom" | "publishGameEndToRoom" | "publishGameResultToRoom" @@ -34,7 +35,17 @@ playerIds, (tickData) => { if (tickData.playerUpdates.length > 0) { - output.publishUpdatePlayersToRoom(roomId, tickData.playerUpdates); + playerIds.forEach((playerId) => { + const updatesForPlayer = tickData.playerUpdates.filter( + (playerUpdate) => playerUpdate.id !== playerId + ); + + if (updatesForPlayer.length === 0) { + return; + } + + output.publishUpdatePlayersToSocket(playerId, updatesForPlayer); + }); } if (tickData.cellUpdates.length > 0) { diff --git a/apps/server/src/network/adapters/socketEmitters.ts b/apps/server/src/network/adapters/socketEmitters.ts index 4d75643..9ced072 100644 --- a/apps/server/src/network/adapters/socketEmitters.ts +++ b/apps/server/src/network/adapters/socketEmitters.ts @@ -20,6 +20,11 @@ (event: TEvent, payload: ServerToClientPayloadOf): void; }; +type EmitToSocketById = { + (socketId: string, event: TEvent): void; + (socketId: string, event: TEvent, payload: ServerToClientPayloadOf): void; +}; + type EmitToAll = { (event: TEvent): void; (event: TEvent, payload: ServerToClientPayloadOf): void; @@ -53,6 +58,13 @@ }; }; +/** 任意ソケットID向けの送信関数を生成する */ +export const createEmitToSocketById = (io: Server): EmitToSocketById => { + return (socketId: string, event: SocketEventName, payload?: unknown) => { + emitWithOptionalPayload((eventName, body) => io.to(socketId).emit(eventName, body), event, payload); + }; +}; + /** 全接続向けの送信関数を生成する */ export const createEmitToAll = (io: Server): EmitToAll => { return (event: SocketEventName, payload?: unknown) => { diff --git a/apps/server/src/network/handlers/CommonHandler.ts b/apps/server/src/network/handlers/CommonHandler.ts index cd6bb1e..5e728b4 100644 --- a/apps/server/src/network/handlers/CommonHandler.ts +++ b/apps/server/src/network/handlers/CommonHandler.ts @@ -7,6 +7,7 @@ createEmitToAll, createEmitToRoom, createEmitToSocket, + createEmitToSocketById, } from "@server/network/adapters/socketEmitters"; /** ハンドラで共通利用する送信コンテキスト */ @@ -14,6 +15,7 @@ emitToAll: ReturnType; emitToRoom: ReturnType; emitToSocket: ReturnType; + emitToSocketById: ReturnType; }; /** 送信先別のエミッタをまとめた共通コンテキストを生成する */ @@ -25,5 +27,6 @@ emitToAll: createEmitToAll(io), emitToRoom: createEmitToRoom(io), emitToSocket: createEmitToSocket(socket), + emitToSocketById: createEmitToSocketById(io), }; }; diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index 1e3e779..728f8c1 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -39,6 +39,9 @@ publishUpdatePlayersToRoom: (roomId: RoomId, players: UpdatePlayersPayload) => { common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYERS, players); }, + publishUpdatePlayersToSocket: (socketId: string, players: UpdatePlayersPayload) => { + common.emitToSocketById(socketId, protocol.SocketEvents.UPDATE_PLAYERS, players); + }, publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: UpdateMapCellsPayload) => { common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); },