Beiträge von Jeffry

    Aber hier hast du es doch verwendet:
    format(String1,sizeof(String1),"/Deagle: %d",Dm[0]);


    Wie ist es denn dort definiert? Lokal im Callback? Wenn ja, poste bitte davon mal mehr Code, damit ich sehe wie du das dort machst.

    Du musst die Größe das anklickbaren Bereiches mit PlayerTextDrawTextSize anpassen. https://wiki.sa-mp.com/wiki/PlayerTextDrawTextSize 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 PlayerTextDrawTextSize-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 PlayerTextDrawTextSize-Y = 24.




    Bei dir also in etwa:
    PlayerTextDrawTextSize(playerid, WeaponEQUIP[playerid][3], 482.666564, 3.6);

    printf("[ADMIN] %s hat sich zum Strand Autohaus teleportiert.",playerid);
    zu:
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
    printf("[ADMIN] %s hat sich zum Strand Autohaus teleportiert.",pname);

    tayson87:
    Lass dir vor
    mysql_function_query(MySqlConnection,query,false,"","");
    mal das Query im Server Log ausgeben und poste dann in einem neuen Thread was im Log steht, und den Code nochmal dazu.
    printf("query: %s", query);


    @Voxa:
    Versuche es so:
    case 1://parteiwahlen
    {
    if(WahlenOffen == 0)return SendClientMessage(playerid, GRAU, "Es sind keine Wahlen offen.");
    new parteistring[256],count;
    format(parteistring, sizeof(parteistring), "Partei\tLeiter\tStimmen\n");
    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(PartInfo[p][ParteiCreatet] != 0 && PartInfo[p][ParteiAusgeschlossen] == 0)
    {
    format(parteistring,sizeof(parteistring),"%s%s\t%s\t%i\n",parteistring,PartInfo[p][ParteiName],PartInfo[p][ParteiOwner],PartInfo[p][ParteiStimmen]);
    count++;
    }
    }
    ShowPlayerDialog(playerid, DIALOG_PARTEIWAEHLEN, DIALOG_STYLE_TABLIST_HEADERS, ""#SERVERFARBE""#SERVERNAME"{FFFFFF}: Partei wählen",parteistring,"Wählen", "Abbrechen");
    if(count == 0)return SendClientMessage(playerid, GRAU, "Es existieren keine Parteien zum wählen.");
    }



    Edit:
    @Voxa: Oh ja! Das auch, gut gesehen! :)

    Die Idee dahinter, die Queries kürzer zu gestalten, ist zwar gut, aber die Umsetzung ist meiner Meinung nach nicht gut. Das liegt wohl auch daran, dass so ein Query einfach nicht kürzer gemacht werden kann als es ist, oder zumindest kaum.
    Grundsätzlich würde ich MySQL Anfängern, an die dies wohl gerichtet ist, strengstens davon abraten, dies oder ähnliches zu nutzen, da sie so das Prinzip MySQL nicht lernen. Außerdem sehe ich keinen wirklichen Vorteil in diesem System.


    Warum?

    • Mehr Code
    • Langsamer
    • Fehleranfälliger (vor allem wenn der String von 1024 voll ist und man es nicht merkt)
    • Funktionseinschränkend (OR geht zum Beispiel nicht)
    • Unübersichtlicher als ein ganz normales Query
    • Schlechte Wartbarkeit/Allgemeinverständlichkeit (niemand weiß, dass Name|Alter für Name und Alter steht, da hätte ich wenigstens & genommen)


    Zudem kommt, dass wenn man mehrere Queries hat, die unterschiedliche Spalten in derselben Tabelle ändern, dann muss man die "rows" Variable für dieses Query jedes mal, bzw. oft, neu anlegen, das ist Speicherverschwendung, wenn man in Betracht zieht, dass kein wirklicher Vorteil dabei entsteht.


    Außerdem fehlt beim Insert die Möglichkeit ein Callback aufzurufen, mit welchem zum Beispiel die neu eingefügte ID (A_I) über den Cache ausgelesen werden kann.

    Dein Code geht dir auf die Bretter, wenn jemand sowas macht:
    ReplaceString("Gemüse", "Schoki & Gemüse", string);
    Dann wird nämlich gar nichts ausgegeben.


    So wäre es korrekt:
    stock ReplaceString(const search[],const replace[], source[], size=sizeof source)
    {
    new i=strfind(source,search),tmp=strlen(search),len=strlen(replace);
    if(i==-1) return 0;
    for( ; i!=-1; i=strfind(source,search,false,i+len))
    {
    strdel(source,i,i+tmp);
    strins(source,replace,i,size);
    }
    return 1;
    }

    Um die Position hinter einem Fahrzeug herauszufinden, kannst du diese Funktion nutzen:
    stock GetPosHinterFahrzeug(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
    {
    if(GetVehicleModel(vehicleid) != 0)
    {
    new Float:a;
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    x -= (dist * floatsin(-a, degrees));
    y -= (dist * floatcos(-a, degrees));
    return true;
    }
    return false;
    }


    Anstatt
    GetVehiclePos(GetPlayerVehicleID(playerid),X,Y,Z);
    dann eben:
    GetPosHinterFahrzeug(GetPlayerVehicleID(playerid), 6.0, X , Y, Z);


    Und
    Y-6
    wieder zu:
    Y

    Und wollte fragen wie man das ganze Übersichtlicher machen könnte wie zb bei DINI so


    Dein Query an sich wird nicht funktionieren, da du "Alter" im Query hast (was ein SQL Befehl ist), es aber ohne Anfürungszeichen geschrieben hast.

    SQL
    Alter


    zu:

    SQL
    `Alter`


    Ebenso fehlt hier etwas:
    pInfo[playerid][pAlter],pInfo[playerid][pPerso],pInfo[playerid],GetPlayerMoney(playerid),
    ^^^

    Zu deiner Frage wie man es übersichtlich schreiben kann:


    Ich finde diese Methode sehr übersichtlich. Das liegt wahrscheinlich auch daran, dass ich mich durch meine Arbeit mit SAP daran gewöhnt habe. Die Leerzeichen im Query sind bei PAWN eben etwas unschön im Query drin.
    stock SpielerSpeichern(playerid)
    {
    if(GetPVarInt(playerid,"loggedin")==1)
    {
    new query[256];
    format(query, sizeof(query), "UPDATE users SET ");
    format(query, sizeof(query), "%s `Alter` = '%i', ", query, pInfo[playerid][pAlter] );
    format(query, sizeof(query), "%s Personalausweis = '%i', ", query, pInfo[playerid][pPerso] );
    format(query, sizeof(query), "%s Spawnchange = '%i' ", query, pInfo[playerid][pSpawnchange] );
    format(query, sizeof(query), "%s WHERE id = '%i' ", query, pInfo[playerid][pDB] );
    mysql_function_query(dbhandle, query, false, "", "");
    }
    return 1;
    }


    Alternativ bietet sich das hier an:
    stock SpielerSpeichern(playerid)
    {
    if(GetPVarInt(playerid,"loggedin")==1)
    {
    new query[256];
    format(query, sizeof(query), "UPDATE users SET ");
    format(query, sizeof(query), "%s`Alter`='%i',", query, pInfo[playerid][pAlter] );
    format(query, sizeof(query), "%sPersonalausweis='%i',", query, pInfo[playerid][pPerso] );
    format(query, sizeof(query), "%sSpawnchange='%i' ", query, pInfo[playerid][pSpawnchange] );
    format(query, sizeof(query), "%sWHERE id='%i'", query, pInfo[playerid][pDB] );
    mysql_function_query(dbhandle, query, false, "", "");
    }
    return 1;
    }

    Dann machst du bei OnPlayerDisconnect:
    if(DM[playerid][0] == 1)
    {
    DM[playerid][0] = 0;
    Dm[0]--;
    new String1[32];
    format(String1,sizeof(String1),"/Deagle: %d",Dm[0]);
    TextDrawSetString(Textdraw[6],String1);
    }