Wie kann man Bewegungen richtig vorhersagen, wenn ein Spieler unsichtbar ist?

20

Ich habe ein Multiplayer-Spiel und mache clientseitige Prognosen, aber manche Spieler können einen Trank trinken und werden unsichtbar ...

Das Problem ist, dass ich, wenn sie unsichtbar werden, nichts mit dem Kunden teile, von dem er wissen könnte, dass er da ist. Wenn ein Spieler also versucht, ein Feld zu betreten, das von einem unsichtbaren Spieler besetzt ist, sagt er voraus, dass er erfolgreich ist, und erhält dann eine hässliche Positionskorrektur vom Server gesendet.

Eine Lösung wäre, etwas zu teilen, damit der Kunde es sehen kann, aber dann könnten Hacker damit herausfinden, wo sich unsichtbare Spieler aufhalten und schummeln.

Übrigens habe ich die reguläre Bewegungsvorhersage bereits gelöst, sie funktioniert perfekt.

affiszervmention
quelle
4
Sende einfach die Infos über alle Spieler. Betrüger werden betrügen. Verkrüppeln Sie nicht die Erfahrung ehrlicher Spieler und denken Sie stattdessen daran, ein Flaggensystem für Betrüger zu schaffen.
user1306322
2
@ user1306322 Indem du es Betrügern leichter machst, lähmst du auch ehrliche Spieler. Ein Flaggensystem ist eine gute Idee, aber wenn Unsichtbarkeit einen großen Teil des Spiels ausmacht, ist möglicherweise eine vorbeugende Maßnahme erforderlich.
ThatOneGuy
@ user1895420 Normalerweise reicht es aus, solche Dinge nicht im Klartext zu senden, damit kein durchschnittlicher Spieler diese Daten auf einfache Weise abrufen kann. Wenn es nur ein technisch versierter Mensch kann, dann ist es eine ebenso gute vorbeugende Maßnahme wie jede andere.
user1306322
1
Oder vielleicht ist es eine bessere Idee, die Unsichtbarkeitsmechanik ein wenig zu ändern, damit sie nicht in unmittelbarer Nähe funktioniert, sodass selbst diejenigen, die sich durch die Spieldaten schummeln können, keinen wirklichen Vorteil erzielen können.
user1306322
Wie wäre es, wenn Sie nur die Position des unsichtbaren Spielers senden (mit einer Flagge, die ihn / sie unsichtbar hält), wenn sich ein sichtbarer Spieler in der Nähe befindet? Das sollte Ihnen ein paar Frames geben, um das Problem der Überbewegung zu vermeiden, während es Betrügern nicht genügend Zeit geben sollte, um zu reagieren. Bei zwei unsichtbaren Spielern würde ich die Kollision einfach ignorieren. Wenn Sie einen zentralen Server haben, auf dem alle Spielerpositionen gespeichert sind, können Sie auch festlegen, wann die Position gesendet werden soll und wann nicht.
JDM

Antworten:

30

Dies kann als Animationsproblem angesehen werden. Wenn eine Positionskorrektur vom Server zurückkommt, weil versucht wurde, in ein unsichtbares Objekt einzudringen, senden Sie nicht nur die Korrektur zurück, sondern auch ein Flag, das angibt, warum die Korrektur benötigt wurde. Anstatt dass ein Spieler rückwärts knallt, kann er eine "Woah" -Animation durchführen, bei der es glaubwürdiger aussieht, als wäre er gerade auf etwas gestoßen.

In Spielen, die diesen Ansatz verwenden, ist es nicht ungewöhnlich, Unsichtbarkeit (zumindest vorübergehend) von allem zu entfernen, auf das gestoßen wurde. Dies ist unter anderem ein Anreiz für unsichtbare Spieler, Massen zu vermeiden oder anderen Charakteren zu nahe zu kommen, wodurch die Häufigkeit verringert wird, mit der Kollisionen mit unsichtbaren Spielern auftreten. Selbst wenn Ihre Animation für diese Art von Kollision schwach (oder nicht vorhanden) ist, wird sie durch den unsichtbaren Charakter, der in Sichtweite gerät, etwas verdeckt und zeigt allen klar, was gerade passiert ist.

Die Animationsanforderung konnte beseitigt werden, indem die Unsichtbarkeit nicht aus nächster Nähe funktioniert. Dies gibt unsichtbaren Spielern einen noch größeren Anreiz, sich anderen Charakteren nicht zu nähern. Dies ist ein gängiger Ansatz für Stealth-basierte Spiele und KI (ersetzen Sie "unsichtbar" durch "für das Ziel nicht sichtbar") und ist in PvP-Spielen wie World of Tanks zu sehen. Sie müssen sich keine Gedanken über die Kollisionsreaktion mit unsichtbaren Zeichen machen, wenn Ihnen nichts Unsichtbares jemals nahe genug ist, um damit zu kollidieren (innerhalb der Latenzgrenzen).

Dracors Lösung, Kollisionen mit unsichtbaren Objekten einfach zu ignorieren, ist auch eine gute. Dies erfordert wiederum einige Animationen (für den unsichtbaren Spieler-Client), damit Objekte nicht nur durch den Avatar des Spielers auf seinem Bildschirm geschnitten werden. Wenn Sie nichts anderes tun, können Sie dafür sorgen, dass sichtbare Objekte immer unsichtbare Objekte verschieben, sodass der unsichtbare Spieler auf dem Server automatisch aus dem Weg geräumt wird, wenn jemand mit ihm kollidiert.

