Beiträge von Jeffry

    Das Array so:
    enum arrayEnum {
    text[10],
    Float:x,
    integer
    };


    new array[10][arrayEnum] = {
    {"Das",234.012,111},
    {"ist",354.012,222},
    {"ein",213.012,333},
    {"Bespiel",221.012,444},
    {"Array.",861.012,555},
    {"...",55.012,666},
    {"xxx",36.012,777},
    {"aaa",4523.012,888},
    {"bbb",872.012,999},
    {"ccc",7.012,101}
    };


    Die Berechnung der Werte so:
    new tmp[sizeof(array)][arrayEnum];
    tmp = array;
    new rnd;
    for(new i = 0; i < sizeof(array) / 2; i++)
    {
    rnd = random(sizeof(array) - i);
    //--------------Ausgabe----------------------//
    //Hier in die Datenbank eintragen, anstatt
    //dem print.
    printf("%d: %s", i, tmp[rnd][text]);
    //---------------Ende------------------------//
    for(new j = rnd; j < sizeof(array)-1; j++)
    {
    format(tmp[j][text], 10, tmp[j+1][text]);
    }
    tmp[sizeof(array)-i-1][text][0] = '\0';
    }


    Zur Erklärung hier ein Log. Jeweils die erste Zeile ist das selektierte Item, und danach die 10 Zeilen, wie das "tmp" Array jetzt aussieht.
    Damit keine doppelten Treffer auftreten, wird das selektierte Item jeweils aus der Liste gelöscht, und die darüber stehenden Items um eins nach unten verschoben.
    Daher bilden sich hinten die null's.





    Ach' und eigentlich funktioniert es bei KEINEN Fahrzeug. Laut Prints hat jede TextDraw davon eine Invalide ID....

    Eventuell bist du schon über dem Limit durch andere Textdraws.



    Weil man müsste ja pro Fahrzeug ne Array haben um die Infos des richtigen Fahrzeugs zu bekommen..oder sehe ich es falsch?

    Das bleibt genau so wie du es aktuell auch machen würdest. Die Daten die du ins Textdraw schreiben willst hast du ja irgendwo gespeichert, wenn du das Textdraw aktualisierst.
    Sprich du hast ein ganz normales enum mit MAX_VEHICLES, in dem die Infos stehen. Wenn dem Spieler das Textdraw angezeigt wird, weißt du ja für welches Fahrzeug und kannst die Daten mit [wiki]PlayerTextDrawSetString[/wiki] setzen.




    Vielleicht könntest du n Beispiel machen, wie du es lösen würdest. Wäre lieb

    Das Beispiel zum Textdraw aktualisieren ist im Link. Versuche mal ob du damit klar kommst. Poste dann eventuell deinen bis dahin vorhandenen Code, falls du nicht weiter kommst, auf der Basis kann ich dir dann besser helfen.

    Du erstellst MAX_VEHICLES (2000) mal 6 Textdraws, sprich 12.000 Textdraws.
    Das Limit liegt bei 2048.
    https://wiki.sa-mp.com/wiki/Limits


    Bei den ersten ~300 Fahrzeugen müsste es klappen, danach nicht mehr.


    Wie machst du es besser?
    Erstelle 1 Player-Textdraw pro Spieler (wenn er online kommt), und zeige ihm dort die Informationen des Fahrzeugs an, das er sich anschaut. Er sieht ja immer nur die Informationen eines Autos, daher reicht 1 Textdraw pro Spieler.

    Ah, sorry, ich habe vergessen den Platzhalter auch zu entfernen.
    format(sql, sizeof(sql), "INSERT INTO biz (name,besitzer,x,y,z,kostet) VALUES ('%s','Niemand',%f,%f,%f,%d)",result,spx,spy,spz,player1);

    Funktioniert jetzt, Danke

    Ok, super.
    Noch der Grund dazu, warum es jetzt funktioniert:
    Es gibt bei GetVehicleParamsEx 3 verschiedene Stati, im Falle des Motors ist das so:
    0 = Aus
    1 = An
    -1 = Ungesetzt (entspricht 0).


    Daher reicht es nicht, auf 1 und 0 zu prüfen.


    https://wiki.sa-mp.com/wiki/GetVehicleParamsEx




    Das kommt bei dir zu Stande, weil du SetVehicleParamsEx vor CreateVehicle ausführst.
    Ändere also beim Laden noch:
    SetVehicleParamsEx(i, false, false, false, false, false, false, false);
    zu:
    SetVehicleParamsEx(Vehicle[i][SID], false, false, false, false, false, false, false);
    Und setze es eine Zeile drunter unter CreateVehicle hin.


    Behalte die Änderung mit nur "else" dennoch bei.

    Versuche es so:
    Function LoadItems()
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields);
    if(!num_rows)return print("["SERVER_DEBUG"] Es konnten keine Items geladen werden (rows = 0)");
    LOOP(num_rows, i)
    {
    new id = GetFreeItemID(), str[32];
    iData[id][itemX] = cache_get_field_content_float(i, "itemX", dbhandle);
    iData[id][itemY] = cache_get_field_content_float(i, "itemY", dbhandle);
    iData[id][itemZ] = cache_get_field_content_float(i, "itemZ", dbhandle);
    if(iData[id][itemX] == 0 && iData[id][itemY] == 0 && iData[id][itemZ] == 0)continue;
    iData[id][itemInteriorid] = cache_get_field_content_int(i, "itemInteriorid", dbhandle);
    iData[id][itemID] = cache_get_field_content_int(i, "itemID", dbhandle);
    iData[id][itemNumber] = cache_get_field_content_int(i, "itemNumber", dbhandle);
    iData[id][itemDBID] = cache_get_field_content_int(i, "itemDBID", dbhandle);

    format(str,sizeof str,"%s(%d)", GetItemName(iData[id][itemID]), iData[id][itemNumber]);
    iData[id][itemTextLabel] = CreateDynamic3DTextLabel(str, COLOR_WHITE, iData[id][itemX], iData[id][itemY], iData[id][itemZ], 20.0, _, _, _, _, iData[id][itemInteriorid]);
    iData[id][itemPickup] = CreateDynamicPickup(GetItemObjectID(iData[id][itemID]), 1, iData[id][itemX], iData[id][itemY], iData[id][itemZ], _, iData[id][itemInteriorid]);
    printf("id: %d / Item: %s / Itemid: %d /Item Anzahl: %d / Pickup: %d - wurde geladen.",id,GetItemName(iData[id][itemID]),iData[id][itemID],iData[id][itemNumber],iData[id][itemPickup]);
    }
    return 1;
    }

    Versuche zuerst:
    else if(tmp_engine == 1)
    zu:
    else


    Und
    if(tmp_engine == 0)
    zu:
    if(tmp_engine != 1)



    Falls das nicht klappt:
    Ändere
    if(!Vehicle[i][SID])continue;
    zu:
    printf("i: %d / SID: %d / carid: %d", i, Vehicle[i][SID], carid);
    if(!Vehicle[i][SID])continue;
    Und poste was im Server Log steht, wenn du den Befehl eingibst.

    Lösche alle Einträge in der Tabelle "biz".
    Dann ändere in der Datenbank in der Tabelle "biz" die Spalte "id" zu AUTO_INCREMENT (A_I), in der Struktur und speichere das.


    Ändere dann im Code:
    format(sql, sizeof(sql), "INSERT INTO biz (id,name,besitzer,x,y,z,kostet) VALUES (%d,'%s','Niemand',%f,%f,%f,%d)",ladebize,result,spx,spy,spz,player1);
    zu:
    format(sql, sizeof(sql), "INSERT INTO biz (name,besitzer,x,y,z,kostet) VALUES ('%s','Niemand',%f,%f,%f,%d)",result,spx,spy,spz,player1);


    Somit wird immer die nächste freie ID automatisch von der Datenbank vergeben, ohne dass du selbst mitzählen musst.
    Performancetechnisch und auch vom Aufwand her ist das die geschickteste Lösung.

    Problem ist, dass du immer nur die erste Zeile ausliest, da du das Query jedes mal neu sendest.
    Mache es so:
    ocmd:fraktioncontrol(playerid,params[])
    {
    new frakid,irang,str[500];
    frakid = SpielerInfo[playerid][Frakt];
    printf("DEBUG ID %i",frakid);
    mysql_queryf("SELECT Name FROM user WHERE Fraktion='%i'",frakid); //Query absenden
    mysql_store_result(); //Ergebnis Speichern
    while(mysql_retrieve_row()) //Alle Zeilen des Ergebnisses durchlaufen
    {
    //Felder jeder Zeile auslesen
    mysql_fetch_field("Name",data);
    strmid(fraktionsmember,data,0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    mysql_fetch_field("Rang",data);
    irang=strval(data);
    printf("DEBUG Name %s",fraktionsmember);
    if(ReturnPlayerID(fraktionsmember) != INVALID_PLAYER_ID) format(str, sizeof(str),"%s\n Name: %s - Rang: %i ({009F00}Online{FFFFFF})\n",str, fraktionsmember, irang);
    else format(str, sizeof(str), "%s\n Name: %s - Rang: %i ({C70A00}Offline{FFFFFF})\n",str, fraktionsmember,irang);
    printf("DEBUG Ende");
    }
    mysql_free_result();
    ShowPlayerDialog(playerid, DIALOG_SONSTIGES, DIALOG_STYLE_MSGBOX, "{FFFFFF}Mitglieder-Übersicht", str, "Ok","");
    return 1;
    }