Self Liezen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Mal so ne frage am rande du hast in deinem Profil eingetragen das du aus Gelsenkirchen nrw kommst aber wie kann es sein das du so grottig schlwcht Deutsch schreibst und ixh denke keiner hat verstanden was du jetzt von uns willst.
    Mfg.
    Luis


    //edit: Frage selbst beantwortet laut Profil 13 schätze ihn auf noch jünger

  • Zuerst musst du überlegen was du eigentlich brauchst. Das währe in diesem Fall folgende Sachen:
    lukas1177:


    Nun weist du was du alles für dieses System brauchst. Ich zeige dir 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");


    So, da hast du es erklärt wie man sowas macht. Auf ein gutes Gelingen.