Beiträge von Jeffry

    Wie soll ich die Funktion jetzt schreiben?


    Das musst du mit dem neuen R40 jetzt so schreiben:
    new rows;cache_get_row_count(rows);if(rows == 0)


    Ich werde im Laufe der nächsten Tage das Tutorial an die R40 Version anpassen.


    ==================================================================================


    Allerdings fehlt ein gute Erklärung zur SQL-Syntax, was bei Anfängern, die andere Systeme als Login/Register erstellen wollen, oft zu Problemen führt.
    Desweiteren hätte man noch zu eine Seite verweisen können, die sämtliche SQL Befehle enthält.


    Ich habe beides in Form von Verweisen zu Kapitel 3 hinzugefügt. Nochmals Danke für den Hinweis.


    ==================================================================================
    ==================================================================================
    ==================================================================================






    Hallo Zusammen,


    ich habe soeben das Tutorial auf die neuste Version (R40) angepasst.
    Durch die neue Version des MySQL Plugins haben sich einige Änderungen ergeben.
    Für das Upgrade von R39-3 (vorheriger Stand des Tutorials) auf R40 (aktueller Stand des Tutorials) sind folgende Anpassungen am Beispielcode notwendig (im Tutorial und Download bereits angepasst):


    Der MySQL handle Variable wurde der Tag "MySQL" hinzugefügt. Dies muss bei der Deklaration angepasst werden.
    new handle; //Die Connection-Handle, über die wir später auf die Tabellen der Datenbank zugreifen
    zu:new MySQL:handle; //Die Connection-Handle, über die wir später auf die Tabellen der Datenbank zugreifen


    Durch diverse Anpassungen wurde auch cache_get_row_count verändert. Diese gibt nun nicht mehr den Wert direkt zurück, sondern über einen Parameter. Der Code muss entsprechend angepasst werden.
    if(cache_get_row_count() == 0)
    zu:new rows;
    cache_get_row_count(rows);
    if(rows == 0)

    Die gleiche Änderung hat auch cache_get_field_content_int erfahren und muss daher ebenfalls wie folgt angepasst werden.
    PlayerInfo[playerid][p_id] = cache_get_field_content_int(0, "id", handle);
    zu:cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
    Bitte beachtet, dass dies natürlich bei allen cache_get_field_content_int's gemacht werden muss, nicht nur bei der "id".
    Zudem haben sich auch die anderen Cache-Funktionen in gleicher Weise geändert. Solltet Ihr also diese Funktionen ebenfalls verwenden (siehe Changelog), dann müsst Ihr diese auch anpassen.


    In mysql_log wurde der Parameter entfernt und muss daher aus dem Code genommen werden.
    //mysql_log(LOG_ALL); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
    zu://mysql_log(); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren



    Jetzt die wichtigste Änderung! Hier wurde die Datenbank und das Passwort vertauscht. Auf diese Änderung macht Euch auch der Compiler nicht aufmerksam, vergesst dies also bitte nicht, sonst kann der Server keine Verbindung zur Datenbank herstellen.
    handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DBSE, MYSQL_PASS);
    zu:handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE);


    Außerdem muss in dem Informationsprint der handle noch der Tag entfernt werden, um einen Tag-Mismatch zu verhindern.
    printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", handle);
    zu:printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle);



    Außerdem ist es nun zwingend notwendig, die aktuelle libmysql.dll sowie die neue log-core.dll Datei im Hauptordner des Servers zu haben. Ansonsten lädt der Code nicht.



    Alle Änderungen findet Ihr hier:
    https://github.com/pBlueG/SA-MP-MySQL/releases/tag/R40


    Ich zähle daher hier nicht nochmal alle Änderungen auf. Falls Ihr Fragen zu den Änderungen habt könnt Ihr gerne wie gewohnt hier nachfragen, ebenso falls es bei der Konvertierung von R39-3 zu R40 Probleme gibt.
    Bitte beachtet, dass der in diesem Post angehängte Ordner "Beispiele_R39-3" für das untenstehende alte Tutorial ist. Die neue Version findet sich im Startpost!


    Viele Grüße,
    Jeffry 8)



    PS:
    Das Tutorial für MySQL R39-3 habe ich hier nochmal angehängt, falls es noch jemand benötigt. Ich empfehle aber die Nutzung der Version R40.

    Zum einen darf die Schleife nur durch die Anzahl der Zeilen gehen, anstatt durch die gesamte Array-Größe und zum anderen musst du überall die Cache-Zeile "i" anstatt "0" auslesen.
    forward LoadCars(playerid);
    public LoadCars(playerid)
    {
    new rows = cache_get_row_count();
    if(rows == 0) return 1;
    printf("1");
    for(new i = 0; i < rows; i++)
    {
    if(cInfo[i][c_vID] != 0) continue;
    cache_get_field_content(i, "c_besitzer", cInfo[i][c_besitzer], dbhandle, 32);
    cInfo[i][c_model] = cache_get_field_content_int(i, "c_model", dbhandle);
    cInfo[i][c_x] = cache_get_field_content_float(i, "c_x", dbhandle);
    cInfo[i][c_y] = cache_get_field_content_float(i, "c_y", dbhandle);
    cInfo[i][c_z] = cache_get_field_content_float(i, "c_z", dbhandle);
    cInfo[i][c_r] = cache_get_field_content_float(i, "c_r", dbhandle);
    cInfo[i][c_color1] = cache_get_field_content_int(i, "c_color1", dbhandle);
    cInfo[i][c_color2] = cache_get_field_content_int(i, "c_color2", dbhandle);
    cInfo[i][c_vID] = CreateVehicle(cInfo[i][c_model],cInfo[i][c_x],cInfo[i][c_y],cInfo[i][c_z],cInfo[i][c_r],cInfo[i][c_color1],cInfo[i][c_color2],0);
    }
    return 1;
    }

    if(cache_get_row_count() == 0)
    zu:
    if(cache_get_row_count() >= 3)


    Beachte, dass dies so aber nicht klappen wird. Wenn du mysql_pquery nutzt, musst du die Cache Abfrage in einem Callback (neues public) machen.
    Ansonsten ändere
    mysql_pquery(dbhandle, query);
    zu:
    mysql_query(dbhandle, query);


    Dies hebelt allerdings den Performancegewinn der neuen Plugins aus und sollte daher nur bedingt genutzt werden.

    Wenn du die Tabellenstruktur der MySQL Tabelle meinst:
    Man kann zwar die Felder auslesen lassen, die sich in den Queries befinden, es wird allerdings schwer, die genauen Datentypen der Felder zu erkennen. Außerdem ist es bei SQL Statements wie SELECT * nicht wirklich erkennbar, was ausgelesen werden soll.
    Von daher kann man zwar schon was auslesen mit einem entsprechenden Coding, das bringt nur nicht viel.



    Wenn du die Daten in der Tabelle meinst:
    Nein, die stehen ja nicht im Code.



    Von daher geht das leider nicht, bzw. nicht wirklich.

    Ok, dann ändere
    FactionCars[fc][fPrice] = FactionBuylist[fc][fbPrice];
    zu:
    for(new i = 0; i < sizeof(FactionBuylist); i++)
    {
    if(FactionCars[fc][fVehid] == FactionBuylist[i][fbVehid])
    {
    FactionCars[fc][fPrice] = FactionBuylist[i][fbPrice];
    break;
    }
    }


    So wird dann immer der Preis zum entsprechenden Model gefunden.


    PS: Den Code mit dem Motorschaden beim Laden musst du etwas weiter nach unten schieben, nach CreateVehicle, sonst setzt er die Health des Fahrzeugs bevor es erstellt ist, das geht nicht.

    Du kannst auch den Spieler am einsteigen hindern, indem du TogglePlayerControllable nutzt.
    Bei OnPlayerEnterVehicle:
    TogglePlayerControllable(playerid, false);
    TogglePlayerControllable(playerid, true);
    Natürlich nur bei den vehicleids, die im Autohaus stehen.


    Damit die Fahrzeuge nicht bewegt werden können kannst du ja auf OnUnoccupiedVehicleUpdate zurück greifen.

    Beim Laden der Fahrzeuge soll dann der Preis wieder ermittelt werden, so wie das aussieht, oder?


    Der Preis soll anhand der Model ID gefunden werden? Oder kann es vorkommen, dass in der FactionBuylist ein Model zwei mal vorkommt?

    Zu was denn?
    Zu dem Rangbezeichner?


    Das habe ich dir ja geschrieben.
    Dort, wo sich der Rang ändert, das hier einfügen:
    LOLTIMER(playerid);


    Den SetTimer zu LOLTIMER komplett entfernen. Somit wird das Textdraw nur dann geändert, wenn es auch geändert werden muss.