fix game
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 8m20s
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 8m20s
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user