Befehle mit Übergabewerten

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
  • Hallo DMA,
    ich hab auch (nach folgendem Schema : http://forum.sa-mp.com/index.php?topic=79810.0#post_data ) einen "Speedtest" durchgeführt und habe nun unter "main ()" folgendes stehen:


    main()
    {
    print("\n----------------------------------");
    print(" usefull script snippets and test");
    print("----------------------------------\n");


    new
    time1,
    time2,
    time3,
    time4;
    time1 = GetTickCount();
    for(new i = 0;i < 1000000;i++) {
    strget("lol lol lol lol lol lol lol lol lol",3);
    }
    time2 = GetTickCount();
    time3 = GetTickCount();
    for(new a = 0;a < 1000000;a++) {
    strret4("lol lol lol lol lol lol lol lol lol",3,4);
    }
    time4 = GetTickCount();
    printf("%d | %d", time2 - time1,time4 - time3);
    }


    Output: ~6300 | ~5400


    Dies kann ich jedoch kaum glauben.



    Daher wollte ich fragen, ob ich nicht etwas falsch getan habe und ob dies so stimmen kann.




    Mit freundlichen Grüßen,


    KornChief.

  • Mein Geschwindigkeitstest:
    #include <a_samp>


    #define ITERATIONS 1000000


    stock explode(aExplode[][], sSource[], const sDelimiter[] = " ", iVertices = sizeof aExplode, iLength = sizeof aExplode[])
    {
    strins(sSource, sDelimiter, strlen(sSource), 28);
    new
    iNode,
    iPointer,
    iPrevious = -1,
    iDelimiter = strlen(sDelimiter);


    while(iNode < iVertices)
    {
    iPointer = strfind(sSource, sDelimiter, false, iPointer);


    if(iPointer == -1)
    {
    strmid(aExplode[iNode], sSource, iPrevious, iLength, iLength);
    break;
    }
    else
    {
    strmid(aExplode[iNode], sSource, iPrevious, iPointer, iLength);
    }


    iPrevious = (iPointer += iDelimiter);
    ++iNode;
    }


    return iPrevious;
    }


    stock strget(strx[], pos, search = ' ', len = sizeof strx)
    {
    new arg, ret[128], idxx;
    for (new i = 0; i < len; i++)
    {
    if(strx[i] == search || i == len || strx[i + 1] == 10)
    {
    arg++;
    if (arg == pos + 1)
    {
    ret[i-idxx] = EOS;
    return ret;
    }
    else if (arg == pos)
    idxx += 1;
    }
    else if (arg == pos)
    ret[i - idxx] = strx[i];
    }
    return ret;
    }


    stock strtok(const string[], &index,seperator=' ') {
    new length = strlen(string);
    new offset = index;
    new result[255];
    while ((index < length) && (string[index] != seperator) && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }


    result[index - offset] = EOS;
    if ((index < length) && (string[index] == seperator))
    {
    index++;
    }
    return result;
    }


    main()
    {
    new
    t0,
    t1,
    t2,
    t3,
    i;
    t0 = GetTickCount();
    for (i = 0; i < ITERATIONS; i++)
    {
    strget("a b", 0);
    }
    t1 = GetTickCount();
    for (i = 0; i < ITERATIONS; i++)
    {
    new b;
    strtok("a b", b);
    }
    t2 = GetTickCount();
    for (i = 0; i < ITERATIONS; i++)
    {
    new bla[2][32];
    explode(bla, "a b");
    }
    t3 = GetTickCount();
    printf("Strget() 1: %04d, Strtok() 2: %04d, Explode() 3: %04d\n", t1 - t0, t2 - t1, t3 - t2);
    }


    Damit sollte man sehr aussage kräfte Ergebnisse bekommen.

  • hey leute^^ Ich wollte ein /anmelden [PW] cmd machen und habs halt mit dcmd versucht. Nur leider speichert dieser es nicht.
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(anmelden,8,cmdtext);
    return 0;
    }


    dcmd_anmelden(playerid,params[])
    {
    new passwort[16];


    new Spielername[MAX_PLAYER_NAME], string[56];
    format(string,sizeof(string),"/%s.ini",Spielername);


    if(sscanf(params,"s",passwort)) {
    return SendClientMessage(playerid,falschrot,"/anmelden [Passwort]");}


    dini_Set(string, "Passwort", passwort);
    return 1;
    }

  • Denk Dran wenn die Datei nicht exestiert muss sie ja noch erstellt werden.

    if(!dini_Exists(string))
    {
    dini_Create(string);
    }


    Vielleicht liegts ja daran.


    //edit Und du hast doch sicher den dcmd und scanff code oben im gamemode mit eingebunden?!


    MFG Raicoon

    Einmal editiert, zuletzt von Raicoon ()

  • 10/10
    Super tutorial, ich mache gerade meine ganzen cmds in meinem RP script zu DCMD.
    Wird vielleicht dauern, aber egal; hauptsache es lohnt sich ^^
    Nicht das ich meinen eigenen RP server aufmache, ich scripte es einfach so und verkaufe es dann vllt wenn ich kb mehr drauf habe.


    Super tut nochmals, und super geile funktionen !! :O

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Normales cmd ("/bubble [text]"):
    if(strcmp(cmd, "/bubble", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(gPlayerLogged[playerid] == 0)
    {
    SendClientMessage(playerid, COLOR_GREY, "Du bist nicht eingeloggt!");
    return 1;
    }
    new length = strlen(cmdtext);
    while ((idx < length) && (cmdtext[idx] <= ' '))
    {
    idx++;
    }
    new offset = idx;
    new result[64];
    while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
    {
    result[idx - offset] = cmdtext[idx];
    idx++;
    }
    result[idx - offset] = EOS;
    if(!strlen(result))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Verwendung: /bubble [text]");
    return 1;
    }
    format(string,sizeof(string),"%s",result);
    SetPlayerChatBubble(playerid,string,COLOR_PURPLE,5.0,3000);
    }
    return 1;
    }


    DCMD ("/bubble [text]")
    dcmd_bubble(playerid, params[])
    {
    new bubbletext[16];
    if(sscanf(params, "s", bubbletext)) { return SendClientMessage(playerid, COLOR_GREY, "=> /bubble [text]"); }
    SetPlayerChatBubble(playerid, bubbletext, COLOR_WHITE, NAMETAG_DRAW_DISTANCE, 5000);
    return 1;
    }
    (und es geht sogar 2 zeilen kürzer XD):
    dcmd_bubble(playerid, params[]) {
    new bubbletext[16];
    if(sscanf(params, "s", bubbletext)) { return SendClientMessage(playerid, COLOR_GREY, "=> /bubble [text]"); }
    SetPlayerChatBubble(playerid, bubbletext, COLOR_WHITE, NAMETAG_DRAW_DISTANCE, 5000);
    return 1; }


    ich wundere mich, wie scripten mal so lustig sein kann xDD

  • Was ist daran lustig, es ist halt eine Funktion die einmal alles erledigt , genau das gleiche wenn du


    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof pname);


    Jedes mal neu holst obwohl du jedesmal eine Funktion nutzen könntest


    Spielername(playerid)
    {
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof pname);
    return pname;
    }


    Diese Funktion gibt Direkt das erforderliche wieder & man spart viel Arbeit

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Aber ehm hab eine frage ??


    Also man kann bei normalen commands ja auch kürzungen erstellen. z.B. /whisper & /w ist beides richtig.
    Also das meine ich:
    if(strcmp(cmd, "/whisper", true) == 0 || strcmp(cmd, "/wisper", true) == 0 || strcmp(cmd, "/w", true) == 0)


    Wie geht das bei dcmd ?! Würde das so funktionieren (also mit /w und /whisper) ??
    dcmd(whisper,1,true);
    So würde es mit /whisper UND /w gehn, oder? ^^


    Mfg Foxy

  • Das Problem bei dem Kommando das ab einer Stelle im Kommando ausließt ist das sich was überschneiden könnte sprich


    Code
    /hallo [text]
    /h [text]


    man schreibt /hallo darin wird /h erkannt der Text danach enthält auch Daten & es werden die Befehle von Kommando /h ausgeführt

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • dcmd_ann(playerid, params[]) {
    return dcmd_announce(playerid,params);
    }

    Angenommen /ann wäre dein /w und /announce dein /whisper


    Das Problem bei dem Kommando das ab einer Stelle im Kommando ausließt ist das sich was überschneiden könnte sprich


    Code
    /hallo [text]
    /h [text]


    man schreibt /hallo darin wird /h erkannt der Text danach enthält auch Daten & es werden die Befehle von Kommando /h ausgeführt


    Könnte man auch leicht umgehen indem man anstatt bestimmten Index via chrfind() [oder ähnlichem] das erste Leerzeichen sucht.Wäre aber keine schöne Variante.Lassen wir das aber lieber,verwirrt vielleicht einige Leute :P

  • dcmd(givegun,7,cmdtext);
    //ABküRZUNG:
    dcmd(g,1,cmdtext);


    dcmd_givegun(playerid, params[])
    {
    new pID,gun,ammo;
    if(!IsPlayerAdmin(playerid)) { return SendClientMessage(playerid, 0xFFFFFFAA, "Du darfst dieses Befehl nicht benutzen !"); }
    if(sscanf(params, "udd", pID, gun, ammo)) { return SendClientMessage(playerid, 0xFFFFFFAA, "SYNTAX: (/g)ivegun [playerid/name] [WaffenID] [Munition]"); }
    if(!IsPlayerConnected(pID)) { return SendClientMessage(playerid, 0xFFFFFFAA, "Ungültige ID !"); }
    if(ammo < 1 || ammo > 999) { return SendClientMessage(playerid, 0xFFFFFFAA, "Minimum 1, Maximal 999 Munition !"); }
    GivePlayerWeapon(pID, gun, ammo);
    return 1;
    }
    //ABKüRZUNG VOM COMMAND:
    dcmd_g(playerid, params[]) { return dcmd_givegun(playerid, params); }


    Boooooooaaaah, das macht voll SPAß dcmd zu scripten ^^ :D
    //edit
    und das beste ist, das der command so höllisch kurz ist (10 zeilen) obwohl es 3 parameter hat.
    aber man kann es auch kürzer machen, in dem man das CMD so macht das es jeder spieler benutzen kann, und das man unendlich munition geben kann. dann würden es etwa 2 zeilen weniger sein ^^ (erste stufe mathe xD :thumbup: )

    Einmal editiert, zuletzt von FoxHound ()

  • Zitat

    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.


    ach das geht bei RPG GM's doch garnicht, geben viel zu viele errors mit "undefined symbol" ^^

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen