Beiträge von Jeffry

    Jeffry: Wie es es am besten, das Geburtsdatum zu Speichern? ist es möglich, dies in das Alter umzuwandeln? Also dass das Geburtsdatum sowie das Alter gespeichert werden? :D


    Das Prinzip haben wir hier schon mal durchgearbeitet: http://forum.sa-mp.de/gta-mult…er-abfragen-2#post1991628 Ich denke damit kommst du klar.


    Geburtsdatum als VARCHAR speichern (String) und Alter als INT (Integer). Achte aber darauf, die Spalte nicht unbedingt "Alter" zu nennen, da dies ein MySQL Befehl ist. Nenn es lieber "Age" oder "pAlter", dann passieren dir keine unerklärlichen Fehler.

    Er kann dennoch nach der Datei suchen und wenn diese vorhanden ist, dann sucht er da nach dem Feld "username" (vorausgesetzt das existiert) und vergleicht das.


    Problem ist nur, dass du nicht nach Dateien suchen kannst. Auf einem Linux Server kannst du sowohl eine Datei "Test.txt" als auch eine Datei "TEST.txt" im selben Ordner haben, auf Windows geht das nicht.
    Heißt man nun "tEsT", wie willst du herausfinden, ob irgendeine Kombination existiert? Das geht nur, indem du die Dateien nur mit Kleinbuchstaben behandelst. Suchen geht nicht. ;)

    Du kannst keine Datei mit strcmp vergleichen, wie soll denn das gehen?



    FileZilla, willst du, wenn man sich als FILEZILLA registriert, man sich auch als filezilla einloggen kann? Wenn ja, dann ist es relativ einfach zu realisieren.

    Das strcat kannst du dir sparen, so ist es besser:
    CMD:admins(playerid, params[])
    {
    new stringfull[524], count = 0;
    foreach (new i : Player) if (PlayerData[i][pAdmin] > 0 && PlayerData[i][pAdminHide] < 1)
    {
    if(PlayerData[i][pAdminDuty]) format(stringfull,sizeof(stringfull), "%s%s {33CC33}(%s (%d)) {33CC33}(Im Support-Dienst)\n", stringfull, ReturnName(i, 0), adminname(i), PlayerData[i][pAdmin]);
    else format(stringfull,sizeof(stringfull), "%s%s {33CC33}(%s (%d)) {FF6347}(Nicht im Dienst)\n", stringfull, ReturnName(i, 0), adminname(i), PlayerData[i][pAdmin]);
    count++;
    }
    if (!count)
    {
    format(stringfull,sizeof(stringfull), "Kein Administrator online.");
    }
    Dialog_Show(playerid, AdminList, DIALOG_STYLE_MSGBOX, "Administratoren", stringfull, "Schließen", "");
    return 1;
    }

    Ah, jetzt seh ich den Fehler. vID - 400 ist falsch. Das muss die Model ID sein, nicht die Vehicle ID.
    Debugging ist einfach toll! :thumbup:



    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    printf("OnPlayerStateChange wurde aufgerufen! (playerid: %d)", playerid);
    if(newstate == PLAYER_STATE_DRIVER)
    {
    printf("%d ist im Auto als Fahrer",playerid);
    new vID = GetPlayerVehicleID(playerid);
    new mID = GetVehicleModel(vID);
    printf("Vehicle-ID: %d",vID);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    printf("id_x: %d (i=%d)", ahCars[i][id_x],i);
    if(ahCars[i][id_x]!=vID) continue;
    printf("%s ist im Autohaus. Fahrzeug: %s | i: %d ",SpielerName(playerid),VehicleName[mID-400],i);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[mID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }


    Falls es noch immer nicht klappt, nochmal den Log posten.

    Lass es mal so laufen:
    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    printf("OnPlayerStateChange wurde aufgerufen! (playerid: %d)", playerid);
    if(newstate == PLAYER_STATE_DRIVER)
    {
    printf("%d ist im Auto als Fahrer",playerid);
    new vID = GetPlayerVehicleID(playerid);
    printf("Vehicle-ID: %d",vID);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    printf("id_x: %d (i=%d)", ahCars[i][id_x],i);
    if(ahCars[i][id_x]!=vID) continue;
    printf("%s ist im Autohaus. Fahrzeug: %s | i: %d ",SpielerName(playerid),VehicleName[vID-400],i);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[vID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }


    Falls der Server abstürzt: crashdetect + Log
    ansonsten nur den Log posten.


    Falls dir er Log komisch vorkommt kannst du auch gleich noch die Erstellung der Fahrzeuge mitposten.

    Wenn er es in den Chat eingeben soll, dann funktioniert es natürlich, indem man abfragt, was er eingegeben hat:

    public OnPlayerText(playerid, text[])
    {
    if(spielerInMenu[playerid]) //Spieler hat das Menu (Beispiel) offen
    {
    if(!strcmp(text, "1")) //Und hat eine 1 eingegeben.
    {
    SendClientMessage(playerid, 0xFFFFFFFF, "Du hast 1 ausgewählt.");
    return 0; //Damit die 1 nicht im Chat angezeigt wird.
    }
    }
    return 1;
    }

    Was genau hast du denn vor, nachdem es gespeicher worden ist? Wird der HEX Wert in einem String verwendet (also muss er genau in dem Format ausgegeben werden), oder willst du es zum Beispiel für SetPlayerColor verwenden?

    Wenn du es als String haben willst, dann kannst du es mit "%x" formatieren (format) und als VARCHAR in der Tabelle speichern. Und wenn du es nur für eine Anweisung wie SetPlayerColor (o.ä.) speichern willst, dann reicht es, wenn du es wie eine Ganzzahl (Integer) behandelst, sprich du speicherst den HEX Wert einfach als Integer ("%d" bzw. "%i") und in der Datenbank als INT, und liest ihn so auch aus. Es ist bei solchen Funktionen (SetPlayerColor) egal, ob du beispielsweise "-1" oder "0xFFFFFFFF" verwendest, da beides das Gleiche ist.

    OnPlayerRequestClass hat nichts mit dem Spawn nach dem Tod zu tun.
    SetPlayerArena(playerid, GetPlayerArena(playerid)),SetPVarInt(playerid, "death", 0);
    solltest du unter OnPlayerSpawn setzen.

    Dann hast du bestimmt die Reihenfolge durcheinander gebracht.
    Du kannst es auch auf die harte Art und Weise machen, einfach beim Login das hier reinschreiben:


    new query[256], name[MAX_PLAYER_NAME];
    format(name, sizeof(name), Spielername(playerid));
    mysql_real_escape_string(name, name);
    format(query, sizeof(query), "UPDATE accounts SET Online='1' WHERE Username='%s'", name);
    mysql_query(query);

    So sollte es passen:
    ocmd:unban(playerid,params[])
    {
    new Spielerdatei[128],name[MAX_PLAYER_NAME];
    if(GetPVarInt(playerid, "loggedin") == 0)return SendClientMessage(playerid,Rot,"Du bist nicht eingeloggt!");
    if(!IsPlayerAnAdmin(playerid,5))return SendClientMessage(playerid,Rot,"Du bist kein Admin oder dein Adminrang ist zu niedrig!");
    if(sscanf(params,"s",name)) return SendClientMessage(playerid,Gelb,"Benutzung: /unban [Spielername/ID]");
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
    if(!strcmp(name, SpielerName(playerid))) return SendClientMessage(playerid, Rot, "Du kannst dich nicht selbst bannen!");
    if(!dini_Exists(Spielerdatei)) return SendClientMessage(playerid, Rot, "Es existiert kein Spieler mit diesem Namen in der Datenbank.");
    if(strval(dini_Get(Spielerdatei,"Banned")) == 0)return SendClientMessage(playerid,Rot,"Der Spieler ist bereits entbannt!");
    dini_IntSet(Spielerdatei,"Banned",0);
    dini_IntSet(Spielerdatei,"Grund",0);
    new string[128];
    format(string,sizeof(string),"AdmCmd: %s wurde von %s entbannt!",name,SpielerName(playerid));
    SendClientMessageToAll(HOrange,string);
    return 1;
    }


    Die Reihenfolge und die Verwendung der Variablen war nicht korrekt.