Private
Public Access
1
0

fix game
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 8m20s

This commit is contained in:
Sebastian Unterschütz
2026-03-21 13:31:34 +01:00
parent 78742fc1c4
commit f48ade50bb
6 changed files with 130 additions and 83 deletions

View File

@@ -128,37 +128,48 @@ func (g *Game) ReconcileWithServer(serverState game.PlayerState) {
g.correctionX = diffX
g.correctionY = diffY
// === NEUE KORREKTUR-LOGIK MIT TOLERANZ ===
// === SMOOTH CORRECTION MIT VISUELLEM OFFSET ===
//
// Strategie: Physics springt sofort zur richtigen Position (korrekte Physik),
// aber der angezeigte Wert (predictedX/Y + correctionOffsetX/Y) springt NICHT
// er driftet sanft über ~80ms zur Physics-Position hin.
//
// Dadurch sehen Spieler keinen "Pushback/Teleport" mehr, selbst wenn der Server
// eine größere Korrektur schickt.
const (
// Toleranzen für Client-Abweichungen
acceptTolerance = 400.0 // 20px - Client-Wert wird akzeptiert, keine Korrektur
warnTolerance = 2500.0 // 50px - Warnung, nur noch Monitoring
criticalTolerance = 10000.0 // 100px - kritisch (Teleport/Respawn/Desync)
acceptTolerance = 400.0 // ~20px: keine Korrektur
criticalTolerance = 2500.0 // ~50px: sanfte Korrektur
)
if dist < acceptTolerance {
// Bei kleinen Abweichungen (<20px): Client-Position akzeptieren, KEINE Korrektur
// Server nimmt Client-Wert an
// (Client-seitige Prediction bleibt unverändert)
} else if dist < warnTolerance {
// Bei mittleren Abweichungen (20-50px): Nur Monitoring, KEINE Korrektur
// Der Unterschied wird toleriert - Client-Position wird akzeptiert
// Server überwacht weiterhin, greift aber nicht ein
// Kleine Abweichung (<20px): Client-Position beibehalten, kein Eingriff nötig
} else if dist < criticalTolerance {
// Bei großen Abweichungen (50-100px): Sanfte Korrektur
interpFactor := 0.3 // Nur 30% Korrektur
g.predictedX += diffX * interpFactor
g.predictedY += diffY * interpFactor
// Mittlere Abweichung (20-50px): sanfte Physics-Korrektur (25%)
// Visueller Offset kompensiert die Bewegung → kein sichtbarer Sprung
factor := 0.25
corrX := diffX * factor
corrY := diffY * factor
g.correctionOffsetX -= corrX // Offset gegenläufig zur Physics-Korrektur
g.correctionOffsetY -= corrY
g.predictedX += corrX
g.predictedY += corrY
g.correctionCount++
} else {
// Bei kritischen Abweichungen (>100px): Sofort korrigieren (Teleport/Respawn/Desync)
// Große Abweichung (>50px): Physics springt komplett zur Replay-Position.
// Visueller Offset hält das Bild an der alten Stelle Spieler sieht keinen Teleport.
g.correctionOffsetX += g.predictedX - replayX // = -(replayX - predictedX) = -diffX
g.correctionOffsetY += g.predictedY - replayY
g.predictedX = replayX
g.predictedY = replayY
g.correctionCount++
}
// Velocity und Ground Status vom Server übernehmen
// Velocity und Ground-State immer vom Replay übernehmen.
// Replay-Werte kommen aus korrekter Server-State + Pending-Input-Replay
// und sind physikalisch genauer als reine Client-Prediction über Zeit.
g.predictedVX = replayVX
g.predictedVY = replayVY
g.predictedGround = replayGround