Suche: Wie anderem Spieler Geld geben?

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
  • Hi
    Ich komme gerade beim scripten nicht weiter.
    Ich will, dass man mit einem Befehl z. B. "/givemoney >ID von dem der es erhalten soll< >Betrag<"
    Ich weis nur wie man sich selbst Geld gib: GivePlayerMoney(playerid,1000);
    um 1000 zu bekommen ich will aber einer anderen Person Geld geben und auch jeden belibigen Betrag.


    Danke schonmal für eure Hilfe
    MFG

  • Mach das am besten mit dcmd und scanff.




    dcmd und scanff ist eine art um commandos mit parametern zu erstellen. (also wie zb. /giveplayermoney [ID][betrag], oder auch /jail[ID])




    weiteres über dcmd und scanff hier:


    [ SCRIPTING ] Commands mit Parametern


    das ist ein echt klasse tutorial von Goldkiller dazu.






    so für das script musst du dcmd definiert haben.




    dazu fügst du folgendes unter deine defines ein




    #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




    dann mach das noch am besten ganz unten ins script




    /*----------------------------------------------------------------------------*-
    Function:
    sscanf
    Params:
    string[] - String to extract parameters from.
    format[] - Parameter types to get.
    {Float,_}:... - Data return variables.
    Return:
    0 - Successful, not 0 - fail.
    Notes:
    A fail is either insufficient variables to store the data or insufficient
    data for the format string - excess data is disgarded.
    A string in the middle of the input data is extracted as a single word, a
    string at the end of the data collects all remaining text.
    The format codes are:
    c - A character.
    d, i - An integer.
    h, x - A hex number (e.g. a colour).
    f - A float.
    s - A string.
    z - An optional string.
    pX - An additional delimiter where X is another character.
    '' - Encloses a litteral string to locate.
    u - User, takes a name, part of a name or an id and returns the id if they're connected.
    Now has IsNumeric integrated into the code.
    Added additional delimiters in the form of all whitespace and an
    optioanlly specified one in the format string.
    -*----------------------------------------------------------------------------*/
    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;
    }
    stock strget(strx[], pos, search = ' ') {
    new arg, ret[128], idxx;
    for (new i = 0; i < strlen(strx); i++) {
    if(strx[i] == search || i == strlen(strx) || strx[i + 1] == 10) {
    arg++;
    if (arg == pos + 1){
    ret[i-idxx] = EOS;
    return ret;
    } else if (arg == pos)
    idxx= i+1;
    }
    else if (arg == pos)
    ret[i - idxx] = strx[i];
    }
    return ret;
    }




    so dcmd ist definiert




    jetzt gehts an das command.




    bei onplayercommandtext schreibst du am besten auch unten rein:


    dcmd(givemoney,9,cmdtext);




    dann kommt das command an sich ausserhalb der publics




    dcmd_givemoney(playerid,params[])
    {
    new
    betrag, // hier erstellen wir die parameter. in deinem fall den betrag des geldes das gegeben wird und pID ist der spieler der das ganze erhalten soll
    pID;


    if(sscanf(params, "di",pID,betrag))
    {
    return SendClientMessage(playerid,COLOR_RED,"Nutze: /givemoney [ID] [betrag]"); // hier wird abgefragt ob beide parameter angegeben werden. wenn nein returnt das ganze mit der nachricht
    }
    if(!IsPlayerConnected(pID))
    {
    return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online"); // hier wird abgefragt ob der Spieler mit der angegebenen Id online ist
    }


    if(GetPlayerMoney(playerid)>=betrag) // dast ist zwar nicht unbedingt notwendig, sollte aber drin sein. da wird überprüft ob der spieler genügend geld hat. deswegen wird abgefragt ob das geld das er gerade hat (getplayermoney) größer oder gleich (>=) wie der angegebene betrag ist.
    {
    new name[MAX_PLAYER_NAME],nachricht[64];
    GetPlayerName(playerid,name,sizeof(name)); // das ist einfach für die Nachricht damit der Spieler der das geld bekommt informiert wird wie viel und von wem er geld bekommen hat.
    format(nachricht,sizeof(nachricht),"%s gab dir %i €",name,betrag);



    SendClientMessage(pID,weiß,nachricht); //das ist der wesentliche teil: die geldübergabe. hier wird die nachricht gesendet
    GivePlayerMoney(pID,betrag); // hier wird pID, also dem spieler der angegeben wurde das geld in höhe von betrag gegeben
    GivePlayerMoney(playerid,-betrag); // und hier wird dem spieler der das commando ausführt der betrag abgezogen (-betrag)
    }


    return 1;
    }




    so das wars auch schon.




    ich hoffe ich konnte dir weiterhelfen (gab bei mir keine errors und funktionierte auch)




    mfg




    shorty123

  • if(sscanf(params, "di",pID,betrag))
    {
    return SendClientMessage(playerid,COLOR_RED,"Nutze: /givemoney [ID] [betrag]"); // hier wird abgefragt ob beide parameter angegeben werden. wenn nein returnt das ganze mit der nachricht
    }


    sowas ist immer sowas von unnötig ... eine if verlangt eine nachfolgende Anweisung , die Klammern sind also nur dann zu benutzen wenn man mehrere anweisungen hat also, natürlich geht das mit Klammern auch , aber die Klammern erfüllen dann nicht ihren Zweck und sind eigentlich für nix.


    if(sscanf(params, "di",pID,betrag)) return SendClientMessage(playerid,COLOR_RED,"Nutze: /givemoney [ID] [betrag]"); // hier wird abgefragt ob beide parameter angegeben werden. wenn nein returnt das ganze mit der nachricht


    und für eine id nutzt man am besten den Data Type u weil dann ist es egal ob name oder ID man angibt
    also


    if(sscanf(params, "ui",pID,betrag)) return SendClientMessage(playerid,COLOR_RED,"Nutze: /givemoney [ID] [betrag]");


    aber sonst finde ich das gut das immer mehr user dcmd/ocmd/zcmd benutzen , obwohl ycmd auch interessant ist


    dazu würde ich auch eine if abfrage machen , ob der Spieler in der nähe ist , weil sonst ist das sehr unrealistisch .