Angepinnt Nützliche Codeschnipsel

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

    • PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
      2. new gstring[MAX_PLAYERS];

      mann kann dadurch die format zeile Sparen.
      Beispiel:

      PAWN-Quellcode

      1. scm(playerid,Weiß,"Mein Name ist %s.",PlayerName(playerid));


      könnte für neulinge nützlich werden

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von huGGy () aus folgendem Grund: Edit1: code erneuert Edit2: code optimiert Edit3: fehler behoben Edit4: rechtschreibung

    • hallo

      PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
      2. new gstring[MAX_PLAYERS];



      ich hab irgendwo das gefunden, was ist von deinem der unterschied zu dem ? oder was ist besser oder schlechter ?

      PAWN-Quellcode

      1. #define SendText(%0,%1,%2,%3) do{new _string[128]; format(_string,sizeof(_string),%2,%3); SendClientMessage(%0,%1,_string);} while(False)



      mfg

    • Markus20 schrieb:

      und was bringt das in meinem code, bei dir ist es ja auch nicht

      PAWN-Quellcode

      1. do{ } while(False)

      Fuer den fall, dass das Makro, wie ein Funktionsaufruf nach einem if() aufgerufen wird:

      PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
      2. new gstring[MAX_PLAYERS];
      3. if( .. ) scm(playerid, fmt, vars);
      4. else
      5. ...

      wird zu:

      PAWN-Quellcode

      1. if( .. )format(...); SendClientMessage(..);
      2. else
      3. ...

      Resultiert also in einem Fehler, da das format() nur aufgerufen wird, wenn das if wahr ist. Das SendClientMessage() immer aufgerufen wird und das else kein if() mehr vor sich hat.
      Im gegensatz dazu:

      PAWN-Quellcode

      1. #define SendText(%0,%1,%2,%3) do{new _string[128]; format(_string,sizeof(_string),%2,%3); SendClientMessage(%0,%1,_string);} while(False)
      2. if ( .. ) SendText(playerid, fmt, vars);
      3. else
      4. ...

      wird zu:

      PAWN-Quellcode

      1. if ( .. ) do{ new ...; format(..); SendClientMessage(..); }while(False);
      2. else
      3. ...

      Dort entsteht kein Fehler in einem solchen Fall.

      Das scm Makro, so wie es ist, kann maximal fuer MAX_PLAYERS - 128 verwendet werden:

      PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
      2. #define MAX_PLAYERS 500
      3. new gstring[MAX_PLAYERS];
      4. playerid = 499;
      5. scm( playerid, ... );

      PAWN-Quellcode

      1. format( gstring[499], 128, ... );

      Sofern der Compiler das zulaesst wuerde ein Puffer ueberlauf dort entstehen, da nur noch eine Zelle (4byte) zur Verfuegung steht und format dort 128 Zellen (512byte) reinschreiben darf.

      Folgendes Makro sollte, aber beide der genannten Fehler beheben:

      PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4) {format(gstring,sizeof(gstring),%3,%4); SendClientMessage(%1,%2,gstring);}
      2. new gstring[128];
      "#pragma tabsize 0", "#pragma semicolon 0" und "#tryinclude" anstatt "#include" koennen viele Probleme mit fehlenden Dateien, nervigen Einrueckungen und dem nutzlosen Semikolon am Ende einer Zeile loesen. Aber Achtung: Bei dem schreiben von moeglichst vielen Befehlen in einer Zeile, was fuer einen echten, platzsparenden, Scripter unerlaesslich ist, muss man weiterhin ein semikolon nach den Befehlen setzen.
      Wenn diese Tipps nicht euer Problem geloest haben, dann schreibt einfach folgenden Code an den Anfang des Skripts:

      Quellcode

      1. main(){}
      2. #endinput
      Nun sollte Pawn euch keine Fehler mehr beim Kompilieren zeigen.
      Viel Spass beim platzsparenden Scripten.

    • danke, habs jetzt verstanden
      aber weißt du noch was ressourcen schonender ist ?


      ich glaub ja das hier, bin mir nicht sicher

      PAWN-Quellcode

      1. #define scm(%1,%2,%3,%4) {format(gstring,sizeof(gstring),%3,%4); SendClientMessage(%1,%2,gstring);}
      2. new gstring[128];
    • Ist es nicht.
      Am besten ist immer noch die normale "Form"
      denn bei euch ist immer der string 128 Zeichen lang, egal ob sie genutzt werden oder nicht.

      PS: W0t?
      3800 Beiträge das sind ein paar zuviel :/
      "Bevor ich mir Informationen aus der "Bild" hole,
      werde ich anfangen, Wahlergebnisse danach vorauszusagen,
      neben welchen Busch unsere Katze gepinkelt hat."
      Margarete Stokowski
    • Teleportmenu

      Ganz oben:

      PAWN-Quellcode

      1. /* *****Gescriptet/Geschrieben von Digidiligitia und zum Laufengebracht von [GGR]Radio_Bot aka. dome
      2. http://forum.sa-mp.de/san-andreas-multiplayer/scripting-base/99103-finde-meinen-fehler-nicht ***** */
      3. //Kurzcodes
      4. #define ShowPlayerDialog SPD
      5. #define SendClientMessage SCM
      6. #define SetPlayerPos SPP
      7. //Dialoge
      8. #define DIALOG_TELEPORT 1
      9. //Farben
      10. #define Orange 0xFFAA00FF
      11. #define Blau 0x0000FFFF
      Alles anzeigen


      Unter OnPlayerCommandText:

      PAWN-Quellcode

      1. if (strcmp(cmdtext,"/teleportmenu",true)== 0)
      2. {
      3. SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}] Willkommen im Teleportmenu!");
      4. SPD(playerid,DIALOG_TELEPORT,DIALOG_STYLE_LIST,"Teleportmenu","BurgerShotNorth [BSN]\nStadthalle\nLSPD","xx","xx");
      5. return 1;
      6. }


      Unter OnDialogResponse:

      PAWN-Quellcode

      1. if(dialogid == DIALOG_TELEPORT)
      2. {
      3. if(response)
      4. {
      5. if(listitem == 0)
      6. {
      7. SPP(playerid,1227.1797,-914.0590,42.6812);
      8. SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
      9. }
      10. if(listitem == 1)
      11. {
      12. SPP(playerid,1479.8236,-1733.3818,13.3828,347.4181);
      13. SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
      14. }
      15. if(listitem == 2)
      16. {
      17. SPP(playerid,1528.8275,-1675.9098,13.3828,342.0914);
      18. SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
      19. }
      20. }
      21. else
      22. {
      23. SCM(playerid,Blau," ");
      24. SCM(playerid,Blau," ");
      25. SCM(playerid,Blau," ");
      26. SCM(playerid,Blau," ");
      27. SCM(playerid,Blau," ");
      28. SCM(playerid,Blau," ");
      29. SCM(playerid,Blau,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Teleportmenu: Bis dann!");
      30. }
      31. }
      Alles anzeigen


      PS: Kann immer erweitert werden :thumbsup:
    • Ich trag jetzt auch mal wieder was bei ^^
      Das ist eine Funktion, die alle 6 Leerzeichen ein "\n" einsetzt.
      Gut für z.B. ein Reportsystem im Dialog ;)

      PAWN-Quellcode

      1. stock TextCheck(text[])
      2. {
      3. new insert_when = 6; //Hier die Anzahl der Leerzeichen eingeben, wann er eine neue Zeile einsetzen soll
      4. new i, newtext[1024];
      5. format(newtext,1024,"%s",text);
      6. for(new y; y!=1024; y++)
      7. {
      8. if(newtext[y] == ' ')
      9. {
      10. i += 1;
      11. if(i == insert_when)
      12. {
      13. strdel(newtext,y,y);
      14. strins(newtext,"\n",y);
      15. i = 0;
      16. }
      17. }
      18. }
      19. format(newtext,1024,"%s",str_replace("\n ", "\n", newtext));
      20. return newtext;
      21. }
      Alles anzeigen
      Unkompetent. Das neue dynamisch.



      Wenn du dich mit Scripten befassen würdest, würdest du das auch selber schaffen...
      Selbst der Ersteller des Systems ist nicht als Profi vom Baum gefallen ;)

      //EDIT: Rechtschreibung


      @OT: Auf Wunsch von SaArDeNy für meinen 1000 Post:
      I hate you DeNy :evil:
      Beschde Designer!!!



      {WoR]Fußboden schrieb:

      ihr seit schon lustig postet erros aber nicht die zeilen wo sie sind dann können wir euch auch nicht helfen^^


      Lernt Scripten, Leute, und macht eure Augen auf!

      _______________________________________
      50 Beiträge: [x] 300 Beiträge: [x]
      100 Beiträge: [x] 500 Beiträge: [x]
      150 Beiträge: [x] 1000 Beiträge: [x]
      200 Beiträge: [x]
      2000 Beiträge: []
      250 Beiträge: [X] Boardaktivitäten: Profil


      _______________________________________

      Eliot Ness schrieb:

      /Edit: Schmerzt es dir eigentlich nicht so ein Müll zu schreiben 8|
      Bei strcmp Befehl darfst du keine Leerzeichen machen. Also jedenfalls nicht so ;O