This commit is contained in:
cay 2026-04-10 08:25:41 +01:00
parent e572f0d3a1
commit fd49572d22
2 changed files with 69 additions and 15 deletions

View File

@ -333,7 +333,7 @@ function registerArenaHandlers(io, socket) {
});
socket.on("arena_join", (data) => {
const { matchId, slot } = data;
const { matchId, slot, playerName } = data;
if (!matchId || !slot) return;
if (!io._arenaRooms) io._arenaRooms = new Map();
@ -341,7 +341,13 @@ function registerArenaHandlers(io, socket) {
const room = io._arenaRooms.get(matchId);
room.sockets[slot] = socket.id;
room.names[slot] = socket.user || "Spieler";
// Name aus socket.user (Objekt) oder vom Client mitgesendet
const u = socket.user;
room.names[slot] = (u && (u.ingame_name || u.username || u.name))
|| playerName
|| "Spieler";
socket.join("arena_" + matchId);
const otherSlot = slot === "player1" ? "player2" : "player1";
@ -372,6 +378,28 @@ function registerArenaHandlers(io, socket) {
io.to("arena_" + matchId).emit("player_surrendered", { slot });
});
/* ── Zugwechsel ── */
socket.on("end_turn", (data) => {
const { matchId, slot } = data;
if (!matchId || !slot) return;
const nextSlot = slot === "player1" ? "player2" : "player1";
io.to("arena_" + matchId).emit("turn_change", { activeSlot: nextSlot });
console.log(`[1v1] Zug: ${slot}${nextSlot} | Match ${matchId}`);
});
socket.on("end_turn_init", (data) => {
const { matchId, starterSlot } = data;
if (!matchId || !starterSlot) return;
// Nur einmal senden (erster Empfang gewinnt)
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 });
console.log(`[1v1] Startzug: ${starterSlot} | Match ${matchId}`);
// Cleanup nach 10s
setTimeout(() => io._turnInit?.delete(matchId), 10000);
});
/* ── 2v2 & 4v4 ── */
registerTeamModeHandlers(io, socket, "2v2");
registerTeamModeHandlers(io, socket, "4v4");

View File

@ -551,34 +551,60 @@
/* Account-ID laden dann arena_join senden */
let myIngameName = null;
fetch("/arena/me")
.then(r => r.json())
.then(me => {
// Eigenen Namen sofort im Avatar anzeigen
myIngameName = me.ingame_name || me.username || me.name || me.id || "Ich";
const myNameEl = document.getElementById(amIPlayer1 ? "nameLeft" : "nameRight");
if (myNameEl) myNameEl.textContent = myIngameName;
socket.emit("arena_join", { matchId, slot: mySlot, accountId: me.id });
})
.catch(() => {
socket.emit("arena_join", { matchId, slot: mySlot, accountId: null });
function emitArenaJoin(me) {
myIngameName = (me && (me.ingame_name || me.username || me.name || String(me.id))) || "Spieler";
const myNameEl = document.getElementById(amIPlayer1 ? "nameLeft" : "nameRight");
if (myNameEl) myNameEl.textContent = myIngameName;
socket.emit("arena_join", {
matchId,
slot: mySlot,
accountId: me?.id ?? null,
playerName: myIngameName,
});
}
function fetchAndJoin() {
fetch("/arena/me")
.then(r => r.json())
.then(me => emitArenaJoin(me))
.catch(() => emitArenaJoin(null));
}
// Auf Socket-Connect warten sicherster Zeitpunkt für arena_join
socket.on("connect", fetchAndJoin);
// Fallback: Socket war bereits verbunden bevor Event registriert wurde
if (socket.connected) fetchAndJoin();
// Fallback: Falls nach 8s kein arena_opponent_joined / arena_ready kommt
// → Bereit-Box trotzdem anzeigen
const readyFallbackTimer = setTimeout(() => {
const connecting = document.getElementById("connecting-overlay");
if (connecting) {
console.warn("[Arena] Kein Socket-Event nach 8s zeige Bereit-Box als Fallback");
connecting.remove();
const lockOverlay = document.getElementById("board-lock-overlay");
if (lockOverlay) lockOverlay.style.display = "flex";
}
}, 8000);
/* ── Gegner verbunden ───────────────────────────────── */
socket.on("arena_opponent_joined", data => {
console.log("[Arena] arena_opponent_joined:", data);
clearTimeout(readyFallbackTimer);
const name = data.name || "Gegner";
document.getElementById(amIPlayer1 ? "nameRight" : "nameLeft").textContent = name;
document.getElementById("connecting-overlay")?.remove();
// Jetzt erst Bereit-Box anzeigen
const lockOverlay = document.getElementById("board-lock-overlay");
if (lockOverlay) lockOverlay.style.display = "flex";
});
socket.on("arena_ready", data => {
console.log("[Arena] arena_ready:", data);
clearTimeout(readyFallbackTimer);
document.getElementById("connecting-overlay")?.remove();
document.getElementById("nameLeft").textContent = data.player1 || "Spieler 1";
document.getElementById("nameRight").textContent = data.player2 || "Spieler 2";
// Bereit-Box anzeigen
const lockOverlay = document.getElementById("board-lock-overlay");
if (lockOverlay) lockOverlay.style.display = "flex";
});