From 3c35cd8594736689c487521af68b1153163be065 Mon Sep 17 00:00:00 2001 From: cay Date: Sun, 12 Apr 2026 10:55:05 +0100 Subject: [PATCH] dghjd --- sockets/arena_socket.js | 51 +++++++++++++++++++++------------------ views/1v1-battlefield.ejs | 10 ++++---- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/sockets/arena_socket.js b/sockets/arena_socket.js index ef7df05..3793d4e 100644 --- a/sockets/arena_socket.js +++ b/sockets/arena_socket.js @@ -359,6 +359,26 @@ function registerTeamModeHandlers(io, socket, mode) { }); } +/* ── Helper: Event direkt an beide Spieler eines Matches senden ── */ +function emitToMatch(io, matchId, event, data) { + const room = io._arenaRooms?.get(matchId); + if (!room) return; + ["player1", "player2"].forEach((slot) => { + if (room.sockets[slot]) { + io.to(room.sockets[slot]).emit(event, data); + } + }); +} + +function emitToOpponent(io, matchId, senderSlot, event, data) { + const room = io._arenaRooms?.get(matchId); + if (!room) return; + const opponentSlot = senderSlot === "player1" ? "player2" : "player1"; + if (room.sockets[opponentSlot]) { + io.to(room.sockets[opponentSlot]).emit(event, data); + } +} + /* ═══════════════════════════════════════════════════════════ HAUPT-HANDLER ═══════════════════════════════════════════════════════════ */ @@ -429,7 +449,7 @@ function registerArenaHandlers(io, socket) { console.log( `[1v1] Beide Spieler da → arena_ready senden | Match ${matchId}`, ); - io.to("arena_" + matchId).emit("arena_ready", { + emitToMatch(io, matchId, "arena_ready", { player1: room.names["player1"] || "Spieler 1", player2: room.names["player2"] || "Spieler 2", }); @@ -472,36 +492,21 @@ function registerArenaHandlers(io, socket) { if (!matchId || !slot) return; const nextSlot = slot === "player1" ? "player2" : "player1"; - // An alle im Room senden (Normalfall) - io.to("arena_" + matchId).emit("turn_change", { activeSlot: nextSlot }); - - // Zusätzlich direkt an den Socket des nächsten Spielers senden – - // Fallback falls der Gegner den Room verlassen hat (z.B. nach Reconnect) - const room = io._arenaRooms?.get(matchId); - if (room?.sockets[nextSlot]) { - io.to(room.sockets[nextSlot]).emit("turn_change", { activeSlot: nextSlot }); - } + // Direkt an beide Spieler senden – kein Room-Broadcast nötig + emitToMatch(io, matchId, "turn_change", { activeSlot: nextSlot }); console.log(`[1v1] Zug: ${slot} → ${nextSlot} | Match ${matchId}`); }); - /* ── Karte gespielt → direkt an Gegner-Socket senden ── */ + /* ── Karte gespielt → direkt an Gegner senden ── */ socket.on("card_played", (data) => { const { matchId, slot } = data; if (!matchId) return; - const opponentSlot = slot === "player1" ? "player2" : "player1"; - const room = io._arenaRooms?.get(matchId); + // Direkt an Gegner-Socket senden + emitToOpponent(io, matchId, slot, "card_played", data); - // Direkt an Gegner-Socket senden (zuverlässiger als Room-Broadcast) - if (room?.sockets[opponentSlot]) { - io.to(room.sockets[opponentSlot]).emit("card_played", data); - } else { - // Fallback: Room-Broadcast - socket.to("arena_" + matchId).emit("card_played", data); - } - - // Karte im Server-State speichern (für Reconnect) + // Karte im Server-State speichern (für Reconnect/board_sync) const roomState = io._arenaRooms?.get(matchId); if (roomState) { roomState.boardCards = roomState.boardCards || []; @@ -518,7 +523,7 @@ function registerArenaHandlers(io, socket) { if (!io._turnInit) io._turnInit = new Set(); if (io._turnInit.has(matchId)) return; io._turnInit.add(matchId); - io.to("arena_" + matchId).emit("turn_change", { activeSlot: starterSlot }); + emitToMatch(io, matchId, "turn_change", { activeSlot: starterSlot }); console.log(`[1v1] Startzug: ${starterSlot} | Match ${matchId}`); // Cleanup nach 10s setTimeout(() => io._turnInit?.delete(matchId), 10000); diff --git a/views/1v1-battlefield.ejs b/views/1v1-battlefield.ejs index f02e7c2..dcceb95 100644 --- a/views/1v1-battlefield.ejs +++ b/views/1v1-battlefield.ejs @@ -690,7 +690,6 @@ tickHandCooldowns(); // Eine Karte aus dem Deck nachziehen drawNextCard(); - lastTurnChangeSlot = null; // Duplikat-Schutz zurücksetzen setTurnState(false); socket.emit("end_turn", { matchId, slot: mySlot }); }); @@ -877,11 +876,12 @@ }); /* ── Server: Zugwechsel ──────────────────────────────── */ - let lastTurnChangeSlot = null; + let lastTurnChangeTs = 0; socket.on("turn_change", (data) => { - // Duplikat-Schutz: dasselbe Event doppelt ignorieren - if (data.activeSlot === lastTurnChangeSlot) return; - lastTurnChangeSlot = data.activeSlot; + // Duplikat-Schutz: identisches Event innerhalb 500ms ignorieren + const now = Date.now(); + if (now - lastTurnChangeTs < 500) return; + lastTurnChangeTs = now; const nowMyTurn = data.activeSlot === mySlot; console.log(