Zuerst muss man überlegen was man überhaupt alles braucht. Das währe in diesem Fall folgende Sachen:
- IsPlayerInRangeOfPoint
- ShowPlayerDialog
- OnDialogResponse
- OnPlayerCommandText
- GetPlayerName
- GetPlayerState
- format
- Ein Speichersystem
Nun weist du was du alles für dieses System brauchst. Ich zeige hier zwei Beispiele, einmal mit PVars und einmal, falls du eine Variable für deine Spielerinfos benutzt, die Methode mit dem enum. Kommt halt darauf an wie dein Login und Register System aussieht.
Beginnen wir nun erstmal mit der vorarbeit die wir benötigen um dieses System reibungslos zu erstellen. Zuerst erstellen wir einen Dialog, dazu kommt dann noch (falls du deine Daten in einem Enum speicherst) die Erstellung von einer neuen Info. Ich werde dir das hier nur an einem Schein zeigen, der Rest wird genauso gemacht wie ich nun erklären werde. Erstellen wir nun diese Sachen.
//Dialog
#define DIALOG_SCHEINE ID //Bei ID einfach eine Zahl angeben die es noch nicht gibt in der Dialog Definierung. Eine Überschneidung der ID´s führt dazu das dass System nicht klappt.
//Im Enum
enum Bezeichnung
{
Autoschein
}
Nun haben wir den Dialog sowie die neue Variable die wir für den Autoschein benutzen. Haben wir das gemacht können wir dann, falls du diese Variante mit dem enum hast, mit der Variable die die Spielerinfos abfragt den Schein später setzen / erfragen lassen.
Kommen wir nun zu dem Befehl, denn sonst können wir ja den Dialog den wir oben definiert haben nicht anzeigen lassen. Dazu gehen wir in dem Public OnPlayerCommandText und erstellen uns erstmal das Grundgerüst eines jeden Befehls.
if(strcmp(cmdtext,"/befehl",true) == 0)
{
return 1;
}
Das Grundgerüst steht und nun können wir mit der Abfrage der Position weiter machen. Um eine Position herauszufinden gehst du Ingame an eine Stelle und tippst dann in den Chat '/save Bezeichnung'. Mit diesem Befehl speicherst du die aktuelle Position des Spielers in einer .txt Datei die du im folgendem Verzeichnis findest. "Start --> Dokumente ---> GTA San Andreas User Files ---> SAMP ---> saveposition.txt". Dort findest du alle gespeicherten Koordinaten. Wenn du in der Datei bist siehst du dann eine Zeile die mit AddPlayerClass beginnt. Ganz am ende, also an der letzten Klammer, ist die Bezeichnung die du zuvor in dem Save Command eingegeben hast. Das dient dazu die Position wiederzufinden falls man mehrere Positionen auf einmal speichern will. Nun gut, da nun dort AddPlayerClass steht sind dort auch viele Daten vorhanden. Wir brauche nur drei davon. Die X, Y und Z Koordinate. Diese befindet sich hier:
AddPlayerClass(skin, --->Float:x, Float:y, Float:z <---, Float:Angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo)
Wir brauchen nur diese drei Koordinaten um die Abfrage mit IsPlayerInRangeOfPoint bilden zu können. Wir kopieren uns also diese Koordinaten raus und erstellen in dem zuvor angelegtem Befehl die IsPlayerInRangeOfPoint abfrage.
if(strcmp(cmdtext,"/befehl",true) == 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,Float:X,Float:Y,Float:Z))
{
}
else SendClientMessage(playerid,-1,"Du bist nicht am Schalter in der Stadthalle!");
return 1;
}
Was mache ich jetzt da? Ich Frage mit der Funktion IsPlayerInRangeOfPoint ab, ob sich der Spieler, der diesen Befehl gerade anwendet, in einem Radius von 5.0 Meter der Position wo du angegeben hast befindet. Sollte das nicht der Fall sein so wird die Message bei "else" ausgegeben, denn "else" bedeutet ins Deutsche Übersetzt "sonst". Also wenn die Bedingung in der if Abfrage nicht eingehalten wurde/wird, dann wird die Message ausgegeben.
So die Abfrage steht, die Koordinaten sitzen. Kommen wir nun zum Dialog. Diesen erzeugen wir mit ShowPlayerDialog. Schauen wir uns erstmal an wie ShowPlayerDialog aufgebaut ist:
ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]);
Wir haben da einmal die playerid, also die ID der der Dialog angezeigt werden soll. Zweitens haben wir die Dialog ID, also die ID die wir oben definiert haben. Drittens haben wir den Style, mit dem Style sagen wir wie der Dialog aussehen soll. Eine Übersicht über die Styles findest du hier: http://wiki.sa-mp.com/wiki/Dialog_Styles. Zum Schluss bleiben dann noch caption (Überschrift), Info (Der Inhalt des Dialogs), Button 1 und der Button 2. Passen wir diese Funktion nun an unser System an. Das was jetzt folgt kommt in diese Abfrage der Distanz rein.
ShowPlayerDialog(playerid,DIALOG_SCHEINE,DIALOG_STYLE_LIST,"Scheine","1. Autoschein","Auswählen","Abbrechen");
Hier noch eine kleine Anmerkung. Du kannst mit \n eine neue Zeile anfangen bzw. ein neues Listitem anfangen, so kannst du dann ganz bequem den Dialog um mehrere Scheine erweitern.
Nun haben wir folgendes. 1. Haben wir den Befehl. 2. Haben wir die Abfrage ob der Spieler an eine bestimmten Position ist wenn er den Befehl eingibt und 3. haben wir dann falls der Spieler an der richtigen Position steht einen Dialog der angezeigt wird. Die Hälfte ist geschafft, widmen wir uns nun der anderen Hälfte zu, zu der wo wir den Schein vergeben, speichern und laden lassen. Kommen wir aber zuerst zu dem vergeben. Ich habe schon oben geschrieben das ich dir beide Varianten zeigen werde, einmal die mit PVars und einmal die, falls du ein enum für deine Daten hast, die Variante mit dem enum. Kommen wir zuerst zu der Variante mit den PVars. Um nun dem Dialog eine Funktion zuzuweisen müssen wir in den Public OnDialogResponse gehen und dort folgende Abfrage erstellen
if(dialogid == DIALOG_SCHEINE)
{
if(response)
{
}
}
Wir fragen in der ersten if Bedingung ab ob es sich um den Dialog "DIALOG_SCHEINE" handelt, sollte das der Fall sein fragen wir in der zweiten if Abfrage ab ob der "Auswählen" Button betätigt wurde. Sollte dieser nicht betätigt worden sein, so wird der Dialog dann geschlossen.
Nun kommen wir zu der Abfrage der einzelnen listitems. Diese Abfrage kommt in die if(response) Abfrage rein.
if(listitem == 0)
{
}
Hier fragen wir ab ob das erste listitem ausgewählt wurde. Hier kannst du das auch ganz leicht ergänzen falls du mehrere Scheine rein machst.
Steht die Abfrage können wir nun, falls keine anderen Aktionen gefordert sind, den Schein dem Spieler übergeben. Dazu brauchen wir jetzt, da ich zuerst das Beispiel mit den PVar´s zeige, SetPVarInt. Zudem lasse ich dann noch eine Message an den Player ausgeben das er den Autoschein erhalten hat.
SetPVarInt(playerid, "Autoschein", 1);
SendClientMessage(playerid,-1,"Du hast erfolgreich den Autoschein erhalten");
Wir sagen hier nun, dass die PVar "Autoschein" 1 bei dem Spieler sein soll, somit hat dann der User den Führerschein. Das bringt uns nun etwas wenig da die PVar´s automatisch beim Disconnect des Spielers gelöscht werden. Das ist nicht vorteilhaft da ja der einzelne Spieler nicht immer und immer wieder den Autoschein bzw. den jeweiligen Schein holen will. Das heißt wir müssen nun in die Spielerdatei des Spielers reinspeichern, dass der User einen Autoschein erworben hat. Den Pfad den ich gleich angeben werde musst du eventuell selbst setzen da ich nicht weiß ob du die Dateien in dem Ordner speicherst. Das was jetzt folgt kommt unter das mit dem SetPVarInt.
new Spielerdatei[64],sName[MAX_PLAYER_NAME];
GetPlayerName(playerid,sName,sizeof(sName));
format(Spielerdatei,sizeof(Spielerdatei),"Accounts/%s.txt",sName);
dini_IntSet(Spielerdatei,"Autoschein",1);
Was mache ich hier jetzt genau? Ich frage mit GetPlayerName den Namen des Spielers ab, das ist wichtig für den zweiten Schritt. Denn dort gebe ich den Pfad zu der Accountdatei an, da die Accountdateien ja nicht gleich heißen müssen wir den Namen des Spielers zuvor mit GetPlayerName herausfinden und einsetzen. Das einsetzen geschieht in dem format.
Dann lasse ich zum Schluss mit dini_IntSet in die oben angegebene Accountdatei in die Zeile "Autoschein" den Wert 1 schreiben. Falls die Zeile noch nicht vorhanden ist wird diese automatisch erstellt. Nun haben wir in die Accoundatei eingespeichert das der Spieler den Autoschein besitzt. Kommen wir nun zu dem Laden des ganzen. Es bringt ja wenig das ganze einzupeichern und dann nicht zu laden. Nun gut, dazu müssen wir in deine Ladefunktion sofern vorhanden. Dort machen wir dann folgendes:
SetPVarInt(playerid, "Autoschein", dini_Int(Spielerdate,"Autoschein");
In diesem Schritt sagen wir das auf die PVar "Autoschein" der Wert gesetzt werden soll der sich in der Spielerdatei in der Zeile "Autoschein" befindet. Soviel zum Laden und Speichern und zu den PVar´s. Ich zeige dir nun, ohne Erklärung da ich diese schon oben gegeben habe, wie man das macht wenn man ein enum bzw. eine Variable für seine Info´s hat. Das machen wir nun so im Dialog und ebenfalls in der Abfrage von dem Listitem.
VariablenName[playerid][Autoschein] = 1;
new Spielerdatei[64],sName[MAX_PLAYER_NAME];
GetPlayerName(playerid,sName,sizeof(sName));
format(Spielerdatei,sizeof(Spielerdatei),"Accounts/%s.txt",sName);
dini_IntSet(Spielerdatei,"Autoschein",1);
Und beim laden dann halt so:
VariablenName[playerid][Autoschein] = dini_Int(Spielerdatei,"Autoschein");
Jetzt kommen wir noch zu dem Teil mit der Abfrabe ob der Spieler einen Schein hat wenn er das jeweilige Fahrzeug betritt. Dazu muss man aber zuerst eine Abfrage haben ob es sich hierbei um ein Auto oder um ein Flugzeug oder sonstwas handelt. Dazu empfehle ich das uf.inc, denn dort wurde das schon gemacht. Man braucht also nur noch die Abfrage erstellen. Das machen wir bei OnPlayerEnterVehicle. Dieses Include kann man hier downloaden: http://www.mediafire.com/download/b74ixr65o4ff32a/uf.inc
So haben wir das nun gedownloadet und includiert können wir auch gleich die Abfrage in dem Public OnPlayerEnterVehicle machen, davor müssen wir aber erst abfragen ob der Spieler der Fahrer ist, sollte der Spieler nicht der Fahrer sein ist es ja nicht so toll wenn man nicht einsteigen kann. Das fragen wir mit GetPlayerState ab.
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
}
Somit fragen wir ab ob der Spieler der Fahrer des Autos ist wenn er einsteigt. Die ganzen Playerstates kannst du hier nachlesen: http://wiki.sa-mp.com/wiki/State
So jetzt können wir abfragen ob es sich 1. um ein Auto handelt (IsPlayerInCar(playerid)) und 2. ob er den Autoschein hat. Man kann natürlich auch, wenn man mehrere Scheine wie z. B. Motoradschein hat etc. auch diese abfragen.
IsPlayerInQuad(playerid);
IsPlayerInPlane(playerid);
IsPlayerInMonsterTruck(playerid);
IsPlayerInHelicopter(playerid);
IsPlayerInBoat(playerid);
IsPlayerOnBicycle(playerid);
IsPlayerOnBike(playerid);
So dann bilden wir jetzt mal die Abfrage, diese kommt in die Abfrage ob es sich um den Fahrersitz handelt.
//Mit PVar
if(IsPlayerInCar(playerid) && GetPVarInt(playerid, "Autoschein") == 0)
{
//Das Was passieren soll wenn er nicht den Autoschein hat
}
//Ohne PVar
if(IsPlayerInCar(playerid) && VariablenName[playerid][Autoschein] == 0)
{
//Das Was passieren soll wenn er nicht den Autoschein hat
}
Bei MySQL ist es eigentlich recht gleich, mann muss halt das mit dem Speichern und laden anpassen. Da ich ja nicht weiß wie ihr bei euch das mit der MySQL Speicherung gemacht habt, werde ich hier kein Beispiel dafür machen. Ich sag nur soviel das mann das Speichern und Laden der Scheine anpassen muss. Der Rest bleibt soweit gleich.
Und so macht man ein Lizenzen System für die einzelnen Fahrzeuge, hier habe ich das jetzt nur mal am Autoschein gezeigt. Die anderen scheine lassen sich aber genauso erstellen.
Dann wünsche ich mal viel Spaß beim ausprobieren und weiterentwickeln.