Beiträge von Jeffry

    Willkommen auf Breadfish!


    Das kannst du so machen:
    Unter den Includes:
    new Float:clickPos[MAX_PLAYERS][3];


    OnPlayerClickMap:
    public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
    {
    clickPos[playerid][0] = fX;
    clickPos[playerid][1] = fY;
    clickPos[playerid][2] = fZ;
    return 1;
    }


    Befehl:
    ocmd:mapport(playerid)
    {
    return SetPlayerPos(playerid, clickPos[playerid][0], clickPos[playerid][1], clickPos[playerid][2]);
    }

    Ich gehe davon aus, dass die Variable dort schon leer ist.
    Mache es so:
    new query[128];
    GetPlayerName(playerid, SpielerInfo[playerid][Name], MAX_PLAYER_NAME);
    mysql_format(db, query, sizeof(query), "SELECT * FROM `accounts` WHERE `username` = '%e'", SpielerInfo[playerid][Name]);
    mysql_pquery(db, query, "OnPlayerDataLoaded","ii", playerid, g_MysqlRaceCheck[playerid]);

    Nein, so:


    Wenn man mit den Cache-Funktionen schon arbeitet, dann sollte man es komplett machen, sonst bringt es keinen Vorteil.
    Nutze für das Query: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_pquery


    OnGameModeInit:
    mysql_pquery(dbhandle, "SELET * FROM Clans;", "LoadClans", "");


    Ganz unten im Code:
    forward LoadClans();
    public LoadClans()
    {
    new rows = cache_num_rows();
    for(new i;i<rows;i++)
    {
    Clan[i][cID] = cache_get_field_content_int(i,"ID",dbhandle);
    cache_get_field_content(i,"name",Clan[i][cName],dbhandle,32);
    cache_get_field_content(i,"Leader",Clan[i][cLeader],dbhandle,32);
    Clan[i][cMitglieder] = cache_get_field_content_int(i,"Mitglieder",dbhandle);
    Clan[i][cLevel] = cache_get_field_content_int(i,"level",dbhandle);
    Clan[i][cGeld] = cache_get_field_content_int(i,"geld",dbhandle);
    Clan[i][cEXP] = cache_get_field_content_int(i,"EXP",dbhandle);
    Clan[i][cSiege] = cache_get_field_content_int(i,"Siege",dbhandle);
    Clan[i][cNiederlagen] = cache_get_field_content_int(i,"Niederlagen",dbhandle);
    Clan[i][cUnentschieden] = cache_get_field_content_int(i,"Unentschieden",dbhandle);
    printf("Clan ID: %i | Name: %s | Leader: %s | Mitglieder: %i | Level: %i | Geld: %i | EXP: %i | S: %i N: %i U: %i",Clan[i][cID], Clan[i][cName], Clan[i][cLeader], Clan[i][cMitglieder], Clan[i][cLevel],Clan[i][cGeld],
    Clan[i][cEXP],Clan[i][cSiege],Clan[i][cNiederlagen],Clan[i][cUnentschieden]);
    }
    return 1;
    }


    @Mencent: Dein Code würde nicht funktionieren, da du in der Schleife das Result frei gibst, somit würde es maximal einen Clan laden.

    Das sieht korrekt aus.
    Mache es mal so: Lösche die ganze Tabelle und erstelle sie neu, mache aber das hier weg:
    AUTO_INCREMENT=387


    Dann gehe in den Server und registriere dich. Dann verlasse den Server und geh wieder rein. Siehst du dann das Login Fenster? Wenn ja, logge dich ein und verlasse den Server wieder. Läuft dann alles?
    Wenn nicht, poste einen Screenshot von der Tabelle und den Print aus dem Server Log.

    Versuche es so:
    case DIALOG_REGISTER:
    {
    if(!response)return Kick(playerid);
    if(strlen(inputtext) <= 5)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung",CHAT_RED "Dein Passwort muss mindestens 5 Zeichen besitzen!\n" CHAT_WHITE "Gebe dein Passwort in das Feld ein:","Registrieren", "Abbrechen");
    new query[256];
    GetPlayerName(playerid, SpielerInfo[playerid][Name], MAX_PLAYER_NAME);
    WP_Hash(SpielerInfo[playerid][Password],129,inputtext);
    mysql_format(db,query,sizeof query,"INSERT INTO `accounts` (`username`,`password`) VALUES ('%e','%e')",SpielerInfo[playerid][Name],SpielerInfo[playerid][Password]);
    printf("Insert Query: %s", query);
    mysql_tquery(db,query,"OnPlayerRegister","d",playerid);
    return 1;
    }


    Muss ich evtl vor Spielerspeichern Stock Spielerspeichern machen oder public SpielerSpeichern ?


    Solange du es nicht per Timer/CallRemoteFunction/... aufrufen willst spielt das keine Rolle.

    stock CountPixelsInName(name[])
    {
    new pixels;
    for(new i=0; i<strlen(name); i++)
    {
    switch(name[i])
    {
    case 'A': pixels+=8;
    case 'a': pixels+=6;
    case '0': pixels+=6;
    }
    }
    return pixels;
    }


    Und dann eben:
    TextDrawTextSize(textdraw, CountPixelsInName(zonenname), 3.0);


    Den switch musst du eben auffüllen, mit allen Buchstaben/Zahlen/... die du verwendest.
    Mache einen Screenshot von den Buchstaben und zoome mit Gimp (z.B.) ganz nah hin, dann kannst du die Pixel zählen.
    Gegebenenfalls musst du noch ein paar Pixel am Ende hinzufügen, also:
    TextDrawTextSize(textdraw, CountPixelsInName(zonenname)+10, 3.0);

    Versuche es so:
    strcat(query,"ALTER TABLE `"#SQLTAG"_account_licenses` ADD COLUMN (`pArchs0` int(2) NOT NULL");
    for(new i=1;i<MAX_ARCHIVMENTS;i++)
    {
    format(query,sizeof(query),"%s, `pArchs%i` int(2) NOT NULL",query,i);
    }
    strcat(query,")");
    mysql_function_query(MySqlConnection,query,false,"","");
    strdel(query,0,sizeof(query));


    strcat(mainquery,"UPDATE "#SQLTAG"_account_licenses SET ");
    for(new i=0;i<MAX_ARCHIVMENTS;i++)
    {
    if(i != MAX_ARCHIVMENTS) mysql_format(MySqlConnection,mainquery,sizeof(mainquery),"%spArchs%i='%d', ",mainquery,i,Spieler[playerid][pArchs][i]);
    else mysql_format(MySqlConnection,mainquery,sizeof(mainquery),"%spArchs%i='%d'",mainquery,i,Spieler[playerid][pArchs][i]);
    }
    mysql_format(MySqlConnection,mainquery,sizeof(mainquery),"%s WHERE Name='%s' LIMIT 1",mainquery,Spieler[playerid][pName]);
    mysql_function_query(MySqlConnection,mainquery,false,"","");
    strdel(mainquery,0,sizeof(mainquery));


    Wobei das eigentlich Syntax Fehler hätten sein müssen.


    Zwecks dem Textdraw: Wir sollten zuerst ein Problem lösen, und dann das andere.

    Von selbst tragen sich die Benutzer nicht ein.
    Wo machst du denn überall einen INSERT INTO für die Tabelle accounts?
    Setze dort gegebenenfalls einen print hin und schaue, wann der print im Server Log steht, dann weißt du wodurch der INSERT ausgeführt wird.

    Dadurch kann man unter anderem ja auch mal länger auf einer Stelle stehen.


    Man könnte das ja so realisieren wie es die neuen Fernseher machen (in 4 Stunden einmal was an der Fernbedienung drücken), man zeigt einfach eine Minute vor dem Kick ein TextDraw an, das sagt: Bitte bewege dich!

    strlen ist hier unpassend. Nicht jeder Buchstabe ist gleich groß, somit kannst du das nicht gescheit berechnen.


    Ich habe das bei mir mal für die Dialoge gemacht, dass die Tabs dynamisch korrekt gesetzt werden.
    Du musst in der Schriftart die der Text hat alle Buchstaben auf ihre Pixelgröße prüfen, sprich zu machst ein Bild von einem "AaBbCcDd...XxYyZz" String und zählst für jeden Buchstabe die Pixel.


    Danach kannst du mit einer Schleife durch alle Buchstaben des Zonennamens die Pixellänge des Namens bestimmen und somit entsprechend die TextDrawTextSize anpassen.

    Du musst die Größe das anklickbaren Bereiches mit TextDrawTextSize anpassen. https://wiki.sa-mp.com/wiki/TextDrawTextSize Der X Wert ist die Position PLUS die Größe des nach rechts anklickbaren Bereiches. Der Y Wert ist die geschätzte Höhe.


    Angenommen du erstellst dein Textdraw bei X = 120 und Y = 90. Dann machst du den Text "Hallo Welt" da rein. Sagen wir, der Text ist so groß, dass er in etwa über ein Zehntel deines Bildschirmes geht (musst du abschätzen, oder mit einem Lineal abmessen), dann heißt das 640 durch 10, das wäre 64. Somit ist TextDrawTextSize-X = 120 + 64 = 184.
    Nun misst, bzw. schätzt, du die Höhe des Textdraws, sagen wir mal du bekommst den Text in etwa 20 mal untereinander hin, bis dein Bildschirm von oben nach unten voll damit wäre. Heißt also: 480 durch 20, das gibt 24. Somit wäre TextDrawTextSize-Y = 24.

    ocmd:driveein(playerid,params[])
    {
    if(IsPlayerInRangeOfPoint(playerid,3,1212.11572, -904.57007, 41.83471))
    {
    SetPlayerHealth(playerid,1000);
    SendClientMessage(playerid,grün,"Du hast dir erfolgreich was zu essen gekauft.");
    }
    else
    {
    SetPlayerHealth(playerid,-40);
    SendClientMessage(playerid,rot,"Du warst nicht am Driveeinschalter.");
    }
    return 1;
    }