Spieler wird nicht gekickt

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
  • Ich habe mir einen Befehl erstellt, mit dem Ich Spieler kicken kann.
    Jedoch wird mir zwar die Nachricht angezeigt, dass der Spieler gekickt wurde, jedoch wird der Spieler nicht gekickt.
    Ich habe es auch in einem Timer versucht, jedoch klappt dies auch nicht.
    Hier habt ihr meine beiden Versuche:



    ocmd:kick(playerid, params[])
    {
    new pID, reason[64], string[164], kickName[MAX_PLAYER_NAME], name[MAX_PLAYER_NAME];
    if(!IsPlayerAnAdmin(playerid, 1))return 0;
    if(sscanf(params, "us", pID, reason))return SendClientMessage(playerid, COLOR_GRAY, "Tippe: /kick [ID] [Grund]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, COLOR_RED, "Der Spieler ist nicht Online.");
    GetPlayerName(pID, kickName, sizeof(kickName));
    format(string, sizeof(string), "%s wurde vom Server gekickt. Grund: %s", kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(pInfo[i][pLogin] != 1)return 0;
    SendClientMessage(i, COLOR_RED, string);
    }
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "** %s %s hat %s aus dem Server gekickt. Grund: %s", GetAdminRang(playerid), name, kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerAnAdmin(playerid,1))continue;
    SendClientMessage(i, COLOR_ORANGE, string);
    }
    SetTimerEx("KickPlayer", 500, false, "u", pID);
    return 1;
    }


    public KickPlayer(playerid)
    {
    Kick(playerid);
    return 1;
    }



    ocmd:kick(playerid, params[])
    {
    new pID, reason[64], string[164], kickName[MAX_PLAYER_NAME], name[MAX_PLAYER_NAME];
    if(!IsPlayerAnAdmin(playerid, 1))return 0;
    if(sscanf(params, "us", pID, reason))return SendClientMessage(playerid, COLOR_GRAY, "Tippe: /kick [ID] [Grund]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, COLOR_RED, "Der Spieler ist nicht Online.");
    GetPlayerName(pID, kickName, sizeof(kickName));
    format(string, sizeof(string), "%s wurde vom Server gekickt. Grund: %s", kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(pInfo[i][pLogin] != 1)return 0;
    SendClientMessage(i, COLOR_RED, string);
    }
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "** %s %s hat %s aus dem Server gekickt. Grund: %s", GetAdminRang(playerid), name, kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerAnAdmin(playerid,1))continue;
    SendClientMessage(i, COLOR_ORANGE, string);
    }
    Kick(pID);
    return 1;
    }

  • Zusätzlich zu dem oberen Post empfehle ich dir diese Include:
    Kick/Ban Fix


    Damit kannst du wie gewohnt Kick(playerid); verwenden, und brauchst nicht immer bei jedem Kick den Timer starten (das übernimmt die Include für dich dann immer).

  • Ich habe alle Tipps & Vorschläge ausprobiert.
    Jedoch hat keiner von denen funktioniert.
    Kann es deshalb sein, dass Ich vor dem SetTimerEx zwei for-Schleifen habe?
    Sprich die for-Schleifen könnten die Ursachen dafür sein, dass der Spieler nicht gekickt wird.
    Aber die Nachricht erhält der Spieler bzw. alle Spieler.

  • Zeig uns doch mal den Code, wie du ihn jetzt hast. Dann können wir dir genauer sagen, was nicht stimmt. ;)


  • ocmd:kick(playerid, params[])
    {
    new pID, reason[64], string[164], kickName[MAX_PLAYER_NAME], name[MAX_PLAYER_NAME];
    if(!IsPlayerAnAdmin(playerid, 1))return 0;
    if(sscanf(params, "us", pID, reason))return SendClientMessage(playerid, COLOR_GRAY, "Tippe: /kick [ID] [Grund]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, COLOR_RED, "Der Spieler ist nicht Online.");
    GetPlayerName(pID, kickName, sizeof(kickName));
    format(string, sizeof(string), "%s wurde vom Server gekickt. Grund: %s", kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(pInfo[i][pLogin] != 1)return 0;
    SendClientMessage(i, COLOR_RED, string);
    }
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "** %s %s hat %s aus dem Server gekickt. Grund: %s", GetAdminRang(playerid), name, kickName, reason);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerAnAdmin(playerid,1))continue;
    SendClientMessage(i, COLOR_ORANGE, string);
    }
    SetTimerEx("KickPlayer", 1000, false, "i", pID);
    return 1;
    }


    public KickPlayer(playerid)
    {
    Kick(playerid);
    return 1;
    }


    Forward für KickPlayer(playerid) ist ganz oben im Script, zur Info.

  • Versuche das mal so. ;)

  • Wenn ich deinen Code richtig verstanden habe, sind da mehrere Fehler drin.


    Zeile 12: wieso i und j? i reicht völlig
    Zeile 14: ergänzt, da er sonst auch die Slots durchläuft, die nicht mit dem Server verbunden sind oder NPC's sind
    Zeile 15: diese Nachricht soll wohl NUR an Admins gehen oder?
    Ziele 15: siehe 14

  • Zeile 12: wieso i und j? i reicht völlig

    http://forum.sa-mp.com/showthread.php?t=580289
    4. Punkt - Conditions in Loops. ;)
    Die beiden Varianten machen bei einer Schleife durch MAX_PLAYERS 9 Millisekunden unterschied (nur i: 812 Millisekunden, i mit j: 803 Millisekunden). Das ist zwar nicht viel, wirkt sich meiner Meinung nach aber aus, wenn man mehrere große Schleifen hat. (MAX_VEHICLES ist um das 4-fache größer).




    Zitat von Woozie

    Zeile 15: diese Nachricht soll wohl NUR an Admins gehen oder?

    Keine Ahnung, ich habe das von ihm übernommen, oben meinte er auch das alle Nachrichten ankommen. ;)

    Einmal editiert, zuletzt von AirM4X ()

  • http://forum.sa-mp.com/showthread.php?t=5802894. Punkt - Conditions in Loops. ;)
    Die beiden Varianten machen bei einer Schleife durch MAX_PLAYERS 9 Millisekunden unterschied (nur i: 812 Millisekunden, i mit j: 803 Millisekunden). Das ist zwar nicht viel, wirkt sich meiner Meinung nach aber aus, wenn man mehrere große Schleifen hat. (MAX_VEHICLES ist um das 4-fache größer).

    Hab mir das grad mal durchgelesen. Deine Aussage bezieht sich auf Funktionen innerhalb des FOR Statements. MAX_PLAYERS ist keine Funktion, sondern ein DEFINE. Du kannst auch anstelle des DEFINE's auch die Zahl hinschreiben. ;)
    Ansonsten, danke für den Hinweis. Habe bisher noch nie Funktionen im FOR-Statement genutzt, werde diesen Tipp aber im Hinterkopf behalten.