Hallo Community,
Ich arbeite gerade an einem (M)MORPG. Die Logik soll natürlich auch auf den Clienten simuliert werden, um unschöne Lags zu vertuschen.
Dafür haben wir einen eigenen Zahlengenerator (Pseudo-Zufall), damit wir einen deterministischen Zufall auf Server und Client haben.
Die ganzen Klassen, die mit dem RNG zu tun haben, haben alle einen Member
|
C-/C++-Quelltext
|
1
|
int RNGcounter, id;
|
Die id ist so wie ein Primärschlüssel bei Datenbanken, d.h., einzigartig. Der RNGCounter wird nach jeder Zufallsberechnung, die dieses Objekt betraf, erhöht.
Dann wird, wenn zum Beispiel ein Spieler einen anderen angreift, um zu errechnen, ob der Spieler getroffen hat, folgendes gemacht:
|
C-/C++-Quelltext
|
1
2
|
float chance = RNG::fNum(0.f,1.f, Player1.id, Player1.RNGCounter++, Player2.Id, Player2.RNGCounter++);
if(chance>=hittreshold) //usw.
|
fNum nimmt dabei Unter- und Oberwert an, gefolgt von mehreren "seeds". Damit jedes mal ein anderer Zufallswert rauskommt, wird der RNG-Zähler beider Spieler erhöt.
Aber wie mache ich es nun am geschicktesten, dass diese RNGCounter-Werte bei allen Synchron bleiben?
Wenn jetzt zum Beispiel der Spieler eigentlich außerhalb einer Schusslinie wäre, sich aber auf dem Clienten auf einmal zum Schuss hinbewegt, also so, dass der Server noch nichts davon weis, und dann auf dem Clienten der Spieler mit dem Pfeil kollidiert, wird ja der RNGCounter des Clienten benutzt, um zu berechnen, ob er doch ausweicht, oder ob es ein kritischer Treffer war o.ä.. Diese Berechnung findet aber auf dem Server nicht statt, da dieser noch nicht weis, dass der Spieler in den Schuss gelaufen ist. Dadurch hätte man ja zwei verschiedene RNG-Counter-Werte.
Das beeinflusst ja alle zufallsgesteuerten Ereignisse, z.B. Drops eines besiegten gegners etc.
Wisst ihr, wie man das Problem am besten löst?
Wie geht man am besten damit um, wenn der Client widersprüchliche Daten zu denen des Servers hat (z.B. wenn es laggt, und man wegrennen will vor den Gegnern,
so wäre es doch am fairsten, wenn der Server die in verzug geratenen Daten vom Clienten noch annimmt, statt ihn stehen und sterben zu lassen.)?
MfG, RmbRT