/kick Befehl will nicht

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[])
    {
    if(Eingeloggt[playerid] == 0) return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt.");
    new string[264],pID,Grund,Kicker[MAX_PLAYER_NAME],Gekickter[MAX_PLAYER_NAME];
    GetPlayerName(pID,Gekickter,MAX_PLAYER_NAME);
    GetPlayerName(playerid,Kicker,MAX_PLAYER_NAME);
    if(SpielerInfo[playerid][pTeam] <= 1)return SendClientMessage(playerid,GRAU,"Dieser Befehl ist für dich nicht verfügbar.");
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid, GRAU,"Benutze: /kick [playerid] [Grund]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, GRAU,"Es ist kein Spieler mit diesem/dieser Name/id online.");
    format(string,sizeof(string),"Supporter %s hat den Spieler %s vom Server gekickt. Grund: %s.",Kicker,Gekickter,Grund);
    SendClientMessageToAll(GRAU,string);
    Kick(pID);
    }


    Moin, Habe einfach mal aus dem Kopf heraus einen Kick Befehl 'versucht'. Will jedoch nicht..


    C:\Users\Dominik\Desktop\Fabulous Life\pawno\include\sscanf2.inc(218) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\pawno\include\sscanf2.inc(218) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\pawno\include\sscanf2.inc(278) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\pawno\include\sscanf2.inc(278) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(120) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(178) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(389) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(404) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(419) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(495) : warning 219: local variable "pID" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(495) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(538) : error 010: invalid function or declaration
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(540) : error 010: invalid function or declaration
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(542) : error 021: symbol already defined: "GetPlayerName"
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(544) : error 010: invalid function or declaration
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(545) : error 010: invalid function or declaration
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(546) : error 010: invalid function or declaration
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(555) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(555) : warning 219: local variable "pID" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(910) : warning 219: local variable "string" shadows a variable at a preceding level
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(924) : warning 203: symbol is never used: "Gekickter"
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(924) : warning 203: symbol is never used: "Grund"
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(924) : warning 203: symbol is never used: "Kicker"
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(924) : warning 203: symbol is never used: "pID"
    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(924) : warning 203: symbol is never used: "string"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    6 Errors.

    ehm. Administration StateV ~ Domi

  • Würde der Befehl an sich so funktionieren?


    Und was hat es mit diesem Warning aufsich?


    C:\Users\Dominik\Desktop\Fabulous Life\gamemodes\life.pwn(550) : warning 209: function "ocmd_kick" should return a valuePawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


    Kicken tut er schon,


    nur da steht halt ' Spieler A hat den Spieler vom server gekickt : Grund:


    Also, der Name vom gekickten taucht net auf, inkl .der Grund

    ehm. Administration StateV ~ Domi

    Einmal editiert, zuletzt von Dominik ()

  • Sscanf muss ganz oben rein, direkt unter die Definitionen der Variablen. Bevor das nicht ausgeführt wurde ist "pID" nämlich einfach nur ne leere Variable, "Grund" genauso. Außerdem würde ich dir raten, die ganzen anderen Abfragenwie ob der Spieler online ist direkt unter sccanf zu machen. Warum? Ist einfach ressourcenschonender, da der Server so bevor er den Befehl anfängt auszuführen bereits merkt dass er das garnicht muss (also z. B. wenn der Spieler nicht online ist).


    Zum Warning: Pack "return 1;" ans Ende deines Befehls dann verschwindet die. Solltest du sowieso ans Ende jedes Befehls setzen.


    //Edit: Is mir grad noch aufgefalln: Wenn du als Grund nicht nur Zahlen angeben können willst solltest du aus "Grund" auch nen String machen ;)

  • ocmd:kick(playerid,params[]) // ( : ) Doppelpunkt vergessen
    {
    if(Eingeloggt[playerid] == 0) return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt.");
    new string[264],pID,Grund[128],Kicker[MAX_PLAYER_NAME],Gekickter[MAX_PLAYER_NAME]; //Grund ist ein String , eine Zeichenkette du musst ihm eine länge zuweisen - > indem fall 128 Zeichen
    GetPlayerName(pID,Gekickter,MAX_PLAYER_NAME);
    GetPlayerName(playerid,Kicker,MAX_PLAYER_NAME);
    if(SpielerInfo[playerid][pTeam] <= 1)return SendClientMessage(playerid,GRAU,"Dieser Befehl ist für dich nicht verfügbar.");
    if(sscanf(params,"us",pID,Grund)) return SendClientMessage(playerid, GRAU,"Benutze: /kick [playerid] [Grund]"); //Grund wird jetzt in eine Variable eingespeichert und kann ausgeführt werden
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, GRAU,"Es ist kein Spieler mit diesem/dieser Name/id online.");
    format(string,sizeof(string),"Supporter %s hat den Spieler %s vom Server gekickt. Grund: %s.",Kicker,Gekickter,Grund);
    SendClientMessageToAll(GRAU,string);
    Kick(pID);
    return 1; //Return vergessen
    }


    Versuchs mal so :D


    LG

  • ocmd:kick(playerid,params[]) // ( : ) Doppelpunkt vergessen
    {
    if(Eingeloggt[playerid] == 0) return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt.");
    new string[264],pID,Grund,Kicker[MAX_PLAYER_NAME],Gekickter[MAX_PLAYER_NAME];
    if(sscanf(params,"us",pID,Grund)) return SendClientMessage(playerid, GRAU,"Benutze: /kick [playerid] [Grund]");
    GetPlayerName(pID,Gekickter,MAX_PLAYER_NAME);
    GetPlayerName(playerid,Kicker,MAX_PLAYER_NAME);
    if(SpielerInfo[playerid][pTeam] <= 1)return SendClientMessage(playerid,GRAU,"Dieser Befehl ist für dich nicht verfügbar.");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, GRAU,"Es ist kein Spieler mit diesem/dieser Name/id online.");
    format(string,sizeof(string),"Supporter %s hat den Spieler %s vom Server gekickt. Grund: %s.",Kicker,Gekickter,Grund);
    SendClientMessageToAll(GRAU,string);
    Kick(pID);
    return 1;
    }


    So sieht es nun aus, jedoch wenn ich die Player ID 0 oder 1 wie auch immer kicken will,
    steht dort: Es ist kein Spieler mit diesem/dieser name/id online.

    ehm. Administration StateV ~ Domi

  • Ich bin kein Freund von sscanf und nutze es auch nicht, von daher kann ich dir den Grund nicht genau sagen, aber versuche mal:
    new string[264],pID,Grund[32],Kicker[MAX_PLAYER_NAME],Gekickter[MAX_PLAYER_NAME];
    if(sscanf(params,"us[32]",pID,Grund)) return SendClientMessage(playerid, GRAU,"Benutze: /kick [playerid] [Grund]");


    Falls das nicht tut, nutze strtok anstatt sscanf, das ist (meiner Meinung nach) wesentlich besser, da man mehr Freiheiten hat.

    Spoiler anzeigen
    ocmd:kick(playerid,params[])
    {
    if(Eingeloggt[playerid] == 0) return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt.");
    new string[264],pID,Kicker[MAX_PLAYER_NAME],Gekickter[MAX_PLAYER_NAME];
    new tmp[256], tmp2[256], idx;
    tmp = strtok(params, idx); tmp2 = strtok(params, idx);
    if(!strlen(tmp2)) return SendClientMessage(playerid, GRAU,"Benutze: /kick [playerid] [Grund]");
    if(!IsNumeric(tmp)) pID = ReturnPlayerID(tmp);
    else pID = strval(tmp);
    GetPlayerName(pID,Gekickter,MAX_PLAYER_NAME);
    GetPlayerName(playerid,Kicker,MAX_PLAYER_NAME);
    if(SpielerInfo[playerid][pTeam] <= 1)return SendClientMessage(playerid,GRAU,"Dieser Befehl ist für dich nicht verfügbar.");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, GRAU,"Es ist kein Spieler mit diesem/dieser Name/id online.");
    format(string,sizeof(string),"Supporter %s hat den Spieler %s vom Server gekickt. Grund: %s.",Kicker,Gekickter,params[strlen(tmp)+1]);
    SendClientMessageToAll(GRAU,string);
    Kick(pID);
    return 1;
    }


    Und hier die benötigten Funktionen, falls du sie noch nicht hast:

    Spoiler anzeigen
    //Aus der dutils.inc
    stock strtok(const string[], &index,seperator=' ')
    {
    new length = strlen(string);
    new offset = index;
    new result[256];
    while ((index < length) && (string[index] != seperator) && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }

    Spoiler anzeigen
    result[index - offset] = EOS;
    if ((index < length) && (string[index] == seperator))
    {
    index++;
    }
    return result;
    }

    Spoiler anzeigen
    stock ReturnPlayerID(PlayerName[]) //©Jeffry
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(!strcmp(pName(i),PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(strfind(pName(i),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;
    }

    Spoiler anzeigen
    ...einfach unten im Code einfügen.