Selfmade /ooc + Range [Wunsch]

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
  • Definition:


    #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


    OnPlayerCommand:


    Public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(ooc,3,cmdtext);
    return 0;
    }


    dcmd's:


    dcmd_kick(playerid,params[]) {
    new Playername[MAX_PLAYER_NAME],
    string[256],
    Text;


    if(sscanf(params, "s",pID)) {
    return SendClientMessage(playerid,FARBE,"USAGE: /ooc [Text]");
    }
    GetPlayerName(Playername,sizeof(Playername));
    format(string,sizeof(string),"&s: &s",Playername,Text);
    SendClientMessageToAll(FARBE,string);
    return 1;
    }



    Ich denke so sollte das gehn.

  • Wow, danke.
    Ich werde es sofort testen.


    Leider kann man den CMD nicht alleine testen ...
    Naja, mal gucken! :3

    /edit:


    Public OnPlayerCommandText(playerid, cmdtext[]) { dcmd(ooc,3,cmdtext); return 0; }


    Hmm,
    Das dcmd(ooc,3,cmdtext);, wo soll das im public hin?
    Habe ja nun schon ein paar Commands.


    schon gut!

  • DCMD STINKT xD denn dcmd ist KEIN Selfmade mehr :D


    überlege dir mal selbst wie so ein Befehl aussehen müsste.


    cmdtext[index] <-- was bedeutet index


    strcmp <-- guckt die hier mal die Parameter an


    format <-- Wie funktioniert format


    sendclientmessagetoall <-- solltest du kennen :D


    letzter Tipp "/o" solltest du immer gaaanz unten im OnPlayerCommandBlubb stehen haben :D

  • @ AdnaN:

    Zitat

    G:\Programme\SA-MP Server\gamemodes\Selfmade.pwn(199) : error 017: undefined symbol "dcmd_ooc"
    G:\Programme\SA-MP Server\gamemodes\Selfmade.pwn(507) : warning 203: symbol is never used: "dcmd_kick"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256],idx;
    cmd = strtok(cmdtext,idx);
    if(!strcmp("/goto",cmd,true)) {
    new tmp[256], OtherID;
    if(IsPlayerAdmin(playerid)) {
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp)) {
    return SendClientMessage(playerid, 0x55FF00FF, "Verwendung: /goto [id]");
    }
    OtherID = strval(tmp); // Falls "OtherID = ReturnUser(tmp);" ein Error gibt, einfach in "OtherID = strval(tmp);" ändern
    if(IsPlayerConnected(OtherID) || IsPlayerNPC(OtherID)) {
    new Float: x, Float: y, Float: z;
    GetPlayerPos(OtherID,x,y,z);
    if(IsPlayerInAnyVehicle(playerid)) {
    new veh = GetPlayerVehicleID(playerid);
    SetVehiclePos(veh, x+3, y+3, z+0.5);
    // eigentlich nicht nötig, doch nur damit nicht das auto sich alleine portet, kann man auch weglassen ;)
    PutPlayerInVehicle(playerid, veh, 0);
    SendClientMessage(playerid, 0x55FF00FF, "Du hast dich teleportiert.");
    return 1;
    }
    else {
    SetPlayerPos(playerid, x+3, y+3, z+0.5);
    SendClientMessage(playerid, 0x55FF00FF, "Du hast dich teleportiert.");
    return 1;
    }
    }
    else {
    return SendClientMessage(playerid,0x55FF00FF,"Der angegebene Spieler ist nicht online!");
    }
    }
    else {
    return SendClientMessage(playerid, 0xFF6300FF, "Du bist kein Administrator!");
    }
    }
    dcmd(ooc,3,cmdtext);
    return 0;
    }


    @ Ed:
    Wow, Ty, ich schauß' mir direkt mal an! :)

  • *facepalm*
    Ich hätte aber auch mal gucken können X(


    FARBE(n) Error's sind klar. sscanf - kann mir mal bitte jemand schnell das posten?
    Hab's noch nicht drin.^^
    aber die zwei argument error's verstehe ich nicht ...


    dcmd_ooc(playerid,params[])
    {
    new Playername[MAX_PLAYER_NAME],
    string[256],
    Text;


    if(sscanf(params, "s",pID)) {
    return SendClientMessage(playerid,FARBE,"USAGE: /ooc [Text]");
    }
    GetPlayerName(Playername,sizeof(Playername));
    format(string,sizeof(string),"&s: &s",Playername,Text);
    SendClientMessageToAll(FARBE,string);
    return 1;
    }

  • Ja "FARBE" musst du ersetzen mit einer Farbe deiner Wahl.


    sscanf zu posten hab ich vergessen sorry.


    Hier


    Den code ganz unten in dein Script packen.



    // Diesen Code


    dcmd_ooc(playerid,params[])
    {
    new Playername[MAX_PLAYER_NAME],
    string[256],
    Text;


    if(sscanf(params, "s",pID)) {
    return SendClientMessage(playerid,FARBE,"USAGE: /ooc [Text]");
    }
    GetPlayerName(Playername,sizeof(Playername));
    format(string,sizeof(string),"&s: &s",Playername,Text);
    SendClientMessageToAll(FARBE,string);
    return 1;
    }


    // Zu diesen ändern


    dcmd_ooc(playerid,params[])
    {
    new Playername[MAX_PLAYER_NAME],
    string[256],
    Text;


    if(sscanf(params, "s",Text)) {
    return SendClientMessage(playerid,FARBE,"USAGE: /ooc [Text]");
    }
    GetPlayerName(Playername,sizeof(Playername));
    format(string,sizeof(string),"&s: &s",Playername,Text);
    SendClientMessageToAll(FARBE,string);
    return 1;
    }


  • War sscanf nicht eeetwas kürzer?


    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':
    {

    new changestr[16], changepos = 0, strpos = stringPos;
    while(changepos < 16 && string[strpos] && string[strpos] != delim)
    {
    changestr[changepos++] = string[strpos++];
    }
    changestr[changepos] = '\0';
    setarg(paramPos,0,_:floatstr(changestr));
    }
    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;
    }


    Wenn nicht, bekomme ich errors:
    ( Farben errors sind ja erklärbar. )


  • Schön, dass ihr ihm alle das fertige Script gebt -.- WIE SOLL ER ES DENN SONST LERNEN... peinlich Jungs.. :D

  • sscanf einfach ganz unten in dein Script.
    Farben ändern.


    aber mit den Argumenten check ich das im moment grad nicht.
    Bin am überlegen.


    Zitat

    WIE SOLL ER ES DENN SONST LERNEN... peinlich Jungs.. :D

    ????


    Weil wir coden können und die Codes posten sind wir peinlich?

  • Zwar hast du recht, jedoch hat mir dein Post auch nichts gebracht :D
    ( also, der post über diesem. )


    SSCANF habe ich ja unten drin:
    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':
    {

    new changestr[16], changepos = 0, strpos = stringPos;
    while(changepos < 16 && string[strpos] && string[strpos] != delim)
    {
    changestr[changepos++] = string[strpos++];
    }
    changestr[changepos] = '\0';
    setarg(paramPos,0,_:floatstr(changestr));
    }
    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;
    }


    Oder ist dass dass falsche?

  • peinlich in dem Sinne, dass einige sich über strg c + v Scripter beschweren - und das teilweise zu Recht - auf der anderen Seite sie dann aber auch dermaßen in ihrem Tun fördern und unterstützen. Für mich ist da so ein Paradoxon :D

  • xD ich glaub ich habs


    Ich habe anstatt "%" "&" geschrieben.


    also bei "format(string,sizeof(string),"&s: &s",Playername,Text);"


    zu


    format(string,sizeof(string),"%s: %s",Playername,Text);


    ändern.

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