Problem mit Kick / Ban

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
  • ocmd:kick(playerid, params[])
    {
    new pID,grund,string[256],pIDname[MAX_PLAYERS],pname[MAX_PLAYERS];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"ds",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /kick [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,sizeof(string),"%s wurde von %s gekickt. Grund: %s",pIDname,pname,grund);
    SendClientMessageToAll(COLOR_RED2,string);
    Kick(pID);
    return 1;
    }


    ocmd:ban(playerid, params[])
    {
    new pID,grund,string[256],pIDname[MAX_PLAYERS],pname[MAX_PLAYERS];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"ds",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /ban [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,sizeof(string),"%s wurde von %s gebannt. Grund: %s",pIDname,pname,grund);
    SendClientMessageToAll(COLOR_RED2,string);
    Spieler[pID][gebannt] = 1;
    Kick(pID);
    return 1;
    }


    Wenn ich eins der beiden Befehle ausführe, bricht der Server zusammen (er stoppt)


    Hoffentlch könnt ihr mirhefen


    MfG

  • if(sscanf(params,"ds",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /kick [ID] [Grund]");


    Das ist der Fehler, die ID ist zwar eine Zahl aber sie wird mit "u" und nicht mit "d" abgefragt, das ist wahrscheinlich der Grund wieso Dein Server crasht.


    So muss es richtig sein:


    if(sscanf(params,"us",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /kick [ID] [Grund]");


    Und ab 0.3x musst Du mit einem Timer kicken sonst funktioniert der ganze Befehl nicht. ;)


  • Man könnte auch "i" bei sscanf angeben bei "d" bin ich mir nicht sicher. Mit Beavis's [ INCLUDE ] Kick/Ban Fix
    Include brauch man es nicht die Frage ist ob er's hat

    KleineHilfe 2.0

  • Natürlich kann man das auch so machen das kommt auf's selbe heraus.


    Das mit dem Include stimmt ja aber woher soll man wissen ob er dieses Include besitzt? Da sage ich es Ihm doch lieber nochmal zur Sicherheit. :wacko:


    bei "i" crasht nichts und wenn du sagst es liegt an "d" dann kommt wohl nur indirekt das selbe raus.
    "i" only ID u = playerid/name.
    Wenn bei sscanf d&i das selbe ist dann kann es eig. nicht daran liegen.

    KleineHilfe 2.0


  • Sicher? Soweit ich weiß nich.. Kann das wer bestätigen, da du dir ja nicht sicher bist.


    d Integer Money
    i Integer Money
    c Character A single letter
    u User ID or name Player
    s String Any length of text
    h Hex number Colour
    x Hex number Colour
    f Float Co-ordinate
    z Optional string A reason e.g. Ban Reason, only optional at the end of a format string

    KleineHilfe 2.0

  • ocmd:kick(playerid, params[])
    {
    new pID,grund[256],string[512],pIDname[MAX_PLAYERS],pname[MAX_PLAYERS];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"uz",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /kick [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,sizeof(string),"%s wurde von %s gekickt. Grund: %s",pIDname,pname,grund[0] ? grund : "/");
    SendClientMessageToAll(COLOR_RED2,string);
    Kick(pID);
    return 1;
    }


    ocmd:ban(playerid, params[])
    {
    new pID,grund[256],string[512],pIDname[MAX_PLAYERS],pname[MAX_PLAYERS];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"uz",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /ban [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,sizeof(string),"%s wurde von %s gebannt. Grund: %s",pIDname,pname,grund[0] ? grund : "/");
    SendClientMessageToAll(COLOR_RED2,string);
    Spieler[pID][gebannt] = 1;
    Kick(pID);
    return 1;
    }
    Hab dir nochmal eben eingebaut, dass wenn man kein Grund angibt "/" angegeben wird.
    Müsste so klappen.
    mfg :thumbup:

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Kann man die Länge nicht mit strlen rausfinden? Wenn ja wie?
    So gehts nicht :S:


    if(strlen(grund[50] > 0)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: Du musst einen Grund angeben.");


    Wenn die Parameter nicht komplett Sind dann macht sscanf das doch schon automatisch.

    KleineHilfe 2.0

  • Zitat

    grund[256],string[512]

    Seit ihr Irre?! Seid wann gibt der Chat den über 760 Zeichen an?! Das zieht doch nur Unnötig...




    new pID, grund[30], string[128], pIDname[MAX_PLAYERS], pname[MAX_PLAYERS];


    So würde das nun richtig aussehen:




    ocmd:kick(playerid, params[])
    {
    new pID,grund[30],string[128],pIDname[MAX_PLAYER_NAME],pname[MAX_PLAYER_NAME];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"uz",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /kick [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,128,"%s wurde von %s gekickt. Grund: %s",pIDname,pname,grund);
    SendClientMessageToAll(COLOR_RED2,string);
    Kick(pID);
    return 1;
    }


    ocmd:ban(playerid, params[])
    {
    new pID, grund[30], string[128], pIDname[MAX_PLAYER_NAME], pname[MAX_PLAYER_NAME];
    GetPlayerName(pID,pIDname,sizeof(pIDname));
    GetPlayerName(playerid, pname,sizeof(pname));
    if(sscanf(params,"uz",pID,grund)) return SendClientMessage(playerid,COLOR_WHITE,"Fehler: /ban [ID] [Grund]");
    if(Spieler[playerid][Admin] < 3) return SendClientMessage(playerid,COLOR_RED2,"Du bist kein Server Leiter.");
    format(string,128,"%s wurde von %s gebannt. Grund: %s",pIDname,pname,grund);
    SendClientMessageToAll(COLOR_RED2,string);
    Spieler[pID][gebannt] = 1;
    Kick(pID);
    return 1;
    }

  • Wenn die Parameter nicht komplett Sind dann macht sscanf das doch schon automatisch.


    Und wenn ich sagen will, dass man nur max. 20 Zeichen benutzen darf?





    Keine sorge hab ich schon gemacht ;D