dghjd
This commit is contained in:
parent
dbe756c9fc
commit
3c35cd8594
@ -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);
|
||||
|
||||
@ -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(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user