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
|
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);
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user