/ignor funktion

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 ich ein Befehl Scripten das ich einen User ignorieren kann ?


    Das heist das ich /ignor (playerid) eintippe und ich bekomme keine nachrichten mehr von dem user den ich ignoriert habe nicht im Chat nicht im /d etc.



    gruß


    Canary

  • Naja Admins, Cops, FBI und Army sollte man halt nicht igno können

  • new ignor[MAX_PLAYERS][MAX_PLAYERS]


    OnPlayerDisconnect(playerid,reason)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    ignor[playerid][i] = 0;
    ignor[i][playerid] = 0;
    }
    return 1;
    }


    nun zum befehl, ich benutze dcmd. müsstest du dann anpassen.
    OnPlayerCommandText(playerid,cmdtext[])
    {
    dcmd(ignor,5,cmdtext);
    return 1;
    }


    dcmd_ignor(playerid,params[])
    {
    new pID;
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,farbe,"Benutze: /ignor [playerid]");
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,farbe,"Ungültige playerid!");
    if(ignor[playerid][i] == 0)
    {
    new name[MAX_PLAYER_NAME], str[100];
    GetPlayerName(pID,name,sizeof(name));
    format(str,sizeof(str),"Sie ignorieren absofort %s(%d)",name,pID);
    SendClientMessage(playerid,0x00DD00FF,str);
    ignor[playerid][pID] = 1;
    }
    else
    {
    new name[MAX_PLAYER_NAME], str[100];
    GetPlayerName(pID,name,sizeof(name));
    format(str,sizeof(str),"Sie ignorieren absofort nicht mehr %s(%d)",name,pID);
    SendClientMessage(playerid,0x00DD00FF,str);
    ignor[playerid][pID] = 0;
    }
    return 1;
    }


    du musst nun nurnoch die abfrage machen ob ignor[id1][id2] == 1 ist und wenn ja schreibste halt: dieser spieler ignoriert sie.

    Einmal editiert, zuletzt von Simon ()


  • könntes du das vill auch ohne cmd mal schreiben wehr echt net da ich nicht mit cmd arbeite ^^

  • WIe meinst du das? das ist ganz normal dcmd.. meinst du ganz normal unter OnPlayerText(playerid,cmdtext[])
    wenn ja, ne kann ich nicht da ich es bisher nur mit dcmd gemacht habe wenn parameter benötigt werden.

  • hmm kannse mir den zeigen wie ich dcmd in mein gm einbauen kann weil bis jetzt habe ich alle befehle normal mit onplayercommandtext als zb /ban player id grund

  • #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


    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;
    }


    Um nun ein befehl zu scripten musst du den unter OnPlayerCommandText definieren:


    //dcmd(cmd,länge,cmdtext);
    //beispiel:
    dcmd(test,4,cmdtext);


    und nun musst du außerhalb der publics den befehl scripten:


    dcmd_test(playerid,params[])
    {
    SendClientMessage(playerid,0x00DD00FF,"Test");
    return 1;
    }