diff --git a/sockets/arena_socket.js b/sockets/arena_socket.js index 866a1c9..3fce2bc 100644 --- a/sockets/arena_socket.js +++ b/sockets/arena_socket.js @@ -359,30 +359,32 @@ function registerTeamModeHandlers(io, socket, mode) { }); } -/* ── Helper: Event an beide Spieler senden (direkt + Room-Fallback) ── */ +/* ── Helper: Event direkt an beide Spieler eines Matches senden ── */ function emitToMatch(io, matchId, event, data) { const room = io._arenaRooms?.get(matchId); - // Direkt an bekannte Socket-IDs senden if (room) { + // Direkt an bekannte Socket-IDs senden (kein Room-Broadcast → kein Duplikat) ["player1", "player2"].forEach((slot) => { if (room.sockets[slot]) { io.to(room.sockets[slot]).emit(event, data); } }); + } else { + // Fallback wenn room noch nicht gesetzt + io.to("arena_" + matchId).emit(event, data); } - // Zusätzlich Room-Broadcast als Fallback (z.B. nach Reconnect) - io.to("arena_" + matchId).emit(event, data); } function emitToOpponent(io, matchId, senderSlot, event, data) { const room = io._arenaRooms?.get(matchId); const opponentSlot = senderSlot === "player1" ? "player2" : "player1"; - // Direkt an Gegner-Socket senden if (room?.sockets[opponentSlot]) { + // Direkt an Gegner-Socket (kein Duplikat beim Sender) io.to(room.sockets[opponentSlot]).emit(event, data); + } else { + // Fallback: Room-Broadcast + socket.to("arena_" + matchId).emit(event, data); } - // Zusätzlich Room-Broadcast als Fallback - io.to("arena_" + matchId).emit(event, data); } /* ═══════════════════════════════════════════════════════════ diff --git a/views/1v1-battlefield.ejs b/views/1v1-battlefield.ejs index c725896..db8cc7c 100644 --- a/views/1v1-battlefield.ejs +++ b/views/1v1-battlefield.ejs @@ -997,11 +997,12 @@ // Festlegen ob ich der linke Spieler bin amILeftPlayer = flip ? mySlot === "player2" : mySlot === "player1"; - // Startspieler NUR vom Server bestimmen lassen – kein lokales setTurnState! - // Nur der erste Spieler sendet end_turn_init, Server entscheidet wer beginnt + // Nur player1 sendet end_turn_init → verhindert Doppelverarbeitung + // turn_change vom Server setzt dann den korrekten Zustand für BEIDE Spieler const starterSlot = flip ? "player2" : "player1"; - socket.emit("end_turn_init", { matchId, starterSlot }); - // turn_change vom Server setzt dann den korrekten Zustand für beide Spieler + if (mySlot === "player1") { + socket.emit("end_turn_init", { matchId, starterSlot }); + } } });