diff --git a/apps/client/src/scenes/game/GameManager.ts b/apps/client/src/scenes/game/GameManager.ts index 387c17c..4e33c89 100644 --- a/apps/client/src/scenes/game/GameManager.ts +++ b/apps/client/src/scenes/game/GameManager.ts @@ -60,6 +60,7 @@ private sessionFacade: GameSessionFacade; private gameActionSender: GameActionSender; private runtime: GameSceneRuntime; + private moveSender: MoveSender; private gameEventFacade: GameEventFacade; private combatFacade: CombatLifecycleFacade; private lifecycleState: SceneLifecycleState; @@ -122,7 +123,7 @@ dependencies.lifecycleState ?? new SceneLifecycleState(); this.gameActionSender = dependencies.gameActionSender ?? new SocketGameActionSender(); - const moveSender = dependencies.moveSender ?? new SocketPlayerMoveSender(); + this.moveSender = dependencies.moveSender ?? new SocketPlayerMoveSender(); const sceneFactories = dependencies.sceneFactories; this.app = new Application(); this.worldContainer = new Container(); @@ -147,6 +148,9 @@ this.localBombHitCount = count; this.uiStateSyncService.emitIfChanged(); }, + onLocalRespawnCompleted: (position) => { + this.moveSender.sendMove(position.x, position.y, { force: true }); + }, }); this.runtime = new GameSceneRuntime({ app: this.app, @@ -155,7 +159,7 @@ myId: this.myId, sessionFacade: this.sessionFacade, gameActionSender: this.gameActionSender, - moveSender, + moveSender: this.moveSender, getElapsedMs: () => this.sessionFacade.getElapsedMs(), onPongReceived: (payload) => { this.clockSyncService.updateFromPong(payload); diff --git a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts index 4b0c005..51057ec 100644 --- a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts +++ b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts @@ -19,6 +19,7 @@ acquireInputLock: () => () => void; onSendBombHitReport: (bombId: string) => void; onLocalBombHitCountChanged: (count: number) => void; + onLocalRespawnCompleted?: (position: { x: number; y: number }) => void; }; type NetworkDamageSource = "bomb" | "hurricane"; @@ -28,6 +29,7 @@ private readonly myId: string; private readonly onSendBombHitReport: (bombId: string) => void; private readonly onLocalBombHitCountChanged: (count: number) => void; + private readonly onLocalRespawnCompleted?: (position: { x: number; y: number }) => void; private readonly bombHitOrchestrator: BombHitOrchestrator; private readonly playerHitPolicy: PlayerHitPolicy; private readonly playerHitEffectOrchestrator: PlayerHitEffectOrchestrator; @@ -40,10 +42,12 @@ acquireInputLock, onSendBombHitReport, onLocalBombHitCountChanged, + onLocalRespawnCompleted, }: CombatLifecycleFacadeOptions) { this.myId = myId; this.onSendBombHitReport = onSendBombHitReport; this.onLocalBombHitCountChanged = onLocalBombHitCountChanged; + this.onLocalRespawnCompleted = onLocalRespawnCompleted; this.bombHitOrchestrator = new BombHitOrchestrator({ players, myId, @@ -65,6 +69,12 @@ if (playerId !== this.myId) return; this.localBombHitCount = 0; this.onLocalBombHitCountChanged(this.localBombHitCount); + const localPlayer = players[playerId]; + if (!localPlayer) { + return; + } + + this.onLocalRespawnCompleted?.(localPlayer.getPosition()); }, }); }