Brauche hilfe bei OnDialogResponse

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
  • Hi,


    Zwei Fragen:


    1. ich möchte ein Gebeschein befehl machen mit dem der Spieler den schein akzeptieren muss, das soll so aussehen:


    Das im Dialog MSG BOX
    "Fahrlehrer [NAME] möchte dir den Autoschein verkaufen" Annehmen, Ablehnen


    und jetzt wenn er akzeptiert hat soll zu dem Fahrlehrer diese nachricht geschickt werden:
    "Du hast [NAME] den Autoschein verkauft"


    und zu dem Spieler:
    "Fahrlehrer [NAME] hat dir den Autoschein verkauft"


    und nun die frage:
    Wie bekomme ich es hin da dies ja in OnDialogResponse geschieht den namen des Fahrlehrers auszugeben und eine nachricht an ihn zu senden der ja normal pID ist. Der Spieler der annehmen oder ablehnen muss ist playerid von ihm kann ich den namen mit meiner Funktion SpielerName(); ausgeben aber ich bekomme es nicht hin den namen des Fahrlehrers auszugeben ohne kompliziertes for schleifen gewurschtel.


    2. Ich möchte ein support system machen wo die Admins mit einem befehl in dem DIALOG_STYLE_LIST die leute angezeigt bekommt die ein ticket erstellt haben, soweit habe ich es auch schon geschafft, nun möchte ich aber wenn man auf den namen klickt das ticket von dem spieler anzeigen lassen.


    Das Problem ist jetzt das icht nicht weis wie man das macht normal würde man das ja mit if(listitem==0) usw machen aber da man ja keine gewisse anzahl hat wie viele listitems es jetzt gibt möchte ich wissen wie man es macht das man die namen in der liste abfragen kann.


    Ich hoffe ihr könnt mir helfen :)


    MFG: KiraYamato

  • Willkommen auf Breadfish!



    1.)
    Erstelle dazu ein globales Array:
    new sentID[MAX_PLAYERS];


    In dem Befehl dann:
    sentID[pID] = playerid;
    Somit weiß die pID, dass sie von der playerid die Einladung bekommen hat.


    Im Dialog kannst du den Namen dann so ausgeben:
    printf("Fahrlehrer Name: %s", SpielerName(sentID[playerid]));


    2.)
    Poste bitte den Befehl, den du dazu erstellt hast. Analog dazu muss nämlich der Code von OnDialogResponse aufgebaut sein.

  • Ah, danke dir jetzt kann ich das Scheine System hoffentlich fertig stellen :D


    Zu dem Support System:


    Der Befehl für das Ticket erstellen erstmal nur Bug Meldungen:

    Code
    ocmd:ticket(playerid,params[])
    {
        ShowPlayerDialog(playerid,DIALOG_SUPPORT,DIALOG_STYLE_LIST,"Support System","Bug Melden","Ok","Abbrechen");
    	return 1;
    }


    Der Befehl um die Tickets anzusehen:

    Und der Krams aus OnDialogResponse:



    Is villeicht nen bissl umständlich aber mir ist nicht eingefallen wie ich es sonst machen könnte :)



    MFG: KiraYamato

    Einmal editiert, zuletzt von KiraYamato ()

  • Zwischenfrage zum Verständnis:
    Warum zeigst du beim Befehl /tickets immer 3 Namen pro Zeile an? So kann meinem Verständnis nach doch nicht eindeutig eine Zeile einem Spieler zugeordnet werden, oder? Oder hat das einen anderen Sinn (x-Variable)?

  • oh, haha du hast recht das ergibt wirklich keinen sinn, ich habe mir das aus nem anderem befehl einkopiert und vergessen das zu verändern. Also angenommen ich mache das mit x weg und sage einfach:
    format(string,sizeof(string),"%s%s",string,Spielername(i)); und dann halt format(string,sizeof(string),"%s",string);
    Könnte man jedem spieler der ein ticket erstellt dann diese zeile zuordnen ? Wenn ja währe es toll wenn du mir erklären würdest wie :)


    PS: am handy geschrieben

    Einmal editiert, zuletzt von KiraYamato ()

  • Dann den Befehl so:
    ocmd:tickets(playerid,params[])
    {
    if(isPlayerAnAdmin(playerid,1) || isPlayerUservertreter(playerid,1))
    {
    new string[MAX_PLAYER_NAME * MAX_PLAYERS];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(i,"Ticket") == 1)
    {
    format(string, sizeof(string), "%s%s\n",string,SpielerName(i));
    }
    }
    }
    ShowPlayerDialog(playerid,DIALOG_TICKETS,DIALOG_STYLE_LIST,"Offene Tickets",string,"Ok","Abbrechen");
    return 1;
    }
    else
    {
    SendClientMessage(playerid,RED,"FEHLER: Du bist kein Admin oder Uservertreter!");
    return 1;
    }
    }


    Und in OnDialogResponse:
    if(dialogid == DIALOG_TICKETS)
    {
    if(!response) return 1;
    new count = -1;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(i,"Ticket") == 1)
    {
    count++;
    if(count == listitem)
    {
    new string[145];
    format(string, sizeof(string), "Spieler %s (ID: %d) in Zeile %d wurde angeklickt.", SpielerName(i), i, listitem);
    SendClientMessage(playerid, 0xFFFFFFFF, string);
    return 1;
    }
    }
    }
    }
    return 1;
    }


    Beachte aber, dass es sein könnte, dass ein Spieler in der Liste den Server verlässt, während du die Liste offen hast, sprich dann stimmt die Liste eventuell nicht mehr und es wird bei der Auswahl ein falscher Spieler ausgewählt.
    Um das zu verhindern habe ich hier ein Tutorial, mit dem man solche Dialoge aktualisieren lassen kann: [jTuT] Interaktive Dialoge


    Alternativ könnte man noch prüfen, ob der Spieler mit dem ausgewählten Name noch online ist, dann sieht es so aus:
    if(dialogid == DIALOG_TICKETS)
    {
    if(!response) return 1;
    new count = -1;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(i,"Ticket") == 1)
    {
    count++;
    if(count == listitem)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(i, name, MAX_PLAYER_NAME);
    if(strcmp(name, inputtext))
    {
    SendClientMessage(playerid, 0xFF0000FF, "Error: Der Spieler ist nicht mehr online.");
    return 1;
    }
    new string[145];
    format(string, sizeof(string), "Spieler %s (ID: %d) in Zeile %d wurde angeklickt.", SpielerName(i), i, listitem);
    SendClientMessage(playerid, 0xFFFFFFFF, string);
    return 1;
    }
    }
    }
    }
    return 1;
    }
    Das geht allerdings nur so, wenn du im Dialog nur den Name anzeigst, da der inputtext bei einem Listdialog dem Text der Zeile entspricht, die ausgewählt wurde. So wie der Befehl momentan ist, kannst du es so nutzen.

  • Ok ich hab das jetzt so eingefügt wie du gesagt hast, allerdings wenn ich den befehl ingame ausführe zeug er mir an das der befehl nicht existiert und zeigt der compiler mir jetzt ganz viel Zeugs an was weder warnings noch errors sind:


    Header size: 9892 bytes
    Code size: 706068 bytes
    Data size: 728816 bytes
    Stack/heap size: 16384 bytes; estimated max. usage=24070 cells (96280 bytes)
    Total requirements: 1461160 bytes


    Ich habe eben gegooglet und da meinte jemand das es eine funtkion ist die sich selbst immer wieder aufruft, das hier war die frage:


    Header size: 8736 bytes
    Code size: 1422004 bytes
    Data size: 1701048 bytes
    Stack/heap size: 16384 bytes; estimated max. usage: unknown, due to recursion
    Total requirements: 3148172 bytes


    This has something to do with memory, right? Is it a problem if it says that, or is it more of a warning?


    Und hier die antwort von ihm:


    The warning appears due recursion


    Stack/heap size: 16384 bytes; estimated max. usage: unknown, due to recursion


    You got a function which call itself again and again


    That code would be enough to get that message



    #include <a_samp>


    main() {
    Stack();
    }


    Stack(count = 0) {
    new
    tmp[4_055] = "Hello World";
    #pragma unused tmp
    if(0 < (--count)) {
    Stack(count);
    }
    }


    in that case put the tmp outside (global) or use a local static variable


    ich nehme mal an das es was mit der count funktion zu tun hat die du gebastelt hast. weist du wie man das wieder hinbekommt ?


    //EDIT:
    habe herrausgefunden woran es lag, und zwar einige leute meinten auch das einige strings zu lang sein könnten. Anscheinend ist dem compiler dieser string hier zu lang: new string[MAX_PLAYER_NAME * MAX_PLAYERS];


    denn wenn ich ihn auskommentiere und einen string erstelle der die länge 128 hat funktioniert es, jetzt die frage welche länge man jetzt nimmt :I, wenn ich mache: new string[MAX_PLAYER_NAME + MAX_PLAYERS]; würde es dann auch funktionieren ?

    Einmal editiert, zuletzt von KiraYamato ()

  • Ändere im Befehl:
    new string[MAX_PLAYER_NAME * MAX_PLAYERS];
    zu:
    new string[512];


    Dann müsste die Meldung weg gehen.
    Ich habe es über MAX_PLAYERS deklariert, da ich nicht weiß, wie viele Slots du hast, wahrscheinlich reicht es aber auch so.


    Alternativ kannst du versuchen, unter den Includes das einzufügen:
    #pragma dynamic 100000


    Schaue auch mal, ob du in der a_samp.inc die MAX_PLAYERS Anzahl auf die Anzahl deiner Slots im Server gesetzt hast, das spart ressourcen, sonst wird es immer mit 500 oder mehr kompiliert, obwohl du z.B. nur 50 Slots hast.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • der string:


    new string[MAX_PLAYER_NAME * MAX_PLAYERS];


    war in dem befehl ^^


    Ich habe im include a_samp als max_players 100 definiert :) also standart halt, ich glaube ich lass das einfach so und setze die länge von string auf 512 so wie du gesagt hast ^^