Kleines Dialogproblem

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
  • Hallo leute!


    Ich zerbrich mir grad den Kopf an einem "kleinen" Dialogproblem.


    Ich hab irgendwo einen Befehl (/showobjects). Dort mach ich eine for-schleife:



    //ganz oben
    new objectstring[256];


    //showobjects
    for(new i=0;i<sizeof(Object);i++)
    {
    if(Object[i][blEnabled] == 1)
    {
    format(objectstring,sizeof(objectstring),"Objekt %d\n",i);
    }
    }


    und setz dann das Ergebnis in einen Dialog:


    ShowPlayerDialog(playerid,ObjectDialog,DIALOG_STYLE_LIST,"Waehle das Objekt aus, das du sehen moechtest:",string,"Sehen","Abbrechen");


    Wie kann ich jetzt die einzelnen "listitems" dort auslesen? Also



    if(dialogid == ObjectDialog)
    {
    if(response == 0) return 1;
    if(response == 1)
    {
    if(listitem == 0)
    {
    //erstes Objekt, das in der Variable objectstring ist
    }
    if(listitem == 1)
    {
    //zweites Objekt, das in der Variable objectstring ist
    }
    //etc
    }
    }


    Ich hoffe, jemand kann mir helfen.


    MFG

  • Okay, 2 Sachen. Zuerst: Mit Format erstellst du "objectstring" aber im Dialog rufst du nur "string" auf.


    Deine Forschleife ist an sich ein richtiger Ansatz, aber du musst sie ändern. Der fertige String muss so aussehen:


    objekt1\nobjekt2\nojekt3....


    Ungetestet würde ich die Forschleife dann so machen: (Abhängig von der Anzahl der Objekte kann es sein, dass eine Arraygröße von 256 nicht reicht!)


    for(new i=0;i<sizeof(Object);i++)
    {
    if(Object[i][blEnabled] == 1)
    {
    format(objectstring,sizeof(objectstring),"%s\nObjekt %d",objectstring,i);
    }
    }


    Noch so als kleiner Tipp:


    if(dialogid == ObjectDialog)
    {
    if(response == 0) return 1;
    if(response == 1)
    {


    kann einfach zu


    if(dialogid== ObjectDialog)
    {
    if(response)
    {
    //CODE
    }
    }
    werden, da bei einer anderen Antwort (der 2. Button) der Dialog automatisch ohne Effekt geschlossen wird.


    Die Frage ist, wie du damit jetzt weiterarbeitest. Da deine Objekte ja scheinbar sich in der Laufzeit variabel ändern, wird das mit dem case für jedes Objekt schwer.
    Ich weiß nicht, was du mit den Objekten jetzt weiter vor hast. Wenn du bei jedem etwas anderes machen willst, aber immer andere in der Liste stehen könnten, solltest du am besten leere Listeneinträge erstellen, damit die Struktur im Code immer gleich bleibt - 3. Zeile in der Liste ist immer das 3. Objekt, egal ob es [blenabled] ist oder nicht. Wenn du aber bei allen den selben Vorgang machen würdest könntest du die listitem-Struktur folgendermaßen versuchen (wie immer ungetestet):


    switch (listitem)
    case 0..sizeof(Objects): //Mache irgendwas mit dem Objekt


    Spontan fällt mir aber keine Anwendungsmöglichkeit ein, da in der Variable ja nicht die Objekte an sich überliefert werden. Versuch dein Vorhaben etwas näher zu erläutern. ;)

  • Okay, 2 Sachen. Zuerst: Mit Format erstellst du "objectstring" aber im Dialog rufst du nur "string" auf.


    ups, war wohl ein kleiner copy&paste fehler :D



    ach, blöder denkfehler, ist ja klar das ich die anderen objekte auch reinnehmen muss.



    ja, stimmt. dann hab ich weniger code. aber bei meinen dialogen kommt bei response == 0 meistens noch was ;)


    Die Frage ist, wie du damit jetzt weiterarbeitest. Da deine Objekte ja scheinbar sich in der Laufzeit variabel ändern, wird das mit dem case für jedes Objekt schwer.
    Ich weiß nicht, was du mit den Objekten jetzt weiter vor hast. Wenn du bei jedem etwas anderes machen willst, aber immer andere in der Liste stehen könnten, solltest du am besten leere Listeneinträge erstellen, damit die Struktur im Code immer gleich bleibt - 3. Zeile in der Liste ist immer das 3. Objekt, egal ob es [blenabled] ist oder nicht.


    Hab ich mir auch schon überlegt. Dann kommt einfach, das dieses Objekt nicht verfügbar ist oder so. Wäre eine Lösung.


    Wenn du aber bei allen den selben Vorgang machen würdest könntest du die listitem-Struktur folgendermaßen versuchen (wie immer ungetestet):


    switch (listitem)
    case 0..sizeof(Objects): //Mache irgendwas mit dem Objekt


    Bei jedem Objekt soll es mir einen Checkpoint anzeigen mit den positionen des objektes. würde dies in dem falle gehen? oder eher nicht?


    Spontan fällt mir aber keine Anwendungsmöglichkeit ein, da in der Variable ja nicht die Objekte an sich überliefert werden. Versuch dein Vorhaben etwas näher zu erläutern. ;)


    ja, dann sind die objekte in einem dialog, die man dann anwählen kann und danach wird einem einen Checkpoint angezeigt, wo das objekt ist.


    Danke schon mal für die antwort :D


    MFG selEcT

  • 1. Mach wenn noch was bei response==0 einfach meine Struktur und ein else, mehr Fälle können nämlich dann nicht auftreten. ;)


    Zum weiteren Vorhaben: Zumindest mir fällt auf die "kurze" Variante keine Möglichkeit ein. Wenn es nicht zu viele Objekte sind, würde ich dir daher vorstellen, mit der FOR-Schleife die Liste so zu gestalten, dass bei nichtaktiven Objekten ein entsprechender Eintrag erstellt wird (Das Objekt ist nicht verfügbar). Dann die Liste im Script vorfertigen mit allen möglichen Listitems und die Abfrage noch jeweils einbauen, damit überprüft wird, ob das Listitem verfügbar ist: if(Object[i][blEnabled] == 1)