Unsichtbar-unsichtbare Kollisionen sind etwas kniffliger. Es kann vorteilhaft sein, nur Kollisionen zu deaktivieren, da niemand sehen kann, ob zwei unsichtbare Objekte zusammenschneiden (vorausgesetzt, mit "unsichtbar" meinen wir, dass beide Objekte nicht für denselben Client sichtbar sind). Wenn eines der Objekte sichtbar wird, kehrt es automatisch zur sichtbaren-unsichtbaren Kollisionsreaktion zurück (schieben Sie das unsichtbare Objekt weg).

Dies alles wird schwieriger, wenn Unsichtbarkeit komplizierte Mengen von Personen enthält, die wen sehen können. Die erste oder zweite Lösung oben ist wahrscheinlich die beste, wenn Sie sie brauchen. Nicht jedes Problem dieser Art braucht eine technische Lösung. Viele benötigen lediglich Designlösungen (z. B. erlauben Sie Ihren Designern diese Funktion nicht).

Sean Middleditch
quelle
5
Das Spiel Team Fortress 2 nutzt diesen ersten Ansatz ... Wenn ein unsichtbarer Spion einen anderen Spieler berührt, kann der andere Spieler den Spion sehen (oder, wenn er von hinten kommt, zumindest ein Hindernis erkennen).
Xantix
4

Ich sehe hier nur zwei Optionen, wenn Sie dem Kunden nicht mitteilen möchten, wo sich der unsichtbare Spieler befindet: 1) Sie ignorieren die Einheitenkollision für unsichtbare Spieler - eine einfache Lösung, und die Spieler könnten die unsichtbaren Spieler nicht anhand von finden Kollisionstests entweder. 2) Nachdem Sie sich für den vorhergesagten Pfad entschieden haben, senden Sie dem Server den vorhergesagten Pfad, korrigieren den Pfad selbst auf der Serverseite und senden dann den neuen Pfad zurück.

Daniel Rusznyak
quelle
Das Problem beim Ignorieren von Kollisionen bei unsichtbaren Spielern besteht darin, dass ein unsichtbarer Spieler nicht mehr unsichtbar ist, wenn er mit einer anderen Person kollidiert. Es fühlt sich auch nicht richtig an. In meinem Spiel habe ich keine wirklichen Pfade oder Wege, die Spieler können sich nur schrittweise in die vier Richtungen bewegen
affiszervmention
Dann müssen Sie die vorhergesagte Bewegung (entweder einen einzelnen Vektor oder ein Array von Vektoren) senden und eine serverseitige Überprüfung durchführen. Oder animieren Sie einfach die Korrektur, wie unten angegeben.
Daniel Rusznyak
1
Wenn Sie eine gitterbasierte Karte haben und trotzdem jedes Quadrat einzeln prüfen, können Sie auch versuchen, die Position der unsichtbaren Zeichen auf der Serverseite mit einer Einwegkodierung wie SHA-1 oder SHA-2 zu kodieren Überprüfen Sie dann Ihren eigenen Pfad, indem Sie die überprüften Koordinaten mit demselben Algorithmus codieren. Ich kann nicht sagen, dass es die Leistung beeinträchtigt, aber wenn Sie es wirklich auf Client-Seite tun möchten, funktioniert diese Lösung möglicherweise auch mit einer begrenzten Anzahl von Positionen, und das Hacken kann aufgrund der enormen Anzahl der zu codierenden Rasterpunkte sehr mühsam sein und mit den Daten im Speicher abgleichen.
Daniel Rusznyak
Ich kann sehen, dass das funktioniert. Meine kleinste Karte hat 1500 verschiedene Positionen. Sollte ich HMAC verwenden, wobei sich der Schlüssel alle paar Sekunden ändert, um zu verhindern, dass der Angreifer alle Positionen vorberechnet?
Affiszervmention
5
Nein, jedes Schema, das Sie sich ausdenken können, wäre nicht "sicher" gegenüber Hackern. Wenn der Kunde bestimmen kann, ob der Spieler gegen eine bestimmte Position kollidiert, kann jemand Ihr Spiel hacken. Das HMACing mit einem rotierenden Schlüssel hindert den Client nicht daran, 1500 HMACs pro Sekunde auszuführen. Versuchen Sie nicht , selbst zu kryptografieren. Wenn Sie das ursprüngliche Ziel erreichen möchten, senden Sie die unsichtbare Spielerposition nur an den Kunden, wenn sich diese innerhalb von 1 oder 2 Feldern des Spielers befinden. Dann können Sie nur hacken, um zu wissen, ob jemand in Ihrer Nähe ist (was nicht nützlich ist, weil Sie einfach umziehen könnten, um dies zu überprüfen).
2

Wenn ich nichts falsch verstehe, ist die Lösung einfach. Senden Sie die Client-Informationen nicht an alle unsichtbaren Spieler, sondern nur an diejenigen, die sich in Reichweite befinden und innerhalb der Bewegungsgrenzen während des vorhergesagten Intervalls einer Kollision ausgesetzt sind. Mit anderen Worten, wenn der Client nur 200 ms in die Zukunft prognostizieren muss, senden Sie nur Informationen zu unsichtbaren Spielern innerhalb von max_player_velocity units/sec * 1/5 secEinheiten entfernt.

R ..
quelle
Ich denke, das könnte funktionieren, aber mein Spiel basiert auf Kacheln (vergessen zu sagen).
affiszervmention
Decken Sie unsichtbare Spieler daher nur auf benachbarten Feldern oder in 2 Schritten Entfernung auf oder was auch immer.
R ..
dann ist es nicht sicher, ob sie kollidieren würden und unsichtbare Spieler müssten sich von jedem fernhalten, der hackt, um nicht entdeckt zu werden
affiszervmention