Hitman Aufträge in Dialog anzeigen?

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, Community!


    Ich habe ein Problem bei meinem Hitman System.
    Wenn ein Spieler den Befehl /kopfgeld [SpielerID] [Betrag] macht wird ein Kopfgeld auf den jeweilgen Spieler ausgesetzt.
    Das funktioniert soweit auch.
    Jetzt wollte ich, dass jeder Hitman alle Aufträge über ein Dialogmenü (seinen Laptop) einsehen kann.
    Die Dialoge sehen inzwischen so aus:


    Die Defines:

    Spoiler anzeigen
    #define DIALOG_HITMANLAPTOPAUSWAHL 32
    #define DIALOG_HITMANLAPTOPAUFTRAG 33


    Der Befehl "/laptop":

    Spoiler anzeigen
    if(strcmp(cmd,"/laptop",true)==0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pMember] == 8 || PlayerInfo[playerid][pLeader] == 8)
    {
    ConnectedToPC[playerid] = 255;
    ShowPlayerDialog(playerid,DIALOG_HITMANLAPTOPAUSWAHL,DIALOG_STYLE_LIST,"Hitman Laptop","Aufträge","Auswählen","Abbrechen");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Sie sind kein Hitman.");
    return 1;
    }
    }
    return 1;
    }


    Dialog "DIALOG_HITMANLAPTOPAUSWAHL":

    Spoiler anzeigen
    ShowPlayerDialog
    if(dialogid == DIALOG_HITMANLAPTOPAUSWAHL)
    {
    new str[128];
    if(response)
    {
    if(listitem == 0)
    {
    format(str,sizeof(str],%s\n%s\n%s\%s
    ShowPlayerDialog(playerid,DIALOG_HITMANLAPTOPAUFTRAG,DIALOG_STYLE_LIST,"Aufträge",
    return 0;
    }
    }
    }


    Jetzt habe ich probiert, dass mit einem format zu machen.. Doch das kann ja nicht funktionieren so wie ich das gemacht habe, da ja auch theoretisch 1000 Aufträge da sein könnten...
    Ich hoffe irgendjemand kann mir helfen.
    (INFO: das mit format ist das was ich probiert habe also bitte keine Beiträge mit "Das format ist ja unvollständig")


    mfg Simon!

  • ich würde mal behaupten mit einer schleife.
    new string1[128];


    for(new i=0;i<MAX_PLAYERS;i++) //eine schleife durch alle slots
    {
    if(!IsPlayerConnected(i))continue; //falls nicht connected continue
    if(PlayerInfo[i][kopfgeld]==0)continue; //falls kein kopfgeld continue
    format(string1,128,"%skopfgeld auf spieler : %s\n",string1,sname(i)); //spieler mit kopfgeld zum string hinzufügen
    }


    ShowPlayerDialog(playerid,DIALOG_HITMANLAPTOPAUFTRAG,DIALOG_STYLE_LIST,"Aufträge",string1,"Weiter","Abbrechen"); //fertiger string nach der schleife im dialog ausgeben

    hab lange nicht mehr gescriptet und sind auch sicher fehler drin.. aber theoretisch kannst du es dir vielleicht vorstellen.



  • Formatiert er bei dir nicht string1 ? den du aber im gleichen format nimmst um das Kopfgeld anzuzeigen?

  • also


    schleife fängt bei 0 an.
    auf spieler 0 gibt es ein kopfgeld.
    string1 wird formatiert und der text "%skopfgeld auf spieler : %s\n" wird in den string gespeichert.


    schleife geht zu 1
    auf spieler 1 gibts auch ein kopfgeld.


    format(string1,128,"%skopfgeld auf spieler : %s\n",string1,sname(i));
    durch das erste %s (rot markiert) wird der text von id 0 wieder in den string gespeichert und danach der text von id 1.


    das geht dann immer so weiter bis die schleife durchgelaufen ist.


    du kannst auch alternativ strcat verwenden: http://wiki.sa-mp.com/wiki/Strcat
    da benötigt man 2 strings.

  • Erstmal danke.


    Jedoch bekomme ich mehrere Errors.
    Der ganze Dialog:


    //Hitman
    if(dialogid == DIALOG_HITMANLAPTOPAUSWAHL)
    {
    if(response)
    {
    if(listitem == 0)
    {
    new string1[128];
    for(new i=0;i<MAX_PLAYERS;i++) //eine schleife durch alle slots
    {
    new sname[MAX_PLAYER_NAME];
    GetPlayerName(i, sname, sizeof(sname));
    if(!IsPlayerConnected(i))continue; //falls nicht connected continue
    if(PlayerInfo[i][pHeadValue]==0)continue; //falls kein kopfgeld continue
    format(string1,128,"%s$ : %s\n",string1,sname(i)); //spieler mit kopfgeld zum string hinzufügen
    }
    ShowPlayerDialog(playerid,DIALOG_HITMANLAPTOPAUFTRAG,DIALOG_STYLE_LIST,"Aufträge",string1,"Weiter","Abbrechen"); //fertiger string nach der schleife im dialog ausgeben
    return 1;
    }
    }
    }



    Das sind die Errors:

    Spoiler anzeigen
    Zeile (44231) : error 012: invalid function call, not a valid address
    Zeile (44231) : Befehl hat keinen Sinn
    Zeile (44231) : Erwartete Zeichen ";", aber gefunden ")"
    Zeile (44231) : Ungültiger Befehl
    Zeile (44231) : Zuviele Fehler in einer Zeile


    Zeile 44231 ist die Zeile mit dem format


    Außerdem:
    Ich lasse ja dann einen Dialog anzeigen mit allen Spielern die ein Kopfgeld haben.
    Wie lasse ich die listitems auslesen? ich kann ja nicht mit "listitem ==0" etc arbeiten...
    Den Rest kann ich dann.. (ClientMessage an alle Hitmans senden etc) Nur wie ich das auslesen lasse ist das Problem....

    Einmal editiert, zuletzt von [MVS]Simon ()

  • "sname" ist in meinem fall eine funktion die den namen der playerid ausliest und den namen zurücksendet.
    hast du nicht auch so etwas ähnliches? wird oftmals "SpielerName" genannt.


    gibt jetzt mehrere möglichkeiten:


    1. du hast schon so eine funktion ,dann nimm diese. (lösche getplayername usw)
    2. du hast den namen schon irgendwo eingespeichert wie in deinem enum (lösche getplayername usw)
    3. du nimmst meinen stock: (lösche getplayername usw)
    sname(playerid){new snamemax[MAX_PLAYER_NAME+1];GetPlayerName(playerid,snamemax,sizeof(snamemax));return snamemax;}
    4. du änderst in der format zeile "sname(i)" zu "sname" (behalte getplayername usw)

  • 1. Danke für die Hilfe!
    2. Es wird kein Preis beim Dialog System angezeigt.. Da steht ingame nur "$ : [MVS]Simon"


    3. Ist das untere bei dir auf mein Problem mit dem auslesen des strings bezogen oder auf sname ? Sname habe ich durch SpielerName ersetzt, funktioniert jetzt also soweit.