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.