Beiträge von maddin

    Bevor gleich jmd meckert weil die strings zu klein sind ^^:
    public OnPlayerConnect(playerid)
    {
    new pname[MAX_PLAYER_NAME], string[27 + MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string, sizeof(string), "%s hat sich gerade eingeloggt", pname);
    SendClientMessageToAll(0xAAAAAAAA, string);
    return 1;
    }
    public OnPlayerDisconnect(playerid, reason)
    {
    new pname[MAX_PLAYER_NAME], string[47 + MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    switch(reason)
    {
    case 0: format(string, sizeof(string), "%s hat den Server verlassen (Verbindung verloren)", pname);
    case 1: format(string, sizeof(string), "%s hat den Server verlassen (Normal)", pname);
    case 2: format(string, sizeof(string), "%s hat den Server verlassen (Kick/Bann)", pname);
    }
    SendClientMessageToAll(0xAAAAAAAA, string);
    return 1;
    }


    Mfg.

    @Martez
    Im normalfall wird auch bei SAMP nicht zwischen Groß- und Kleinschreibung unterschieden. Sprich wenn du dir nen Account mit Martez erstellst kannst du dich auch mit MaRtEz einloggen. Sollte also, meiner meinung nach, kein Problem darstellen.


    @Denninho
    Du kannst immer nur einen Wert abfragen. Das heisst du musst, wenn du z.b X,Y und Z Position abfragen willst, drei abfragen machen. Zumal du GetFloat benutzen musst um einen Float Wert aus der Datenbank zu bekommen.
    So wäre es richtig:
    Spieler[playerid][Pos_X] = mysql_GetFloat("accounts", "XPos", "Name", Spieler[playerid][Name]);
    Spieler[playerid][Pos_Y] = mysql_GetFloat("accounts", "YPos", "Name", Spieler[playerid][Name]);
    Spieler[playerid][Pos_Z] = mysql_GetFloat("accounts", "ZPos", "Name", Spieler[playerid][Name]);


    Zitat

    error 017: undefined symbol "mysql_CheckAccount"
    error 017: undefined symbol "mysql_CheckAccount"


    Bedeutet warscheinlich das die funktion "mysql_CheckAccount" nicht existiert.


    Die anderen Fehler kommen, weil du die Variablen falsch benutzt hast.


    Spieler[playerid][pGeld] = mysql_GetInt("accounts", "geld" "Name", Spieler[playerid][name]); //1186
    Spieler[playerid][pWanted] = mysql_GetInt("accounts", "wanted" "Name", Spieler[playerid][name]);
    Spieler[playerid][bankgeld] = mysql_GetInt("accounts", "bankgeld" "Name", Spieler[playerid][name]);

    Lass dir mal die genaue stelle ausgeben wo der Server crasht. Also den Login teil per print("1"); print("2"); usw. ausgeben lassen damit du weisst ab wann der server abstürtzt. Und ggf. mal den teil hier Posten damit wir dir Helfen können.

    Versuch mal obs geht wenn du die funktion durch die hier ersetzt.
    stock Float:mysql_GetFloat(Table[], Field[], Where[], Is[])
    {
    new query[128], Float:sqlfloat;
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT %s FROM %s WHERE %s = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_float(sqlfloat);
    mysql_free_result();
    return sqlfloat;
    }


    WOOOOORDD !!


    Wenn euch das Forum nicht passt, warum geht ihr dann nicht einfach? Zwingt euch doch keiner hier zu bleiben.


    Fragen und Probleme zu verwarnungen gehören in eine PN an den betreffenden Moderator. Und sollte das nichts bringen wendet man sich eben an einen Super Moderator oder Admin um das zu klären.


    Ich weiss garnicht was ihr habt. Ich bin seid über 1 1/2 jahren registriert und habe noch keine einzige Verwarnung bekommen. Anscheind mache ich irgendwas falsch :huh:

    da Preis16 eine Zahl ist musst du %d oder %i nehmen anstatt %s.
    new string[256];
    format(string,sizeof(string)," Granate (%d)\n Molotov Cocktail \n 9mm \n Schallgedämpfte 9mm \n Desert Eagle \n Schrotflinte \n Abgesägte Schrotflinte \n Combat Schrotflinte \n Micro SMG \n SMG \n AK47 \n M4 \n Tec9 \n Country Rifle \n Sniper Rifle \n Raketen Werfer \n HS Raketen Werfer \n Flammenwerfer \n Spraydose \n Feuerlöscher \n Fallschirm",Preis16);
    ShowPlayerDialog(playerid, BUYGUN, DIALOG_STYLE_LIST, "Waffenliste", string, "Kaufen", "Abbruch") ;

    Ich mag das Navi nicht, irgendwie gefallen mir so einfache Links ohne grafiken etc nicht.
    Aber ansonsten find ichs nicht schlecht. Darf man fragen was für ein Projekt das ist? Also wofür die Seite sein soll.

    Was ich für ziemlich fragwürdig halte.
    So ein Forum ist nur wirklich attraktiv weil man dort weitestgehend anonym ist. Was durch die facebook gruppe wieder nicht möglich ist. Ich weiss, man ist ja nicht gezwungen da beizutreten.
    Wenn ich wollte das meine Freunde, verwandten, etc von meinen Problemen wissen könnte ich auch direkt mit ihnen reden und wäre nicht auf so ein Forum angewiesen.
    Aber naja ist nur meine meinung :)

    Vorerst gutes Tutorial ;)
    Ist echt gut zu gebrauchen leider brauch ich mal deine Hilfe :D
    Undzwar möchte ich gerne diesen Command an Mysql anpassen!
    Der CMD soll bewirken das die "Kills" auf 99 gesetzt werden. Mit Dini ist das ja ganz leicht :


    PlayerInfo[playerid][pKills] = 99;


    Nur wie schaut das bei Mysql aus? Vielen Dank im Vorraus!


    Eigentlich musst du an den Commands nichts ändern. Die Stats werden beim Logout gespeichert, also reicht es wenn du die Variable auf 99 Setzt. Asonsten gehts so wie LoRdCrUnChEr es gesagt hat.


    mfg.

    6. Hinweis


    Sollten irgendwelche Fehler auftreten, oder etwas nicht so funktionieren wie es sollte, empfiehlt es sich immer die eingebaut debug funktion zu verwenden.
    Um den Debug Modus ein zu schalten, schreibt ihr einfach
    mysql_debug(1);
    Unter OnGameModeInit(). Wenn das script nun irgendwelche aktionen per mysql macht, sei es abfragen, verbinden oder sonst was, wird das ganze in der datei mysql_log.txt gespeichert. Diese findet sich in eurem Server Verzeichniss, da wo auch die samp-server.exe und die server_log.txt datei liegen.
    Eine Auflistung aller Fehler Codes findet ihr Hier: Client | Sever


    7. Abschluss


    Joa das wars, ich hoffe dem ein oder anderen hat es geholfen. Solltet ihr noch fragen haben schreibt einfach hier in den Thread.
    Wer fehler findet bitte auch Melden damit ich diese Korrigiren kann.




    Wer ein Beispiel Skript Braucht:


    Die SQL-Datei (accounts.sql, database.sql):


    Nützliche Links:


    unbegrenz* = MySQL Tabellen sind nur theoretisch unbegrenz groß, aber ich halte es führ extrem unwarscheinlich das ihr irgendwann mal an eure grenzen stoßen werdet. Jeder eintrag in einer Tabelle füllt eine bestimmte Menge an speicher aus auf dem Server auf dem eure MySQL Datenbank liegt (Wir befinden uns hier in Byte dimensionen). Das heisst: Je mehr einträge in der Datenbank, desto mehr speicherplatz verbraucht sie. Seid MySQL Version 3.23 ist die maximale Tabellengröße 65.536 Terabyte (2567 – 1 Byte). Das bedeutet, dass die maximale effektive Tabellengröße von MySQL-Datenbanken normalerweise durch Beschränkungen des Betriebssystems hinsichtlich Dateigrößen festgelegt ist, nicht durch MySQL-interne Grenzen.



    Mfg.



    Edit 1: Sorry das Ich Doppel(Trippel) post machen musste, aber sind zu viele Zeichen^^ Habs aber extra mit Stijn abgesprochen.
    Edit 2: Fehler bei mysql_GetFloat behoben, danke an reLyyy der mich darauf aufmerksam gemacht hat.
    Edit 3: Beispiel Skript geupdatet. Danke an [FoR]Hardcore der mich darauf aufmerksam gemacht hat.
    Edit 4: Flaot zu Float ^^
    Edit 5: puglic zu public. Danke an Paranoid der mich darauf aufmerksam gemacht hat.
    Edit 6: Punkt 7 Hinzugefügt.
    Edit 7: Hinweis zu *unbegrenzt
    Edit 8: Tabelle im ersten post gefixxt (Wegen des neuen BBCodes)
    Edit 9: Tabelle im ersten post durch ein Bild ersetzt
    Edit 10: Code im zweiten Post & Beispiel Skript überarbeitet (siehe hier & hier). Danke an Goldkiller & Nortex.
    Edit 11: Multiupload-Links erneurt
    Edit 12: Tabelle im ersten Post gefixxt. Mal wieder ^^
    Edit 13: SQL Dateiname geändert, für die leute die schwer von begriff sind ^^
    Edit 14: Download Links aktualisiert.

    5. Der Skript Teil
    Jetzt geht es ans Skript. Also öffnen wir Pawno, erstellen ein Neues Skript und Entfernen erst mal den Filterscirpt Teil da wir ja einen Gamemode machen.
    Ganz oben ins Script kommt erst mal die include, also fügen wir unter die Zeile #include <a_samp> folgendes Hinzu:


    #include <a_mysql>
    #define SQL_HOST "127.0.0.1"
    #define SQL_USER "root"
    #define SQL_PASS ""
    #define SQL_DATA "samp_db"
    #define DIALOG_REGISTER (1)
    #define DIALOG_LOGIN (2)


    enum SpielerDaten
    {
    pName[MAX_PLAYER_NAME],
    pLevel,
    pGeld,
    pKills,
    pTode,
    Float:pHealth
    }
    new SpielerInfo[MAX_PLAYERS][SpielerDaten];


    Kurtze erklärung:
    #include <a_mysql> sollte wohl klar sein, das ist unsere mysql include die wir brauchen.
    SQL_HOST ist der host, also die IP Adresse der Datenbank auf die wir zugreifen wollen. Da wir erst mal nur mit unserem lokalen MySQL Server arbeiten schreiben wir da "127.0.0.1" rein.
    SQL_USER ist der Username der Zugriff auf die MySQL Datenbank hat. In unserem falle war das der user "root". Solltet ihr einen anderen erstellt haben müsst ihr diesen natürlich dort eintragen.
    SQL_PASS ist das Passwort das zu dem angegebenen Usernamen passt. Standardmäßig hatten wir ja kein Passwort eingestellt, weshalb wir dort nichts rein schreiben.
    SQL_DATA ist die Datenbank die wir erstellt haben. Da ich nicht weiß wie ihr eure genannt habt, nehme ich den Namen den ich ihr im Tutorial gegeben habe. Ihr müsst das natürlich entsprechend abändern.


    Die Anderen beiden defines sind unsere Dialoge die wir für den Login und das Registrieren brauchen.
    Dazu kommt noch das enum für die Spieler Daten, denn wir werden nur beim Login und Verlassen des Servers die Datenbank verändern. Alles andere wird über variablen geregelt.


    Nun geht ihr weiter zu
    public OnGameModeInit()
    und schreibt dort folgendes rein:
    Connect_To_Database();
    Diese Funktion werden wir benutzen um auf unsere Datenbank zu verbinden. Die Funktion selbst erstellen wir jetzt. Dafür Scrollt ihr ganz nach unten ins Script und fügt dort folgendes ein:
    stock Connect_To_Database()
    {
    mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS); //Wir versuchen mit den Angaben die wir oben im Script gemacht haben uns mit dem MySQL Server zu verbinden.
    if(mysql_ping() == 1) //Es wird überprüft ob die Verbindung steht.
    {
    //Falls ja wird das in die Console geschrieben und die Funktion wird beendet.
    print("<-| [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt!");
    return true;
    }
    else
    {
    //Falls nicht wird erneut versucht eine Verbindung aufzubauen.
    print("<-| [MYSQL] Es konnte keine Verbindung zur Datenbank hergestellt werden!");
    print("<-| [MYSQL] Es wird erneut versucht eine Verbindung zur Datenbank herzustellen!");
    mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    if(mysql_ping() == 1)
    {
    print("<-| [MYSQL] Es konnte im 2 Versuch eine Verbindung hergestellt werden!");
    return true;
    }
    else
    {
    //Falls das auch nicht Funktioniert wird der Server zur Sicherheit wieder heruntergefahren.
    print("<-| [MYSQL] Es konnte keine Verbindung zur Datenbank hergestellt werden!");
    print("<-| [MYSQL] Der Server wird nun beendet!");
    SendRconCommand("exit");
    return true;
    }
    }
    }


    Nun sind wir, theoretisch jedenfalls, mit der Datenbank verbunden. Aber was nun? Nun gehen wir zu
    public OnPlayerRequestClass(playerid, classid)
    Um unsere Login/Register Abfrage zu machen.
    public OnPlayerRequestClass(playerid, classid)
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 0) //Als erstes fragen wir ab ob der Spieler schon eingeloggt ist oder nicht, damit wir nicht bei jeder Skin Auswahl uns neu Einloggen müssen.
    {
    if(mysql_CheckAccount(playerid) == 0)//Wir überprüfen ob der Account Existiert, falls nicht Zeigen wir den Dialog zum Registrieren.
    {
    SendClientMessage(playerid, 0xFFFFFFFF,"________-> Willkommen auf auf meinem Server <-________");
    SendClientMessage(playerid, 0xFFFFFFFF,"Dein Account wurde nicht gefunden, bitte Registriere dich!");
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Bitte Gib ein Passwort an:","Register","Exit");
    }
    else if(mysql_CheckAccount(playerid) == 1)//Falls doch zeigen wir den Dialog zum Einloggen.
    {
    SendClientMessage(playerid, 0xFFFFFFFF,"________-> Willkommen auf auf meinem Server <-________");
    SendClientMessage(playerid, 0xFFFFFFFF,"Dein Account wurde gefunden, bitte Log dich nun ein!");
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Bitte gib dein Passwort ein:","Login","Abbrechen");
    }
    }
    return 1;
    }


    Da die Funktion mysql_CheckAccount(playerid) nicht standardmäßig existiert, werden wir diese nun auch erstellen. Dafür gehen wir wieder nach unten ins Skript, und fügen folgendes Hinzu:
    stock mysql_CheckAccount(playerid)
    {
    new Query[128],Name[MAX_PLAYER_NAME],count;
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name, Name);
    format(Query, sizeof(Query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", Name);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    return count;
    }
    Diese Funktion gibt 0 Zurück wenn kein Account mit dem Angegebenen Namen existiert, und 1 Wenn er schon existiert.


    Nun gehen wir zu OnDialogResponse um unseren Login/Register Dialog fertig zu stellen.
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_REGISTER:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Das angegebene Passwort war zu Kurz...\nBitte Registrier dich jetzt mit einem Passwort:","Register","Abbrechen");
    return 1;
    }
    else
    {
    CreateAccount(playerid, inputtext); //Account wird erstellt
    SetPVarInt(playerid,"Eingeloggt",1); //Die variable wird auf 1 gesetzt, damit wir nun die Skin Auswahl benutzen können ohne wieder nach unserem Passwort gefragt zu werden.
    SpawnPlayer(playerid); //Wir lassen den Spieler Spawnen
    return 1;
    }
    }
    else
    {
    Kick(playerid); //Wenn auf Abbrechen geklickt wurde, wird der Spieler gekickt damit man ohne Account nicht Spielen kann.
    }
    }
    case DIALOG_LOGIN:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Das Angegebene Passwort war Falsch.\nBitte log dich jetzt mit dem richtigen Passwort ein:","Login","Abbrechen");
    return 1;
    }
    else
    {
    new SpielerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, SpielerName, MAX_PLAYER_NAME);
    if(!strcmp(inputtext, mysql_ReturnPasswort(SpielerName), true)) // Wir holen uns das Passwort aus der MySQL Datenbank und überprüfen es mit dem angegebenen passwort.
    {
    SetPVarInt(playerid,"Eingeloggt",1); //Falls beide passwörter übereinstimmen wird die Variable auf 1 gesetzt damit wir die Skin auswahl benutzen können.
    LoadPlayer(playerid); //Der Spieler wird "geladen", speich es werden seine Daten aus der Datenbank geholt und in variablen gespeichert um diese im Skript zu verwenden.
    SpawnPlayer(playerid); //Wir lassen den Spieler Spawnen
    return 1;
    }
    else
    {
    //Wenn das Passwort falsch war, lassen wir erneut das Login fenster erscheinen damit der Spieler das Richtige Passwort eingibt.
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Das war das Falsche Passwort.\nBitte log dich jetzt mit dem richtigen Passwort ein:","Login","Abbrechen");
    return 1;
    }
    }
    }
    else
    {
    Kick(playerid); //Wenn auf Abbrechen geklickt wurde, wird der Spieler gekickt damit man ohne Account nicht Spielen kann.
    }
    }
    }
    return 1;
    }
    Wer jetzt versucht das ganze zu Compilen, sollte 3 Fehlermeldungen bekommen:

    Code
    undefined symbol "CreateAccount"
    undefined symbol "mysql_ReturnPasswort"
    undefined symbol "LoadPlayer"


    Das liegt daran, das diese drei Funktionen (noch) nicht existieren, was wir nun ändern werden. Dafür gehen wir wieder Ganz nach unten ins Script und fügen folgendes ein:
    stock CreateAccount(playerid, pass[])
    {
    new query[256],Name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name,Name);
    mysql_real_escape_string(pass,pass);
    format(query, sizeof(query), "INSERT INTO `accounts` (`Name`, `Passwort`) VALUES ('%s', '%s')", Name, pass);
    mysql_query(query);
    return true;
    }
    Mit dieser Fuktion erstellen wir einen Account mit angegebenen Namen und Passwort in unserer Datenbank.
    stock mysql_ReturnPasswort(Name[])
    {
    new query[130], Get[130];
    mysql_real_escape_string(Name, Name);
    format(query, 128, "SELECT `passwort` FROM `accounts` WHERE `Name` = '%s'", Name);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    mysql_free_result();
    return Get;
    }
    Mit der Funktion holen wir uns das Passwort aus der Datenbank, um es mit dem Angegebenen zu überprüfen.


    Nun fehlt noch LoadPlayer(playerid), womit wir die Daten aus der MySQL Datenbank raus suchen und diese in unseren variablen Speichern.
    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))//Wir fragen ab ob der angegebene Spieler auch Online ist, und kein NPC ist (nur zur sicherhheit)
    {
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME); //Wir Speichern den Namen des Spielers in der Variable [i]SpielerInfo[playerid][pName][/i]
    SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Level" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pGeld] = mysql_GetInt("accounts", "Geld", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Geld" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pKills] = mysql_GetInt("accounts", "Kills", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Kills" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pTode] = mysql_GetInt("accounts", "Tode", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Tode" eingetragen ist und Speichern ihn in unserer Variable.
    }
    return 1;
    }
    Das ist sicher nicht die effizienteste Lösung, aber sie Ist übersichtlich und Anfängerfreundlich. Wer das Ganze trotzdem anders haben möchte, kann sich Hier mal anschauen wie sich das Ganze mit sscanf realisieren lässt.


    Ok weiter im Text. Wir haben jetzt also eine Funktion um die Daten des Spielers in unseren Server variablen zu Speichern. Aber moment, es Fehlen ja noch die Funktion/en die dort benutzt wurden.
    Das wäre in unserem Falle mysql_GetInt.


    mysql_GetInt Benutzen wir um einzelne Werte aus der Datenbank zu lesen und diese dann im Script zu verwenden. Dafür gehen wir wieder ganz nach unten, und fügen folgendes ein:
    stock mysql_GetInt(Table[], Field[], Where[], Is[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    new sqlint = mysql_fetch_int();
    mysql_free_result();
    return sqlint;
    }
    Als erklärung:
    mysql_GetInt gibt den Integer zurück, der an der angegebenen Position in der angegebenen Tabelle liegt.

    • Table[] - Die Tabelle in der der Wert liegt.
    • Field[] - Das Feld (die Spalte) in der der Wert liegt.
    • Where[] - Das Feld (die Spalte) in der Nach der Bedingung gesucht wird.
    • Is[] - Die bedingung um die richtige Reihe zu finden.


    mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName])
    Heisst also, wir suchen in der Tabelle "accounts" nach dem Wert "Level", aber damit wir nicht von irgendwem das level bekommen, geben wir als bedingung an das wir das Level aus der Reihe haben wollen, wo unter "Name" der Name unseres Spielers ist (dieser ist ja in SpielerInfo[playerid][pName] gespeichert).
    Gleiches gilt auch für mysql_GetFloat und mysql_GetString, nur das wir dort eben einen Float wert oder einen string zurück bekommen. Damit wir diese Funktionen auch benutzen können fügen wir mysql_GetString unten ins Skript ein. mysql_GetFloat muss nach oben ins Skript, weil funktionen mit tag (also z.b Float:mysql_GetFloat ) im Skript stehen müssen bevor die Funktion verwendet wird:
    stock mysql_GetString(Table[], Field[], Where[], Is[])
    {
    new query[128], Get[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    mysql_free_result();
    return Get;
    }

    stock Float:mysql_GetFloat(Table[], Field[], Where[], Is[])
    {
    new query[128], Float:sqlfloat;
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_float(sqlfloat);
    mysql_free_result();
    return sqlfloat;
    }


    So nun sind wir fast fertig. Was uns jetzt noch fehlt ist das Speichern des Spielers wenn er den Server verlässt.
    Dazu gehen wir zu
    public OnPlayerDisconnect(playerid, reason)
    und fügen dort die Funktion
    SavePlayer(playerid)
    ein. Damit wird der Spieler beim Ausloggen gepseichert.
    Zusätzlich löschen wir die Variable des Spielers ob er eingeloggt ist, da er ja nun ausgeloggt wird. Das ganze machen wir mit
    DeletePVar(playerid,"Eingeloggt");
    Da wir die Funktion SavePlayer aber noch nicht haben, fügen wir sie unten ins Skript hinzu:
    stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid)) //wir überprüfen ob der Spieler überhaupt noch Connected ist und ob er nicht ein NPC ist.
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1) //Und hier ob er noch eingeloggt ist.
    {
    //Nun speichern wir die Daten in der Datenbank.
    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Geld", SpielerInfo[playerid][pGeld], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Kills", SpielerInfo[playerid][pKills], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Tode", SpielerInfo[playerid][pTode], "Name", SpielerInfo[playerid][pName]);
    mysql_SetFloat("accounts", "Health", SpielerInfo[playerid][pHealth], "Name", SpielerInfo[playerid][pName]);
    }
    }
    return 1;
    }
    Und die Funktionen mysql_SetInt, mysql_SetFloat und mysql_SetString kommen direkt da drunter (mysql_SetString benutzen wir zwar nicht, aber falls ihr mal strings speichern wollt habt ihr diese direkt parat).
    stock mysql_SetInt(Table[], Field[], To, Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%d' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetString(Table[], Field[], To[], Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(To, To);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%s' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetFloat(Table[], Field[], Float:To, Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%f' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    Als erklärung:
    mysql_SetInt "Updatet" den Wert der an der Angegebenen Stelle in der Tabelle liegt, auf den neuen Wert den wir angegeben haben.

    • Table[] - Die Tabelle in der der Wert verändert werden soll.
    • Field[] - Das Feld (die Spalte) in der der Wert verändert werden soll.
    • To - Der Wert der an der in das Angegebene feld eingetragen werden soll.
    • Where[] - Das Feld (die Spalte) in der Nach der Bedingung gesucht wird.
    • Where2[] - Die bedingung um die richtige Reihe zu finden.


    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    heisst also, wir gehen in die Tabelle "accounts", und ändern den Wert der in der Spalte "Level" steht, auf den Wert den wir angegebene haben (SpielerInfo[playerid][pLevel]), da wo in der Spalte "Name" unsere bedingung (SpielerInfo[playerid][pName]) steht.