There is no translation but we are working on it! Please ask us for support!
Das Einbinden eines Gameplugins setzt als allererstes gute und gründliche Recherche im Internet voraus. Es muss nämlich als erstes eine Dokumentation über das jeweilige Spiel gefunden werden. Im Falle von GrandPrix 3+4, dessen Quellcode ich hier veröffentliche, war es ein angagierter Spieler, der eine Plattform zur Datenübermittlung geschrieben hat. Diese Plattformen sind meist kleine Hackerprogramme die Werte aus dem Spielspeicher direkt auslesen. Über die Schnittstelle dieser Hackerprogramme wird dann eine Verbindung zum Plugin erreicht, welches wiederum die Daten an den Force-Sender weitergibt. Das klingt nun ziemlich kompliziert, dient aber zu richtigen Datenkonvertierung zwischen Spiel und dem Force Sender.
Das Force-Sender Plugin besteht eigentlich nur aus einem Empfangsteil, dem Namensteil und einem kleinem Start und Stoppteil.
Der Empfangsteil ist das schwierigste, da jedes Spiel anderst seine Daten preisgibt. Im Falle von GrandPrix geschieht dies mit einem kleinem Tool eines Spielemodders, bei X-Plane über Netzwerkempfang und bei rFactor über eine eigene Schnittstelle des Herstellers. Im Falle von rFactor sind die Beschreibungen recht einfach zu implementieren, beim Zerlegen von Netzwerkpacketen geht dabei schon die eine oder andere Stund / Tag verloren. Man sollte also recht gut mit Fremdcode umgehen können um sich an ein solches Projekt zu wagen.
Ein wesentlich einfacher Weg ist es noch einen zusätzlichen Zwischenschritt zu vollziehen und eine kleine Applikation mit den gewünschten Werten zu erzeugen. Dies sind bei mir im Pluginverzeichnis alle "outsim" .exe Programme. Dabei habe ich einfach, wie im Visualisierungs Interface Tutorial beschrieben, eine Applikation erstellt und versucht den Fremdcode des jeweiligen Spieles anzuzapfen. Dieser Applikation kann man dann eine IPC (=Inter Process Comunication) Schnittstelle verpassen. Dies ist ein kleiner Code, der schnell Variablen mit dem Plugin austauschen kann. Dabei werden die Variablen in beiden Prozessen immer automatisch abgeglichen, sodass beide die gleichen Werte haben. Eine gute IPC Schnitstelle findet sich auf der CodeProject Seite: http://www.codeproject.com/threads/csharedstruct.asp Man erzeugt also eine kleine MFC oder .Net Applikation, bindet die CSharedStruct.h in das Plugin Project und in die besagte Applikation ein und kann die Daten 1:1 weitergeben. Im Plugin selbst kann wie in einer DLL üblich im Attach und Detach Bereich die Applikation dann sogar automatisch mit dem Plugin gestartet werden.
Zum Plugin Quellcode: Er ist recht primitiv gehalten. Sonderbefehle wie cpy etc. habe ich durch for-next Schleifen ersetzt, um dem Einsteiger eine einfache Übersicht zu geben. Wichtig ist, das die Längen der jeweiligen Texte zu Effekten und Spielnamen EXACT eingehalten werden. Der verbleibende Platz muss mit Leerzeichen aufgefüllt werden.
Für Variablen verwendet man einen shared -memory Bereich, der sicherstellt, das bei einem Funktionsaufruf der Plugin DLL die neu erzeugten Funktionen dieselben beschriebenen Variablen verwendet werden.
#pragma data_seg ("sharedGPxPatch") int oldspeed=0; //Alte Geschwindigkeit int accelcounter=0; //Counter um die Abfragezeit künstlich zu vergrößern int acceleration=0; //aktuelle Beschleunigung bool started=false; //Flag, ob init ausgeführt wurde int oldgear=0; //altes Getriebe int gearcounter=0; //gear Effekt steht solange auf errechneten Wert int oldgeareffekt=0; //Geareffekt, der während des Counters verwendet wird. DWORD oldtime; #pragma data_seg() #pragma comment(linker,"/SECTION:sharedGPxPatch,RWS")
Dies eignet sich für nachträgliche Berrechnungen für Geareffekte und Beschleunigungen in G (9,8 m/s²). Ebenfalls solltet ihr die Werte aufziehen. Die Kräfte gehen meist nur bis 1G, was bedeutet, das 0,9 G in integer nur als 0 dargestellt werden. Diese Werte müssen also z.B. *1000 genommen werden. Je größer die Werte sind, je genauer kann der Force-Profiler dannach fahren. Mit 0-900 lässt sich also etwas anfangen, es spricht aber nichts gegen 0-9000.
Die folgenden Zeilen dürfen nicht verändert werden, sie dienen dem Force -Sender als Erkennung, das es sich um ein Sender-Plugin handelt:
DllInfo dllinfo; char* type; type="SenderPlug"; for(int z=0; z < 10; z++){dllinfo.type[z]=type[z];}
Dagegen wird in der folgenden Zeile eine 10 Zeichen Kurzinfo angegeben, diese befindet sich später im Force-Sender Menü. Es ist also der Menüeintrag selbst.
char* name; name="GrandPrix "; for(int z=0; z < 10; z++){dllinfo.name[z]=name[z];} dllinfo.name[10]= 0;
Es folgt eine ausführlichere Beschreibung für den Plugin Assistenten vom Force-Sender. Dort werden dann auch die ganzen Texte der einzelnen Werte angezeigt. Gebt bitte Ausführliche Infos an dieser Stelle. Es sollten auch manuell errechnete Werte dementsprechend markiert werden. (z.B. mit "calc value xy")
// Name des Plugins, darf genau 50 Zeichen lang sein !! name="Grand Prix 3 und 4 Plugin aufgebaut auf GPxPatch "; for(int z=0; z < 50; z++){getinfo.pluginname[z]=name[z];} // Names der einzelnen Effekte, wie sie unten in das array übergeben werden // Beschreibungen dürfen genau 30 Zeichen lang sein char* description1 ="Effekt 21: Geschwindigkeit "; char* description2 ="Effekt 22: Acceleration "; char* description3 ="Effekt 23: Current Gear "; char* description4 ="Effekt 24: Gear switch Rumple "; char* description5 ="Effekt 25: VIBE Speed "; char* description6 ="Effekt 26: VIBE Speed X ";
Hat man diese Dateneingabe abgeschlossen, sollte noch im Projekt die dll info abgeändert werden (meinplugin.dll Version 1.1)
Im der Funktion GetDataArray(int number) folgt nun die eigentliche Übergabe. Der Buffer wird gefüllt und dann als Datenpacket weitergegeben. An dieser Stelle lassen sich dann noch wie im Source gezeigt einige Berrechnung einbauen.
Das wäre dann auch schon alles ....
Viel Spass beim erkunden !
|