Angepinnt Befehle mit Übergabewerten

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

    • Befehle mit Übergabewerten

      Commands mit Parameter,was ist das?
      An Beispielen wird euch das sicherlich deutlich,

      Keine Paramter:
      /lossantos - einfacher Teleport
      /help
      /time

      Mit Paramtern:
      /kick [playerid]
      /announce [text]
      /register [passwort] [password]



      Natürlich ist den meisten hier im Forum die strtok variante sehr geläufig bei Commands mit Paramtern,eventuell
      auch Commands mit strget zu erstellen.Doch es geht bei weitem einfacher und schneller
      sowohl bei der Ausführung durch den Server als auch beim scripten.

      Ich spreche von der Methode Commands zu erstellen in Verbindung von dcmd und sscanf.
      Vorteile:
      * Command ist viel besser strukturiert und besser lesbar
      * CPU schonender als strtok oder strget (Code wird schneller ausgeführt durch CPU->Kann laggs vermindern)
      * Bessere Gesamtstruktur des Scriptes (Es ist möglich die Commands in einem extra include aufzubewahren)
      * DCMD enthält einen Filter (Command muss exakt eingegeben werden)

      Hier ein einfaches Beispiel wie ein einfacher Command aussehen könnte mit einem extra Parameter,
      /kick [playerid]

      PAWN-Quellcode

      1. public OnPlayerCommandText(playerid, cmdtext[])
      2. {
      3. new
      4. idx,
      5. cmd[128];
      6. cmd=strtok(cmdtext,idx);
      7. if(!strcmp(cmd,"/kick",true,5)) {
      8. new
      9. sID[128],
      10. pID;
      11. sID=strtok(cmdtext,idx);
      12. if(!strlen(sID)) {
      13. return SendClientMessage(playerid,COLOR_RED,"USAGE: /kick [playerid]");
      14. }
      15. pID=strval(sID);
      16. if(!IsPlayerConnected(pID)) {
      17. return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online");
      18. }
      19. Kick(pID);
      20. SendClientMessage(playerid,COLOR_YELLOW,"Erfolgreich Spieler vom Server gekickt!");
      21. }
      22. return 0;
      23. }
      Alles anzeigen

      Natürlich funktioniert der Command auch so wunderbar,aber nur weil es funktioniert heisst nicht,dass es
      so auch die beste Lösung ist.Sehr anläufig für viele Bugs.Was ist wenn wir einen String bestehend aus "gwefd23f%D" in einen Integer konvertieren wollen?Gut,dafür gibt es IsNumeric,aber wir werden später sehen,es geht besser.
      Dazu kommt,dass man so auch euren Server crashen kann (Ja,das ist tatsächlich möglich mit dem Beispielcommand).

      dcmd
      Erfinder des dcmd's ist Dracoblue,vielleicht kennt ihr ihn eher von DINI,DUDB,Dutils oder djason.Das sind ebenfalls seine Werke.
      Als erstes brauchen wir das dcmd-Macro.


      PAWN-Quellcode

      1. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


      Der Command nun in der dcmd Form

      PAWN-Quellcode

      1. public OnPlayerCommandText(playerid, cmdtext[])
      2. {
      3. dcmd(kick,4,cmdtext);
      4. return 0;
      5. }
      6. dcmd_kick(playerid,params[]) {
      7. if(!strlen(params)) {
      8. return SendClientMessage(playerid,COLOR_RED,"USAGE: /kick [playerid]");
      9. }
      10. new
      11. pID=strval(params);
      12. if(!IsPlayerConnected(pID)) {
      13. return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online");
      14. }
      15. Kick(pID);
      16. SendClientMessage(playerid,COLOR_YELLOW,"Erfolgreich Spieler vom Server gekickt!");
      17. return 1;
      18. }
      Alles anzeigen

      Auf den ersten Blick ist der Code nicht unbedingt viel kürzer,aber die länge ist nicht unbedingt ein wichtiges
      Merkmal wie gut oder schlecht ein Code ist.Oft ist trotzdem kürzer besser ;P
      Nun zu der Erklärung.Wie bereits erwähnt ist der Code lediglich etwas kürzer,dennoch wie Ich finde viel übersichtlicher
      da das OnPlayerCommandText - Callback nicht voller endloslangen Codes ist.
      Was bedeutet aber die Zeile in OnPlayerCommandText genau?

      dcmd(kick,4,cmdtext);


      kick,dass ist der Name des Commands den wir im 3 Paramter,cmdtext suchen.Es wird
      überprüft ob ein Spieler /kick eingegeben hat.Die 4 steht dabei für die länge von kick.Das ganze muss man
      ohne / angeben.Wieso ist relativ unwichtig,es sollte für den normalen gebrauch reichen.
      Wichtig ist noch zu wissen,dass die Definitionszeile ( dcmd(<cmdname>,<cmdlänge>,<source>) ) immer unter das Callback OnPlayerCommandText(playerid,cmdtext[]) gehört.
      So müsste als Beispiel die Definition von /ban aussehene:

      PAWN-Quellcode

      1. dcmd(ban,3,cmdtext);


      Kommen wir nun zu dem eigentlichen Command,dcmd_kick:
      Wieso es dcmd_kick heisst sollte relativ klar sein,es ist einfach der Name des Commands.
      Nun zu den Parametern.
      dcmd_kick(playerid,params[])

      Der erste Paramter,playerid ist wie der Name sagt die playerid von demjenigen der den Command ausgeführt hat.Der zweite Paramter wird meistens params genannt.Falls der Spieler nun /kick 34er2 eingegeben hat,würde params nun 34er2 enthalten.Sollte er auch nur /kick eingegeben hat,enthält params nicht.Ist also ein leerer String.
      Wenn man das ganzes einmal verstanden hat,wird man merken das es so sehr sehr einfach ist.
      Es gibt außerdem noch einen weitern Vorteil bei dcmd.Es enthält einen "Filter".Wer sich das ganze mal angucken möchte,nur zu: [HowTo] Fast command processor: DCMD
      Allerdings müsste man auch strtok wieder benutzten,sobald man mehr als einen Paramter haben möchte in seinem Command,zB /kick [playerid] [grund].Jetzt kommt sscanf zum Einsatz.

      Wenn die Funktion keine Parameter braucht, (zB bei Teleportcommands wie /sf (Teleportiert Spieler nach San Fierro)) kann man
      folgende Warnung leicht unterdrücken.
      warning 203: symbol is never used: "params"


      PAWN-Quellcode

      1. dcmd_info(playerid, params[]) {
      2. #pragma unused params
      3. //Do something here
      4. }


      Update 19.8.2010, Tutorial auf 2 ( 3 ) Post's aufgeteilt,da das Postlimit erreicht wurde ( Kein Edit mehr möglich ).

      >> Teil 2 des Tutorials

      Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von Goldkiller ()

    • Jo zumal der Gebrauch von dcmd noch andere Vorteile mit sich bringt. Zum einen natürlich die hier angesprochene bessere Übersichtlichkeit und eine bessere Struktur. Zum anderen ist die Methode dcmd-sscanf 30-40 mal schneller als die strcmp-strtok Geschichte, eure Server-CPU wirds euch also auch danke ;)
      Zum dritten kann man damit wirklich sehr elegant seinen gamemode strukturieren, indem man die Commands in eine include reinpfeffert, und so vor allem Freeroam oder RolePlay-Skripte viel übersichtlicher machen kann, weil in diesen Skripten, OnPlayerCommandText auch mal gerne die Hälfte der .pwn einnehmen kann.

      @Goldkiller:
      Schönes Tutorial, ist auch gut verständlich geschrieben.
    • Der Datentyp "u" ist natürlich was sehr feines.Gibts glaub ich noch gar nicht so lange.
      Damit ist es jetzt sogar noch einfacher Commands mit Parametern zu erstellen bei denen ein Parameter der Spieler ist.

      Zum dritten kann man damit wirklich sehr elegant seinen gamemode strukturieren, indem man die Commands in eine include reinpfeffert, und so vor allem Freeroam oder RolePlay-Skripte viel übersichtlicher machen kann, weil in diesen Skripten, OnPlayerCommandText auch mal gerne die Hälfte der .pwn einnehmen kann.

      Ist generell ekelig sich so ein Script anzugucken.Wenn ich schon sehe das dort überall tmp=strtok,cmd=strtok ... steht landet das Script im Papierkorb X/ .Versteht man meist nur Bahnhof wenn man den Code nur überfliegt.Bei sscanf kann man trotz überfliegen den Command leicht und schnell verstehen.
    • PAWN-Quellcode

      1. public OnPlayerCommandText(playerid, cmdtext[])
      2. {
      3. dcmd(givemoney,9,cmdtext);
      4. return 0;
      5. }
      6. dcmd_givemoney(playerid,params[])
      7. {
      8. new moneyid, moneyamount;
      9. if(sscanf(params,"dd",moneyid,moneyamount))
      10. {
      11. SendClientMessage(playerid,0xFF0000FF," [FEHLER]: /givemoney [id] [money] ");
      12. }
      13. else if(!IsPlayerConnected(moneyid))
      14. {
      15. SendClientMessage(playerid,0xFF0000FF," Spieler nicht gefunden!");
      16. }
      17. else if(moneyamount < 1 || moneyamount > 9999)
      18. {
      19. SendClientMessage(playerid,0xFF0000FF," Summe ungültig!");
      20. }
      21. else
      22. {
      23. GivePlayerMoney(moneyid,moneyamount);
      24. GivePlayerMoney(playerid,-moneyamount);
      25. }
      26. return 1;
      27. }
      Alles anzeigen

      Ein Command von mir :D
      Es ist wirklich einfacher, als ich dachte. Trotzdem werde ich nicht meinen ganzen GM umbauen ;)

      Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

    • strget ist garnicht albern.
      Die Funktion ist einfach nur ein verkürzstes Strtok von mir.
      Zumal sie viel schneller im Quelltext eingearbeitet werden kann. :>

      PAWN-Quellcode

      1. &x = strget(cmdtext, 0, ' ');
      >:)
      DMA @ Twitter: hier
      C & JAVA Videotutorials auf DevCornerNow

      Programmieraufträge & kalkulationen per PN.
      SA:MP Egal ob Fehlerreparatur oder Scriptteile, beides wird erstellt. (Auch Nischen wie SQLite können bedient werden. ;-))
      sonstige Sprachen:
      • C
      • C++
      • C#
      • D
      • PAWN
      • JavaScript (HTML5)
      • PHP
      • Perl
      • SQL
      Assembler:
      • 6502
      • x86
      • IA64
      • PowerPC

      Momentan
      • Z-C (programming language)
      • CGI-PAWN (pawn for webprogramming)



    • also wenn man ein GM hat, wo alles noch beim Alten ist, ist das ziemlich umsändlich alles zu ändern.... weiß da einer ne Möglichkeit, dass man durch ein "Script" oder sonstwas durchlaufen lassen könnte, dass alles umschreibt ?... :(
      Ansonsten, ist es ein Problem, wenn ich das alte lasse und mit dem neuen anfange?

      San Andreas [Fun]RealLife
      [ TOOL ] Grex's RCON Tool
      "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher" - Albert Einstein
    • Die einzige Möglichkeit wäre, eigenständig alle Commands auf dcmd & sscanf umzuschreiben. Ich überlege mir gerade ob ich ein GF so umschreiben und dann veröffentlichen sollte. Ein Haufen Arbeit, aber, es lohnt sich ganz sicher.
      Help dcmd & sscanf to their way to Pawn domination. Read the tutorial below, and use it.
      dcmd & sscanf
    • PAWN-Quellcode

      1. dcmd_jail(playerid,params[]) {
      2. new target;
      3. if(sscanf(params,"u",target)) {
      4. if(IsACop(playerid)) { // GF Deklaration
      5. return SendClientMessage(playerid, 0xFF0000FF, "Benutze /jail [PlayerID] um jemanden ins Gefängnis zu stecken.");
      6. }}
      7. if(IsACop(target)) {
      8. return SendClientMessage(playerid, 0xFF0000FF, "Der angegebene User ist ein Cop!");
      9. // ...... Hier den eig. Jail Code reinschreiben, z.B. SetPlayerPos(......) usw.
      10. // ......
      11. return 1;
      12. }
      Alles anzeigen
    • hey cooles tut XD

      ich hab da ma ne frage:

      funktioniert dashier?

      PAWN-Quellcode

      1. if (sscanf(params, "d/d/d", Tag, Monat, Jahr))

      also das man jetzt "24/7/1990" eingeben muss. also die 3 daten mit "/" voneinander trennen und ohne "/" am anfang eingeben muss.

      MFG
      Ich


      MY SELFMADE GAMEMODE "NoName"
      Spoiler anzeigen


      - AccountSystem: 100%
      - LizenzenSystem: 5%
      - TelefonSystem: 5%
      - JobSystem: 3%
      - GeldSystem: 80%
      - AutoSystem: 75%
      - FahndungsSystem: 10%
      - HausSystem: 0%
      - GeschäftsSystem: 0%
      - ZahlTag System: 0%
      - WetterSystem: 0%
      - AntiCheatSystem: 0%

      GameModeName: [GM]MyGamemode
      Filterscripts: None
      Benutze Includes: [Inc]MyInclude
      Voraussichtliche Fertigstellung: Unbekannt
      Voraussichtliche Servereröffnung: Unbekannt
      Voraussichtliche Veröffentlichung des Scripts: Wahrscheinlich NIE
      Voraussichtliche Veröffentlichung des Scripts: Wahrscheinlich NIE
      Sonstige Anmerkungen: Selfmade