MAX_PLAYERS - Dialog

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • MAX_PLAYERS - Dialog

      Ich release heute mal ein kleines System welches ich letzte Nacht kurz geschrieben habe. Es ist dazu da, einem Spieler einen Dialog anzuzeigen, zb. Mit allen connected Spielern oder mit allen Admins etc. Man kann dann ganz leicht unter OnPlayerDialogResponse das Listitem benutzen.

      Als erstes erstellen wir ein Makro für den Dialog.

      PAWN-Quellcode

      1. #define DIALOG_PLAYERS 1525 //1525 = Eindeutige DialogID.

      Dann brauchen wir noch eine Variable in der das Listitem zwischengespeichert wird.

      PAWN-Quellcode

      1. new item[MAX_PLAYERS][MAX_PLAYERS]; //Das 1. MAX_PLAYERS ist dafür da das das Array für jeden Spieler einzeln erstellt wird. Das 2. ist für die einzelnen Listitems da.

      Dann der Befehl:

      PAWN-Quellcode

      1. if(strcmp("/players", cmdtext, true) == 0)//Standart-Befehl halt
      2. {
      3. new iItem;//Variable damit das listitem richtig gesetzt wird
      4. new string[MAX_PLAYER_NAME*MAX_PLAYERS];//String
      5. new dName[MAX_PLAYER_NAME];//String für den Namen
      6. for(new i; i<MAX_PLAYERS; i++)//Schleife die alle Spieler durchgeht
      7. {
      8. if(!IsPlayerConnected(i))continue;//Wenn Spieler nicht Connected -> Continue
      9. //if(!IsPlayerAdmin(i))continue; <- Würde alle RCON-Admins anzeigen.
      10. GetPlayerName(i, dName, sizeof dName);//String mit Namen setzen
      11. format(string, sizeof string, "%s\n%s", string, dName);//String für den Dialog erweitern + nächsten Namen reinsetzen
      12. item[playerid][iItem] = i;//Listitem auf Playerid setzen
      13. iItem ++;//Listitem hochsetzen damit es das nächste ist
      14. }
      15. ShowPlayerDialog(playerid, DIALOG_PLAYERS, DIALOG_STYLE_LIST, "Spieler:", string, "Weiter","Abbrechen");//Dialog anzeigen
      16. return 1;
      17. }
      Alles anzeigen

      Dann noch ganz simpel bei OnPlayerDialogResponse:

      PAWN-Quellcode

      1. if(dialogid == DIALOG_PLAYERS)//Dialogid abfragen
      2. {
      3. if(!response)return 1;//Wenn er auf Abbrechen drückt -> Abbrechen
      4. //Hier kannst du nun item[playerid][listitem] für den gewählten Spieler verwenden.
      5. SendClientMessage(item[playerid][listitem], -1, "Dein Name wurde angeklickt!");
      6. }


      Wenn ihr noch Fragen habt, schreibt sie einfach hier im Thema!
      Bei Bugs natürlich auch ;)

      MfG.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SynonymousZ ()

    • Finde es soweit ganz gut, jedoch habe ich einwas zu beanstanden.

      new dName[MAX_PLAYER_NAME];//String für den Namen


      Ändere dies bitte zu:

      PAWN-Quellcode

      1. new dName[MAX_PLAYER_NAME+1];//String für den Namen


      Da es den abschliesenden Null Character noch gibt.

      Quelle: SA:MP Wiki GetPlayerName

      Note: A player's name can be up to 24 characters long (as of 0.3d R2).

      This is defined in a_samp as MAX_PLAYER_NAME.
      Strings to store names in should be made this size, plus one extra cell for the null terminating character.
      i.e. new pName[MAX_PLAYER_NAME+1];

    • Wenn ich InGame /wanted einegebe kommt Unknowed Command. 8|
      Warum?

      PAWN-Quellcode

      1. ocmd:wanted(playerid,params[])
      2. {
      3. new count=0,iItem;
      4. new string[MAX_PLAYER_NAME*MAX_PLAYERS];
      5. for(new i; i != GetMaxPlayers(); i++)
      6. {
      7. if (IsPlayerConnected(i))
      8. {
      9. if(SpielerInfo[i][pWanted] > 0)
      10. {
      11. new dName[MAX_PLAYER_NAME];
      12. GetPlayerName(i, dName, sizeof dName);
      13. format(string,sizeof(string),"%s %d\n%s %d",SpielerName(i),GetPlayerWantedLevel(i));
      14. item[playerid][iItem] = i;
      15. iItem ++;
      16. ShowPlayerDialog(i,DialogSubjects,DIALOG_STYLE_LIST,"Verbrecher Akte",string,"Ok","Abbrechen"); //OK Clearen beim anderen Dialog danach
      17. count++;
      18. return 1;
      19. }
      20. }
      21. }
      22. if (count == 0)
      23. {
      24. SendClientMessage(playerid, hellblau, "Niemand hat Wanteds!");
      25. return 1;
      26. }
      27. return 1;
      28. }
      Alles anzeigen


      - Tom

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tomsen ()

    • Änder doch nicht meinen Code so drastisch ab, dann kommen solche Fehler auch nicht. Soweit ichs jetzt sehe ist einmal der ShowPlayerDialog zu früh und das hier musst du ändern:

      PAWN-Quellcode

      1. format(string,sizeof(string),"%s %d\n%s %d",SpielerName(i),GetPlayerWantedLevel(i));

      zu

      PAWN-Quellcode

      1. format(string,sizeof(string),"%s\n%s %d",string,SpielerName(i),GetPlayerWantedLevel(i));

      Und das return 1; unter count++; hat auch keinen Sinn.
    • SynonymousZ schrieb:

      @ulbi1990:
      Unnötig.

      Das gilt zwar für den Namens-String den du setzen kannst, jedoch kannst du eh nur mit einem String von 20 Charactern auf einen Server connecten. Sprich eigentlich würde in diesem Fall ein Array von 21 Cells völlig reichen ;)


      Sorry das ich erst jetzt nen Reply schreibe, aber ich wollte dich nur einmal daran erinnern das es noch eine Funktion gibt welche sich SetPlayerName nennt und diese ist NICHT auf die 20 Character gebunden und es gibt hierbei genug Leute die bestimmt wenn jemand /afk geht oder was auch immer noch nen Tag ran geben, so sollte er nun schon 20 Character als Namen haben kommen diese hinzu und dein Code wird nicht mehr ohne Bugs laufen.
    • SynonymousZ schrieb:

      for(new i; i != GetMaxPlayers(); i++)

      Anstatt MAX_PLAYERS kannst du auch folgendes machen:

      PAWN-Quellcode

      1. for(new i, l=GetMaxPlayers(); i<l; i++)


      Und, wenn es sich vermeiden lässt, deklariert man keine Variablen in Schleifen.

      Aber, du kannst sie einfach in den "Header" der Schleife packen und dann sieht das so aus:

      PAWN-Quellcode

      1. for(new i, l=GetMaxPlayers(),dName[MAX_PLAYER_NAME]; i<l; i++)//Schleife die alle Spieler durchgeht
      2. {
      3. if(!IsPlayerConnected(i))continue;//Wenn Spieler nicht Connected -> Continue
      4. //if(!IsPlayerAdmin(i))continue; <- Würde alle RCON-Admins anzeigen.
      5. GetPlayerName(i, dName, sizeof dName);//String mit Namen setzen
      6. format(string, sizeof string, "%s\n%s", string, dName);//String für den Dialog erweitern + nächsten Namen reinsetzen
      7. item[playerid][iItem] = i;//Listitem auf Playerid setzen
      8. iItem ++;//Listitem hochsetzen damit es das nächste ist
      9. }


      mfg. :thumbup:


      Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
    • SynonymousZ schrieb:

      Kaliber schrieb:

      Anstatt MAX_PLAYERS kannst du auch folgendes machen:

      Hab es jetzt aber als MAX_PLAYERS, wenn man sein MAX_PLAYERS nicht selbstständig runtersetzt ist es halt so, brauch ich mich ja nicht drum kümmern die Schleife kürzer zu machen :D

      Und, wenn es sich vermeiden lässt, deklariert man keine Variablen in Schleifen.

      Hab es nun außerhalb der Schleife.


      Hallo SynonymousZ ich möchte dir mal etwas zum Thema Dialoge erläutern , wenn du ein listitem anklickst wird der inhalt an den Funktionparameter inputtext übergeben,
      daher wird kein extra array benötigt für die listitemid.

      Ich setze immer eine ID bei sowas vor dem listitem, ein beispiel hier die Spielerid.

      [0] Hans
      [1] Dieter
      [2] Peter
      ...

      wenn du den Dialog so formatierst kannst du mit paar Stringfunktionen diese Zahl extrahieren

      Beispielcode mit dem du das kurz testen kannst:

      PAWN-Quellcode

      1. new inputtext[20] = "[12] Peter";
      2. strdel(inputtext,0,1);
      3. strdel(inputtext,strfind(inputtext,"]",0),strlen(inputtext));
      4. new pID = strval(inputtext);
      5. printf("%d",pID);