Anti Cheat APIs
-
@Code-Walker:
zweimal sehrwohl korrekt. Es gibt Gründe warum man gewisse Daten an den Spieler senden MUSS.Wenn der Client ein leises Geräusch spielen will wenn hinter mir jmd. rumläuft, dann muss er wissen dass hinter mir jmd. rumläuft. Natürlich könntest du sagen egal, soll halt der Server bloss schicken "spiel Sound 42 mit Lautstärke 3 und Vektor soundso". Gut, dann kann ich mir aber wieder genau diese Daten visualisieren lassen - alleine der Vektor kann mir schon viel mehr bringen als das Geräusch, welches ich trotz tollem 3D Sound halt nicht SO gut zuordnen kann.
Was den Sichtbarkeits-Test angeht: das möchte ich erstmal sehen. Wenn man sich alles recht einfach macht, bloss indoor, ne shöne Portal-Engine, ja, dann ginge vielleicht noch einiges. Aber sobald es outdoor ist wird das occlusion-culling schonmal sehr aufwändig. (EDIT: vor allem wenn bewegte Objekte dazukommen wo man nixmehr "vorrechnen" kann /EDIT) Oder was ist mit irgendwelchen reflektierenden Gegenständen? Willst du für die auch Serverseitig berechnen was nötig ist um die Reflektion korrekt darstellen zu können? Also ob Spieler X der gerade hinter mir steht in der Reflektion auf Objekt Y (welches ich sehen kann) gerade sichtbar ist?
Oder was ist mit Stellen wo man vielleicht wirklich ein paar Pixel eines Gegners durch irgendwelche Gräser/Bäume/Spalten in Türen/ganz was anderes durchscheinen sieht? Dann *muss* die Position des Gegners am Client bekannt sein, und dieser wird wohl nicht drum herumkommen das Problem mit der Sichtbarkeit einfach so zu lösen indem er den ganzen Gegner einfach rendert, und den Rest der Grafikkarte und deren Z-Buffer überlässt. Und dann bringen diverse Tricks die man mit dem Grafikkarten-Treiber, der D3D DLL oder sonstwas hinbasteln kann auf einmal recht viel.
Nochmal was die Sichtbarkeit angeht: wie fändest du es wenn du ne schnelle Drehung machst, und dann erst vielleicht 100-200ms später ein Gegner irgendwo "aufpoppt" weil der Client einfach vorher noch nicht wusste dass es den überhaupt gibt? Hm. Nicht so toll wenn du mich fragst. Also musst du auch hier Objekte an den Client senden die er noch nicht sehen kann, damit das bei schnellen Bewegungen/Drehungen so aussieht wie es aussehen sollte.
Alles in allem denke ich du stellst dir das recht einfach vor. Zu einfach.
-
Wie gesagt, damit habe ich mich noch nicht richtig beschäftigt, bei einem Spiel mit mega Grafik, reflektionen etc kann das ganze komplizierter werden. Dan noch, wenn jemand läuft, ist es schön wenn man dazu Sound einbindet, aber wenn er läuft und im höhrbereich ist, kann man ruhig die Position mitlifern, denn dann weiß der Spieler doch so wie so wo er ist, dank 3D Sound! Dafür würde dann glaubeich niemand einen cheat schreiben.
-
Ja, glaubst DU dass dafür keiner einen Cheat schreiben würde
Ich als Spieler würde es aber als grosse Hilfe empfinden wenn ich statt einem gaaaanz leisen "trapp trapp" was ich schon fast nichtmehr höre und schongarnicht feststellen kann wo es herkommt einen fetten Pfeil bzw. blinkenden Punkt auf meinem 2. Monitor habe der mit zeigt wo genau der Gegner ist.
Oder dass ich statt ein paar fast schon unbemerkbaren dunkleren/helleren Pixeln die irgendwo durchscheinen einfach die Umrisse der Figur dort sehe die sich hinter dem Busch versteckt, oder eben gleich die ganze Figur, weil der Busch auf einmal halb durchsichtig ist.
Und da fallen mir noch andere Dinge ein, z.B. könnte man diverse Unterschiede die im Original-Spiel kaum sichtbar sind deutlich hervorheben, so dass ich aus zig Metern Entfernung gleich z.B. anhand der Farbe der Spieler-Klamotten sehe was für ne Waffe er hält, und nicht an den 3x3 Pixeln die das Ding gross ist erkennen muss was es ist.
----
Ein konkretes Beispiel: bei bestimmten Versionen von America's Army checken die Server (zumindest einige) ob der Spieler die Schatten eingeschaltet hat, und kicken die die mit Schatten spielen wollen. Weil es nen Bug in einem ATI Grafikkarten-Treiber gibt, der dazu führt dass die Schatten der Spieler durch die Decke von unten sichtbar sind. Was natürlich ein komplett unfairer Vorteil für die ist die mit ATI Karten und eingeschalteten Schatten spielen.
-
Danke code-walker und hustbaer erstmal für die ausführlichen Antworten. Was ich dazu loswerden will:
Was meinen speziellen Fall angeht, so wird das kein MMORPG (das Probleme mit Unmengen von KeyStrokes bekommen würde) und auch kein Ego-Shooter (der Probleme mit Sichtbarkeitsanalyse bekommen würde).
Generell würde ich da gerne unterscheiden zwischen indirektem (Der Cheater verschafft sich einen Vorteil, der aber von anderen Spielern nicht eindeutig indentifiziert werden kann - z.B. verbesserte Sicht und andere Clientseitige Änderungen) und direktem Cheaten(Gezielte Fehlinformationen an den Server, die in der Regel direkt von anderen erkannt werden können - Falsche Highscores, senden falscher Positionen etc.).
Indirektes Cheaten kann man ohnehin nicht verhindern, denke ich. Sie findet schließlich clientseitig statt und nach allem was ich weiß, gibt es mittlerweile Software(Decompiler), die einem mehr oder weniger den Quellcode von Programmen liefern kann. Wenn jemand den Quellcode kennt, kann er den Clienten ohnehin nach Belieben ändern.
Indirektes Cheaten im Multiplayer halte ich für weit weniger problematisch als direktes. Nach dem Motto “was ich nicht weiß, macht mich nicht heiß”, denke ich, würden andere Spieler den Unterschied ohnehin nicht feststellen. Sie könnten maximal erahnen dass jemand soetwas macht. Beweisen können sie es nicht, da schließlich der Datenverkehr zwischen Server und Client gleich bleibt. Sicherlich wäre es schön auch soetwas beheben zu können, aber ich glaube da beißt man sich die Zähne dran aus.Direktes Cheaten hingegen sollte rein theoretisch vermeidbar sein, wenn man von einem unverändertem Programm auf Serverseite ausgeht. Da es ohnehin viel drastischere Möglichkeiten der Manipulation des Spielgeschehens bietet, würde ich hier ohnehin das größte Problem sehen. Senden von Keystrokes ist sicherlich eine gute Idee, wenn die Spielerzahlen im überschaubaren Rahmen bleiben bzw. die Rechenleistung des Servers stimmt. Hier stellt sich bloß die Frage was bei Differenzen im Resultat der Keystrokes zwischen Client und Server zu tun ist, bzw. Wie man solche Differenzen überhaupt aufdeckt. Mein Gedanke hierzu war:
Angenommen der Spieler muss W drücken um vorwärts zu laufen. Der Spieler befindet sich bei position 0. Der Spieler drückt und hält W. Folgendes passiert:
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = speed; ServerPos= 0;}
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 2xspeed; ServerPos=0;}
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 3xspeed; ServerPos= speed;} // diesmal gab es also 2 frames Delay
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 4xspeed; ServerPos= 2xspeed;} // diesmal gab es wieder 2 frames Delay
Jetzt lässt der Spieler W los, da alle Pakete per UDP geschickt wurden, gehen die letzten verloren(packet loss), Endresultat ist, dass der Spieler auf dem Client auf Position 4xspeed steht und beim Server nur auf 2xspeed. Der Spieler hat hier nicht gecheatet. Dennoch sind die Reultate nicht deckungsgleich. Wie bereits erwähnt, kommt dann noch Kollision mit anderen Spielern dazu die Clientseitig und Serverseitig durch Verzögerung verschiedene Positionen haben. Und wenn noch ein paar Pakete verloren gehen werden die Differenzen natürlich größer.
Das per TCP zu lösen ist Quatsch, weil es eine zu große Latenz ins Spiel bringt. Was man machen könnte ist die Latenz zu begrenzen, sprich: man darf maximal einen 400er ping haben und außerdem regelmäßig vom Server Positionsupdates zu schicken und denSpieler auf dem Client, falls die Differenz zu groß ist, zurechtzurücken. Denke aber, dass so würde jede Menge Geruckel entstehen würde. Wie würde man mit diesem Problem am besten umgehen?Zu den Highscores. Das ist immernoch ein großes Problem. Vorallem, wenn das Spiel im Singleplayer gespielt wird und am Ende Ergebisse ausgetauscht werden sollen.
Die Idee ein Singleplayerspiel tatsächlich im Multiplayer zu spielen halte ich für weniger gut. Multiplayerspiele finden auf mehreren unterschiedlichen Servern statt(auch Listen Server), Singleplayerspiele müssten auf einen einzigen Server zugreifen. Wenn dieser Server dann 1000 Spiele oder mehr gleichzeitig “spielt” zwingt das jeden Rechner in die Knie. Natürlich könnte man die Last aufteilen, aber das geht dann auf den Geldbeutel - vorallem, wenn es ein Freegame wird.
Wie bereits gesagt kann man verschlüsseln. Die Verschlüsselung müsste dann upgedated werden. Ich frage mich gerade, ob mein Professor an der Uni nicht mal dazu was erzählt hatte (hätte ich mal besser aufpassen sollen). Muss ich nochmal die Geschichten von Alice und Bob durchgehen, ob da was Brauchbares bei war. Den Aufwand ständig Client und Serverupdates für die Verschlüsselung zu machen halte ich für ein Freegame wie für nicht vertretbar. Irgendwann will man ja auch mal ein Update zum eigentlichen Spiel machen. Mathegenies? Ideen?Gruß
cman