Beiträge von Jeffry

    stock FraktRangName(playerid)
    {
    new query[128], returnvar[11];
    format(query,sizeof(query),"SELECT Rang%d FROM `rangnamen` WHERE `FID` = '%d'",SpielerInfo[playerid][pFRang],SpielerInfo[playerid][pFraktion]);
    mysql_query(Handle, query);
    cache_get_row(0, 0, returnvar);
    return returnvar;
    }
    Teste es so.

    Nein, da soll kein Stern hin, da soll der Name der Spalte hin, in der die Namen der Ränge stehen, sonst geht es nicht.
    Wenn du nicht weißt was das ist, poste einen Screenshot der Tabelle in der die Namen stehen.

    stock FraktRangName(playerid)
    {
    new query[128], returnvar[11];
    //Passe hier das "name" an den Name der Spalte an, in der die Rangnamen stehen.
    format(query,sizeof(query),"SELECT name FROM `rangnamen` WHERE `FID` = '%d'",SpielerInfo[playerid][pFraktion]);
    mysql_query(Handle, query);
    cache_get_row(0, 0, returnvar);
    return returnvar;
    }


    Und im Befehl:
    format(fstring,sizeof(fstring),"*%s %d: %s*", Spielername(playerid), FraktRangName(playerid), ftext);
    zu:
    format(fstring,sizeof(fstring),"*%s %s: %s*", Spielername(playerid), FraktRangName(playerid), ftext);


    Allerdings sei gesagt, dass das nicht wirklich performant ist. Besser ist es, wenn du die Rangnamen beim Starten des Servers in Variablen lädst.

    Einfach unter der anderen Nachricht einfügen:
    format(str, sizeof(str), "Ein Administrator hat dir die Farbe zu %s geändert.", tmp);
    SendClientMessage(pID, 0xFFFFFFFF, str);


    @Jack_Bauer:
    Meiner Meinung nach ist die Methode sich etwas anzuschauen, was komplett ist, und daraus zu lernen die bessere Methode, wenn man sehr wenig bis gar keine Kenntnisse hat. aviate: stimmt dem sicher auch zu, vor allem wenn er gar nicht mit sscanf arbeiten will.
    Das grüne Häkchen an Post #6 düfte Onkel Jeffry's Methode wohl bestätigen.

    Willkommen auf Breadfish!


    Hier der Befehl:
    dcmd_setcolor(playerid,params[])
    {
    new pID, tmp[20], idx;
    tmp = strtok(params, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Fehler: /setcolor [playerid/SpielerName] [Farbe]");
    if(IsNumeric(tmp)) pID = strval(tmp);
    else pID = ReturnPlayerID(tmp);
    tmp = strtok(params, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Fehler: /setcolor [playerid/SpielerName] [Farbe]");
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0xFF0000FF,"Der Spieler ist nicht online.");

    if(!strcmp(tmp, "blau", true)) SetPlayerColor(pID, COLOR_BLUE);
    else if(!strcmp(tmp, "gelb", true)) SetPlayerColor(pID, COLOR_YELLOW);
    else if(!strcmp(tmp, "rot", true)) SetPlayerColor(pID, COLOR_RED);
    else if(!strcmp(tmp, "grün", true)) SetPlayerColor(pID, COLOR_GREEN);
    else if(!strcmp(tmp, "weiß", true)) SetPlayerColor(pID, COLOR_WHITE);
    else return SendClientMessage(playerid,0xFF0000FF,"Diese Farbe existiert nicht.");

    new str[145];
    GetPlayerName(pID, str, MAX_PLAYER_NAME);
    format(str, sizeof(str), "Du hast die Farbe von %s zu %s geändert.", str, tmp);
    SendClientMessage(playerid, 0xFFFFFFFF, str);
    return 1;
    }
    Ich denke das ist alles recht selbsterklärend.
    strtok gibt dir immer die Zeichen bis zum nächsten Leerzeichen zurück.
    Falls du ocmd verwendest, ersetze das dcmd_ mit ocmd:.


    Diese Funktionen fügst du einmalig in deinen Gamemode ganz unten ein:

    Spoiler anzeigen
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }

    Spoiler anzeigen
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

    Spoiler anzeigen
    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }


    Alternativ könnte man es auch mit sscanf machen.

    Ehh, doch nicht mit einem Timer.
    Das geht viel einfacher und ressourcensparender indem man einfach den Timestamp prüft:


    Unter die Includes:
    new tPickBlocked[MAX_PLAYERS];


    Unter OnPlayerPickUpPickup, bei dem entsprechenden Pickup:
    if(tPickBlocked[playerid] > gettime()) return 1;
    tPickBlocked[playerid] = gettime() + 20; //20 Sekunden


    Mehr ist es nicht.

    Nichts, das muss genau so bleiben (Edit: Mit } am Ende anstatt ]) . ;)
    Das heißt, dass beim instanziieren alle Werte, sprich jeder Index von 0 bis MAX_PLAYERS-1 auf -1 gesetzt werden. Die 3 Punkte sind hier eine korrekte Anweisung.

    Doch, das macht einen Unterschied, das muss mit -1 deklariert werden, da es ja eine ID 0 geben kann, daher weiß der Code dann nicht, ob 0 jetzt nichts heißt, oder ID 0. Bei -1 weiß er das.

    So wie das aussieht wird der Timer bei dir gar nicht aufgerufen, sonst würde es dir die Box schon anzeigen, bevor du überhaupt den TV Befehl nutzt (dadurch, dass du es auf 0

    Hast du das
    tvID[playerid] = pID;
    bei deinem TV-Befehl eingefügt? Poste ggf. mal die beiden Befehle nochmal.

    Timer und das was ich dir gegegeben habe hast du auch genau gleich?