Frage zum strcmp und strtok

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 Leute,


    ich hät mal ne Frage. Und zwar will ich einen /pay befehl machen mit folgender Struktur:"/pay [EmpfängerID] [Betrag]".
    Ich hab auch schon einen ähnlichen Befehl hinbekommen, welcher jedoch nur eine "variable" nach dem befehl hat (/setweather [ID]).
    Also wie geht das mit 2 Variablen?
    hoffe ihr könnt mir helfen

    Scripter aus Leidenschaft!
    Tod dem Godfather, lasst Selfmade-Scripts freie Möglichkeiten!

  • if(strcmp(cmd,"/pay",true) == 0)
    {
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_WHITE,"/pay [EmpfängerID] [Betrag]"); // Nachricht, wenn das Parameter fehlt
    param1 = ReturnUser(tmp); // Das erste Parameter, also der Spieler
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_WHITE,"/pay [EmpfängerID] [Betrag]"); // Nachricht, wenn das Parameter fehlt
    param2 = strval(tmp); // Das zweite Parameter, also der Betrag
    // Hier kann das Nachrichtengelaber hin
    GivePlayerMoney(playerid,-param2); // Dem Commandeingeber das Geld wegnehmen
    GivePlayerMoney(param1,param2); // Dem ausgewählten Spieler das Geld geben
    return 1;
    }


    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!

  • Ok danke.


    aber was ist wenn ich zb einen /pm (personal Message)-befehl machen will. dann muss er ja nich nur eine Zahl "speichern" sondern einen Text. wie kann ich das machen?


    //EDIT


    Wieso geht folgender Code nicht?
    if(strcmp(cmd, "/sethealth", true) == 0)
    {
    if(IsPlayerAdmin(playerid))
    {
    new tmp[128], param1, Float:param2;
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, WEISS, "USAGE: /sethealth [ID] [HEALTH]");
    param1 = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, WEISS, "USAGE: /sethealth [ID] [HEALTH]");
    param2 = floatstr(tmp);
    tmp = strtok(cmdtext, idx);
    if(IsPlayerAdmin(param1))
    {
    SendClientMessage(playerid, ROT, "Du kannst die Leben eines anderen Admin nicht verändern");
    return 1;
    }
    else if(!IsPlayerConnected(param1))
    {
    SendClientMessage(playerid, ROT, "Dieser Spieler ist nich online");
    return 1;
    }
    else
    {
    new admin[MAX_PLAYER_NAME], player[MAX_PLAYER_NAME], string[48], string2[48];
    GetPlayerName(playerid, admin, sizeof(admin));
    GetPlayerName(param1, player, sizeof(player));
    format(string, sizeof(string), "Du hast *%s* Leben auf [%f] gesetzt", player, param2);
    format(string2, sizeof(string2), "*%s* hat deine Leben auf [%f] gesetzt", admin, param2);
    SendClientMessage(playerid, WEISS, string);
    SendClientMessage(param1, ROT, string2);
    SetPlayerHealth(param1, param2);
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid, ROT, "Du darfst diesen Befehl nicht nutzen");
    return 1;
    }
    }

    Scripter aus Leidenschaft!
    Tod dem Godfather, lasst Selfmade-Scripts freie Möglichkeiten!

    Einmal editiert, zuletzt von Raphii_Warren ()

  • Um nicht nur ein Wort in einem string zu speichern, wie bei strtok, kannst du den Code unten verwenden. Der Text wird im string "result" gespeichert.
    new
    length = strlen(cmdtext);
    while ((idx < length) && (cmdtext[idx] <= ' '))
    {
    idx++;
    }
    new
    offset = idx,
    result[64];
    while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
    {
    result[idx - offset] = cmdtext[idx];
    idx++;
    }
    result[idx - offset] = EOS;
    if(result[0] == 0) return 1; // Eingabe fehlt
    Einfacher und besser als strtok ist allerdings dcmd & sscanf, dort würde das Ganze (/pm Text) so aussehen:
    if(sscanf(params, "s", string)) return 1; // Fehlende Eingabe
    // Die Eingabe wird in string gespeichert


    Dein /sethealth Befehl so
    new
    health,
    giveplayerid,
    if(sscanf(params, "ud", giveplayerid, health)) return 1; // Fehlende Eingabe
    // Die Eingaben werden in giveplayerid und health gespeichert
    Außerdem brauchst du keinen Float beim /sethealth Befehl zu verwenden, ein einfacher Integer tuts auch