Was ist an diesem Dialog falsch? Keine Errors aber funzt net?

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
  • if(dialogid==DIALOG_DRIVEIN)
    {
    if(response==0)
    {
    SendClientMessage(playerid,ROT,"Du hast den Kaufvorgang abbgebrochen");
    }
    if(listitem==0)


    SetPlayerHealth(playerid,50);
    GivePlayerMoney(playerid,-20);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    }
    if(listitem==1)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-50);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    }
    if(listitem==2)
    {
    SetPlayerHealth(playerid,40);
    GivePlayerMoney(playerid,-10);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    }
    if(listitem==3)
    {
    SetPlayerHealth(playerid,80);
    GivePlayerMoney(playerid,-40);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    }
    if(listitem==4)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-30);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    }
    }
    return 1;
    }

    Der PC ist nur so schlau wie die Person die dahinter steckt.

  • Auch wenn ich gerade den Fehler nicht sehen kann, ein Tipp für dich:
    Arbeite lieber mit switch(listitem).
    switch(listitem)
    {
    case 0:
    {
    // ...
    }
    case 1:
    {
    // ...
    }
    }
    Ist das untere Return vom gesamten Callback OnDialogResponse? Wenn ja, ändere die Zahl von 1 auf 0. Siehe dazu auch die Wiki.


    Noch ein Tipp:
    Du setzt einfach nur das Leben des Spielers, anstatt es zu dem aktuellen Leben zu addieren. Hat man also 90 Leben, kauft etwas zu essen hat man danach noch 40 Leben.
    Speichere also vorher das Leben des Spielers mit GetPlayerHealth und addiere einfach deines.


    Mit freundl. Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • if(dialogid==DIALOG_DRIVEIN)
    {
    if(response==0)
    {
    SendClientMessage(playerid,ROT,"Du hast den Kaufvorgang abbgebrochen");
    return 1;
    }
    if(listitem==0)
    {
    SetPlayerHealth(playerid,50);
    GivePlayerMoney(playerid,-20);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem==1)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-50);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem==2)
    {
    SetPlayerHealth(playerid,40);
    GivePlayerMoney(playerid,-10);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem==3)
    {
    SetPlayerHealth(playerid,80);
    GivePlayerMoney(playerid,-40);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem==4)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-30);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    return 1;
    }


    Damit das Script auch abbricht, nachdem er die Auswahl gefunden hat, die der Spieler tätigt,
    muss ein "return 1;" hinter jeder Abfrage gehängt werden.


    Wenn du das nicht verstehst, kann ich es nochmal genauer erklären.

  • Pille, das stimmt nicht. Das Script arbeitet von oben nach unten durch (außer es durchläuft Schleifen o.Ä).
    Wenn also die entsprechende Abfrage richtig ist und durchlaufen wird (z.B. listitem == 2), dann wird das ausgeführt und dann außerhalb der if-Abfrage weitergemacht. Dass dort ein return 1; steht reicht bereits.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Ebenso unnötig. else if verlangsamt in dem Fall prinzipiell nur die Rechenzeit.
    Durch mehrere if-Abfragen werden alle überprüft, allerdings nur eine durchlaufen.
    Durch else-if Abfragen werden sie dennoch solange bis es zutrifft überprüft und ggf. durchlaufen.


    Ändert vom Script her nichts.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Sicher dass er sie verlangsamt?


    In dem Fall von oben geht er immer das ganze durch.
    Hängt man unter jedes listitem ein "return 1;" dann
    sucht er sich das raus, und beendet an dieser Stelle das Rechnen.


    Oder? ^^

  • Ohne auf die zahlreichen blödsinnigen Antworten
    einzugehen und nochmehr Blödsinn zu hören, hier die Lösung:


    if(dialogid==DIALOG_DRIVEIN)
    {
    if(response)
    {
    if(listitem == 0)
    {
    SetPlayerHealth(playerid,50);
    GivePlayerMoney(playerid,-20);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem == 1)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-50);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem == 2)
    {
    SetPlayerHealth(playerid,40);
    GivePlayerMoney(playerid,-10);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem == 3)
    {
    SetPlayerHealth(playerid,80);
    GivePlayerMoney(playerid,-40);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    if(listitem == 4)
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-30);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du hast den Kaufvorgang abbgebrochen");
    return 1;
    }


    return 1;
    }
    Funktioniert definitiv.


    Was hier nichts sieht, ist selber Schuld.




    [NACHTRAG]


    EIN KLEINER ABER INTERESSANTER TIPP:


    Man verwendet in Script o.ä. keine Sonderzeichen.
    D.h. das Ü bei grün, solltest Du besser als ue, also GRUEN deklarieren.


    Führt manchmal zu kleinen Fehlern ;)

  • Eigentlich ja, aber bei soetwas kommt es immer nur auf Millisekunden an, was nicht wirklich etwas weltbewegendes ist. Es ging mir nur darum es anzumerken.
    Am besten wäre es einfach einen switch zu verwenden, da dieser imho von der Berechnungszeit am wenigsten in Anspruch nimmt.


    4#Future: Was hat das mit selber schuld zu tun? Ich sagte, dass ich gerade nichts wirklich erkennen kann - Was daran liegt, dass ich mich um diese Zeit gar nicht wirklich darum bemühe.
    Ich habe ihn dafür auf einige Dinge hingewiesen, die ihm von Nutzen sein könnten. Aber es ist ja Blödsinn.


    In deinem Code sehe ich übrigens keine signifikante Besserung, beziehungsweise Lösung seines Problems - Sondern eher eine grundlegende Verbesserung. Nur weil er kein else-Statement für den Response verwendet hat, wird nicht zwangsläufig der Response-Fall nicht aufgerufen. Es geschieht hier lediglich eine eigene Separierung für den Falle Response = 0.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Padarom


    Nein, das meinte ich nicht.
    Ich würde es selbst auch vorzugsweise mit switch lösen.


    Einfach der Übersicht halber.


    if(dialogid == DIALOG_DRIVEIN)
    {
    if(response)
    {
    switch(listitem)
    {
    case 0:
    {
    SetPlayerHealth(playerid,50);
    GivePlayerMoney(playerid,-20);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    break;
    }
    case 1:
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-50);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    break;
    }
    case 2:
    {
    SetPlayerHealth(playerid,40);
    GivePlayerMoney(playerid,-10);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    break;
    }
    case 3:
    {
    SetPlayerHealth(playerid,80);
    GivePlayerMoney(playerid,-40);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    break;
    }
    case 4:
    {
    SetPlayerHealth(playerid,90);
    GivePlayerMoney(playerid,-30);
    SendClientMessage(playerid,GRÜN,"Guten Appetit.Gute weiterfahrt");
    break;
    }
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du hast den Kaufvorgang abbgebrochen");
    return 1;
    }


    return 1;
    }