Wie mache ich einen /take Befel?

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,


    Wie kann man einen "/take" Befehl erstellen?


    Also vor allem Befehle mit diesem Muster hier "/take [Item] [Spieler-ID]"


    Und anstatt Item soll man dann irgend ein Wort wie "Waffen" oder " lizauto" hinschreiben damit eben das jeweilige entzogen wird.


    MfG Ranger

  • if(strcmp(cmd, "/take", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(Spieler[playerid][Team] == 1 || Spieler[playerid][Team] == 2 || Spieler[playerid][Team] == 7)
    {
    new x_nr[256], Float:x, Float:y, Float:z, string[128];
    x_nr = strtok(cmdtext, idx);
    if(!strlen(x_nr))
    {
    SendClientMessage(playerid, COLOR_GREEN, "_________________________");
    SendClientMessage(playerid, COLOR_WHITE, "FEHLER: /take [Gegenstand] [ID/Name]");
    SendClientMessage(playerid, COLOR_WHITE, "Gegenstände: Autoschein, Flugschein, Waffenschein, Bootschein, Angelschein");
    SendClientMessage(playerid, COLOR_WHITE, "Gegenstände: Waffen, Drogen, Materialien");
    return 1;
    }
    if(strcmp(x_nr, "autoschein", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Autoschein [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s den Führerschein entzogen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir den Führerschein entzogen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][DrivLic] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "flugschein", true) == 0)
    {
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Flugschein [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s den Flugschein entzogen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir den Flugschein entzogen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][FlugLic] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "waffenschein", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Waffenschein [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s den Waffenschein entzogen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir den Waffenschein entzogen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][GunLic] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "bootschein", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Bootschein [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s den Bootschein entzogen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir den Bootschein entzogen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][BootLic] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "angelschein", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Angelschein [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s den Angelschein entzogen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir den Angelschein entzogen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][AngelLic] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "waffen", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take waffen [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s's Waffen abgenommen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir deine Waffen abgenommen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    ResetPlayerWeapons(pID);
    }
    }
    }
    }
    else if(strcmp(x_nr, "drogen", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Drogen [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s's Drogen abgenommen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir deine Drogen abgenommen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][Drugs] = 0;
    }
    }
    }
    }
    else if(strcmp(x_nr, "materialien", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "FEHLER: /take Materialien [ID/Name]");
    return 1;
    }
    new pID = ReturnUser(tmp);
    if(IsPlayerConnected(pID))
    {
    if(pID != INVALID_PLAYER_ID)
    {
    GetPlayerPos(pID, x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, 5.0, x,y,z))
    {
    format(string, sizeof(string), "* Du hast %s's Materialien abgenommen.", SpielerName(pID));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "* Beamter %s hat dir deine Materialien abgenommen.", SpielerName(playerid));
    SendClientMessage(pID, COLOR_LIGHTBLUE, string);
    Spieler[pID][Mats] = 0;
    }
    }
    }
    }
    }
    else
    {
    return SendClientMessage(playerid, COLOR_GRAD2, "Du bist kein Beamter.");
    }
    }
    return 1;
    }


    entnommen aus GF =)

  • Wenn ich das jetzt einfach einfüge und die fraktionsabfrage anpasse passiert erstmal das:

  • Denk doch mal ein bisschen nach ... mach aus Spieler PlayerInfo oderso..
    wie hast du den die anderen Abfragen z.b. If(Playerinfo[playerid][Beipiel] == 0)


    Das unten im Script einfach einfügen ..
    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }

  • Die Fraktionsabfragen, und die Befehle zum entziehen der Sache hab ich bereits angepasst, übrig bleiben folgende probleme:

    Zitat

    1.3.2.pwn(8254) : error 017: undefined symbol "strtok"
    1.3.2.pwn(8255) : error 017: undefined symbol "tmp"
    1.3.2.pwn(8260) : error 017: undefined symbol "ReturnUser"

  • Zitat

    1.3.2.pwn(8294) : error 033: array must be indexed (variable "tmp")
    1.3.2.pwn(8300) : error 017: undefined symbol "ReturnUser"
    1.3.2.pwn(8319) : error 017: undefined symbol "strtok"

    Das steht in der Fehlerliste jetzt etwa 10 mal in der kombination

  • ReturnUser(text[], playerid = INVALID_PLAYER_ID)
    {
    new pos = 0;
    while (text[pos] < 0x21) // Strip out leading spaces
    {
    if (text[pos] == 0) return INVALID_PLAYER_ID; // No passed text
    pos++;
    }
    new userid = INVALID_PLAYER_ID;
    if (IsNumeric(text[pos])) // Check whole passed string
    {
    // If they have a numeric name you have a problem (although names are checked on id failure)
    userid = strval(text[pos]);
    if (userid >=0 && userid < MAX_PLAYERS)
    {
    if(!IsPlayerConnected(userid))
    {
    /*if (playerid != INVALID_PLAYER_ID)
    {
    SendClientMessage(playerid, 0xFF0000AA, "User not connected");
    }*/
    userid = INVALID_PLAYER_ID;
    }
    else
    {
    return userid; // A player was found
    }
    }
    /*else
    {
    if (playerid != INVALID_PLAYER_ID)
    {
    SendClientMessage(playerid, 0xFF0000AA, "Invalid user ID");
    }
    userid = INVALID_PLAYER_ID;
    }
    return userid;*/
    // Removed for fallthrough code
    }
    // They entered [part of] a name or the id search failed (check names just incase)
    new len = strlen(text[pos]);
    new count = 0;
    new name[MAX_PLAYER_NAME];
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    if (IsPlayerConnected(i))
    {
    GetPlayerName(playerid, name, sizeof (name));
    if (strcmp(name, text[pos], true, len) == 0) // Check segment of name
    {
    if (len == strlen(name)) // Exact match
    {
    return i; // Return the exact player on an exact match
    // Otherwise if there are two players:
    // Me and MeYou any time you entered Me it would find both
    // And never be able to return just Me's id
    }
    else // Partial match
    {
    count++;
    userid = i;
    }
    }
    }
    }
    if (count != 1)
    {
    if (playerid != INVALID_PLAYER_ID)
    {
    if (count)
    {
    SendClientMessage(playerid, 0xFF0000AA, "Multiple users found, please narrow earch");
    }
    else
    {
    SendClientMessage(playerid, 0xFF0000AA, "No matching user found");
    }
    }
    userid = INVALID_PLAYER_ID;
    }
    return userid; // INVALID_USER_ID for bad return
    }


    unten im Script..

  • Zitat

    1.3.2.pwn(8294) : error 017: undefined symbol "strtok"
    1.3.2.pwn(8294) : error 033: array must be indexed (variable "tmp")
    1.3.2.pwn(8300) : error 017: undefined symbol "ReturnUser"

    Jetzt gibts etwa 5 mal diese Kombination

  • Erstell dir doch einfach einen eigenen Take-CMD statt aus dem GF das zu entnehmen.


    ocmd:take(playerid,params[])
    {
    new name1[MAX_PLAYER_NAME];
    new string[128],string2[128];
    new name2[MAX_PLAYER_NAME];
    if(SpielerInfo[playerid][Fraktion] == 2) //HIer die FraktionsID eintragen von der Polizei
    {
    new pID, sache;;
    GetPlayerName(playerid,name1,sizeof(name1));
    GetPlayerName(pID,name2,sizeof(name2));
    if(sscanf(params,"ud",pID,sache))return SendClientMessage(playerid, COLOR_GRAD2, "Fehler: /take [ID/NAME] [Schein]"); SendClientMessage(playerid, COLOR_GRAD2, "0 = Waffenschein | 1 = Führerschein");
    if(sache == 0 || < 2)
    {
    if(sache == 0)
    {
    format(string2,sizeof(string2),"Du hast %s den Waffenschein entzogen.",name2);
    format(string,sizeof(string),"%s hat dir den Waffenschein entzogen.",name1);
    SpielerInfo[playerid][Waffenschein] = 0; //Das anpassen
    SendClientMessage(pID, COLOR_GRAD2, string);
    SendClientMessage(playerid,COLOR_GRAD2, string2);
    }
    if(sache == 1)
    {
    format(string2,sizeof(string2),"Du hast %s den Führerschein entzogen.",name2);
    format(string,sizeof(string),"%s hat dir den Führerschein entzogen.",name1);
    SpielerInfo[playerid][Autoschein] = 0; //Das Anpassen
    SendClientMessage(pID, COLOR_GRAD2, string);
    SendClientMessage(playerid,COLOR_GRAD2, string2);
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_GRAD2,"Du kannst nur die Zahl 0 & 1 benutzen. (0 = Waffenschein || 1 = Autoschein)");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Polizist!");
    }
    return 1;
    }


    Ungetestet!!!



    Edit: Code verbessert

  • Dazu gibt es hier bereits 1000000 Themen.
    strcmp'st den 2. Parameter (vorher zum String machen) und fragst ab ob eben "waffe", "drogen" oder was auch immer eingegeben wurde, je nachdem handelst du.