fix game
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 8m13s
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 8m13s
This commit is contained in:
@@ -27,6 +27,8 @@ type wsConn struct {
|
|||||||
|
|
||||||
// disconnectFromServer trennt die bestehende WebSocket-Verbindung sauber
|
// disconnectFromServer trennt die bestehende WebSocket-Verbindung sauber
|
||||||
func (g *Game) disconnectFromServer() {
|
func (g *Game) disconnectFromServer() {
|
||||||
|
// Generation erhöhen → alle noch laufenden Handler der alten Verbindung werden ignoriert
|
||||||
|
g.connGeneration++
|
||||||
if g.wsConn != nil {
|
if g.wsConn != nil {
|
||||||
g.wsConn.ws.Call("close")
|
g.wsConn.ws.Call("close")
|
||||||
g.wsConn = nil
|
g.wsConn = nil
|
||||||
@@ -53,8 +55,16 @@ func (g *Game) connectToServer() {
|
|||||||
connected: false,
|
connected: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generation zum Zeitpunkt der Verbindung festhalten.
|
||||||
|
// Wenn disconnectFromServer() aufgerufen wird, erhöht sich g.connGeneration
|
||||||
|
// und alle Handler dieser alten Verbindung geben sofort nil zurück.
|
||||||
|
myGen := g.connGeneration
|
||||||
|
|
||||||
// OnOpen Handler
|
// OnOpen Handler
|
||||||
ws.Call("addEventListener", "open", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
ws.Call("addEventListener", "open", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||||
|
if g.connGeneration != myGen {
|
||||||
|
return nil // veraltete Verbindung
|
||||||
|
}
|
||||||
log.Println("✅ WebSocket verbunden!")
|
log.Println("✅ WebSocket verbunden!")
|
||||||
conn.connected = true
|
conn.connected = true
|
||||||
g.connected = true
|
g.connected = true
|
||||||
@@ -63,6 +73,9 @@ func (g *Game) connectToServer() {
|
|||||||
|
|
||||||
// OnMessage Handler
|
// OnMessage Handler
|
||||||
ws.Call("addEventListener", "message", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
ws.Call("addEventListener", "message", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||||
|
if g.connGeneration != myGen {
|
||||||
|
return nil // veraltete Verbindung – Nachrichten ignorieren
|
||||||
|
}
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -149,6 +162,9 @@ func (g *Game) connectToServer() {
|
|||||||
|
|
||||||
// OnError Handler
|
// OnError Handler
|
||||||
ws.Call("addEventListener", "error", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
ws.Call("addEventListener", "error", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||||
|
if g.connGeneration != myGen {
|
||||||
|
return nil // veraltete Verbindung
|
||||||
|
}
|
||||||
log.Println("❌ WebSocket Fehler!")
|
log.Println("❌ WebSocket Fehler!")
|
||||||
conn.connected = false
|
conn.connected = false
|
||||||
g.connected = false
|
g.connected = false
|
||||||
@@ -157,6 +173,9 @@ func (g *Game) connectToServer() {
|
|||||||
|
|
||||||
// OnClose Handler
|
// OnClose Handler
|
||||||
ws.Call("addEventListener", "close", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
ws.Call("addEventListener", "close", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||||
|
if g.connGeneration != myGen {
|
||||||
|
return nil // veraltete Verbindung – kein g.connected überschreiben
|
||||||
|
}
|
||||||
log.Println("🔌 WebSocket geschlossen")
|
log.Println("🔌 WebSocket geschlossen")
|
||||||
conn.connected = false
|
conn.connected = false
|
||||||
g.connected = false
|
g.connected = false
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ type Game struct {
|
|||||||
appState int
|
appState int
|
||||||
conn *nats.EncodedConn
|
conn *nats.EncodedConn
|
||||||
wsConn *wsConn // WebSocket für WASM
|
wsConn *wsConn // WebSocket für WASM
|
||||||
|
connGeneration int // Erhöht bei jedem Disconnect; macht alte WS-Handler ungültig
|
||||||
|
isConnecting bool // Guard gegen mehrfaches connectAndStart()
|
||||||
gameState game.GameState
|
gameState game.GameState
|
||||||
stateMutex sync.Mutex
|
stateMutex sync.Mutex
|
||||||
connected bool
|
connected bool
|
||||||
@@ -904,6 +906,14 @@ func (g *Game) resetForNewGame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *Game) connectAndStart() {
|
func (g *Game) connectAndStart() {
|
||||||
|
// Guard: verhindert mehrfaches gleichzeitiges Verbinden
|
||||||
|
if g.isConnecting {
|
||||||
|
log.Println("⚠️ connectAndStart bereits aktiv, ignoriere doppelten Aufruf")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
g.isConnecting = true
|
||||||
|
defer func() { g.isConnecting = false }()
|
||||||
|
|
||||||
g.resetForNewGame()
|
g.resetForNewGame()
|
||||||
|
|
||||||
// Verbindung über plattformspezifische Implementierung
|
// Verbindung über plattformspezifische Implementierung
|
||||||
|
|||||||
@@ -425,7 +425,7 @@ const _loadingQuoteInterval = setInterval(function() {
|
|||||||
} else {
|
} else {
|
||||||
clearInterval(_loadingQuoteInterval);
|
clearInterval(_loadingQuoteInterval);
|
||||||
}
|
}
|
||||||
}, 4000);
|
}, 10000);
|
||||||
|
|
||||||
function showSprueche() {
|
function showSprueche() {
|
||||||
document.querySelectorAll('.overlay-screen').forEach(el => el.classList.add('hidden'));
|
document.querySelectorAll('.overlay-screen').forEach(el => el.classList.add('hidden'));
|
||||||
|
|||||||
Reference in New Issue
Block a user