← Zurück zur Anfrage
RI-01 Namespace: Verse

Rand & RNG

Temperatur-Abhängigkeit: equalizeCells.Shuffle() verbraucht globalen Rand-State

Temperatur → Rand Verbindung
Bei jedem Room-Rebuild (Wand/Tür gebaut/entfernt) wird equalizeCells.Shuffle() aufgerufen. Das verbraucht Rand-Calls aus dem globalen RNG-State. Wenn Rooms auf verschiedenen Clients zu unterschiedlichen Zeitpunkten rebuilt werden → unterschiedliche Rand-Sequenz → Desync.
#1 Globaler State Verse/Rand.cs:13-17

MP-Kritisch — Zwei Felder definieren den gesamten RNG-State: seed (uint) und iterations (uint). Jeder Value-Aufruf erhöht iterations um 1. Determinismus hängt davon ab, dass alle Clients exakt gleich viele Rand-Calls machen.

Temperatur-Bezug: equalizeCells.Shuffle() ruft pro Zelle einmal Rand.Range() auf. Ein Raum mit 50 equalizeCells verbraucht 50 Rand-Calls bei jedem Rebuild.

#2 PushState/PopState — Isolierung Verse/Rand.cs:440-454

Stack-basiertes State-Management: PushState() speichert aktuellen seed+iterations und setzt neuen Seed. PopState() stellt alten State wieder her.

Temperatur-Bezug: Das Shuffle in RegenerateEqualizationData nutzt NICHT PushState — es verbraucht den globalen Rand direkt. Das ist der Grund warum es MP-kritisch ist. Hätte Ludeon PushState verwendet, wäre es kein Desync-Risiko.