Fahrzeuge auflisten und beim Ausführen ID herrausfinden

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich habe ein Dialog welches die Fahrzeuge des Spielers auflistet (geladen wird es von der Datenbank).
    Wie kann ich aber bei der Auswahl herrausfinden, auf welches Fahrzeug der Spieler geklickt hat?
    Müsste ich dafür dann eine Variable definieren und jedesmal mit einer Schleife drüber gehen?



    new String[2048] = "";
    for(new i = 0; i < num_rows; i++) {
    new globalId;
    globalId = cache_get_field_content_int(i, "Id", Database);
    format(String, sizeof(String), "%s%s (Id: %i)\n", String, VehicleNames[VehicleInfo[globalId][vModelId] - 400], VehicleInfo[globalId][vId]);
    }


    ShowPlayerDialog(playerid, DIALOG_PV_2, DIALOG_STYLE_LIST, "{FFFFFF}Fahrzeuge", String, "Finden", "Schließen");

  • Wenn der Text eines Eintrags nur einmal vorkommen kann (zum Beispiel: Kennzeichen), kannst du auch danach suchen.
    Bei einem Listen-Dialog beinhaltet "inputtext" den Text des Eintrags, auf den der Spieler geklickt hat.


    Edit:
    Übrigens solltest du die Variable "globalId" vor beginn der Schleife erstellen.

  • Wenn der Text eines Eintrags nur einmal vorkommen kann (zum Beispiel: Kennzeichen), kannst du auch danach suchen.
    Bei einem Listen-Dialog beinhaltet "inputtext" den Text des Eintrags, auf den der Spieler geklickt hat.


    Edit:
    Übrigens solltest du die Variable "globalId" vor beginn der Schleife erstellen.

    Es werden mehrere Fahrzeuge aufgelistet, nicht nur eine, daher auch die globale ID in der Schleife.
    Es geht hier nicht um das Kennzeichen (das würde ich ja genau so wenig herrausfinden, wenn ich nicht weiß, auf welches der Spieler geklickt hat).
    Ich könnte höchstwahrscheinlich nur in einer Variable alles abspeichern. Meine Frage ist ja aber, ob es eine alternative, bessere Möglichkeit gibt.

  • Zitat

    Es werden mehrere Fahrzeuge aufgelistet, nicht nur eine, daher auch die globale ID in der Schleife.


    Trotzdem musst du die Variable nur einmal erstellen. Der Schleifenzähler "i", wird ja auch nicht bei jedem Durchgang neu erstellt.


    Zitat

    Meine Frage ist ja aber, ob es eine alternative, bessere Möglichkeit gibt.


    Ja die gibt es. Voraussetzung ist allerdings, dass du das Kennzeichen eines Fahrzeugs in dem Array speicherst, dieses einzigartig ist und auch im Dialog anzeigen lässt.


    Code
    format(String, sizeof(String), "%s%s (Id: %i)\n", String, VehicleNames[VehicleInfo[globalId][vModelId] - 400], VehicleInfo[globalId][vId]); // Hier einfach das Kennzeichen einsetzen.
    // Kannst auch das Kennzeichen, Modell und die ID anzeigen lassen und hinterher den String parsen. 
    
    
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
      // Hier kannst du nun nach dem Fahrzeug suchen, da "inputtext" das Kennzeichen des Fahrzeugs enthält.
      // Auf diese Weise weißt du sehr wohl, auf welchen Fahrzeug der Spieler geklickt hat.
      return 1;
    }


    Edit:
    Zusatz: Alternativ kannst du natürlich auch nach der ID des Fahrzeugs suchen, anstatt nach dem Kennzeichen. Auch hier beinhaltet "inputtext" die ID des Fahrzeugs, sofern diese im Dialog angezeigt wird.
    Dann musst du nur prüfen, ob "inputtext" nur Zahlen enthält, ggf. vorher die ID parsen und zu einem Integer umwandeln.

    Einmal editiert, zuletzt von Kobra ()

  • Hey,
    du kannst den inputtext auch spliten.


    Sprich der Inputtext ist das wo du drauf klickst.
    z.B Du hast einen List Dialog von 1-10.
    Der Spieler klickt auf die "6".


    Dann steht 6 im inputtext. Bei dir steht im Inputtext dann also die ID etc.


    Du splitest das, so das du Diskussion ID bekommst und speicherSt sie in einer Variable


  • Und wenn man z.B. 2x 411 (Infernus) hat?


    Caglar:


    Ich habe dir hier mal etwas aus meinem Script kopiert, denke du solltest damit klar kommen:
    //GLOBALE VARIABLEN
    new db_ID[999];


    //Im Befehl oder so
    new string[256],str[256],seller,model,reward,id,i;
    mysql_query("SELECT * FROM `Ordereddealercars`");
    mysql_store_result();
    while(mysql_fetch_row(string)) {
    sscanf(string,"p<|>iddd",id,seller,model,reward);
    db_ID[i] = id;
    format(str,sizeof str,"%s{00FF00}%s {FFFFFF}für {00FF00}%s{FFFFFF}€\n",str,PlayerVehicle[model-400],inspoints(reward));
    i++;
    }
    mysql_free_result();
    if(strlen(str) > 0) {
    ShowPlayerDialog(playerid,DLG_TRUCKER_CARIMPORT,DIALOG_STYLE_LIST,"Fahrzeugbestellungen",str,"Auswählen","Abbrechen");
    } else {
    SendClientMessage(playerid,COLOR_LIGHTRED,"Es gibt zur Zeit keine Fahrzeugbestellungen!");
    }


    //OnDialogResponse
    case DLG_TRUCKER_CARIMPORT:
    {
    if(response) {
    new q[256],seller,model,reward,Float:lPos[3],Float:zang,query[256];
    format(query,sizeof query,"SELECT `Seller`, `Model`, `Reward` FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);
    mysql_store_result();
    while(mysql_fetch_row(q)) {
    sscanf(q,"p<|>ddd",seller,model,reward);
    }
    mysql_free_result();
    //Dein Zeug hier
    format(query,sizeof query,"DELETE FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);
    }
    }


    edit: Eindrückung und globale Variable
    Das mit mysql_query ist für die R5 von BlueG geschrieben.



    lg
    Deagle

  • Könntest du mit strfind machen, aber das ist nicht wirklich ratsam.
    Ich würde dir vorschlagen, dort wo du die Liste erstellst, also den Dialog anzeigst:
    tmpID[playerid][i] = VehicleInfo[globalId][vId];


    Und unter den Includes:
    new tmpID[MAX_PLAYERS][MAX_VEHICLES];
    MAX_VEHICLES dazu ändern, was bei VehicleInfo als Größe steht.


    Dann kannst du im Dialog mit
    tmpID[playerid][listitem]
    auf die ID zugreifen.


  • Genau das war ja meine Frage. Dachte vllt. es gäbe eine alternative.
    Ich habe es so gemacht, funktioniert auch prima. Danke Jeffry!