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
  • bei mir hagelts Warnings un Errors O.o








    dcmd_kick(playerid,params[])
    {
    new
    sGrund[128],
    pID;
    if(sscanf(params, "dz",pID,sGrund))
    {
    return SendClientMessage(playerid,COLOR_RED,"USAGE: /kick [playerid] ([grund],optional)");
    }
    if(!IsPlayerConnected(pID))
    {
    return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online");
    }
    new
    ThePlayer[MAX_PLAYER_NAME],
    string[128];
    GetPlayerName(pID,ThePlayer,sizeof(ThePlayer));
    format(string,sizeof(string),"%s (ID %d) wurde vom Server gekickt,Grund: %s",ThePlayer,pID,sGrund[0] ? sGrund : "<Kein Grund>");
    SendClientMessageToAll(COLOR_YELLOW,string);
    Kick(pID);
    return 1;
    }


    if(strcmp(cmd, "/mafiazu1", true) == 0) {
    MoveObject (mafia1, 2635.129150, 1369.242554, 11.618702, 2.5);
    return 1;
    }

  • dcmd_sethealth(playerid,params[]) { new pID, Float:fHP; if(sscanf(params, "df",pID,fHP)) { return SendClientMessage(playerid,COLOR_RED,"USAGE: /sethealth [playerid] [healthpoints]"); } if(!IsPlayerConnected(pID)) { return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online"); } new ThePlayer[MAX_PLAYER_NAME], string[128]; GetPlayerName(pID,ThePlayer,sizeof(ThePlayer)); SetPlayerHealth(pID,fHP); format(string,sizeof(string),"%s (ID %d) Healtpoints wurden von %d auf %.1f gesetzt!",ThePlayer,pID,playerid,fHP); SendClientMessageToAll(COLOR_YELLOW,string); return 1; }

    an der makierten stelle kann doch was net stimmen O_o
    bei mir kommt dann immer die ID statt [..] von "hp xD" auf "hp dannach" [..]
    sondern bei "hp xD" ist dann die ID O_o help XD

  • wieso sollte ich? goldkiller hat dieses tut + beispiel gemacht deswegen sollte man denken das es funktionieren sollte.


    also weißt du wie man das nun richtig ändert? einfach durch ein float:health machen? vorher ein float:health = GetPlayerHealth(playerid); ? XDD
    sry fange gerade mit dcmd (parametern allgemein) an.

  • - - -
    Edit:
    Verstehe,nach langem nachdenken hab ich endlich verstanden was du mit dem Quark da meinst.
    Wäre wahrscheinlich schlauer gewesen es gleich als "ID: XX" zu kennzeichnen um eine Verwirrung auszuschließen.Hab dir das mal überarbeitet.
    dcmd_sethealth(playerid,params[])
    {
    new
    pID,
    Float:fHP;
    if(sscanf(params, "df",pID,fHP)) {
    return SendClientMessage(playerid,COLOR_RED,"USAGE: /sethealth [playerid] [healthpoints]");


    }
    if(!IsPlayerConnected(pID)) {
    return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online");


    }
    new
    ThePlayer[MAX_PLAYER_NAME],
    GivePlayer[MAX_PLAYER_NAME],
    string[128];
    GetPlayerName(pID,GivePlayer,sizeof(GivePlayer));
    GetPlayerName(playerid,ThePlayer,sizeof(ThePlayer));
    SetPlayerHealth(pID,fHP);
    format(string,sizeof(string),"%s (ID %d) Healtpoints wurden von %s (ID %d) auf %.1f gesetzt!",GivePlayer,pID,ThePlayer,playerid,fHP);
    SendClientMessageToAll(COLOR_YELLOW,string);
    return 1;
    }

    3 Mal editiert, zuletzt von Goldkiller ()

  • Da fehlt GetPlayerName(playerid,pID,sizeof(pID));


    dcmd_test(playerid,params[])
    {
    new
    pID,
    string[128];
    if(sscanf(params, "d", pID))
    {
    SendClientMessage(playerid, COLOR_INFO, "Benutze bitte: /test[ID]");
    return 1;
    }
    GetPlayerName(playerid,pID,sizeof(pID));
    format(string, sizeof(string), "Dies ist ein Test. ID %d", pID);
    SendClientMessage(playerid ,COLOR_RED, string);
    return 1;
    }

  • also mit dcmd komme ich gut zurecht, nur mit sscanf hab ich soeinige probleme....


    weiß wer von euch wie ich die folgenden codes in dcmd bekomme?



    dcmd_registrieren(playerid,params[])
    {
    #pragma unused params
    new spieler[MAX_PLAYER_NAME];
    new cmdtext[256];
    GetPlayerName(playerid,spieler,sizeof(spieler));
    format(save, sizeof(save),"MasterScript/Spieler/%s.ini",spieler);
    if(!dini_Exists(save))
    {
    dini_Create(save);
    dini_IntSet(save,"passwort",udb_hash(strget(cmdtext,1)));
    SendClientMessage(playerid, COLOR_GREEN, "Dein Account wurde erfolgreich registriert");
    SendClientMessage(playerid, COLOR_GREEN, "Nutze /login [Passwort] um dich einzuloggen");


    }
    else
    {
    if(dini_Exists(save))
    {
    SendClientMessage(playerid, COLOR_RED, "Der Account ist bereits registriert");
    Kick(playerid);
    }
    }
    return 1;
    }
    dcmd_einloggen(playerid,params[])
    {
    #pragma unused params
    new s2[256];
    new spieler[MAX_PLAYER_NAME];
    new cmdtext[256];
    GetPlayerName(playerid,spieler,sizeof(spieler));
    format(save,sizeof(save),"MasterScript/Spieler/%s.ini",spieler);
    if(dini_Exists(save))
    {
    s2=dini_Get(save,"passwort");
    if(strval(s2)==udb_hash(strget(cmdtext,1)))
    {
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Du hast dich erfolgreich eingeloggt");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Passwort Falsch!");
    }
    }
    return 1;
    }


    so funktioniert es leider ja nicht.....

    Zitat

    (skype) Wastl: Oida, i greif ka schowaßding mea au, gestan bam schwoaßn hob i ma meine sockhoa vaseink :-/

    Zitat

    (skype) Wastl: Alter, ich greife kein schweißgerät mehr an, gestern beim schweißen hab ich mir meine intimhaare versenkt :-/

    :D :D :D

  • Habe einen Error:

    Zitat

    C:\Dokumente und Einstellungen\Administrator\Desktop\samp02Xserver.win32\gamemodes\Reallife.pwn(1172) : error 017: undefined symbol "sscanf"

    Brauche ich irgendein Include oder so ?


    MFG Eis-Man

  • Füg das unten in dein Script ein wie ein eigener Public



    stock sscanf(string[], format[], {Float,_}:...)
    {
    #if defined isnull
    if (isnull(string))
    #else
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
    {
    return format[0];
    }
    #pragma tabsize 4
    new
    formatPos = 0,
    stringPos = 0,
    paramPos = 2,
    paramCount = numargs(),
    delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
    stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
    switch (format[formatPos++])
    {
    case '\0':
    {
    return 0;
    }
    case 'i', 'd':
    {
    new
    neg = 1,
    num = 0,
    ch = string[stringPos];
    if (ch == '-')
    {
    neg = -1;
    ch = string[++stringPos];
    }
    do
    {
    stringPos++;
    if ('0' <= ch <= '9')
    {
    num = (num * 10) + (ch - '0');
    }
    else
    {
    return -1;
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num * neg);
    }
    case 'h', 'x':
    {
    new
    num = 0,
    ch = string[stringPos];
    do
    {
    stringPos++;
    switch (ch)
    {
    case 'x', 'X':
    {
    num = 0;
    continue;
    }
    case '0' .. '9':
    {
    num = (num << 4) | (ch - '0');
    }
    case 'a' .. 'f':
    {
    num = (num << 4) | (ch - ('a' - 10));
    }
    case 'A' .. 'F':
    {
    num = (num << 4) | (ch - ('A' - 10));
    }
    default:
    {
    return -1;
    }
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num);
    }
    case 'c':
    {
    setarg(paramPos, 0, string[stringPos++]);
    }
    case 'f':
    {
    setarg(paramPos, 0, _:floatstr(string[stringPos]));
    }
    case 'p':
    {
    delim = format[formatPos++];
    continue;
    }
    case '\'':
    {
    new
    end = formatPos - 1,
    ch;
    while ((ch = format[++end]) && ch != '\'') {}
    if (!ch)
    {
    return -1;
    }
    format[end] = '\0';
    if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
    {
    if (format[end + 1])
    {
    return -1;
    }
    return 0;
    }
    format[end] = '\'';
    stringPos = ch + (end - formatPos);
    formatPos = end + 1;
    }
    case 'u':
    {
    new
    end = stringPos - 1,
    id = 0,
    bool:num = true,
    ch;
    while ((ch = string[++end]) && ch != delim)
    {
    if (num)
    {
    if ('0' <= ch <= '9')
    {
    id = (id * 10) + (ch - '0');
    }
    else
    {
    num = false;
    }
    }
    }
    if (num && IsPlayerConnected(id))
    {
    setarg(paramPos, 0, id);
    }
    else
    {
    #if !defined foreach
    #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end] = '\0';
    num = false;
    new
    name[MAX_PLAYER_NAME];
    id = end - stringPos;
    foreach (Player, playerid)
    {
    GetPlayerName(playerid, name, sizeof (name));
    if (!strcmp(name, string[stringPos], true, id))
    {
    setarg(paramPos, 0, playerid);
    num = true;
    break;
    }
    }
    if (!num)
    {
    setarg(paramPos, 0, INVALID_PLAYER_ID);
    }
    string[end] = ch;
    #if defined __SSCANF_FOREACH__
    #undef foreach
    #undef __SSCANF_FOREACH__
    #endif
    }
    stringPos = end;
    }
    case 's', 'z':
    {
    new
    i = 0,
    ch;
    if (format[formatPos])
    {
    while ((ch = string[stringPos++]) && ch != delim)
    {
    setarg(paramPos, i++, ch);
    }
    if (!i)
    {
    return -1;
    }
    }
    else
    {
    while ((ch = string[stringPos++]))
    {
    setarg(paramPos, i++, ch);
    }
    }
    stringPos--;
    setarg(paramPos, i, '\0');
    }
    default:
    {
    continue;
    }
    }
    while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
    {
    stringPos++;
    }
    while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
    {
    stringPos++;
    }
    paramPos++;
    }
    do
    {
    if ((delim = format[formatPos++]) > ' ')
    {
    if (delim == '\'')
    {
    while ((delim = format[formatPos++]) && delim != '\'') {}
    }
    else if (delim != 'z')
    {
    return delim;
    }
    }
    }
    while (delim > ' ');
    return 0;
    }

  • Mich würde interessieren, was am schnellsten ist:
    strtok
    DCMD
    SSCANF
    strget
    getstr
    zcmd


    ? Ich persönlich bevorzuge ja zcmd, da es sehr einfach und simpel ist (auch der Code) und Einwandtfrei funktioniert :thumbup: .

  • Es hängt meist davon ab wie oft das Skript auf Unterfunktionen zugreifen muss


    das ist die gleiche Sache :


    for(new i = 0;i<GetMaxPlayers();i++)


    for(new i = 0;i<MAX_PLAYERS;i++)



    GetMaxPlayers(); = Muss wieder auf eine Funktion zugreifen bzw. muss schon wieder einen Wert berechnen/wiedergeben
    MAX_PLAYERS = 200 Spieler , einfach ein Wert mit 200 muss nichts besonderes tun nur 200 zurückgeben = Direkter Wert



    Man muss es so sehen , solange man nur 32 Maximale Spieler eingestellt hat bringt die Funktion was , wenn man die Maximale Anzahl sowieso
    nutzt ist es egal , aber man kann dazu auch IsPlayerConnected abfragen , das ist aber wieder eine andere Geschichte



    Solange es Sinn ergibt halt

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Wie meinst du das mit "Text eingeben"?


    Erstmal, zb dcmd und strtok kann man nicht vergleichen. Es gibt ja zum einen Methoden um Zeichenketten in Teile aufzulösen, und zum einen Methoden, um möglichst einfach und klar strukturiert Commands zu scripten.
    Also vergleiche ich eher:
    strtok, sscanf, strget, getstr, split, explode,..
    und ich vergleiche:
    zcmd, dcmd


    Mein letzer Test war lange her, aber so weit ich mich errinern kann, war Westie´s explode Funktion am schnellsten (von PHP portiert).
    Von allen kann ich also explode empfehlen http://forum.sa-mp.com/index.php?topic=110557.0


    Am Anfang ist die schnellste Methode:
    explode->sscanf->strtok->strget->getstr->split.
    Diese Reihenfolge hat keinen Anspruch auf Richtigkeit, probier es einfach selbst aus:
    http://forum.sa-mp.com/index.php?topic=79810.0#post_test


    Und zcmd->dcmd->ycmd.


    So, dass ist nun die dritte Meinung. Am besten machst du dir deine eigene Meinung.

    ICQ Scripting - Support 495961653
    Montags-Freitags ab 15 Uhr

  • Vielen Dank TheKeks.
    Hast du den ycmd Code? Würde den gerne mal ansehen...
    Mein Problem bei strget war, dass ein Befehl wie "/kick 4 Dies und Jenes" nicht funktioniert hat, denn er gab nur raus:"/kick 4 Dies"...

  • Ist doch ganz einfach, nämlich in einer Schleife solange das Array in Teile auflösen, bis es leer ist, da keine weiteren Teile vorhanden sein.
    http://pastebin.com/f4c65eee3 (die Kommentare kannst du ignorieren und löschen, wenn die dich verwirren)


    ycmd ist bei YSI dabei.
    Hier ist die Doku: http://wiki.sa-mp.com/wiki/YSI:Commands


    Bei ycmd werden die Command ähnlich wie bei dcmd erstellt, nur man erstellt die Cmd nicht bei der Rückruffunktion onPlayerCommandText, sondern in OnGameModeInit/OnFIlterscriptInit:
    Aus der readme entnommen

    ICQ Scripting - Support 495961653
    Montags-Freitags ab 15 Uhr

    Einmal editiert, zuletzt von TheKekes ()

  • Wie das jetzt mit ycmd und sscanf ist, kann ich nicht sagen, da die Wiki down ist, aber hier das Ergebnis aus explode, strtok, strget (optimierte Version [1]):
    Strget() 1: 0814, Strtok() 2: 1105, Explode() 3: 0614


    Zwischen der unoptimierten und der optimierten strget liegen außerdem ~200ms.
    Durchläufe: 1000000 (Mit mehr wird der Unterschied natürlich noch deutlicher)


    Explode ist aufjedenfall schneller als strget und strtok.


    [1]: Optimiertes strget:
    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;
    }

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