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
*/
@ -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);

View File

@ -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(