Schleife und Dialog .. Problem mit OnDialogResponse

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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 derzeit dabei ein neues Sanitäter System zu machen



    if(strcmp(cmd,"/aufträge", true) == 0) // jobchat
    {
    if(PlayerInfo[playerid][sMember] != 4)
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Du bist kein Sanitäter!");
    return 1;
    }
    new mvstring[800];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[i][pTot] == 1)
    {
    new LocationZone[MAX_ZONE_NAME];
    GetPlayer2DZone(i, LocationZone, MAX_ZONE_NAME);
    format(mvstring,800,"%s%s Position: %s, Restliche Zeit: %d\n",mvstring,GetName(i),LocationZone,PlayerInfo[i][pTotTime]);
    }
    }
    }
    ShowPlayerDialog(playerid,DIALOG_AUFTRAGE,DIALOG_STYLE_LIST,"Sanitäter Aufträge",mvstring,"Auswählen","Abbrechen");
    return 1;
    }



    Das Funktioniert so auch Problemlos allerdings weiß ich nicht wie ich an die playerid unter "OnDialogResponse" kommen soll weil Listitem listet ja nicht die playerid auf





    if(dialogid == DIALOG_AUFTRAGE)
    {
    new i = INVALID_PLAYER_ID;
    sscanf(inputtext, "'ID: 'd", i);
    SetPlayerCheckpoint(playerid, PlayerInfo[i][pPos_x],PlayerInfo[i][pPos_y],PlayerInfo[i][pPos_z], 3.0);// Timer als Gametext setten wenn auftrag angenommen wird
    new stringd[128];
    format(stringd,128,"<< %s %s hat den Auftrag von %s angenommen! >>",GetFrakRang(PlayerInfo[playerid][pRank],PlayerInfo[playerid][sMember]),GetName(playerid),GetName(i));
    SendFamilyMessage(4, COLOR_LIGHTRED, stringd);
    format(stringd, sizeof(stringd), "* Du hast den Auftrag von %s angenommen! Du hast nun %d Sekunden Zeit.", GetName(i),PlayerInfo[i][pTotTime]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, stringd);
    PlayerInfo[playerid][pAuftrag] = PlayerInfo[i][pTotTime];
    return 1;
    }


    Bei "i" Muss ja die Playerid von dem angeklicken spieler hin


    Wie mache ich das ? Mfg

    Einmal editiert, zuletzt von seegras () aus folgendem Grund: Code ein wenig eingerückt

  • Gibts es zwei (mir spontan einfallende) Möglichkeiten:


    1. Du gibst die ID an und holst dir dann aus dem String inputtext die ID raus (per sscanf oder ähnlichem).
    2. Du erstellst zwei globale Variablen, die eine nutzt zu dem index hochzählen, die andere zum speichern der spielerID, dabei entspricht der Index jeweils dem row (sprich erste Zeile = index 0, zweite Zeile = index 1, ...). Kann dir ggf. mal ein Beispiel raussuchen, sollten eig. welche im Forum findbar sein.


    Ist halt Geschmackssache, hat halt je nach Methode seine Vor- und Nachteile.

  • Beispiel 1 wäre folgendes:


    Code
    format(mvstring,800,"%s%s ( ID: %d ) Position: %s, Restliche Zeit: %d\n",mvstring,GetName(i),i,LocationZone,PlayerInfo[i][pTotTime]);


    und um den Namen dann zu ermitteln (unter OnDialogResponse):



    Code
    new id = INVALID_PLAYER_ID;
    sscanf(inputtext, "'ID: 'd", id);


    Das geht aber nur, wenn du das sscanf - Plugin verwendest (was generell empfehlenswert ist).

  • Bei mir passiert dann aber nix mehr wenn ich den auftrag annehme



    if(dialogid == DIALOG_AUFTRAGE)
    {
    new i = INVALID_PLAYER_ID;
    sscanf(inputtext, "'ID: 'd", i);
    SetPlayerCheckpoint(playerid, PlayerInfo[i][pPos_x],PlayerInfo[i][pPos_y],PlayerInfo[i][pPos_z], 3.0);// Timer als Gametext setten wenn auftrag angenommen wird
    new stringd[128];
    format(stringd,128,"<< %s %s hat den Auftrag von %s angenommen! >>",GetFrakRang(PlayerInfo[playerid][pRank],PlayerInfo[playerid][sMember]),GetName(playerid),GetName(i));
    SendFamilyMessage(4, COLOR_LIGHTRED, stringd);
    format(stringd, sizeof(stringd), "* Du hast den Auftrag von %s angenommen! Du hast nun %d Sekunden Zeit.", GetName(i),PlayerInfo[i][pTotTime]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, stringd);
    PlayerInfo[playerid][pAuftrag] = PlayerInfo[i][pTotTime];
    return 1;
    }



    Die meldung kommt nicht

  • Ja, per zwei globale Variablen, Beispiel wäre:


    Code
    new DialogTemp[MAX_PLAYERS][50];
    new DialogTempIndex[MAX_PLAYERS];

    Dann innerhalb des Schleifenrumpfs:

    Code
    DialogTemp[playerid][DialogTempIndex[playerid]++] = i;


    Vor dem Schleifenrumpf setzt du dann DialogTempIndex = 0.
    Dann kannst du innerhalb OnDialogResponse auf die ID per


    Code
    new id = DialogTemp[playerid][listitem];

    zugreifen. Die 50 kannst du beliebig ändern, je nach dem wie viele rows du innerhalb deines Dialogs anzeigen wirst.