Listendialog mit eigenen Autos

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
  • Hey,
    ich bin gerade am Grübeln wie ich einen Listendialog machen in dem alle meine Autos aufgelistet sind. Habe auch schon was, aber das funktioniert nicht so wirklich und ich kann mir auch vorstellen wieso. Nur weiß ich nicht wie ich es richtig machen kann :D
    CMD:mycars(playerid,params[])
    {
    new carstring[800];
    for(new i=0;i<sizeof(cInfo);i++){
    if(cInfo[i][id_x]==0)continue;
    if(cInfo[i][besitzer]!=sInfo[playerid][id0])continue;
    format(carstring,sizeof(carstring),"%s\n",GetVehicleName(cInfo[i][id_x]));
    }
    ShowPlayerDialog(playerid,80,DIALOG_STYLE_LIST,"Owned cars:",carstring,"Select","Close");
    return 1;

    Der String wird halt immer wieder neu formatiert, aber wie mache ich es anders ?

  • Der String wird halt immer wieder neu formatiert, aber wie mache ich es anders ?


    Als erstes in deiner if-Abfrage vergleichst du 2 Strings miteinander, dass musst du in Pawn mit strcmp machen und so kannst du es anders machen:


    CMD:mycars(playerid)
    {
    new carstring[800];
    for(new i=0;i<sizeof(cInfo);i++){
    if(!cInfo[i][id_x] || strcmp(cInfo[i][besitzer],sInfo[playerid][id0]))continue;
    format(carstring,sizeof(carstring),"%s%s\n",carstring,GetVehicleName(cInfo[i][id_x]));
    }
    ShowPlayerDialog(playerid,80,DIALOG_STYLE_LIST,"Owned cars:",carstring,"Select","Close");
    return 1;
    }


    PS: Da du params[] nicht brauchst, musst du es nicht oben angeben ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hat funktioniert, wollte halt auch noch machen wenn man es anklickt werden Sachen wie Position des Fahrzeuges angezeigt, nur wie bekomme ich herraus welches Fahrzeug man angeklickt hat ?


    Entweder du prüfst, welches listitem es war und wenn du chronologisch es auflistest, hast du den Slot von dem Auto.
    Oder du gibst den Slot noch mit an und splitte dann den inputtext (bei OnDialogResponse steht im inputtext der string, den er angeklickt hat) nach dem Slot auf, dann weißt du welches Fahrzeug er angeklickt hat ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hatte mal ein ähnliches Problem mit meinem Report-System.
    Das hat mir sehr dabei geholfen: MAX_PLAYERS - Dialog


    Das ist eigentlich eine Speicherverschwendung einen zweidimensionalen Array zu erstellen mit jeweils 500 Feldern ist hier etwas sinnlos :whistling:


    format(carstring,sizeof(carstring),"%s%s Slot: %d\n",carstring,GetVehicleName(cInfo[i][id_x]),cInfo[i][slot]); //slot (Variable) natürlich anpassen!


    //Wenn man das so macht, kann man dies einfach splitten
    //Schreib dir unten folgende Funktion ins Script
    stock GetSlotFromString(const string[]) {
    new pos = strfind(string,":"),buffer[2];
    if(pos == -1) return -1;
    strmid(buffer,string,pos+2,strlen(string),sizeof buffer);
    return strval(buffer);
    }


    //Nutzen kannst du es unter OnDialogResponse so:
    new slot = GetSlotFromString(string); //Dann hast du den Slot vom den Auto und kannst damit arbeiten


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Also sagen wir mal ich möchte wenn ich auf ein Fahrzeug klicke, soll es neben mich gesetzt werden. Funktioniert es dann so ?
    Oben im Script:
    new slot[MAX_PLAYERS];
    Dann:
    CMD:mycars(playerid,params[])
    {
    new carstring[800];
    for(new i=0;i<sizeof(cInfo);i++){
    if(cInfo[i][id_x]==0)continue;
    if(cInfo[i][besitzer]!=sInfo[playerid][id0])continue;
    format(carstring,sizeof(carstring),"%s%s\n",carstring,GetVehicleName(cInfo[i][id_x]));
    }
    ShowPlayerDialog(playerid,80,DIALOG_STYLE_LIST,"Owned cars:",carstring,"Select","Close");
    slot[playerid] = GetSlotFromString(carstring);
    return 1;
    }
    if(dialogid==80){
    if(response){
    new Float:vehX,Float:vehY,Float:vehZ;
    SetVehiclePos(cInfo[slot[playerid]][id_x],vehX,vehY+2,vehZ);
    }
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Habe bis jetzt das:
    if(dialogid==80){
    if(response){
    new Float:vehX,Float:vehY,Float:vehZ;
    GetPlayerPos(playerid,vehX,vehY,vehZ);
    SetVehiclePos(cInfo[listitem][id_x],vehX,vehY+2,vehZ);
    }
    }
    Das funktioniert logischerweiße nur wenn ein Spieler online ist, da die Autos immer erst spawnen wenn ein Spieler connectet. Ich muss das irgendwie in eine Schleife einbauen also z.B. wenn ich das 5te Listitem anklicke soll es das 5te Fahrzeug, dass mir gehört zu mir teleportieren. Habe da etwas gemacht, aber das funktioniert nicht:
    if(dialogid==80){
    if(response){
    new Float:vehX,Float:vehY,Float:vehZ;
    GetPlayerPos(playerid,vehX,vehY,vehZ);
    for(new i=listitem;i<sizeof(cInfo);){
    if(cInfo[i][besitzer] == sInfo[playerid][id0]) continue;
    SetVehiclePos(cInfo[i][id_x],vehX,vehY+2,vehZ);
    }
    }
    }