PawnBasics + Reallife Gamemode erstellen

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
  • Hier gehts nun mit dem 2.Teil weiter,


    also wenn alles Glatt gelaufen ist müsstet ihr irgendwo in LV(eher südlich) Spawnen...
    Am besten ihr minimiert das Spiel und wendet euch wieder Pawno zu.
    Da wir ja ein RL machen ist ein Login Register unverzichtbar, daher wenden wir uns dem nun!



    Zurerst brauchen wir ein paar Daten für die Account´s, die wir ja später speichern wollen, diese schreiben wir ganz oben hin
    (unter #include :(


    enum spieler_info{ Passwort, Level, Geld, bool:Logged }



    Nun braucht das Ganze noch ein Array, welche wir unter das "enum" schreiben(Erklärung unten):


    new Spieler[MAX_PLAYERS][spieler_info];



    Was haben wir eigentlich gerade gemacht?
    Ganz einfach, ihr müsst euch Array´s wie Tabellen vorstellen, die Tabelle ist so Breit wie die maximal gleichzeitig verbundenen
    Spieler und so Hoch wie die Anzahl der Daten die wir im Enum angegeben haben,
    d.h. Jeder Spieler hat unabhängig von den anderen Spielern Zahlen, denen wir oben Bezeichnungen hinzugefügt haben, diese Zahlen sind beim Serverstart 0. Diese werden erst beim Login oder während des Spiels geändert(z.B. wenn jemand sich ein neues Level kauft).


    Wir könnten nun jede dieser Nullen auf einen beliebigen Wert ändern,
    zB.: das Level von Spieler 3 könnten wir so auf 8 ändern:


    Spieler[3][Level] = 8;


    Gut, damit haben wir die Grundlagen gelegt!
    Nun kommt ein schwerer Teil, wer das bisher nich verstanden hat wird es sehr schwer haben!


    Was wenn ein Spieler nun einmal unseren Server besucht?
    Er wird nur ein kleines Menü zur Skinwahl vorfinden, wenn er Spawn drückt landet er in LV und das jedes mal...
    Das muss sich ändern!


    Sucht nun einmal "public OnPlayerConnect(playerid)", die die in Englisch aufgepasst haben werden nun recht schnell merken was das heißen soll,
    für die anderen: "Wenn Spieler verbindet".
    Was müsste man nun als Mensch an einem Schreibtisch nachsehen?
    Natürlich, ob man den Spieler bereits kennt, und das geht so:


    Das muss über das return 1; und unter die geschwungene Klammer({).
    new string[68];


    Hier erstellen wir eine neue Variable(string = Textvariable), diese Variable können wir nun beschreiben,


    bevor wir sie beschreiben können muss aber noch eine andere Information her, der Spielername!
    Dazu müssen wir eine weitere Textvariable erstellen, diese nennen wir "pname".
    new pname[MAX_PLAYER_NAME];


    Warum eigentlich jetzt MAX_PLAYER_NAME und nicht 64?
    Weil diese Zahl gibt die Länge des Strings an, da uns hier Kye(er hat SAMP entwickelt) geholfen hat indem er die maximale Länge des Spielernamens gegeben hat,
    brauchen wir das nichtmehr anzugeben!


    Nun müssen wir die Textvariable(pname) noch beschreiben, das heißt wir brauchen eine zusätzliche Funktion(GetPlayerName).
    GetPlayerName(playerid,pname, sizeof pname);
    Hier steht 1. die SpielerID die grade eben verbunden hat, 2. die zu beschreibende Variable und 3. die Größe der Variable.


    ^ :thumbup: Klasse Internet, oder? :thumbup: ^

    6 Mal editiert, zuletzt von LaT3St ()

  • Wir haben nun also 2 Textvariablen und eines ist der Name des Spielers der verbunden hat...
    Eigentlich ganz simpel, nun wird es aber etwas schwerer:


    format(string, sizeof string, "%s.ini", pname);


    Hier gilt wieder: Wer (vorallem Englisch) lesen kann ist klar im Vorteil, denn format heißt soviel wie
    "formulieren", in jedem Fall gilt: Alles was in Klammern geschrieben ist sind Parameter, Parameter sind wie
    Variablen sie übergeben Bestimmte Daten und Werte an eine Funktion die dann diese Werte verarbeitet und im Normalfall etwas zurückgibt,
    in diesem Fall den formulierten String(Textvariable)...
    "format" braucht mindestens 3 Parameter, die zu beschreibende Variable, die Größe der zu beschreibenden Variable und ein Text,
    zusätzlich kann man noch Parameter wie in unserem Fall den Spielernamen angeben,
    diese muss man dann in der richtigen Reihenfolge mit z.B. %s und %d im Text angeben(bei uns "%s.ini")!


    if(fexist(string))
    Endlich, unsere erste Abfrage! Mit if lässt sich sogut wie alles abfragen von gleichen Zahlen oder verschieden große Zahlen und sogar Texte!
    Was wir nun Abfragen ist ob wir den Spieler kennen, wir erinnern uns an unseren Schreibtisch! Nun gibt es ein Problem welches die logischen Denker unter euch schon entdeckt haben werden,
    wo ist der 2.te Wert? Wenn ich nur eine Funktion angebe wird als Vergleichswert 0 genommen. Das hat Vorteile und auch Nachteile, Vorteilhaft währen weniger schreibarbeit und weniger Code,
    Nachteile gibt es auch genug, z.B. unübersichtlichkeit...
    Wenn wir nun einen Wahr oder Falsch-Wert zurückbekommen haben, was sollen wir dann damit anfangen, und wie?
    Da wir ja abgefragt haben ob der Account schon vorhanden ist(wir also eine Akte in unserer Schreibtischschublade über diesen Spieler haben) brauchen wir in ja nur nach einem vorgegeben Text(einem Passwort) zu fragen...
    Dazu machen wir eine geschwungene Klammer( { } ) auf und schließen diese in der nächsten Zeile auch gleich wieder!
    Nun können wir anfangen einzutragen, zuerst soll eine Meldung ausgegeben werden:


    -Meldung
    SendClientMessage(playerid, 0xFFFFFFFF, "Hallo du bist bereits bei uns Registriert, bitte gib dein Passwort nun im Chat ein!");
    Als erstes sehen wir "playerid", diese Variable kennen wir ja bereits,
    dann wäre da dieses "0xFFFFFFFF", das ist die Farbe in der der Text angezeigt werden soll.
    In diesem Fall habe ich die Farbe Weiß gewählt,diese können wir naher wieder ändern(das wird später behandelt).


    -Kamera ändern
    Natürlich soll der Spieler ein schönes Panoramabild sehen, dafür suchen wir die Funktion "OnPlayerRequestClass".
    hier löscht ihr nun alles was in den geschwungenen Klammern steht, damit die Kamera nichtmehr versetzt wird.
    Das "return 1;" muss natürlich bleiben!


    Nun können wir das ganze schonmal testen!


    Was haben wir nun alles?
    Da wäre ein erklärendes Kommentar und ein Panorama...
    Nun benötigen wir eine Funktion die die Passworteingabe abgfragt...
    Dazu scrollen wir wieder ganz nach oben zum Spielerarray,
    da drunter tragen wir nun folgendes ein:


    new bool:pWaitForPW[MAX_PLAYERS];


    Wie ihr meinem ersten Teil entnehmen könnt, wird hier eine Tabelle(Array) erstellt welche Platz für einen Ja/Nein-Wert pro Spieler hat,
    heißt wir könnten das nun mit true oder false belegen, es ist standartmäßig auf false, was für uns so auch ok wäre.
    Nun begeben wir uns wieder zum OnPlayerConnect, dort tragen wir nun in der If-Abfrage ein das die grade eben erstellte Variable beim verbinden auf "true" gesetzt wird,
    das machen wir so:
    pWaitForPW[playerid] = true;
    Diese Zeile erklärt sich wahrscheinlich von selbst.
    Was brauchen wir dann?
    Nun jetzt brauchen wir einen Code der eine Datei ausliest und diese mit der Eingabe vergleicht,
    dazu Kopieren wir uns das geschriebene von "new string[68];" bis "format(string, sizeof string, "%s.ini", pname);", wir errinnern uns, das gibt uns den Dateinamen und die Endung der Datei.
    Das kopieren wir nun in das "OnPlayerText", das hat den Sinn das wir nun auch da Dateien abfragen können...
    Nun was soll passieren?
    Zuerst soll abgefragt werden ob der Spieler überhaupt ein PW eingeben soll, dazu wenden wir die kürzlich gelernte If-Abfrage an.
    if(pWaitForPW[playerid] == true)
    Wie voher schon, die geschwungenen Klammern nicht vergessen!


    NICHT KOMMENTIEREN, da kommt noch was!


    ^ :thumbup: Klasse Internet, oder? :thumbup: ^

    4 Mal editiert, zuletzt von LaT3St ()