This commit is contained in:
cay 2026-04-12 10:55:05 +01:00
parent dbe756c9fc
commit 3c35cd8594
2 changed files with 33 additions and 28 deletions

View File

@ -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 HAUPT-HANDLER
*/ */
@ -429,7 +449,7 @@ function registerArenaHandlers(io, socket) {
console.log( console.log(
`[1v1] Beide Spieler da → arena_ready senden | Match ${matchId}`, `[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", player1: room.names["player1"] || "Spieler 1",
player2: room.names["player2"] || "Spieler 2", player2: room.names["player2"] || "Spieler 2",
}); });
@ -472,36 +492,21 @@ function registerArenaHandlers(io, socket) {
if (!matchId || !slot) return; if (!matchId || !slot) return;
const nextSlot = slot === "player1" ? "player2" : "player1"; const nextSlot = slot === "player1" ? "player2" : "player1";
// An alle im Room senden (Normalfall) // Direkt an beide Spieler senden kein Room-Broadcast nötig
io.to("arena_" + matchId).emit("turn_change", { activeSlot: nextSlot }); emitToMatch(io, matchId, "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 });
}
console.log(`[1v1] Zug: ${slot}${nextSlot} | Match ${matchId}`); 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) => { socket.on("card_played", (data) => {
const { matchId, slot } = data; const { matchId, slot } = data;
if (!matchId) return; if (!matchId) return;
const opponentSlot = slot === "player1" ? "player2" : "player1"; // Direkt an Gegner-Socket senden
const room = io._arenaRooms?.get(matchId); emitToOpponent(io, matchId, slot, "card_played", data);
// Direkt an Gegner-Socket senden (zuverlässiger als Room-Broadcast) // Karte im Server-State speichern (für Reconnect/board_sync)
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)
const roomState = io._arenaRooms?.get(matchId); const roomState = io._arenaRooms?.get(matchId);
if (roomState) { if (roomState) {
roomState.boardCards = roomState.boardCards || []; roomState.boardCards = roomState.boardCards || [];
@ -518,7 +523,7 @@ function registerArenaHandlers(io, socket) {
if (!io._turnInit) io._turnInit = new Set(); if (!io._turnInit) io._turnInit = new Set();
if (io._turnInit.has(matchId)) return; if (io._turnInit.has(matchId)) return;
io._turnInit.add(matchId); 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}`); console.log(`[1v1] Startzug: ${starterSlot} | Match ${matchId}`);
// Cleanup nach 10s // Cleanup nach 10s
setTimeout(() => io._turnInit?.delete(matchId), 10000); setTimeout(() => io._turnInit?.delete(matchId), 10000);

View File

@ -690,7 +690,6 @@
tickHandCooldowns(); tickHandCooldowns();
// Eine Karte aus dem Deck nachziehen // Eine Karte aus dem Deck nachziehen
drawNextCard(); drawNextCard();
lastTurnChangeSlot = null; // Duplikat-Schutz zurücksetzen
setTurnState(false); setTurnState(false);
socket.emit("end_turn", { matchId, slot: mySlot }); socket.emit("end_turn", { matchId, slot: mySlot });
}); });
@ -877,11 +876,12 @@
}); });
/* ── Server: Zugwechsel ──────────────────────────────── */ /* ── Server: Zugwechsel ──────────────────────────────── */
let lastTurnChangeSlot = null; let lastTurnChangeTs = 0;
socket.on("turn_change", (data) => { socket.on("turn_change", (data) => {
// Duplikat-Schutz: dasselbe Event doppelt ignorieren // Duplikat-Schutz: identisches Event innerhalb 500ms ignorieren
if (data.activeSlot === lastTurnChangeSlot) return; const now = Date.now();
lastTurnChangeSlot = data.activeSlot; if (now - lastTurnChangeTs < 500) return;
lastTurnChangeTs = now;
const nowMyTurn = data.activeSlot === mySlot; const nowMyTurn = data.activeSlot === mySlot;
console.log( console.log(