Beiträge von Jeffry

    Jo geschickt. :)


    Ich habe es mir angeschaut, ich finde keinen Fehler mehr, zumindest so beim drüberschauen.
    Kannst du mal einen print vor das Create3DTextLabel im UpdateBiz setzen?
    print(string);
    Und dann posten was im Log steht.


    Und dazu dann nochmal ein Bild des Hauses im Spiel posten?


    Wenn möglich, kannst du bitte den mysql_log mit LOG_ALL einschalten und posten was im Log steht, wenn du die Häuser lädst?

    Auf dein Beispiel Code hier bezogen brauchst du den ganzen Aufwand gar nicht, da du mit hart programmierten IDs arbeitest (du hast die 0 direkt ins query geschrieben).


    Wenn du es über einen solchen switch machst, und die ID immer hart in das query schreibst, dann musst du nichts weiter machen, als das Auto Increment entfernen.


    Falls du die IDs doch über Platzhalter (%d) einfügen willst, dann aktualisiere bitte den Code, da es sonst nicht geht dir das genau zu erklären.

    alles klar danke! Aber warum die 02 in der formatirung?


    Das bewirkt, dass da zum Beispiel 01.01.2015 steht, anstatt 1.1.2015.


    Und wie mache ich dass jetzt mit der Junge/Mädchen abfrage + Alter abfrage ? Diesmal ist es ja kein Datum etc.


    Das machst du ähnlich, nur eben dass du einen Dialog machst in dem du den Spieler das Geschlecht auswählen lässt (LIST-Dialog) und dann einen Input Dialog in den der Spieler sein Alter eingeben kann. Beides speicherst du jeweils in eine Variable und speicherst es das ganz normal über die Statistiken, oder du fragst es vor der Registration ab, dann kannst du es auch im selben Query wie das Register-Datum einfügen.
    Wenigstens die Dialoge solltest du hinbekommen, beginne einfach mal.



    CapriZ: http://forum.sa-mp.com/showthread.php?t=282883 Objekt: 18646

    Da der Spieler sich da registriert, kannst du es direkt hier erstellen, also über:
    format(query,sizeof(query),"INSERT INTO user (username,passwort) VALUES ('%s',MD5('%s')) ",name,passwort);
    machst du:
    new tag, monat, jahr, datum[16];
    getdate(tag, monat, jahr);
    format(datum, sizeof(datum), "%02d.%02d.%d", tag, monat, jahr);


    und dann fügst du es in das Query ein:
    format(query,sizeof(query),"INSERT INTO user (username,passwort) VALUES ('%s',MD5('%s')) ",name,passwort);
    zu:
    format(query,sizeof(query),"INSERT INTO user (username,passwort,registerdatum) VALUES ('%s',MD5('%s'),'%s') ",name,passwort,datum);


    => Nicht vergessen in der Tabelle eine Spalte "registerdatum" als VARCHAR anzulegen.

    Was meinst du damit?
    Hast du denn dazu schon einen Code? Was willst du überhaupt machen? Speichern, oder die gesamte Eingabe, oder für was brauchst du Hilfe?


    Am besten du fängst erst mal an mit dem was du vor hast und postest dann den Teil an dem du hängst.

    okay danke geht nun, aber ist jetzt "Health" weg oder? Weil ich es nicht mehr sehe und ich brauch es später noch..


    Ja, das musst du dann später, wenn du die Variable hast, wieder (mit Variable!) in das Query einfügen. Du hattest es ohne eine Variable für die Health anzugeben im Query. Deshalb hat es deine DB-ID in das Health Feld geschrieben, und das Feld der ID war leer, folglich hat es deine Stats nicht mehr aktualisiert.


    Die Platzhalter (%s, %d, ...) müssen immer gleich viele sein, wie Variablen in den Parametern am Ende vom format.

    So etwas gibt es meines Wissens nach nicht. Ich habe danach auch schonmal selbst ewig gesucht, da ich es leid war die Pickups immer manuell zu übernehmen, hatte aber auch nichts gefunden.
    Um Pickups die Nitro aktivieren zu erstellen reicht ein Converter sowieso nicht aus, denn da brauchst du einen Code dazu, der das Nitro setzt, wenn der Spieler in einem Fahrzeug ist, welches Nitro bekommen darf/kann.

    SavePlayer(playerid)
    {
    if(SpielerInfo[playerid][eingeloggt] == 0) return 1;
    new query[1024];
    format(query,sizeof(query),"UPDATE user SET Level='%i',Fraktion='%i',Geldaufhand='%i',Kills='%i',Tode='%i',Alevel='%i',Skin='%i',Banned='%i',p_x='%f',p_y='%f',p_z='%f' WHERE id='%i'",SpielerInfo[playerid][Level],SpielerInfo[playerid][Fraktion],GetPlayerMoney(playerid),SpielerInfo[playerid][Kills],SpielerInfo[playerid][Tode],SpielerInfo[playerid][Alevel],SpielerInfo[playerid][Skin],
    SpielerInfo[playerid][Banned],SpielerInfo[playerid][p_x],SpielerInfo[playerid][p_y],SpielerInfo[playerid][p_z],SpielerInfo[playerid][db_id]);
    mysql_function_query(dbhandle,query,false,"","");
    return 1;
    }


    Das Health war zu viel im Query. die Klammern brauchst du auch nicht. So sollte es passen.

    Lass dir den Timer mal ausgeben:
    public UpdateTacho(playerid)
    {
    printf("UpdateTacho für ID %d aufgerufen.", playerid);
    new string[128];
    format(string, sizeof(string), "%d KM/H",getKmh(playerid, true));
    print(string);
    TextDrawSetString(KMH[playerid], string);
    return 1;
    }


    Wird das im Server Log geprintet? Wenn ja, was?
    Wenn nein, poste bitte dein OnPlayerConnect.

    So habe den Befehl nochmal etwas übearbeitet , leider wird der Spieler nur gekickt, aber wenn man wieder online kommt passiert nichts!


    Was soll den passieren wenn der Spieler online kommt?
    Poste mal den Code dazu, das was passieren soll, wenn der Spieler online kommt.


    Wird Banned = 1 in der Datenbank gespeichert? Wenn nein: Hast du die Spalte in der Tabelle erstellt? Wenn ja, und es trotzdem nicht gespeichert wird, poste bitte den MySQL Log.

    Gibt es dort eine andere Möglichkeit? Z.b. wenn ID und NAME gleich sind (Aber dafür kein Primary Key)?


    Klar gibt es da eine Möglichkeit.
    Du nimmst ein Array, und setzt den Index der ID jeweils auf true wenn die ID in der Datenbank existiert. Wird ein Wert gelöscht, dann setzt du den Index wieder auf false.
    Beim Hinzufügen loopst du durch das Array und schaust welcher Index zuerst false ist (finden des kleinsten Index).


    Auto increment muss dafür natürlich entfernt werden. Den Primary key kannst du bestehen lassen.


    Beispiel mit Häusern:
    new bool:InDB[MAX_HAUS];


    InDB[id] = true; //bzw false beim löschen


    Finden des Index zum hinzufügen
    for(new i=0;i<MAX_HAUS;i++)
    {
    if(InDB[i]) continue; //Index existiert, weiter.
    id=i;
    break;
    }
    //dann hier das Haus erstellen und InDB von id auf true setzen.



    Edit:
    DJ Deagle: Mache ich heute Abend, bin nicht zu Hause.

    Kommt auf deine zwei Abfrage-Funktionen an. Wenn du nur abfragst, ob der Spieler gleich dem angegebenen Level ist geht es (zumindest von der Logik her). Wenn du abfragst ob Level >= dem angegeben, dann nicht. Du musst zuerst das höchste Level abfragen, also so:
    isAdmin(playerid, 200)
    dann isAdmin(playerid, 199)
    dann isAdmin(playerid, 180)
    ...
    am Ende: isAdmin(playerid, 1)


    Nach dem Prinizip.



    => Am besten du testest den Befehl wenn du zu Hause bist, das macht wesentlich mehr Sinn. Die Scripting Base ist eigentlich zum helfen gedacht, und nicht um Codes zu prüfen, zumindest so wie du es hier willst. Das können wir nämlich gar nicht, da wir weder den Rest vom Code kennen noch deine Funktionen und Variablen kennen.

    okay, und ich möchte es so machen dass wenn man Level 5 ist dass man ein Auto + habe nkann , wie geht dass jetzt?


    Dann musst du abfragen ob weniger als zwei Zeilen vorhanden sind:


    new rows = cache..//selbst mit deinen Werten ausfüllen
    if(rows == 1 && SpielerInfo[playerid][Level] != 5)
    {
    //hat bereits eins
    }
    else if(rows == 2 && SpielerInfo[playerid][Level] == 5)
    {
    //hat bereits eins
    }
    else
    {
    //darf eins erstellen
    }

    Du musst in der Datenbank mit SELECT abfragen, ob bereits ein Fahrzeug mit dem Name des Spielers erstellt worden ist.


    Beispiel:
    format(query, 128, "SELECT * FROM deinetabelle WHERE name = '%s'", SpielerName(playerid));


    Wenn dann eine Zeile zurückgegeben wird (also der cache nicht leer ist), hat der Spieler bereits ein Fahrzeug.

    Noch eine Frage, ich habe jetzt über /save Autopositionen abgespeichert. Nur jetzt kann ich mich nicht mehr daran erinnern wo ich sie einfügen muss.


    OnGameModeInit / OnFilterScriptInit
    Je nach dem ob du einen Gamemode oder einen Filterscript machst.

    Du darfst nicht die playerid zerstören, sondern die Fahrzeug ID:


    DestroyVehicle(GetPlayerVehicleID(playerid));


    Das kannst du dir so vorstellen:
    new vehicleID;
    vehicleID = GetPlayerVehicleID(playerid); //ID des Fahrzeugs in dem der Spieler ist.
    DestroyVehicle(vehicleID); //vehicleID zerstören.